diff options
| author | Markus Roberts <Markus@reality.com> | 2009-09-03 17:43:24 -0700 |
|---|---|---|
| committer | James Turnbull <james@lovedthanlost.net> | 2009-09-05 09:24:28 +1000 |
| commit | aba2f6600062c6935b65ebc2eeae0802e1f89a89 (patch) | |
| tree | 252ed15abd6fddf7b6ec0e8d50d9b782c827b9f1 /spec | |
| parent | fb236a00459c375e4f2a94bdd924ed4e7fbd25eb (diff) | |
| download | puppet-aba2f6600062c6935b65ebc2eeae0802e1f89a89.tar.gz puppet-aba2f6600062c6935b65ebc2eeae0802e1f89a89.tar.xz puppet-aba2f6600062c6935b65ebc2eeae0802e1f89a89.zip | |
This further normalizes the handling of init-style services (including
the redhat "service" wrapper script). Removes special case handling of
non-zero exit code in redhat (base already did this) and centralizes
scattered @resource[:has_____] checks. Tests that proper versions of
each are called and one level of fallbacks.
Signed-off-by: Markus Roberts <Markus@reality.com>
Diffstat (limited to 'spec')
| -rw-r--r-- | spec/unit/provider/service/init.rb | 135 | ||||
| -rw-r--r-- | spec/unit/provider/service/redhat.rb | 127 |
2 files changed, 262 insertions, 0 deletions
diff --git a/spec/unit/provider/service/init.rb b/spec/unit/provider/service/init.rb new file mode 100644 index 000000000..297768e33 --- /dev/null +++ b/spec/unit/provider/service/init.rb @@ -0,0 +1,135 @@ +#!/usr/bin/env ruby +# +# Unit testing for the Init service Provider +# + +require File.dirname(__FILE__) + '/../../../spec_helper' + +provider_class = Puppet::Type.type(:service).provider(:init) + +describe provider_class do + + before(:each) do + # Create a mock resource + @resource = stub 'resource' + + @provider = provider_class.new + # A catch all; no parameters set + @resource.stubs(:[]).returns(nil) + + # But set name, source and path (because we won't run + # the thing that will fetch the resource path from the provider) + @resource.stubs(:[]).with(:name).returns "myservice" + @resource.stubs(:[]).with(:ensure).returns :enabled + @resource.stubs(:[]).with(:path).returns ["/service/path","/alt/service/path"] + @resource.stubs(:ref).returns "Service[myservice]" + + @provider.stubs(:resource).returns @resource + @provider.resource = @resource + end + + it "should have a start method" do + @provider.should respond_to(:start) + end + + it "should have a stop method" do + @provider.should respond_to(:stop) + end + + it "should have a restart method" do + @provider.should respond_to(:restart) + end + + it "should have a status method" do + @provider.should respond_to(:status) + end + + describe "when serching for the init script" do + it "should be able to find the init script in the service path" do + File.expects(:stat).with("/service/path/myservice").returns true + @provider.initscript.should == "/service/path/myservice" + end + it "should be able to find the init script in the service path" do + File.expects(:stat).with("/alt/service/path/myservice").returns true + @provider.initscript.should == "/alt/service/path/myservice" + end + it "should fail if the service isn't there" do + lambda { @provider.initscript }.should raise_error(Puppet::Error, "Could not find init script for 'myservice'") + end + end + + describe "if the init script is present" do + before :each do + File.stubs(:stat).with("/service/path/myservice").returns true + end + + describe "when starting" do + it "should execute the init script with start" do + @provider.expects(:texecute).with(:start, ['/service/path/myservice', :start], true).returns("") + @provider.start + end + end + + describe "when stopping" do + it "should execute the init script with stop" do + @provider.expects(:texecute).with(:stop, ['/service/path/myservice', :stop], true).returns("") + @provider.stop + end + end + + describe "when checking status" do + describe "when hasstatus is :true" do + before :each do + @resource.stubs(:[]).with(:hasstatus).returns :true + end + it "should execute the command" do + @provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("") + @provider.status + end + it "should consider the process running if the command returns 0" do + @provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("") + $?.stubs(:exitstatus).returns(0) + @provider.status.should == :running + end + [-10,-1,1,10].each { |ec| + it "should consider the process stopped if the command returns something non-0" do + @provider.expects(:texecute).with(:status, ['/service/path/myservice', :status], false).returns("") + $?.stubs(:exitstatus).returns(ec) + @provider.status.should == :stopped + end + } + end + describe "when hasstatus is not :true" do + it "should consider the service :running if it has a pid" do + @provider.expects(:getpid).returns "1234" + @provider.status.should == :running + end + it "should consider the service :stopped if it doesn't have a pid" do + @provider.expects(:getpid).returns nil + @provider.status.should == :stopped + end + end + end + + describe "when restarting" do + describe "when hasrestart is :true" do + before :each do + @resource.stubs(:[]).with(:hasrestart).returns :true + end + it "should execute the command" do + @provider.expects(:texecute).with(:restart, ['/service/path/myservice', :restart], true).returns("") + $?.stubs(:exitstatus).returns(0) + @provider.restart + end + end + describe "when hasrestart is not :true" do + it "should stop and restart the process" do + @provider.expects(:texecute).with(:stop, ['/service/path/myservice', :stop ], true).returns("") + @provider.expects(:texecute).with(:start,['/service/path/myservice', :start], true).returns("") + $?.stubs(:exitstatus).returns(0) + @provider.restart + end + end + end + end +end diff --git a/spec/unit/provider/service/redhat.rb b/spec/unit/provider/service/redhat.rb new file mode 100644 index 000000000..df2c93f57 --- /dev/null +++ b/spec/unit/provider/service/redhat.rb @@ -0,0 +1,127 @@ +#!/usr/bin/env ruby +# +# Unit testing for the RedHat service Provider +# + +require File.dirname(__FILE__) + '/../../../spec_helper' + +provider_class = Puppet::Type.type(:service).provider(:redhat) + +describe provider_class do + + before(:each) do + # Create a mock resource + @resource = stub 'resource' + + @provider = provider_class.new + # A catch all; no parameters set + @resource.stubs(:[]).returns(nil) + + # But set name, source and path (because we won't run + # the thing that will fetch the resource path from the provider) + @resource.stubs(:[]).with(:name).returns "myservice" + @resource.stubs(:[]).with(:ensure).returns :enabled + @resource.stubs(:[]).with(:path).returns ["/service/path","/alt/service/path"] + @resource.stubs(:ref).returns "Service[myservice]" + + @provider.stubs(:resource).returns @resource + @provider.resource = @resource + end + + it "should have a start method" do + @provider.should respond_to(:start) + end + + it "should have a stop method" do + @provider.should respond_to(:stop) + end + + it "should have a restart method" do + @provider.should respond_to(:restart) + end + + it "should have a status method" do + @provider.should respond_to(:status) + end + + it "should have an enabled? method" do + @provider.should respond_to(:enabled?) + end + + it "should have an enable method" do + @provider.should respond_to(:enable) + end + + it "should have a disable method" do + @provider.should respond_to(:disable) + end + + describe "when starting" do + it "should execute the service script with start" do + @provider.expects(:texecute).with(:start, ['/sbin/service', 'myservice', 'start'], true) + @provider.start + end + end + + describe "when stopping" do + it "should execute the init script with stop" do + @provider.expects(:texecute).with(:stop, ['/sbin/service', 'myservice', 'stop'], true) + @provider.stop + end + end + + describe "when checking status" do + describe "when hasstatus is :true" do + before :each do + @resource.stubs(:[]).with(:hasstatus).returns :true + end + it "should execute the command" do + @provider.expects(:texecute).with(:status, ['/sbin/service', 'myservice', 'status'], false) + @provider.status + end + it "should consider the process running if the command returns 0" do + @provider.expects(:texecute).with(:status, ['/sbin/service', 'myservice', 'status'], false) + $?.stubs(:exitstatus).returns(0) + @provider.status.should == :running + end + [-10,-1,1,10].each { |ec| + it "should consider the process stopped if the command returns something non-0" do + @provider.expects(:texecute).with(:status, ['/sbin/service', 'myservice', 'status'], false) + $?.stubs(:exitstatus).returns(ec) + @provider.status.should == :stopped + end + } + end + describe "when hasstatus is not :true" do + it "should consider the service :running if it has a pid" do + @provider.expects(:getpid).returns "1234" + @provider.status.should == :running + end + it "should consider the service :stopped if it doesn't have a pid" do + @provider.expects(:getpid).returns nil + @provider.status.should == :stopped + end + end + end + + describe "when restarting" do + describe "when hasrestart is :true" do + before :each do + @resource.stubs(:[]).with(:hasrestart).returns :true + end + it "should execute the command" do + @provider.expects(:texecute).with(:restart, ['/sbin/service', 'myservice', 'restart'], true) + $?.stubs(:exitstatus).returns(0) + @provider.restart + end + end + describe "when hasrestart is not :true" do + it "should stop and restart the process" do + @provider.expects(:texecute).with(:stop, ['/sbin/service', 'myservice', 'stop'], true) + @provider.expects(:texecute).with(:start, ['/sbin/service', 'myservice', 'start'], true) + $?.stubs(:exitstatus).returns(0) + @provider.restart + end + end + end +end |
