diff options
author | Mike Dodge <mikedodge04@fb.com> | 2015-03-12 18:33:44 -0700 |
---|---|---|
committer | Mike Dodge <mikedodge04@fb.com> | 2015-03-12 18:33:44 -0700 |
commit | 0486e802d5eb966d4da058a367527ed556df711a (patch) | |
tree | da82ff523c3427d0ffef8e41493a5c8f16a9c5f6 | |
parent | fd0bfd4c60c64888ff6f9d0e82e365f091b82347 (diff) | |
download | chef-0486e802d5eb966d4da058a367527ed556df711a.tar.gz |
added tests for 100% of use cases
-rw-r--r-- | spec/unit/provider/service/macosx_spec.rb | 394 |
1 files changed, 201 insertions, 193 deletions
diff --git a/spec/unit/provider/service/macosx_spec.rb b/spec/unit/provider/service/macosx_spec.rb index 830ac293c4..9607ac23ed 100644 --- a/spec/unit/provider/service/macosx_spec.rb +++ b/spec/unit/provider/service/macosx_spec.rb @@ -59,70 +59,77 @@ describe Chef::Provider::Service::Macosx do XML ["Daemon", "Agent"].each do |service_type| - before do - @service_name = 'io.redis.redis-server' - @plist = '/Library/LaunchDaemons/io.redis.redis-server.plist' - if service_type.include?('Agent') - @plist = '/Library/LaunchAgents/io.redis.redis-server.plist' - end - allow(node).to receive(:[]).with("platform_version").and_return('10.10') - allow(Etc).to receive(:getlogin).and_return('igor') - allow(Dir).to receive(:glob).and_return([@plist], []) - @su_cmd = 'su igor -c' - cmd = "launchctl list #{@service_name}" - allow(provider).to receive(:shell_out_with_systems_locale). - with(/(#{@su_cmd} '#{cmd}'|#{cmd})/). - and_return(double("Status", - :stdout => launchctl_stdout, :exitstatus => 0)) - allow(provider).to receive(:shell_out_with_systems_locale!). - with(/plutil -convert xml1 -o/). - and_return(double("Status", :stdout => plutil_stdout)) - end - - context "#{@service_name}" do - let(:new_resource) { Chef::Resource::MacosxService.new(@service_name) } - let!(:current_resource) { Chef::Resource::MacosxService.new(@service_name) } - - describe "#load_current_resource" do - - # CHEF-5223 "you can't glob for a file that hasn't been converged - # onto the node yet." - context "when the plist doesn't exist" do - - def run_resource_setup_for_action(action) - new_resource.action(action) - provider.action = action - provider.load_current_resource - provider.define_resource_requirements - provider.process_resource_requirements - end - - before do - allow(Dir).to receive(:glob).and_return([]) - allow(provider).to receive(:shell_out!). - with(/plutil -convert xml1 -o/). - and_raise(Mixlib::ShellOut::ShellCommandFailed) - end - - it "works for action :nothing" do - expect { run_resource_setup_for_action(:nothing) }.not_to raise_error - end - - it "works for action :start" do - expect { run_resource_setup_for_action(:start) }.not_to raise_error - end - - it "errors if action is :enable" do - expect { run_resource_setup_for_action(:enable) }.to raise_error(Chef::Exceptions::Service) - end - - it "errors if action is :disable" do - expect { run_resource_setup_for_action(:disable) }.to raise_error(Chef::Exceptions::Service) + ["redis-server", "io.redis.redis-server"].each do |service_name| + ["10.9", "10.10"].each do |platform_version| + let(:plist) {'/Library/LaunchDaemons/io.redis.redis-server.plist'} + let(:session) { StringIO.new } + if service_type == 'Agent' + let(:plist) {'/Library/LaunchAgents/io.redis.redis-server.plist'} + let(:session) {'-S Aqua '} + let(:su_cmd) {'su igor -c'} + if platform_version != "10.10" + let(:su_cmd) {'su -l igor -c'} end end + let(:service_label) {'io.redis.redis-server'} + before do + allow(Dir).to receive(:glob).and_return([plist], []) + allow(Etc).to receive(:getlogin).and_return('igor') + allow(node).to receive(:[]).with("platform_version").and_return(platform_version) + cmd = "launchctl list #{service_label}" + allow(provider).to receive(:shell_out_with_systems_locale). + with(/(#{su_cmd} '#{cmd}'|#{cmd})/). + and_return(double("Status", + :stdout => launchctl_stdout, :exitstatus => 0)) + allow(provider).to receive(:shell_out_with_systems_locale!). + with(/plutil -convert xml1 -o/). + and_return(double("Status", :stdout => plutil_stdout)) + end + + context "#{service_name} that is a #{service_type} running Osx #{platform_version}" do + let(:new_resource) { Chef::Resource::MacosxService.new(service_name) } + let!(:current_resource) { Chef::Resource::MacosxService.new(service_name) } + + describe "#load_current_resource" do + + # CHEF-5223 "you can't glob for a file that hasn't been converged + # onto the node yet." + context "when the plist doesn't exist" do + + def run_resource_setup_for_action(action) + new_resource.action(action) + provider.action = action + provider.load_current_resource + provider.define_resource_requirements + provider.process_resource_requirements + end + + before do + allow(Dir).to receive(:glob).and_return([]) + allow(provider).to receive(:shell_out!). + with(/plutil -convert xml1 -o/). + and_raise(Mixlib::ShellOut::ShellCommandFailed) + end + + it "works for action :nothing" do + expect { run_resource_setup_for_action(:nothing) }.not_to raise_error + end + + it "works for action :start" do + expect { run_resource_setup_for_action(:start) }.not_to raise_error + end + + it "errors if action is :enable" do + expect { run_resource_setup_for_action(:enable) }.to raise_error(Chef::Exceptions::Service) + end + + it "errors if action is :disable" do + expect { run_resource_setup_for_action(:disable) }.to raise_error(Chef::Exceptions::Service) + end + end - context "when launchctl returns pid in service list" do - let(:launchctl_stdout) { StringIO.new <<-SVC_LIST } + context "when launchctl returns pid in service list" do + let(:launchctl_stdout) { StringIO.new <<-SVC_LIST } { "LimitLoadToSessionType" = "System"; "Label" = "io.redis.redis-server"; @@ -138,21 +145,21 @@ XML }; SVC_LIST - before do - provider.load_current_resource - end + before do + provider.load_current_resource + end - it "sets resource running state to true" do - expect(provider.current_resource.running).to be_truthy - end + it "sets resource running state to true" do + expect(provider.current_resource.running).to be_truthy + end - it "sets resouce enabled state to true" do - expect(provider.current_resource.enabled).to be_truthy - end - end + it "sets resouce enabled state to true" do + expect(provider.current_resource.enabled).to be_truthy + end + end - describe "running unsupported actions" do - let(:launchctl_stdout) { StringIO.new <<-SVC_LIST } + describe "running unsupported actions" do + let(:launchctl_stdout) { StringIO.new <<-SVC_LIST } { "LimitLoadToSessionType" = "System"; "Label" = "io.redis.redis-server"; @@ -168,15 +175,15 @@ SVC_LIST }; SVC_LIST - before do - allow(Dir).to receive(:glob).and_return(["#{@plist}"], []) - end - it "should throw an exception when reload action is attempted" do - expect {provider.run_action(:reload)}.to raise_error(Chef::Exceptions::UnsupportedAction) - end - end - context "when launchctl returns empty service pid" do - let(:launchctl_stdout) { StringIO.new <<-SVC_LIST } + before do + allow(Dir).to receive(:glob).and_return(["#{plist}"], []) + end + it "should throw an exception when reload action is attempted" do + expect {provider.run_action(:reload)}.to raise_error(Chef::Exceptions::UnsupportedAction) + end + end + context "when launchctl returns empty service pid" do + let(:launchctl_stdout) { StringIO.new <<-SVC_LIST } { "LimitLoadToSessionType" = "System"; "Label" = "io.redis.redis-server"; @@ -191,147 +198,148 @@ SVC_LIST }; SVC_LIST - before do - provider.load_current_resource - end - - it "sets resource running state to false" do - expect(provider.current_resource.running).to be_falsey - end - - it "sets resouce enabled state to true" do - expect(provider.current_resource.enabled).to be_truthy - end - end - - context "when launchctl doesn't return service entry at all" do - let(:launchctl_stdout) { StringIO.new <<-SVC_LIST } - Could not find service "io.redis.redis-server" in domain for system - SVC_LIST + before do + provider.load_current_resource + end - it "sets service running state to false" do - provider.load_current_resource - expect(provider.current_resource.running).to be_falsey - end + it "sets resource running state to false" do + expect(provider.current_resource.running).to be_falsey + end - context "and plist for service is not available" do - before do - allow(Dir).to receive(:glob).and_return([]) - provider.load_current_resource + it "sets resouce enabled state to true" do + expect(provider.current_resource.enabled).to be_truthy + end end - it "sets resouce enabled state to false" do - expect(provider.current_resource.enabled).to be_falsey + context "when launchctl doesn't return service entry at all" do + let(:launchctl_stdout) { StringIO.new <<-SVC_LIST } +Could not find service "io.redis.redis-server" in domain for system +SVC_LIST + + it "sets service running state to false" do + provider.load_current_resource + expect(provider.current_resource.running).to be_falsey + end + + context "and plist for service is not available" do + before do + allow(Dir).to receive(:glob).and_return([]) + provider.load_current_resource + end + + it "sets resouce enabled state to false" do + expect(provider.current_resource.enabled).to be_falsey + end + end + + context "and plist for service is available" do + before do + allow(Dir).to receive(:glob).and_return(["#{plist}"], []) + provider.load_current_resource + end + + it "sets resouce enabled state to true" do + expect(provider.current_resource.enabled).to be_truthy + end + end + + describe "and several plists match service name" do + it "throws exception" do + allow(Dir).to receive(:glob).and_return(["#{plist}", + "/Users/wtf/something.plist"]) + provider.load_current_resource + provider.define_resource_requirements + expect { provider.process_resource_requirements }.to raise_error(Chef::Exceptions::Service) + end + end end end - - context "and plist for service is available" do + describe "#start_service" do before do - allow(Dir).to receive(:glob).and_return(["#{@plist}"], []) + allow(Chef::Resource::MacosxService).to receive(:new).and_return(current_resource) provider.load_current_resource + allow(current_resource).to receive(:running).and_return(false) end - it "sets resouce enabled state to true" do - expect(provider.current_resource.enabled).to be_truthy - end - end + it "calls the start command if one is specified and service is not running" do + allow(new_resource).to receive(:start_command).and_return("cowsay dirty") - describe "and several plists match service name" do - it "throws exception" do - allow(Dir).to receive(:glob).and_return(["#{@plist}", - "/Users/wtf/something.plist"]) - provider.load_current_resource - provider.define_resource_requirements - expect { provider.process_resource_requirements }.to raise_error(Chef::Exceptions::Service) + expect(provider).to receive(:shell_out_with_systems_locale!).with("cowsay dirty") + provider.start_service end - end - end - end - describe "#start_service" do - before do - allow(Chef::Resource::Service).to receive(:new).and_return(current_resource) - provider.load_current_resource - allow(current_resource).to receive(:running).and_return(false) - end - it "calls the start command if one is specified and service is not running" do - allow(new_resource).to receive(:start_command).and_return("cowsay dirty") + it "shows warning message if service is already running" do + allow(current_resource).to receive(:running).and_return(true) + expect(Chef::Log).to receive(:debug).with("macosx_service[#{service_name}] already running, not starting") - expect(provider).to receive(:shell_out_with_systems_locale!).with("cowsay dirty") - provider.start_service - end - - it "shows warning message if service is already running" do - allow(current_resource).to receive(:running).and_return(true) - expect(Chef::Log).to receive(:debug).with("macosx_service[#{@service_name}] already running, not starting") - - provider.start_service - end + provider.start_service + end - it "starts service via launchctl if service found" do - session_type = @plist.include?('Agent') ? "-S Aqua " : '' - cmd = 'launchctl load -w ' + session_type + @plist - expect(provider).to receive(:shell_out_with_systems_locale). - with(/(#{@su_cmd} .#{cmd}.|#{cmd})/). - and_return(0) + it "starts service via launchctl if service found" do + cmd = 'launchctl load -w ' + session + plist + expect(provider).to receive(:shell_out_with_systems_locale). + with(/(#{su_cmd} .#{cmd}.|#{cmd})/). + and_return(0) - provider.start_service - end - end + provider.start_service + end + end - describe "#stop_service" do - before do - allow(Chef::Resource::Service).to receive(:new).and_return(current_resource) + describe "#stop_service" do + before do + allow(Chef::Resource::MacosxService).to receive(:new).and_return(current_resource) - provider.load_current_resource - allow(current_resource).to receive(:running).and_return(true) - end + provider.load_current_resource + allow(current_resource).to receive(:running).and_return(true) + end - it "calls the stop command if one is specified and service is running" do - allow(new_resource).to receive(:stop_command).and_return("kill -9 123") + it "calls the stop command if one is specified and service is running" do + allow(new_resource).to receive(:stop_command).and_return("kill -9 123") - expect(provider).to receive(:shell_out_with_systems_locale!).with("kill -9 123") - provider.stop_service - end + expect(provider).to receive(:shell_out_with_systems_locale!).with("kill -9 123") + provider.stop_service + end - it "shows warning message if service is not running" do - allow(current_resource).to receive(:running).and_return(false) - expect(Chef::Log).to receive(:debug).with("macosx_service[#{@service_name}] not running, not stopping") + it "shows warning message if service is not running" do + allow(current_resource).to receive(:running).and_return(false) + expect(Chef::Log).to receive(:debug).with("macosx_service[#{service_name}] not running, not stopping") - provider.stop_service - end + provider.stop_service + end - it "stops the service via launchctl if service found" do - cmd = "launchctl unload -w #{@plist}" - expect(provider).to receive(:shell_out_with_systems_locale). - with(/(#{@su_cmd} .#{cmd}.|#{cmd})/). - and_return(0) + it "stops the service via launchctl if service found" do + cmd = 'launchctl unload -w '+ plist + expect(provider).to receive(:shell_out_with_systems_locale). + with(/(#{su_cmd} .#{cmd}.|#{cmd})/). + and_return(0) - provider.stop_service - end - end + provider.stop_service + end + end - describe "#restart_service" do - before do - allow(Chef::Resource::Service).to receive(:new).and_return(current_resource) + describe "#restart_service" do + before do + allow(Chef::Resource::Service).to receive(:new).and_return(current_resource) - provider.load_current_resource - allow(current_resource).to receive(:running).and_return(true) - allow(provider).to receive(:sleep) - end + provider.load_current_resource + allow(current_resource).to receive(:running).and_return(true) + allow(provider).to receive(:sleep) + end - it "issues a command if given" do - allow(new_resource).to receive(:restart_command).and_return("reload that thing") + it "issues a command if given" do + allow(new_resource).to receive(:restart_command).and_return("reload that thing") - expect(provider).to receive(:shell_out_with_systems_locale!).with("reload that thing") - provider.restart_service - end + expect(provider).to receive(:shell_out_with_systems_locale!).with("reload that thing") + provider.restart_service + end - it "stops and then starts service" do - expect(provider).to receive(:unload_service) - expect(provider).to receive(:load_service); + it "stops and then starts service" do + expect(provider).to receive(:unload_service) + expect(provider).to receive(:load_service); - provider.restart_service + provider.restart_service + end + end end end end |