move Mixlib::ShellOut stubbing code to separate module
It was not specific to Pacemaker in any way, yet was previously in Chef::RSpec::Pacemaker::CIBObject, in a file alongside other Pacemaker-specific code.
This commit is contained in:
@@ -4,76 +4,10 @@ require 'mixlib/shellout'
|
||||
|
||||
this_dir = File.dirname(__FILE__)
|
||||
require File.expand_path('../../libraries/pacemaker/cib_object', this_dir)
|
||||
|
||||
module Chef::RSpec
|
||||
module Pacemaker
|
||||
module CIBObject
|
||||
# Return a Mixlib::ShellOut double which mimics successful
|
||||
# execution of a command, returning the given string on STDOUT.
|
||||
def succeeding_shellout_double(string)
|
||||
shellout = double(Mixlib::ShellOut)
|
||||
shellout.stub(:environment).and_return({})
|
||||
shellout.stub(:run_command)
|
||||
shellout.stub(:error!)
|
||||
expect(shellout).to receive(:stdout).and_return(string)
|
||||
shellout
|
||||
end
|
||||
|
||||
# Return a Mixlib::ShellOut double which mimics failed
|
||||
# execution of a command, raising an exception when #error! is
|
||||
# called. We expect #error! to be called, because if it isn't,
|
||||
# that probably indicates the code isn't robust enough. This
|
||||
# may need to be relaxed in the future.
|
||||
def failing_shellout_double(stdout='', stderr='', exitstatus=1)
|
||||
shellout = double(Mixlib::ShellOut)
|
||||
shellout.stub(:environment).and_return({})
|
||||
shellout.stub(:run_command)
|
||||
shellout.stub(:stdout).and_return(stdout)
|
||||
shellout.stub(:stderr).and_return(stderr)
|
||||
shellout.stub(:exitstatus).and_return(exitstatus)
|
||||
exception = Mixlib::ShellOut::ShellCommandFailed.new(
|
||||
"Expected process to exit with 0, " +
|
||||
"but received '#{exitstatus}'"
|
||||
)
|
||||
expect(shellout).to receive(:error!).and_raise(exception)
|
||||
shellout
|
||||
end
|
||||
|
||||
# This stubs Mixlib::ShellOut.new with a sequence of doubles
|
||||
# with a corresponding sequence of behaviours. This allows us
|
||||
# to simulate the output of a series of shell commands being run
|
||||
# via Mixlib::ShellOut. Each double either mimics a successful
|
||||
# command execution whose #stdout method returns the given
|
||||
# string, or a failed execution with the given exit code and
|
||||
# STDOUT/STDERR.
|
||||
#
|
||||
# results is an Array describing the sequence of behaviours;
|
||||
# each element is either a string mimicking STDOUT from
|
||||
# successful command execution, or a [stdout, stderr, exitcode]
|
||||
# status mimicking command execution failure.
|
||||
#
|
||||
# For example, "crm configure show" is executed by
|
||||
# #load_current_resource, and again later on for the :create
|
||||
# action, to see whether to create or modify. So the first
|
||||
# double in the sequence would return an empty definition if we
|
||||
# wanted to test creation of a new CIB object, or an existing
|
||||
# definition if we wanted to test modification of an existing
|
||||
# one. If the test needs subsequent doubles to return different
|
||||
# values then stdout_strings can have more than one element.
|
||||
def stub_shellout(*results)
|
||||
doubles = results.map { |result|
|
||||
result.is_a?(String) ?
|
||||
succeeding_shellout_double(result)
|
||||
: failing_shellout_double(*result)
|
||||
}
|
||||
Mixlib::ShellOut.stub(:new).and_return(*doubles)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
require File.expand_path('shellout', this_dir)
|
||||
|
||||
shared_examples "a CIB object" do
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
include Chef::RSpec::Mixlib::ShellOut
|
||||
|
||||
def expect_to_match_fixture(obj)
|
||||
expect(obj.class).to eq(pacemaker_object_class)
|
||||
|
@@ -1,7 +1,8 @@
|
||||
# Shared code used to test providers of CIB objects
|
||||
|
||||
this_dir = File.dirname(__FILE__)
|
||||
require File.expand_path('../helpers/cib_object', this_dir)
|
||||
require File.expand_path('shellout', this_dir)
|
||||
require File.expand_path('cib_object', this_dir)
|
||||
|
||||
shared_context "a Pacemaker LWRP" do
|
||||
before(:each) do
|
||||
@@ -26,6 +27,8 @@ end
|
||||
module Chef::RSpec
|
||||
module Pacemaker
|
||||
module CIBObject
|
||||
include Chef::RSpec::Mixlib::ShellOut
|
||||
|
||||
def test_modify(expected_cmds)
|
||||
yield
|
||||
|
||||
@@ -43,7 +46,7 @@ module Chef::RSpec
|
||||
end
|
||||
|
||||
shared_examples "action on non-existent resource" do |action, cmd, expected_error|
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
include Chef::RSpec::Mixlib::ShellOut
|
||||
|
||||
it "should not attempt to #{action.to_s} a non-existent resource" do
|
||||
stub_shellout("")
|
||||
|
@@ -4,7 +4,8 @@
|
||||
# and stopped) but constraints cannot.
|
||||
|
||||
this_dir = File.dirname(__FILE__)
|
||||
require File.expand_path('../helpers/provider', this_dir)
|
||||
require File.expand_path('provider', this_dir)
|
||||
require File.expand_path('shellout', this_dir)
|
||||
|
||||
shared_examples "a runnable resource" do |fixture|
|
||||
def expect_running(running)
|
||||
@@ -13,6 +14,8 @@ shared_examples "a runnable resource" do |fixture|
|
||||
.and_return(running)
|
||||
end
|
||||
|
||||
include Chef::RSpec::Mixlib::ShellOut
|
||||
|
||||
describe ":delete action" do
|
||||
it_should_behave_like "action on non-existent resource", \
|
||||
:delete, "crm configure delete #{fixture.name}", nil
|
||||
|
68
spec/helpers/shellout.rb
Normal file
68
spec/helpers/shellout.rb
Normal file
@@ -0,0 +1,68 @@
|
||||
require 'mixlib/shellout'
|
||||
|
||||
module Chef::RSpec
|
||||
module Mixlib
|
||||
module ShellOut
|
||||
# Return a Mixlib::ShellOut double which mimics successful
|
||||
# execution of a command, returning the given string on STDOUT.
|
||||
def succeeding_shellout_double(string)
|
||||
shellout = double(Mixlib::ShellOut)
|
||||
shellout.stub(:environment).and_return({})
|
||||
shellout.stub(:run_command)
|
||||
shellout.stub(:error!)
|
||||
expect(shellout).to receive(:stdout).and_return(string)
|
||||
shellout
|
||||
end
|
||||
|
||||
# Return a Mixlib::ShellOut double which mimics failed
|
||||
# execution of a command, raising an exception when #error! is
|
||||
# called. We expect #error! to be called, because if it isn't,
|
||||
# that probably indicates the code isn't robust enough. This
|
||||
# may need to be relaxed in the future.
|
||||
def failing_shellout_double(stdout='', stderr='', exitstatus=1)
|
||||
shellout = double(Mixlib::ShellOut)
|
||||
shellout.stub(:environment).and_return({})
|
||||
shellout.stub(:run_command)
|
||||
shellout.stub(:stdout).and_return(stdout)
|
||||
shellout.stub(:stderr).and_return(stderr)
|
||||
shellout.stub(:exitstatus).and_return(exitstatus)
|
||||
exception = ::Mixlib::ShellOut::ShellCommandFailed.new(
|
||||
"Expected process to exit with 0, " +
|
||||
"but received '#{exitstatus}'"
|
||||
)
|
||||
expect(shellout).to receive(:error!).and_raise(exception)
|
||||
shellout
|
||||
end
|
||||
|
||||
# This stubs Mixlib::ShellOut.new with a sequence of doubles
|
||||
# with a corresponding sequence of behaviours. This allows us
|
||||
# to simulate the output of a series of shell commands being run
|
||||
# via Mixlib::ShellOut. Each double either mimics a successful
|
||||
# command execution whose #stdout method returns the given
|
||||
# string, or a failed execution with the given exit code and
|
||||
# STDOUT/STDERR.
|
||||
#
|
||||
# results is an Array describing the sequence of behaviours;
|
||||
# each element is either a string mimicking STDOUT from
|
||||
# successful command execution, or a [stdout, stderr, exitcode]
|
||||
# status mimicking command execution failure.
|
||||
#
|
||||
# For example, "crm configure show" is executed by
|
||||
# #load_current_resource, and again later on for the :create
|
||||
# action, to see whether to create or modify. So the first
|
||||
# double in the sequence would return an empty definition if we
|
||||
# wanted to test creation of a new CIB object, or an existing
|
||||
# definition if we wanted to test modification of an existing
|
||||
# one. If the test needs subsequent doubles to return different
|
||||
# values then stdout_strings can have more than one element.
|
||||
def stub_shellout(*results)
|
||||
doubles = results.map { |result|
|
||||
result.is_a?(String) ?
|
||||
succeeding_shellout_double(result)
|
||||
: failing_shellout_double(*result)
|
||||
}
|
||||
::Mixlib::ShellOut.stub(:new).and_return(*doubles)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
@@ -27,8 +27,6 @@ describe "Chef::Provider::PacemakerClone" do
|
||||
Pacemaker::Resource::Clone
|
||||
end
|
||||
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
describe ":create action" do
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
|
@@ -27,8 +27,6 @@ describe "Chef::Provider::PacemakerColocation" do
|
||||
Pacemaker::Constraint::Colocation
|
||||
end
|
||||
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
describe ":create action" do
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
|
@@ -27,8 +27,6 @@ describe "Chef::Provider::PacemakerGroup" do
|
||||
Pacemaker::Resource::Group
|
||||
end
|
||||
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
describe ":create action" do
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
|
@@ -27,8 +27,6 @@ describe "Chef::Provider::PacemakerLocation" do
|
||||
Pacemaker::Constraint::Location
|
||||
end
|
||||
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
describe ":create action" do
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
|
@@ -27,8 +27,6 @@ describe "Chef::Provider::PacemakerMs" do
|
||||
Pacemaker::Resource::MasterSlave
|
||||
end
|
||||
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
describe ":create action" do
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
|
@@ -27,10 +27,9 @@ describe "Chef::Provider::PacemakerPrimitive" do
|
||||
Pacemaker::Resource::Primitive
|
||||
end
|
||||
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
|
||||
describe ":create action" do
|
||||
include Chef::RSpec::Pacemaker::CIBObject
|
||||
include Chef::RSpec::Mixlib::ShellOut
|
||||
|
||||
it "should modify the primitive if it has different params" do
|
||||
expected_configure_cmd_args = [
|
||||
|
Reference in New Issue
Block a user