diff options
author | Phil Dibowitz <phil@ipom.com> | 2012-10-12 00:56:11 -0700 |
---|---|---|
committer | Bryan McLellan <btm@opscode.com> | 2013-06-19 14:27:55 -0700 |
commit | 2a3d8a762f5d0b3fce36dd44106c0ac04caa5eba (patch) | |
tree | a12a32ed64607086b2dcc7b39d20670d9dcb3738 /spec | |
parent | b4e37867815a4f2109a8e4b0b52c292316d23713 (diff) | |
download | chef-2a3d8a762f5d0b3fce36dd44106c0ac04caa5eba.tar.gz |
CHEF-3521: Wrap the call to yum-dump.rb in a configurable timeout.
Diffstat (limited to 'spec')
-rw-r--r-- | spec/unit/provider/package/yum_spec.rb | 56 |
1 files changed, 36 insertions, 20 deletions
diff --git a/spec/unit/provider/package/yum_spec.rb b/spec/unit/provider/package/yum_spec.rb index 375ae0966b..97084bfc6b 100644 --- a/spec/unit/provider/package/yum_spec.rb +++ b/spec/unit/provider/package/yum_spec.rb @@ -600,7 +600,7 @@ describe Chef::Provider::Package::Yum do @provider.stub!(:output_of_command).and_return([@status, "", ""]) @provider.should_receive(:output_of_command).once.with( "yum -d0 -e0 -y install emacs-1.0", - {} + {:timeout => Chef::Config[:yum_timeout]} ) @provider.yum_command("yum -d0 -e0 -y install emacs-1.0") end @@ -610,7 +610,7 @@ describe Chef::Provider::Package::Yum do @provider.stub!(:output_of_command).and_return([@status, "failure failure", "problem problem"]) @provider.should_receive(:output_of_command).once.with( "yum -d0 -e0 -y install emacs-1.0", - {} + {:timeout => Chef::Config[:yum_timeout]} ) lambda { @provider.yum_command("yum -d0 -e0 -y install emacs-1.0") }.should raise_error(Chef::Exceptions::Exec) end @@ -620,7 +620,7 @@ describe Chef::Provider::Package::Yum do @provider.stub!(:output_of_command).and_return([@status, "error: %pre(demo-1-1.el5.centos.x86_64) scriptlet failed, exit status 2", ""]) @provider.should_receive(:output_of_command).once.with( "yum -d0 -e0 -y install emacs-1.0", - {} + {:timeout => Chef::Config[:yum_timeout]} ) # will still raise an exception, can't stub out the subsequent call lambda { @provider.yum_command("yum -d0 -e0 -y install emacs-1.0") }.should raise_error(Chef::Exceptions::Exec) @@ -631,7 +631,7 @@ describe Chef::Provider::Package::Yum do @provider.stub!(:output_of_command).and_return([@status, "error: %post(demo-1-1.el5.centos.x86_64) scriptlet failed, exit status 2", ""]) @provider.should_receive(:output_of_command).twice.with( "yum -d0 -e0 -y install emacs-1.0", - {} + {:timeout => Chef::Config[:yum_timeout]} ) # will still raise an exception, can't stub out the subsequent call lambda { @provider.yum_command("yum -d0 -e0 -y install emacs-1.0") }.should raise_error(Chef::Exceptions::Exec) @@ -1584,22 +1584,34 @@ file: file://///etc/yum.repos.d/CentOS-Base.repo, line: 12 'qeqwewe\n' EOF - @status = mock("Status", :exitstatus => 0) - @status_bad = mock("Status", :exitstatus => 1) @stdin = mock("STDIN", :nil_object => true) @stdout = mock("STDOUT", :nil_object => true) - @stdout_good = yum_dump_good_output.split("\n") - @stdout_bad_type = yum_dump_bad_output_type.split("\n") - @stdout_bad_separators = yum_dump_bad_output_separators.split("\n") + @stdout_good = mock("STDOUT", :nil_object => true) + s = @stdout_good.stub!(:each_line) + yum_dump_good_output.split("\n").each do |line| + s.and_yield(line) + end + @stdout_bad_type = mock("STDOUT", :nil_object => true) + s = @stdout_bad_type.stub!(:each_line) + yum_dump_bad_output_type.split("\n").each do |line| + s.and_yield(line) + end + @stdout_bad_separators = mock("STDOUT", :nil_object => true) + s = @stdout_bad_separators.stub!(:each_line) + yum_dump_bad_output_separators.split("\n").each do |line| + s.and_yield(line) + end + @stdout_no_output = mock("STDOUT", :nil_object => true) + @stdout_no_output.stub!(:each_line).and_return(nil) @stderr = mock("STDERR", :nil_object => true) @stderr.stub!(:readlines).and_return(yum_dump_error.split("\n")) - @pid = mock("PID", :nil_object => true) + @status = mock("Status", :exitstatus => 0, :stdin => @stdin, :stdout => @stdout_good, :stderr => @stderr) # new singleton each time Chef::Provider::Package::Yum::YumCache.reset_instance @yc = Chef::Provider::Package::Yum::YumCache.instance # load valid data - @yc.stub!(:popen4).and_yield(@pid, @stdin, @stdout_good, @stderr).and_return(@status) + @yc.stub!(:shell_out!).and_return(@status) end describe "initialize" do @@ -1618,7 +1630,7 @@ EOF describe "refresh" do it "should implicitly call yum-dump.py only once by default after being instantiated" do - @yc.should_receive(:popen4).once + @yc.should_receive(:shell_out!).once @yc.installed_version("zlib") @yc.reset @yc.installed_version("zlib") @@ -1626,48 +1638,52 @@ EOF it "should run yum-dump.py using the system python when next_refresh is for :all" do @yc.reload - @yc.should_receive(:popen4).with(%r{^/usr/bin/python .*/yum-dump.py --options --installed-provides$}, :waitlast=>true) + @yc.should_receive(:shell_out!).with(%r{^/usr/bin/python .*/yum-dump.py --options --installed-provides$}, :timeout=>Chef::Config[:yum_timeout]) @yc.refresh end it "should run yum-dump.py with the installed flag when next_refresh is for :installed" do @yc.reload_installed - @yc.should_receive(:popen4).with(%r{^/usr/bin/python .*/yum-dump.py --installed$}, :waitlast=>true) + @yc.should_receive(:shell_out!).with(%r{^/usr/bin/python .*/yum-dump.py --installed$}, :timeout=>Chef::Config[:yum_timeout]) @yc.refresh end it "should run yum-dump.py with the all-provides flag when next_refresh is for :provides" do @yc.reload_provides - @yc.should_receive(:popen4).with(%r{^/usr/bin/python .*/yum-dump.py --options --all-provides$}, :waitlast=>true) + @yc.should_receive(:shell_out!).with(%r{^/usr/bin/python .*/yum-dump.py --options --all-provides$}, :timeout=>Chef::Config[:yum_timeout]) @yc.refresh end it "should pass extra_repo_control args to yum-dump.py" do @yc.enable_extra_repo_control("--enablerepo=foo --disablerepo=bar") - @yc.should_receive(:popen4).with(%r{^/usr/bin/python .*/yum-dump.py --options --installed-provides --enablerepo=foo --disablerepo=bar$}, :waitlast=>true) + @yc.should_receive(:shell_out!).with(%r{^/usr/bin/python .*/yum-dump.py --options --installed-provides --enablerepo=foo --disablerepo=bar$}, :timeout=>Chef::Config[:yum_timeout]) @yc.refresh end it "should warn about invalid data with too many separators" do - @yc.stub!(:popen4).and_yield(@pid, @stdin, @stdout_bad_separators, @stderr).and_return(@status) + @status = mock("Status", :exitstatus => 0, :stdin => @stdin, :stdout => @stdout_bad_separators, :stderr => @stderr) + @yc.stub!(:shell_out!).and_return(@status) Chef::Log.should_receive(:warn).exactly(3).times.with(%r{Problem parsing}) @yc.refresh end it "should warn about invalid data with an incorrect type" do - @yc.stub!(:popen4).and_yield(@pid, @stdin, @stdout_bad_type, @stderr).and_return(@status) + @status = mock("Status", :exitstatus => 0, :stdin => @stdin, :stdout => @stdout_bad_type, :stderr => @stderr) + @yc.stub!(:shell_out!).and_return(@status) Chef::Log.should_receive(:warn).exactly(2).times.with(%r{Problem parsing}) @yc.refresh end it "should warn about no output from yum-dump.py" do - @yc.stub!(:popen4).and_yield(@pid, @stdin, [], @stderr).and_return(@status) + @status = mock("Status", :exitstatus => 0, :stdin => @stdin, :stdout => @stdout_no_output, :stderr => @stderr) + @yc.stub!(:shell_out!).and_return(@status) Chef::Log.should_receive(:warn).exactly(1).times.with(%r{no output from yum-dump.py}) @yc.refresh end it "should raise exception yum-dump.py exits with a non zero status" do - @yc.stub!(:popen4).and_yield(@pid, @stdin, [], @stderr).and_return(@status_bad) + @status = mock("Status", :exitstatus => 1, :stdin => @stdin, :stdout => @stdout_no_output, :stderr => @stderr) + @yc.stub!(:shell_out!).and_return(@status) lambda { @yc.refresh}.should raise_error(Chef::Exceptions::Package, %r{CentOS-Base.repo, line: 12}) end |