summaryrefslogtreecommitdiff
path: root/spec/unit/provider/subversion_spec.rb
diff options
context:
space:
mode:
authorSimon Detheridge <simon@widgit.com>2015-08-20 17:27:15 +0100
committerSimon Detheridge <simon@widgit.com>2015-08-24 11:02:01 +0100
commit01419e6c445b7e92912d6f501f7e22926472e4d8 (patch)
treea937dc2e58f4c73a8c558218fb580669d780c070 /spec/unit/provider/subversion_spec.rb
parent953af618fd0114a6557150358369f3ae7491614a (diff)
downloadchef-01419e6c445b7e92912d6f501f7e22926472e4d8.tar.gz
Replace output_of_command with shell_out! in subversion provider
output_of_command doesn't work properly on Windows (see chef/chef#1533)
Diffstat (limited to 'spec/unit/provider/subversion_spec.rb')
-rw-r--r--spec/unit/provider/subversion_spec.rb81
1 files changed, 50 insertions, 31 deletions
diff --git a/spec/unit/provider/subversion_spec.rb b/spec/unit/provider/subversion_spec.rb
index 9ca11b8d82..9d4a8bd218 100644
--- a/spec/unit/provider/subversion_spec.rb
+++ b/spec/unit/provider/subversion_spec.rb
@@ -27,6 +27,7 @@ describe Chef::Provider::Subversion do
@resource.revision "12345"
@resource.svn_arguments(false)
@resource.svn_info_args(false)
+ @resource.svn_binary "svn"
@node = Chef::Node.new
@events = Chef::EventDispatch::Dispatcher.new
@run_context = Chef::RunContext.new(@node, {}, @events)
@@ -63,28 +64,18 @@ describe Chef::Provider::Subversion do
"Last Changed Rev: 11410\n" + # Last Changed Rev is preferred to Revision
"Last Changed Date: 2009-03-25 06:09:56 -0600 (Wed, 25 Mar 2009)\n\n"
expect(::File).to receive(:exist?).at_least(1).times.with("/my/deploy/dir/.svn").and_return(true)
- expect(::File).to receive(:directory?).with("/my/deploy/dir").and_return(true)
- expect(::Dir).to receive(:chdir).with("/my/deploy/dir").and_yield
- allow(@stdout).to receive(:string).and_return(example_svn_info)
- allow(@stderr).to receive(:string).and_return("")
- allow(@exitstatus).to receive(:exitstatus).and_return(0)
- expected_command = ["svn info", {:cwd=>"/my/deploy/dir"}]
- expect(@provider).to receive(:popen4).with(*expected_command).
- and_yield("no-pid", "no-stdin", @stdout,@stderr).
- and_return(@exitstatus)
+ expected_command = ["svn info", {:cwd => '/my/deploy/dir', :returns => [0,1]}]
+ expect(@provider).to receive(:shell_out!).with(*expected_command).
+ and_return(double("ShellOut result", :stdout => example_svn_info, :stderr => ""))
expect(@provider.find_current_revision).to eql("11410")
end
it "gives nil as the current revision if the deploy dir isn't a SVN working copy" do
example_svn_info = "svn: '/tmp/deploydir' is not a working copy\n"
expect(::File).to receive(:exist?).with("/my/deploy/dir/.svn").and_return(true)
- expect(::File).to receive(:directory?).with("/my/deploy/dir").and_return(true)
- expect(::Dir).to receive(:chdir).with("/my/deploy/dir").and_yield
- allow(@stdout).to receive(:string).and_return(example_svn_info)
- allow(@stderr).to receive(:string).and_return("")
- allow(@exitstatus).to receive(:exitstatus).and_return(1)
- expect(@provider).to receive(:popen4).and_yield("no-pid", "no-stdin", @stdout,@stderr).
- and_return(@exitstatus)
+ expected_command = ["svn info", {:cwd => '/my/deploy/dir', :returns => [0,1]}]
+ expect(@provider).to receive(:shell_out!).with(*expected_command).
+ and_return(double("ShellOut result", :stdout => example_svn_info, :stderr => ""))
expect(@provider.find_current_revision).to be_nil
end
@@ -127,28 +118,20 @@ describe Chef::Provider::Subversion do
"Last Changed Author: codeninja\n" +
"Last Changed Rev: 11410\n" + # Last Changed Rev is preferred to Revision
"Last Changed Date: 2009-03-25 06:09:56 -0600 (Wed, 25 Mar 2009)\n\n"
- exitstatus = double("exitstatus")
- allow(exitstatus).to receive(:exitstatus).and_return(0)
@resource.revision "HEAD"
- allow(@stdout).to receive(:string).and_return(example_svn_info)
- allow(@stderr).to receive(:string).and_return("")
- expected_command = ["svn info http://svn.example.org/trunk/ --no-auth-cache -rHEAD", {:cwd=>Dir.tmpdir}]
- expect(@provider).to receive(:popen4).with(*expected_command).
- and_yield("no-pid","no-stdin",@stdout,@stderr).
- and_return(exitstatus)
+ expected_command = ["svn info http://svn.example.org/trunk/ --no-auth-cache -rHEAD", {:cwd => '/my/deploy/dir', :returns => [0,1]}]
+ expect(@provider).to receive(:shell_out!).with(*expected_command).
+ and_return(double("ShellOut result", :stdout => example_svn_info, :stderr => ""))
expect(@provider.revision_int).to eql("11410")
end
it "returns a helpful message if data from `svn info` can't be parsed" do
example_svn_info = "some random text from an error message\n"
- exitstatus = double("exitstatus")
- allow(exitstatus).to receive(:exitstatus).and_return(0)
@resource.revision "HEAD"
- allow(@stdout).to receive(:string).and_return(example_svn_info)
- allow(@stderr).to receive(:string).and_return("")
- expect(@provider).to receive(:popen4).and_yield("no-pid","no-stdin",@stdout,@stderr).
- and_return(exitstatus)
- expect {@provider.revision_int}.to raise_error(RuntimeError, "Could not parse `svn info` data: some random text from an error message")
+ expected_command = ["svn info http://svn.example.org/trunk/ --no-auth-cache -rHEAD", {:cwd => '/my/deploy/dir', :returns => [0,1]}]
+ expect(@provider).to receive(:shell_out!).with(*expected_command).
+ and_return(double("ShellOut result", :stdout => example_svn_info, :stderr => ""))
+ expect {@provider.revision_int}.to raise_error(RuntimeError, "Could not parse `svn info` data: some random text from an error message\n")
end
@@ -277,4 +260,40 @@ describe Chef::Provider::Subversion do
expect(@resource).to be_updated
end
+ context "selects the correct svn binary" do
+ before do
+ end
+
+ it "selects 'svn' as the binary by default" do
+ @resource.svn_binary nil
+ allow(ChefConfig).to receive(:windows?) { false }
+ expect(@provider).to receive(:svn_binary).and_return('svn')
+ expect(@provider.export_command).to eql(
+ 'svn export --force -q -r12345 http://svn.example.org/trunk/ /my/deploy/dir')
+ end
+
+ it "selects an svn binary with an exe extension on windows" do
+ @resource.svn_binary nil
+ allow(ChefConfig).to receive(:windows?) { true }
+ expect(@provider).to receive(:svn_binary).and_return('svn.exe')
+ expect(@provider.export_command).to eql(
+ 'svn.exe export --force -q -r12345 http://svn.example.org/trunk/ /my/deploy/dir')
+ end
+
+ it "uses a custom svn binary as part of the svn command" do
+ @resource.svn_binary 'teapot'
+ expect(@provider).to receive(:svn_binary).and_return('teapot')
+ expect(@provider.export_command).to eql(
+ 'teapot export --force -q -r12345 http://svn.example.org/trunk/ /my/deploy/dir')
+ end
+
+ it "wraps custom svn binary with quotes if it contains whitespace" do
+ @resource.svn_binary 'c:/program files (x86)/subversion/svn.exe'
+ expect(@provider).to receive(:svn_binary).and_return('c:/program files (x86)/subversion/svn.exe')
+ expect(@provider.export_command).to eql(
+ '"c:/program files (x86)/subversion/svn.exe" export --force -q -r12345 http://svn.example.org/trunk/ /my/deploy/dir')
+ end
+
+ end
+
end