summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormcquin <claire@chef.io>2016-03-31 12:25:36 -0700
committermcquin <claire@chef.io>2016-04-01 10:05:43 -0700
commitd0a2ad5f353ca10b92bf1f1d01e6e8fdfb4dcbc5 (patch)
tree8f33a49e5f69e760fc1242cb069c0a66405ec236
parent51f96b21e2fccf52fb0d717971bc6efd39611483 (diff)
downloadohai-d0a2ad5f353ca10b92bf1f1d01e6e8fdfb4dcbc5.tar.gz
Add tests and revise logging
-rw-r--r--lib/ohai/mixin/command.rb22
-rw-r--r--spec/unit/mixin/command_spec.rb128
2 files changed, 131 insertions, 19 deletions
diff --git a/lib/ohai/mixin/command.rb b/lib/ohai/mixin/command.rb
index a27dff21..6823ccf2 100644
--- a/lib/ohai/mixin/command.rb
+++ b/lib/ohai/mixin/command.rb
@@ -28,27 +28,21 @@ require "mixlib/shellout"
module Ohai
module Mixin
module Command
+ # DISCLAIMER: Logging only works in the context of a plugin!!
# accept a command and any of the mixlib-shellout options
def shell_out(cmd, **options)
# unless specified by the caller timeout after 30 seconds
- options[:timeout] = 30 unless options[:timeout]
- m = Mixlib::ShellOut.new(cmd, options)
+ options[:timeout] ||= 30
+ so = Mixlib::ShellOut.new(cmd, options)
begin
- m.run_command
-
- # we should really fail here on non-0, but historically we haven't so we can't now
- if m.exitstatus == 0
- Ohai::Log.debug("Plugin #{self.name} successfully ran command #{cmd}")
- else
- Ohai::Log.debug("Plugin #{self.name} command #{cmd} returned status #{m.exitstatus}")
- end
-
- m
+ so.run_command
+ Ohai::Log.debug("Plugin #{self.name} ran '#{cmd}' and returned #{so.exitstatus}")
+ so
rescue Errno::ENOENT => e
- Ohai::Log.debug("Plugin #{self.name} failed to run command #{cmd}")
+ Ohai::Log.debug("Plugin #{self.name} ran '#{cmd}' and failed #{e.inspect}")
raise Ohai::Exceptions::Exec, e
rescue Mixlib::ShellOut::CommandTimeout => e
- Ohai::Log.debug("Plugin #{self.name} timed out after #{options[:timeout]}s running command #{cmd}")
+ Ohai::Log.debug("Plugin #{self.name} ran '#{cmd}' and timed out after #{options[:timeout]} seconds")
raise Ohai::Exceptions::Exec, e
end
end
diff --git a/spec/unit/mixin/command_spec.rb b/spec/unit/mixin/command_spec.rb
index 97180d06..7a326820 100644
--- a/spec/unit/mixin/command_spec.rb
+++ b/spec/unit/mixin/command_spec.rb
@@ -30,7 +30,7 @@ describe Ohai::Mixin::Command, "popen4" do
end
it "should respect locale when specified explicitly" do
- Ohai::Mixin::Command.popen4("echo $LC_ALL", :environment => { "LC_ALL" => "es" }) do |pid, stdin, stdout, stderr|
+ Ohai::Mixin::Command.popen4("echo $LC_ALL", :environment => { "LC_ALL" => "es" }) do |pid, stdin, stdout, stderr|
stdin.close
expect(stdout.read.strip).to eq("es")
end
@@ -52,14 +52,14 @@ describe Ohai::Mixin::Command, "popen4" do
it "should force encode the string to UTF-8" do
extend Ohai::Mixin::Command
- snowy = run_command(:command => ("echo '" + ("☃" * 8096) + "'"))[1]
+ snowy = run_command(:command => ("echo "" + ("☃" * 8096) + """))[1]
expect(snowy.encoding).to eq(Encoding::UTF_8)
end
end
it "should force encode the string to UTF-8" do
extend Ohai::Mixin::Command
- snowy = run_command(:command => ("echo '" + ("☃" * 8096) + "'"))[1]
+ snowy = run_command(:command => ("echo "" + ("☃" * 8096) + """))[1]
expect(snowy.encoding).to eq(Encoding::UTF_8)
end
end
@@ -72,7 +72,7 @@ describe Ohai::Mixin::Command, "popen4" do
created_procs = 0
100.times do
begin
- Ohai::Mixin::Command.popen4("/bin/this-is-not-a-real-command") { |p, i, o, e| nil }
+ Ohai::Mixin::Command.popen4("/bin/this-is-not-a-real-command") { |p, i, o, e| nil }
rescue Ohai::Exceptions::Exec
created_procs += 1
end
@@ -80,10 +80,128 @@ describe Ohai::Mixin::Command, "popen4" do
expect(created_procs).to eq(100)
reaped_procs = 0
begin
- loop { Process.wait(-1); reaped_procs += 1 }
+ loop { Process.wait(-1); reaped_procs += 1 }
rescue Errno::ECHILD
end
expect(reaped_procs).to eq(0)
end
+end
+
+describe Ohai::Mixin::Command, "shell_out" do
+ let(:cmd) { 'sparkle-dream --version' }
+
+ let(:shell_out) { double("Mixlib::ShellOut") }
+
+ let(:plugin_name) { :OSSparkleDream }
+
+ before(:each) do
+ allow(Ohai::Mixin::Command).to receive(:name).and_return(plugin_name)
+ end
+
+ describe "when the command runs" do
+ it "logs the command and exitstatus" do
+ expect(Mixlib::ShellOut).
+ to receive(:new).
+ with(cmd, { timeout: 30 }).
+ and_return(shell_out)
+
+ expect(shell_out).
+ to receive(:run_command)
+
+ expect(shell_out).
+ to receive(:exitstatus).
+ and_return(256)
+
+ expect(Ohai::Log).to receive(:debug).
+ with("Plugin OSSparkleDream ran 'sparkle-dream --version' and returned 256")
+
+ Ohai::Mixin::Command.shell_out(cmd)
+ end
+ end
+
+ describe "when the command does not exist" do
+ it "logs the command and error message" do
+ expect(Mixlib::ShellOut).
+ to receive(:new).
+ with(cmd, { timeout: 30 }).
+ and_return(shell_out)
+
+ expect(shell_out).
+ to receive(:run_command).
+ and_raise(Errno::ENOENT, "sparkle-dream")
+
+ expect(Ohai::Log).
+ to receive(:debug).
+ with("Plugin OSSparkleDream ran 'sparkle-dream --version' and failed " \
+ "#<Errno::ENOENT: No such file or directory - sparkle-dream>")
+
+ expect{ Ohai::Mixin::Command.shell_out(cmd) }.
+ to raise_error(Ohai::Exceptions::Exec)
+ end
+ end
+ describe "when the command times out" do
+ it "logs the command an timeout error message" do
+ expect(Mixlib::ShellOut).
+ to receive(:new).
+ with(cmd, { timeout: 30 }).
+ and_return(shell_out)
+
+ expect(shell_out).
+ to receive(:run_command).
+ and_raise(Mixlib::ShellOut::CommandTimeout)
+
+ expect(Ohai::Log).
+ to receive(:debug).
+ with("Plugin OSSparkleDream ran 'sparkle-dream --version' and timed " \
+ "out after 30 seconds")
+
+ expect{ Ohai::Mixin::Command.shell_out(cmd) }.
+ to raise_error(Ohai::Exceptions::Exec)
+ end
+ end
+
+ describe "when a timeout option is provided" do
+ let(:options) { {timeout: 10} }
+
+ it "runs the command with the provided timeout" do
+ expect(Mixlib::ShellOut).
+ to receive(:new).
+ with(cmd, options).
+ and_return(shell_out)
+
+ expect(shell_out).
+ to receive(:run_command)
+
+ expect(shell_out).
+ to receive(:exitstatus).
+ and_return(256)
+
+ expect(Ohai::Log).to receive(:debug).
+ with("Plugin OSSparkleDream ran 'sparkle-dream --version' and returned 256")
+
+ Ohai::Mixin::Command.shell_out(cmd, options)
+ end
+
+ describe "when the command times out" do
+ it "logs the command an timeout error message" do
+ expect(Mixlib::ShellOut).
+ to receive(:new).
+ with(cmd, options).
+ and_return(shell_out)
+
+ expect(shell_out).
+ to receive(:run_command).
+ and_raise(Mixlib::ShellOut::CommandTimeout)
+
+ expect(Ohai::Log).
+ to receive(:debug).
+ with("Plugin OSSparkleDream ran 'sparkle-dream --version' and timed " \
+ "out after 10 seconds")
+
+ expect{ Ohai::Mixin::Command.shell_out(cmd, options) }.
+ to raise_error(Ohai::Exceptions::Exec)
+ end
+ end
+ end
end