123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397 |
- require 'spec_helper'
- describe 'concat', :type => :define do
- shared_examples 'concat' do |title, params, id|
- params = {} if params.nil?
- id = 'root' if id.nil?
- # default param values
- p = {
- :ensure => 'present',
- :path => title,
- :owner => nil,
- :group => nil,
- :mode => '0644',
- :warn => false,
- :force => false,
- :backup => 'puppet',
- :replace => true,
- :order => 'alpha',
- :ensure_newline => false,
- }.merge(params)
- safe_name = title.gsub('/', '_')
- concatdir = '/var/lib/puppet/concat'
- fragdir = "#{concatdir}/#{safe_name}"
- concat_name = 'fragments.concat.out'
- default_warn_message = '# This file is managed by Puppet. DO NOT EDIT.'
- file_defaults = {
- :backup => false,
- }
- let(:title) { title }
- let(:params) { params }
- let(:facts) do
- {
- :concat_basedir => concatdir,
- :id => id,
- :osfamily => 'Debian',
- :path => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
- :kernel => 'Linux',
- }
- end
- if p[:ensure] == 'present'
- it do
- should contain_file(fragdir).with(file_defaults.merge({
- :ensure => 'directory',
- :mode => '0750',
- }))
- end
- it do
- should contain_file("#{fragdir}/fragments").with(file_defaults.merge({
- :ensure => 'directory',
- :mode => '0750',
- :force => true,
- :ignore => ['.svn', '.git', '.gitignore'],
- :purge => true,
- :recurse => true,
- }))
- end
- [
- "#{fragdir}/fragments.concat",
- "#{fragdir}/#{concat_name}",
- ].each do |file|
- it do
- should contain_file(file).with(file_defaults.merge({
- :ensure => 'present',
- :mode => '0640',
- }))
- end
- end
- it do
- should contain_file(title).with(file_defaults.merge({
- :ensure => 'present',
- :owner => p[:owner],
- :group => p[:group],
- :mode => p[:mode],
- :replace => p[:replace],
- :path => p[:path],
- :alias => "concat_#{title}",
- :source => "#{fragdir}/#{concat_name}",
- :backup => p[:backup],
- }))
- end
- cmd = "#{concatdir}/bin/concatfragments.sh " +
- "-o \"#{concatdir}/#{safe_name}/fragments.concat.out\" " +
- "-d \"#{concatdir}/#{safe_name}\""
- # flag order: fragdir, warnflag, forceflag, orderflag, newlineflag
- if p.has_key?(:warn)
- case p[:warn]
- when TrueClass
- message = default_warn_message
- when 'true', 'yes', 'on'
- # should generate a stringified boolean warning
- message = default_warn_message
- when FalseClass
- message = nil
- when 'false', 'no', 'off'
- # should generate a stringified boolean warning
- message = nil
- else
- message = p[:warn]
- end
- unless message.nil?
- cmd += " -w \'#{message}\'"
- end
- end
- cmd += " -f" if p[:force]
- cmd += " -n" if p[:order] == 'numeric'
- cmd += " -l" if p[:ensure_newline] == true
- it do
- should contain_exec("concat_#{title}").with({
- :alias => "concat_#{fragdir}",
- :command => cmd,
- :unless => "#{cmd} -t",
- })
- end
- else
- [
- fragdir,
- "#{fragdir}/fragments",
- "#{fragdir}/fragments.concat",
- "#{fragdir}/#{concat_name}",
- ].each do |file|
- it do
- should contain_file(file).with(file_defaults.merge({
- :ensure => 'absent',
- :backup => false,
- :force => true,
- }))
- end
- end
- it do
- should contain_file(title).with(file_defaults.merge({
- :ensure => 'absent',
- :backup => p[:backup],
- }))
- end
- it do
- should contain_exec("concat_#{title}").with({
- :alias => "concat_#{fragdir}",
- :command => 'true',
- :unless => 'true',
- :path => '/bin:/usr/bin',
- })
- end
- end
- end
- context 'title' do
- context 'without path param' do
- # title/name is the default value for the path param. therefore, the
- # title must be an absolute path unless path is specified
- ['/foo', '/foo/bar', '/foo/bar/baz'].each do |title|
- context title do
- it_behaves_like 'concat', '/etc/foo.bar'
- end
- end
- ['./foo', 'foo', 'foo/bar'].each do |title|
- context title do
- let(:title) { title }
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not an absolute path/)
- end
- end
- end
- end
- context 'with path param' do
- ['./foo', 'foo', 'foo/bar'].each do |title|
- context title do
- it_behaves_like 'concat', title, { :path => '/etc/foo.bar' }
- end
- end
- end
- end # title =>
- context 'as non-root user' do
- it_behaves_like 'concat', '/etc/foo.bar', {}, 'bob'
- end
- context 'ensure =>' do
- ['present', 'absent'].each do |ens|
- context ens do
- it_behaves_like 'concat', '/etc/foo.bar', { :ensure => ens }
- end
- end
- context 'invalid' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :ensure => 'invalid' }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /#{Regexp.escape('does not match "^present$|^absent$"')}/)
- end
- end
- end # ensure =>
- context 'path =>' do
- context '/foo' do
- it_behaves_like 'concat', '/etc/foo.bar', { :path => '/foo' }
- end
- ['./foo', 'foo', 'foo/bar', false].each do |path|
- context path do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :path => path }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not an absolute path/)
- end
- end
- end
- end # path =>
- context 'owner =>' do
- context 'apenney' do
- it_behaves_like 'concat', '/etc/foo.bar', { :owner => 'apenny' }
- end
- context 'false' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :owner => false }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not a string/)
- end
- end
- end # owner =>
- context 'group =>' do
- context 'apenney' do
- it_behaves_like 'concat', '/etc/foo.bar', { :group => 'apenny' }
- end
- context 'false' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :group => false }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not a string/)
- end
- end
- end # group =>
- context 'mode =>' do
- context '1755' do
- it_behaves_like 'concat', '/etc/foo.bar', { :mode => '1755' }
- end
- context 'false' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :mode => false }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not a string/)
- end
- end
- end # mode =>
- context 'warn =>' do
- [true, false, '# foo'].each do |warn|
- context warn do
- it_behaves_like 'concat', '/etc/foo.bar', { :warn => warn }
- end
- end
- context '(stringified boolean)' do
- ['true', 'yes', 'on', 'false', 'no', 'off'].each do |warn|
- context warn do
- it_behaves_like 'concat', '/etc/foo.bar', { :warn => warn }
- it 'should create a warning' do
- pending('rspec-puppet support for testing warning()')
- end
- end
- end
- end
- context '123' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :warn => 123 }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not a string or boolean/)
- end
- end
- end # warn =>
- context 'force =>' do
- [true, false].each do |force|
- context force do
- it_behaves_like 'concat', '/etc/foo.bar', { :force => force }
- end
- end
- context '123' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :force => 123 }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not a boolean/)
- end
- end
- end # force =>
- context 'backup =>' do
- context 'reverse' do
- it_behaves_like 'concat', '/etc/foo.bar', { :backup => 'reverse' }
- end
- context 'false' do
- it_behaves_like 'concat', '/etc/foo.bar', { :backup => false }
- end
- context 'true' do
- it_behaves_like 'concat', '/etc/foo.bar', { :backup => true }
- end
- context 'true' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :backup => [] }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /backup must be string or bool/)
- end
- end
- end # backup =>
- context 'replace =>' do
- [true, false].each do |replace|
- context replace do
- it_behaves_like 'concat', '/etc/foo.bar', { :replace => replace }
- end
- end
- context '123' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :replace => 123 }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not a boolean/)
- end
- end
- end # replace =>
- context 'order =>' do
- ['alpha', 'numeric'].each do |order|
- context order do
- it_behaves_like 'concat', '/etc/foo.bar', { :order => order }
- end
- end
- context 'invalid' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :order => 'invalid' }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /#{Regexp.escape('does not match "^alpha$|^numeric$"')}/)
- end
- end
- end # order =>
- context 'ensure_newline =>' do
- [true, false].each do |ensure_newline|
- context 'true' do
- it_behaves_like 'concat', '/etc/foo.bar', { :ensure_newline => ensure_newline}
- end
- end
- context '123' do
- let(:title) { '/etc/foo.bar' }
- let(:params) {{ :ensure_newline => 123 }}
- it 'should fail' do
- expect { should }.to raise_error(Puppet::Error, /is not a boolean/)
- end
- end
- end # ensure_newline =>
- describe 'deprecated parameter' do
- context 'gnu =>' do
- context 'foo' do
- it_behaves_like 'concat', '/etc/foo.bar', { :gnu => 'foo'}
- it 'should create a warning' do
- pending('rspec-puppet support for testing warning()')
- end
- end
- end
- end
- end
- # vim:sw=2:ts=2:expandtab:textwidth=79
|