beaker 0.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +15 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.simplecov +14 -0
- data/DOCUMENTING.md +167 -0
- data/Gemfile +3 -0
- data/LICENSE +17 -0
- data/README.md +332 -0
- data/Rakefile +121 -0
- data/beaker.gemspec +42 -0
- data/beaker.rb +10 -0
- data/bin/beaker +9 -0
- data/lib/beaker.rb +36 -0
- data/lib/beaker/answers.rb +29 -0
- data/lib/beaker/answers/version28.rb +104 -0
- data/lib/beaker/answers/version30.rb +194 -0
- data/lib/beaker/cli.rb +113 -0
- data/lib/beaker/command.rb +241 -0
- data/lib/beaker/command_factory.rb +21 -0
- data/lib/beaker/dsl.rb +85 -0
- data/lib/beaker/dsl/assertions.rb +87 -0
- data/lib/beaker/dsl/helpers.rb +625 -0
- data/lib/beaker/dsl/install_utils.rb +299 -0
- data/lib/beaker/dsl/outcomes.rb +99 -0
- data/lib/beaker/dsl/roles.rb +97 -0
- data/lib/beaker/dsl/structure.rb +63 -0
- data/lib/beaker/dsl/wrappers.rb +100 -0
- data/lib/beaker/host.rb +193 -0
- data/lib/beaker/host/aix.rb +15 -0
- data/lib/beaker/host/aix/file.rb +16 -0
- data/lib/beaker/host/aix/group.rb +35 -0
- data/lib/beaker/host/aix/user.rb +32 -0
- data/lib/beaker/host/unix.rb +54 -0
- data/lib/beaker/host/unix/exec.rb +15 -0
- data/lib/beaker/host/unix/file.rb +16 -0
- data/lib/beaker/host/unix/group.rb +40 -0
- data/lib/beaker/host/unix/pkg.rb +22 -0
- data/lib/beaker/host/unix/user.rb +32 -0
- data/lib/beaker/host/windows.rb +44 -0
- data/lib/beaker/host/windows/exec.rb +18 -0
- data/lib/beaker/host/windows/file.rb +15 -0
- data/lib/beaker/host/windows/group.rb +36 -0
- data/lib/beaker/host/windows/pkg.rb +26 -0
- data/lib/beaker/host/windows/user.rb +32 -0
- data/lib/beaker/hypervisor.rb +37 -0
- data/lib/beaker/hypervisor/aixer.rb +52 -0
- data/lib/beaker/hypervisor/blimper.rb +123 -0
- data/lib/beaker/hypervisor/fusion.rb +56 -0
- data/lib/beaker/hypervisor/solaris.rb +65 -0
- data/lib/beaker/hypervisor/vagrant.rb +118 -0
- data/lib/beaker/hypervisor/vcloud.rb +175 -0
- data/lib/beaker/hypervisor/vsphere.rb +80 -0
- data/lib/beaker/hypervisor/vsphere_helper.rb +200 -0
- data/lib/beaker/logger.rb +167 -0
- data/lib/beaker/network_manager.rb +73 -0
- data/lib/beaker/options_parsing.rb +323 -0
- data/lib/beaker/result.rb +55 -0
- data/lib/beaker/shared.rb +15 -0
- data/lib/beaker/shared/error_handler.rb +17 -0
- data/lib/beaker/shared/host_handler.rb +46 -0
- data/lib/beaker/shared/repetition.rb +28 -0
- data/lib/beaker/ssh_connection.rb +198 -0
- data/lib/beaker/test_case.rb +225 -0
- data/lib/beaker/test_config.rb +148 -0
- data/lib/beaker/test_suite.rb +288 -0
- data/lib/beaker/utils.rb +7 -0
- data/lib/beaker/utils/ntp_control.rb +42 -0
- data/lib/beaker/utils/repo_control.rb +92 -0
- data/lib/beaker/utils/setup_helper.rb +77 -0
- data/lib/beaker/utils/validator.rb +27 -0
- data/spec/beaker/command_spec.rb +94 -0
- data/spec/beaker/dsl/assertions_spec.rb +104 -0
- data/spec/beaker/dsl/helpers_spec.rb +230 -0
- data/spec/beaker/dsl/install_utils_spec.rb +70 -0
- data/spec/beaker/dsl/outcomes_spec.rb +43 -0
- data/spec/beaker/dsl/roles_spec.rb +86 -0
- data/spec/beaker/dsl/structure_spec.rb +60 -0
- data/spec/beaker/dsl/wrappers_spec.rb +52 -0
- data/spec/beaker/host_spec.rb +95 -0
- data/spec/beaker/logger_spec.rb +117 -0
- data/spec/beaker/options_parsing_spec.rb +37 -0
- data/spec/beaker/puppet_command_spec.rb +128 -0
- data/spec/beaker/ssh_connection_spec.rb +39 -0
- data/spec/beaker/test_case_spec.rb +6 -0
- data/spec/beaker/test_suite_spec.rb +44 -0
- data/spec/mocks_and_helpers.rb +34 -0
- data/spec/spec_helper.rb +15 -0
- metadata +359 -0
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ClassMixedWithDSLInstallUtils
|
4
|
+
include Beaker::DSL::InstallUtils
|
5
|
+
include Beaker::DSL::Structure
|
6
|
+
end
|
7
|
+
|
8
|
+
describe ClassMixedWithDSLInstallUtils do
|
9
|
+
context 'extract_repo_info_from' do
|
10
|
+
[{:protocol => 'git', :path => 'git://github.com/puppetlabs/project.git'},
|
11
|
+
{:protocol => 'ssh', :path => 'git@github.com:puppetlabs/project.git'},
|
12
|
+
{:protocol => 'https', :path => 'https://github.com:puppetlabs/project'},
|
13
|
+
{:protocol => 'file', :path => 'file:///home/example/project'}
|
14
|
+
].each do |type|
|
15
|
+
it "handles #{type[:protocol]} uris" do
|
16
|
+
uri = "#{type[:path]}#master"
|
17
|
+
repo_info = subject.extract_repo_info_from uri
|
18
|
+
expect(repo_info[:name]).to be == 'project'
|
19
|
+
expect(repo_info[:path]).to be == type[:path]
|
20
|
+
expect(repo_info[:rev]).to be == 'master'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
context 'order_packages' do
|
26
|
+
it 'orders facter, hiera before puppet, before anything else' do
|
27
|
+
named_repos = [
|
28
|
+
{:name => 'puppet_plugin'}, {:name => 'puppet'}, {:name => 'facter'}
|
29
|
+
]
|
30
|
+
ordered_repos = subject.order_packages named_repos
|
31
|
+
expect( ordered_repos[0][:name] ).to be == 'facter'
|
32
|
+
expect( ordered_repos[1][:name] ).to be == 'puppet'
|
33
|
+
expect( ordered_repos[2][:name] ).to be == 'puppet_plugin'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'find_git_repo_versions' do
|
38
|
+
it 'returns a hash of :name => version' do
|
39
|
+
host = stub('Host')
|
40
|
+
repository = {:name => 'name'}
|
41
|
+
path = '/path/to/repo'
|
42
|
+
cmd = 'cd /path/to/repo/name && git describe || true'
|
43
|
+
logger = double.as_null_object
|
44
|
+
|
45
|
+
subject.should_receive( :logger ).and_return( logger )
|
46
|
+
subject.should_receive( :on ).with(host, cmd).and_yield
|
47
|
+
subject.should_receive( :stdout ).and_return( '2' )
|
48
|
+
|
49
|
+
version = subject.find_git_repo_versions(host, path, repository)
|
50
|
+
|
51
|
+
expect(version).to be == {'name' => '2'}
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
context 'install_from_git' do
|
56
|
+
it 'does a ton of stuff it probably shouldnt' do
|
57
|
+
repo = { :name => 'puppet',
|
58
|
+
:path => 'git://my.server.net/puppet.git',
|
59
|
+
:rev => 'master' }
|
60
|
+
path = '/path/to/repos'
|
61
|
+
host = { 'platform' => 'debian' }
|
62
|
+
logger = double.as_null_object
|
63
|
+
|
64
|
+
subject.should_receive( :logger ).any_number_of_times.and_return( logger )
|
65
|
+
subject.should_receive( :on ).exactly( 4 ).times
|
66
|
+
|
67
|
+
subject.install_from_git( host, path, repo )
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ClassMixedWithDSLOutcomes
|
4
|
+
include Beaker::DSL::Outcomes
|
5
|
+
end
|
6
|
+
|
7
|
+
describe ClassMixedWithDSLOutcomes do
|
8
|
+
let(:logger) { double }
|
9
|
+
before { subject.stub( :logger ).and_return( logger ) }
|
10
|
+
|
11
|
+
describe '#pass_test' do
|
12
|
+
it "logs the notification passed to it and raises PassTest" do
|
13
|
+
logger.should_receive( :notify ).with( /blah/ )
|
14
|
+
expect { subject.pass_test('blah') }.
|
15
|
+
to raise_error Beaker::DSL::Outcomes::PassTest
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe '#skip_test' do
|
20
|
+
it "logs the notification passed to it and raises SkipTest" do
|
21
|
+
logger.should_receive( :notify ).with( /blah/ )
|
22
|
+
expect { subject.skip_test('blah') }.
|
23
|
+
to raise_error Beaker::DSL::Outcomes::SkipTest
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe '#pending_test' do
|
28
|
+
it "logs the notification passed to it and raises PendingTest" do
|
29
|
+
logger.should_receive( :warn ).with( /blah/ )
|
30
|
+
expect { subject.pending_test('blah') }.
|
31
|
+
to raise_error Beaker::DSL::Outcomes::PendingTest
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
describe '#fail_test' do
|
36
|
+
it "logs the notification passed to it and raises FailTest" do
|
37
|
+
logger.should_receive( :warn )
|
38
|
+
logger.should_receive( :pretty_backtrace )
|
39
|
+
expect { subject.fail_test('blah') }.
|
40
|
+
to raise_error Beaker::DSL::Outcomes::FailTest
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
|
4
|
+
class ClassMixedWithDSLRoles
|
5
|
+
include Beaker::DSL::Roles
|
6
|
+
include Beaker::DSL::Outcomes
|
7
|
+
end
|
8
|
+
|
9
|
+
describe ClassMixedWithDSLRoles do
|
10
|
+
|
11
|
+
let(:hosts) { @hosts || Hash.new }
|
12
|
+
let(:agent1) { {'roles' => [ 'agent' ] } }
|
13
|
+
let(:agent2) { {'roles' => [ 'agent' ] } }
|
14
|
+
let(:a_and_dash) { {'roles' => [ 'agent', 'dashboard' ] } }
|
15
|
+
let(:custom) { {'roles' => [ 'custome_role' ] } }
|
16
|
+
let(:db) { {'roles' => [ 'database' ] } }
|
17
|
+
let(:master) { {'roles' => [ 'master', 'agent' ] } }
|
18
|
+
let(:monolith) do
|
19
|
+
{'roles' => [ 'agent', 'dashboard', 'database', 'master', 'custom_role' ] }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#agents' do
|
23
|
+
it 'returns an array of hosts that are agents' do
|
24
|
+
@hosts = [ agent1, agent2, master ]
|
25
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
26
|
+
expect( subject.agents ).to be == [ agent1, agent2, master ]
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'and an empty array when none match' do
|
30
|
+
@hosts = [ db, custom ]
|
31
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
32
|
+
expect( subject.agents ).to be == []
|
33
|
+
end
|
34
|
+
end
|
35
|
+
describe '#master' do
|
36
|
+
it 'returns the master if there is one' do
|
37
|
+
@hosts = [ master, agent1 ]
|
38
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
39
|
+
expect( subject.master ).to be == master
|
40
|
+
end
|
41
|
+
it 'raises an error if there is more than one master' do
|
42
|
+
@hosts = [ master, monolith ]
|
43
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
44
|
+
expect { subject.master }.to raise_error Beaker::DSL::FailTest
|
45
|
+
end
|
46
|
+
it 'and raises an error if there is no master' do
|
47
|
+
@hosts = [ agent1, agent2, custom ]
|
48
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
49
|
+
expect { subject.master }.to raise_error Beaker::DSL::FailTest
|
50
|
+
end
|
51
|
+
end
|
52
|
+
describe '#dashboard' do
|
53
|
+
it 'returns the dashboard if there is one' do
|
54
|
+
@hosts = [ a_and_dash, agent1 ]
|
55
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
56
|
+
expect( subject.dashboard ).to be == a_and_dash
|
57
|
+
end
|
58
|
+
it 'raises an error if there is more than one dashboard' do
|
59
|
+
@hosts = [ a_and_dash, monolith ]
|
60
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
61
|
+
expect { subject.dashboard }.to raise_error Beaker::DSL::FailTest
|
62
|
+
end
|
63
|
+
it 'and raises an error if there is no dashboard' do
|
64
|
+
@hosts = [ agent1, agent2, custom ]
|
65
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
66
|
+
expect { subject.dashboard }.to raise_error Beaker::DSL::FailTest
|
67
|
+
end
|
68
|
+
end
|
69
|
+
describe '#database' do
|
70
|
+
it 'returns the database if there is one' do
|
71
|
+
@hosts = [ db, agent1 ]
|
72
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
73
|
+
expect( subject.database ).to be == db
|
74
|
+
end
|
75
|
+
it 'raises an error if there is more than one database' do
|
76
|
+
@hosts = [ db, monolith ]
|
77
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
78
|
+
expect { subject.database }.to raise_error Beaker::DSL::FailTest
|
79
|
+
end
|
80
|
+
it 'and raises an error if there is no database' do
|
81
|
+
@hosts = [ agent1, agent2, custom ]
|
82
|
+
subject.should_receive( :hosts ).and_return( hosts )
|
83
|
+
expect { subject.database }.to raise_error Beaker::DSL::FailTest
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ClassMixedWithDSLStructure
|
4
|
+
include Beaker::DSL::Structure
|
5
|
+
end
|
6
|
+
|
7
|
+
describe ClassMixedWithDSLStructure do
|
8
|
+
let(:logger) { Object.new }
|
9
|
+
describe '#step' do
|
10
|
+
it 'requires a name' do
|
11
|
+
expect { subject.step do; end }.to raise_error ArgumentError
|
12
|
+
end
|
13
|
+
|
14
|
+
it 'notifies the logger' do
|
15
|
+
subject.should_receive( :logger ).and_return( logger )
|
16
|
+
logger.should_receive( :notify )
|
17
|
+
subject.step 'blah'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'yields if a block is given' do
|
21
|
+
subject.should_receive( :logger ).and_return( logger )
|
22
|
+
logger.should_receive( :notify )
|
23
|
+
subject.should_receive( :foo )
|
24
|
+
subject.step 'blah' do
|
25
|
+
subject.foo
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#test_name' do
|
31
|
+
it 'requires a name' do
|
32
|
+
expect { subject.test_name do; end }.to raise_error ArgumentError
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'notifies the logger' do
|
36
|
+
subject.should_receive( :logger ).and_return( logger )
|
37
|
+
logger.should_receive( :notify )
|
38
|
+
subject.test_name 'blah'
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'yields if a block is given' do
|
42
|
+
subject.should_receive( :logger ).and_return( logger )
|
43
|
+
logger.should_receive( :notify )
|
44
|
+
subject.should_receive( :foo )
|
45
|
+
subject.test_name 'blah' do
|
46
|
+
subject.foo
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#teardown' do
|
52
|
+
it 'append a block to the @teardown var' do
|
53
|
+
teardown_array = double
|
54
|
+
subject.instance_variable_set :@teardown_procs, teardown_array
|
55
|
+
block = lambda { 'blah' }
|
56
|
+
teardown_array.should_receive( :<< ).with( block )
|
57
|
+
subject.teardown &block
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
class ClassMixedWithDSLWrappers
|
4
|
+
include Beaker::DSL::Wrappers
|
5
|
+
end
|
6
|
+
|
7
|
+
describe ClassMixedWithDSLWrappers do
|
8
|
+
let(:opts) { {'ENV' => default_opts} }
|
9
|
+
let(:default_opts) { Beaker::Command::DEFAULT_GIT_ENV }
|
10
|
+
describe '#facter' do
|
11
|
+
it 'should split out the options and pass "facter" as first arg to Command' do
|
12
|
+
Beaker::Command.should_receive( :new ).
|
13
|
+
with('facter', [ '-p' ], opts)
|
14
|
+
subject.facter( '-p' )
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe '#hiera' do
|
19
|
+
it 'should split out the options and pass "hiera" as first arg to Command' do
|
20
|
+
Beaker::Command.should_receive( :new ).
|
21
|
+
with('hiera', [ '-p' ], opts)
|
22
|
+
subject.hiera( '-p' )
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe '#puppet' do
|
27
|
+
it 'should split out the options and pass "puppet <blank>" to Command' do
|
28
|
+
merged_opts = {}
|
29
|
+
merged_opts['ENV'] = {:HOME => '/'}.merge( default_opts )
|
30
|
+
merged_opts[:server] = 'master'
|
31
|
+
Beaker::Command.should_receive( :new ).
|
32
|
+
with('puppet agent', [ '-tv' ], merged_opts)
|
33
|
+
subject.puppet( 'agent', '-tv', :server => 'master', 'ENV' => {:HOME => '/'})
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#host_command' do
|
38
|
+
it 'delegates to HostCommand.new' do
|
39
|
+
Beaker::HostCommand.should_receive( :new ).with( 'blah' )
|
40
|
+
subject.host_command( 'blah' )
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'deprecated puppet wrappers' do
|
45
|
+
%w( resource doc kick cert apply master agent filebucket ).each do |sub|
|
46
|
+
it "#{sub} delegates the proper info to #puppet" do
|
47
|
+
subject.should_receive( :puppet ).with( sub, 'blah' )
|
48
|
+
subject.send( "puppet_#{sub}", 'blah')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Beaker
|
4
|
+
describe Host do
|
5
|
+
let :config do
|
6
|
+
MockConfig.new({}, {'name' => {'platform' => @platform}}, @pe)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:options) { @options || Hash.new }
|
10
|
+
let(:host) { Host.create 'name', options, config }
|
11
|
+
|
12
|
+
it 'creates a windows host given a windows config' do
|
13
|
+
@platform = 'windows'
|
14
|
+
expect( host ).to be_a_kind_of Windows::Host
|
15
|
+
end
|
16
|
+
|
17
|
+
it( 'defaults to a unix host' ) { expect( host ).to be_a_kind_of Unix::Host }
|
18
|
+
|
19
|
+
it 'can be read like a hash' do
|
20
|
+
expect { host['value'] }.to_not raise_error NoMethodError
|
21
|
+
end
|
22
|
+
|
23
|
+
it 'can be written like a hash' do
|
24
|
+
host['value'] = 'blarg'
|
25
|
+
expect( host['value'] ).to be === 'blarg'
|
26
|
+
end
|
27
|
+
|
28
|
+
|
29
|
+
# it takes a command object and a hash of options,
|
30
|
+
# it acts on the host's logger and connection object
|
31
|
+
# it receives a result object from the connection#execute
|
32
|
+
# (which it's really just a confusing wrapper for)
|
33
|
+
# it controls the result objects logging and fails a test for TestCase
|
34
|
+
# if the exit_code doesn't match
|
35
|
+
# it returns the result object
|
36
|
+
it 'EXEC!'
|
37
|
+
|
38
|
+
# it takes a location and a destination
|
39
|
+
# it basically proxies that to the connection object
|
40
|
+
it 'do_scp_to logs info and proxies to the connection' do
|
41
|
+
logger = mock(:logger)
|
42
|
+
conn = mock(:connection)
|
43
|
+
@options = { :logger => logger }
|
44
|
+
host.instance_variable_set :@connection, conn
|
45
|
+
args = [ 'source', 'target', {} ]
|
46
|
+
|
47
|
+
logger.should_receive(:debug)
|
48
|
+
conn.should_receive(:scp_to).with(*args)
|
49
|
+
|
50
|
+
host.do_scp_to *args
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'do_scp_from logs info and proxies to the connection' do
|
54
|
+
logger = mock(:logger)
|
55
|
+
conn = mock(:connection)
|
56
|
+
@options = { :logger => logger }
|
57
|
+
host.instance_variable_set :@connection, conn
|
58
|
+
args = [ 'source', 'target', {} ]
|
59
|
+
|
60
|
+
logger.should_receive(:debug)
|
61
|
+
conn.should_receive(:scp_from).with(*args)
|
62
|
+
|
63
|
+
host.do_scp_from *args
|
64
|
+
end
|
65
|
+
it 'interpolates to its "name"' do
|
66
|
+
expect( "#{host}" ).to be === 'name'
|
67
|
+
end
|
68
|
+
|
69
|
+
|
70
|
+
context 'merging defaults' do
|
71
|
+
it 'knows the difference between foss and pe' do
|
72
|
+
@pe = true
|
73
|
+
expect( host['puppetpath'] ).to be === '/etc/puppetlabs/puppet'
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'correctly merges network configs over defaults?' do
|
77
|
+
overridden_config = MockConfig.new( {'puppetpath'=> '/i/do/what/i/want'},
|
78
|
+
{'name' => {} },
|
79
|
+
false )
|
80
|
+
merged_host = Host.create 'name', options, overridden_config
|
81
|
+
expect( merged_host['puppetpath'] ).to be === '/i/do/what/i/want'
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'correctly merges host specifics over defaults' do
|
85
|
+
overriding_config = MockConfig.new( {},
|
86
|
+
{'name' => {
|
87
|
+
'puppetpath' => '/utter/awesomeness'}
|
88
|
+
}, true )
|
89
|
+
|
90
|
+
merged_host = Host.create 'name', options, overriding_config
|
91
|
+
expect( merged_host['puppetpath'] ).to be === '/utter/awesomeness'
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Beaker
|
4
|
+
describe Logger, :use_fakefs => true do
|
5
|
+
let(:my_io) { MockIO.new }
|
6
|
+
let(:logger) { Logger.new(my_io, :quiet => true) }
|
7
|
+
|
8
|
+
|
9
|
+
context 'new' do
|
10
|
+
it 'does not duplicate STDOUT when directly passed to it' do
|
11
|
+
stdout_logger = Logger.new STDOUT
|
12
|
+
expect( stdout_logger ).to have(1).destinations
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
context 'default for' do
|
17
|
+
its(:destinations) { should include(STDOUT) }
|
18
|
+
its(:color) { should be_nil }
|
19
|
+
its(:log_level) { should be :normal }
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
context 'it can' do
|
25
|
+
it 'open/create a file when a string is given to add_destination' do
|
26
|
+
logger.add_destination 'my_tmp_file'
|
27
|
+
expect( File.exists?( 'my_tmp_file' ) ).to be_true
|
28
|
+
|
29
|
+
io = logger.destinations.select {|d| d.respond_to? :path }.first
|
30
|
+
expect( io.path ).to match /my_tmp_file/
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'remove destinations with the remove_destinations method' do
|
34
|
+
logger.add_destination 'my_file'
|
35
|
+
|
36
|
+
logger.remove_destination my_io
|
37
|
+
logger.remove_destination 'my_file'
|
38
|
+
|
39
|
+
expect( logger.destinations ).to be_empty
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'strip colors from arrays of input' do
|
43
|
+
stripped = logger.strip_colors_from [ "\e[00;30m text! \e[00;00m" ]
|
44
|
+
expect( stripped ).to be === [ ' text! ' ]
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'colors strings if @color is set' do
|
48
|
+
colorized_logger = Logger.new my_io, :color => true, :quiet => true
|
49
|
+
|
50
|
+
my_io.should_receive( :print ).with "\e[00;30m"
|
51
|
+
my_io.should_receive( :print )
|
52
|
+
my_io.should_receive( :puts ).with 'my string'
|
53
|
+
|
54
|
+
colorized_logger.optionally_color "\e[00;30m", 'my string'
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
context 'at debug log_level' do
|
59
|
+
subject( :debug_logger ) { Logger.new( my_io,
|
60
|
+
:debug => true,
|
61
|
+
:quiet => true,
|
62
|
+
:color => true )
|
63
|
+
}
|
64
|
+
|
65
|
+
its( :is_debug? ) { should be_true }
|
66
|
+
its( :is_warn? ) { should be_true }
|
67
|
+
|
68
|
+
|
69
|
+
context 'successfully print' do
|
70
|
+
before do
|
71
|
+
my_io.stub :puts
|
72
|
+
my_io.should_receive( :print ).at_least :twice
|
73
|
+
end
|
74
|
+
|
75
|
+
it( 'warnings' ) { debug_logger.warn 'IMA WARNING!' }
|
76
|
+
it( 'debugs' ) { debug_logger.debug 'IMA DEBUGGING!' }
|
77
|
+
it( 'successes' ) { debug_logger.success 'SUCCESS!' }
|
78
|
+
it( 'errors' ) { debug_logger.error 'ERROR!' }
|
79
|
+
it( 'host_output' ) { debug_logger.host_output 'ERROR!' }
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
context 'at normal log_level' do
|
84
|
+
subject( :normal_logger ) { Logger.new( my_io,
|
85
|
+
:quiet => true,
|
86
|
+
:color => true )
|
87
|
+
}
|
88
|
+
|
89
|
+
its( :is_debug? ) { should be_false }
|
90
|
+
its( :is_warn? ) { should be_false }
|
91
|
+
|
92
|
+
|
93
|
+
context 'skip' do
|
94
|
+
before do
|
95
|
+
my_io.should_not_receive :puts
|
96
|
+
my_io.should_not_receive :print
|
97
|
+
end
|
98
|
+
|
99
|
+
it( 'warnings' ) { normal_logger.warn 'NOT A WARNING!' }
|
100
|
+
it( 'debugs' ) { normal_logger.debug 'NOT DEBUGGING!' }
|
101
|
+
end
|
102
|
+
|
103
|
+
|
104
|
+
context 'but print' do
|
105
|
+
before do
|
106
|
+
my_io.should_receive :puts
|
107
|
+
my_io.should_receive( :print ).twice
|
108
|
+
end
|
109
|
+
|
110
|
+
it( 'successes' ) { normal_logger.success 'SUCCESS!' }
|
111
|
+
it( 'notifications' ) { normal_logger.notify 'NOTFIY!' }
|
112
|
+
it( 'errors' ) { normal_logger.error 'ERROR!' }
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|