#
# Author:: John Keiser (<jkeiser@opscode.com>)
# Copyright:: Copyright (c) 2013 Opscode, Inc.
# License:: Apache License, Version 2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

require "support/shared/integration/integration_helper"
require "chef/knife/raw"

describe "knife common options", :workstation do
  include IntegrationSupport
  include KnifeSupport

  when_the_repository "has a node" do
    before { file "nodes/x.json", {} }

    context "When chef_zero.enabled is true" do
      before(:each) do
        Chef::Config.chef_zero.enabled = true
      end

      it "knife raw /nodes/x should retrieve the node" do
        knife("raw /nodes/x").should_succeed( /"name": "x"/ )
      end

      context "And chef_zero.port is 9999" do
        before(:each) { Chef::Config.chef_zero.port = 9999 }

        it "knife raw /nodes/x should retrieve the node" do
          knife("raw /nodes/x").should_succeed( /"name": "x"/ )
          expect(Chef::Config.chef_server_url).to eq("chefzero://localhost:9999")
        end
      end

      # 0.0.0.0 is not a valid address to bind to on windows.
      context "And chef_zero.host is 0.0.0.0", :unix_only do
        before(:each) { Chef::Config.chef_zero.host = "0.0.0.0" }

        it "knife raw /nodes/x should retrieve the role" do
          knife("raw /nodes/x").should_succeed( /"name": "x"/ )
        end
      end

      context "and there is a private key" do
        before do
          file "mykey.pem", <<EOM
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEApubutqtYYQ5UiA9QhWP7UvSmsfHsAoPKEVVPdVW/e8Svwpyf
0Xef6OFWVmBE+W442ZjLOe2y6p2nSnaq4y7dg99NFz6X+16mcKiCbj0RCiGqCvCk
NftHhTgO9/RFvCbmKZ1RKNob1YzLrFpxBHaSh9po+DGWhApcd+I+op+ZzvDgXhNn
0nauZu3rZmApI/r7EEAOjFedAXs7VPNXhhtZAiLSAVIrwU3ZajtSzgXOxbNzgj5O
AAAMmThK+71qPdffAdO4J198H6/MY04qgtFo7vumzCq0UCaGZfmeI1UNE4+xQWwP
HJ3pDAP61C6Ebx2snI2kAd9QMx9Y78nIedRHPwIDAQABAoIBAHssRtPM1GacWsom
8zfeN6ZbI4KDlbetZz0vhnqDk9NVrpijWlcOP5dwZXVNitnB/HaqCqFvyPDY9JNB
zI/pEFW4QH59FVDP42mVEt0keCTP/1wfiDDGh1vLqVBYl/ZphscDcNgDTzNkuxMx
k+LFVxKnn3w7rGc59lALSkpeGvbbIDjp3LUMlUeCF8CIFyYZh9ZvXe4OCxYdyjxb
i8tnMLKvJ4Psbh5jMapsu3rHQkfPdqzztQUz8vs0NYwP5vWge46FUyk+WNm/IhbJ
G3YM22nwUS8Eu2bmTtADSJolATbCSkOwQ1D+Fybz/4obfYeGaCdOqB05ttubhenV
ShsAb7ECgYEA20ecRVxw2S7qA7sqJ4NuYOg9TpfGooptYNA1IP971eB6SaGAelEL
awYkGNuu2URmm5ElZpwJFFTDLGA7t2zB2xI1FeySPPIVPvJGSiZoFQOVlIg9WQzK
7jTtFQ/tOMrF+bigEUJh5bP1/7HzqSpuOsPjEUb2aoCTp+tpiRGL7TUCgYEAwtns
g3ysrSEcTzpSv7fQRJRk1lkBhatgNd0oc+ikzf74DaVLhBg1jvSThDhiDCdB59mr
Jh41cnR1XqE8jmdQbCDRiFrI1Pq6TPaDZFcovDVE1gue9x86v3FOH2ukPG4d2/Xy
HevXjThtpMMsWFi0JYXuzXuV5HOvLZiP8sN3lSMCgYANpdxdGM7RRbE9ADY0dWK2
V14ReTLcxP7fyrWz0xLzEeCqmomzkz3BsIUoouu0DCTSw+rvAwExqcDoDylIVlWO
fAifz7SeZHbcDxo+3TsXK7zwnLYsx7YNs2+aIv6hzUUbMNmNmXMcZ+IEwx+mRMTN
lYmZdrA5mr0V83oDFPt/jQKBgC74RVE03pMlZiObFZNtheDiPKSG9Bz6wMh7NWMr
c37MtZLkg52mEFMTlfPLe6ceV37CM8WOhqe+dwSGrYhOU06dYqUR7VOZ1Qr0aZvo
fsNPu/Y0+u7rMkgv0fs1AXQnvz7kvKaF0YITVirfeXMafuKEtJoH7owRbur42cpV
YCAtAoGAP1rHOc+w0RUcBK3sY7aErrih0OPh9U5bvJsrw1C0FIZhCEoDVA+fNIQL
syHLXYFNy0OxMtH/bBAXBGNHd9gf5uOnqh0pYcbe/uRAxumC7Rl0cL509eURiA2T
+vFmf54y9YdnLXaqv+FhJT6B6V7WX7IpU9BMqJY1cJYXHuHG2KA=
-----END RSA PRIVATE KEY-----
EOM
        end

        it "knife raw /nodes/x should retrieve the node" do
          knife("raw /nodes/x").should_succeed( /"name": "x"/ )
        end
      end
    end

    it "knife raw -z /nodes/x retrieves the node" do
      knife("raw -z /nodes/x").should_succeed( /"name": "x"/ )
    end

    it "knife raw --local-mode /nodes/x retrieves the node" do
      knife("raw --local-mode /nodes/x").should_succeed( /"name": "x"/ )
    end

    it "knife raw -z --chef-zero-port=9999 /nodes/x retrieves the node" do
      knife("raw -z --chef-zero-port=9999 /nodes/x").should_succeed( /"name": "x"/ )
      expect(Chef::Config.chef_server_url).to eq("chefzero://localhost:9999")
    end

    context "when the default port (8889) is already bound" do
      before :each do
        begin
          @server = ChefZero::Server.new(:host => "localhost", :port => 8889)
          @server.start_background
        rescue Errno::EADDRINUSE
          # OK.  Don't care who has it in use, as long as *someone* does.
        end
      end
      after :each do
        @server.stop if @server
      end

      it "knife raw -z /nodes/x retrieves the node" do
        knife("raw -z /nodes/x").should_succeed( /"name": "x"/ )
        expect(URI(Chef::Config.chef_server_url).port).to be > 8889
      end
    end

    context "when port 9999 is already bound" do
      before :each do
        begin
          @server = ChefZero::Server.new(:host => "localhost", :port => 9999)
          @server.start_background
        rescue Errno::EADDRINUSE
          # OK.  Don't care who has it in use, as long as *someone* does.
        end
      end
      after :each do
        @server.stop if @server
      end

      it "knife raw -z --chef-zero-port=9999-20000 /nodes/x" do
        knife("raw -z --chef-zero-port=9999-20000 /nodes/x").should_succeed( /"name": "x"/ )
        expect(URI(Chef::Config.chef_server_url).port).to be > 9999
      end

      it "knife raw -z --chef-zero-port=9999-9999,19423" do
        knife("raw -z --chef-zero-port=9999-9999,19423 /nodes/x").should_succeed( /"name": "x"/ )
        expect(URI(Chef::Config.chef_server_url).port).to be == 19423
      end
    end

    it "knife raw -z --chef-zero-port=9999 /nodes/x retrieves the node" do
      knife("raw -z --chef-zero-port=9999 /nodes/x").should_succeed( /"name": "x"/ )
      expect(Chef::Config.chef_server_url).to eq("chefzero://localhost:9999")
    end
  end
end
