summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Dodge <mikedodge04@fb.com>2015-03-12 18:33:44 -0700
committerMike Dodge <mikedodge04@fb.com>2015-03-12 18:33:44 -0700
commit0486e802d5eb966d4da058a367527ed556df711a (patch)
treeda82ff523c3427d0ffef8e41493a5c8f16a9c5f6
parentfd0bfd4c60c64888ff6f9d0e82e365f091b82347 (diff)
downloadchef-0486e802d5eb966d4da058a367527ed556df711a.tar.gz
added tests for 100% of use cases
-rw-r--r--spec/unit/provider/service/macosx_spec.rb394
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