3b2e37ab1e
Ruby is not in the path for all PE installations, so make sure the concat script is run with ruby in the path.
398 lines
10 KiB
Ruby
398 lines
10 KiB
Ruby
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',
|
|
:is_pe => false,
|
|
}
|
|
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
|
|
skip('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
|
|
skip('rspec-puppet support for testing warning()')
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
# vim:sw=2:ts=2:expandtab:textwidth=79
|