d452e6ca1e
Previously, trying to use a space as a key_val_separator in the ini_setting type would fail because #strip is being called on the key_val_separator attribute, which completely kills the space. This commit checks to see if key_val_separator has been set as a space, and, if so, sets the `k_v_s` variable in the library to be ' ' instead of ''. This in turn allows the provider to check for existing values (instead of inserting the value every time Puppet is run).
284 lines
8.5 KiB
Ruby
284 lines
8.5 KiB
Ruby
require 'spec_helper_acceptance'
|
|
|
|
tmpdir = default.tmpdir('tmp')
|
|
|
|
describe 'ini_setting resource' do
|
|
after :all do
|
|
shell("rm #{tmpdir}/*.ini", :acceptable_exit_codes => [0, 1, 2])
|
|
end
|
|
|
|
shared_examples 'has_content' do |path, pp, content|
|
|
before :all do
|
|
shell("rm #{path}", :acceptable_exit_codes => [0, 1, 2])
|
|
end
|
|
after :all do
|
|
shell("cat #{path}", :acceptable_exit_codes => [0, 1, 2])
|
|
shell("rm #{path}", :acceptable_exit_codes => [0, 1, 2])
|
|
end
|
|
|
|
it 'applies the manifest twice' do
|
|
apply_manifest(pp, :catch_failures => true)
|
|
apply_manifest(pp, :catch_changes => true)
|
|
end
|
|
|
|
describe file(path) do
|
|
it { should be_file }
|
|
its(:content) { should match content }
|
|
end
|
|
end
|
|
|
|
shared_examples 'has_error' do |path, pp, error|
|
|
before :all do
|
|
shell("rm #{path}", :acceptable_exit_codes => [0, 1, 2])
|
|
end
|
|
after :all do
|
|
shell("cat #{path}", :acceptable_exit_codes => [0, 1, 2])
|
|
shell("rm #{path}", :acceptable_exit_codes => [0, 1, 2])
|
|
end
|
|
|
|
it 'applies the manifest and gets a failure message' do
|
|
expect(apply_manifest(pp, :expect_failures => true).stderr).to match(error)
|
|
end
|
|
|
|
describe file(path) do
|
|
it { should_not be_file }
|
|
end
|
|
end
|
|
|
|
describe 'ensure parameter' do
|
|
context '=> present for global and section' do
|
|
pp = <<-EOS
|
|
ini_setting { 'ensure => present for section':
|
|
ensure => present,
|
|
path => "#{tmpdir}/ini_setting.ini",
|
|
section => 'one',
|
|
setting => 'two',
|
|
value => 'three',
|
|
}
|
|
ini_setting { 'ensure => present for global':
|
|
ensure => present,
|
|
path => "#{tmpdir}/ini_setting.ini",
|
|
section => '',
|
|
setting => 'four',
|
|
value => 'five',
|
|
}
|
|
EOS
|
|
|
|
it 'applies the manifest twice' do
|
|
apply_manifest(pp, :catch_failures => true)
|
|
apply_manifest(pp, :catch_changes => true)
|
|
end
|
|
|
|
it_behaves_like 'has_content', "#{tmpdir}/ini_setting.ini", pp, /four = five\n\n\[one\]\ntwo = three/
|
|
end
|
|
|
|
context '=> present for global and section (from previous blank value)' do
|
|
before :all do
|
|
if fact('osfamily') == 'Darwin'
|
|
shell("echo \"four =[one]\ntwo =\" > #{tmpdir}/ini_setting.ini")
|
|
else
|
|
shell("echo -e \"four =\n[one]\ntwo =\" > #{tmpdir}/ini_setting.ini")
|
|
end
|
|
end
|
|
|
|
pp = <<-EOS
|
|
ini_setting { 'ensure => present for section':
|
|
ensure => present,
|
|
path => "#{tmpdir}/ini_setting.ini",
|
|
section => 'one',
|
|
setting => 'two',
|
|
value => 'three',
|
|
}
|
|
ini_setting { 'ensure => present for global':
|
|
ensure => present,
|
|
path => "#{tmpdir}/ini_setting.ini",
|
|
section => '',
|
|
setting => 'four',
|
|
value => 'five',
|
|
}
|
|
EOS
|
|
|
|
it 'applies the manifest twice' do
|
|
apply_manifest(pp, :catch_failures => true)
|
|
apply_manifest(pp, :catch_changes => true)
|
|
end
|
|
|
|
it_behaves_like 'has_content', "#{tmpdir}/ini_setting.ini", pp, /four = five\n\n\[one\]\ntwo = three/
|
|
end
|
|
|
|
context '=> absent for key/value' do
|
|
before :all do
|
|
if fact('osfamily') == 'Darwin'
|
|
shell("echo \"four = five[one]\ntwo = three\" > #{tmpdir}/ini_setting.ini")
|
|
else
|
|
shell("echo -e \"four = five\n[one]\ntwo = three\" > #{tmpdir}/ini_setting.ini")
|
|
end
|
|
end
|
|
|
|
pp = <<-EOS
|
|
ini_setting { 'ensure => absent for key/value':
|
|
ensure => absent,
|
|
path => "#{tmpdir}/ini_setting.ini",
|
|
section => 'one',
|
|
setting => 'two',
|
|
value => 'three',
|
|
}
|
|
EOS
|
|
|
|
it 'applies the manifest twice' do
|
|
apply_manifest(pp, :catch_failures => true)
|
|
apply_manifest(pp, :catch_changes => true)
|
|
end
|
|
|
|
describe file("#{tmpdir}/ini_setting.ini") do
|
|
it { should be_file }
|
|
its(:content) {
|
|
should match /four = five/
|
|
should match /\[one\]/
|
|
should_not match /two = three/
|
|
}
|
|
end
|
|
end
|
|
|
|
context '=> absent for global' do
|
|
before :all do
|
|
if fact('osfamily') == 'Darwin'
|
|
shell("echo \"four = five\n[one]\ntwo = three\" > #{tmpdir}/ini_setting.ini")
|
|
else
|
|
shell("echo -e \"four = five\n[one]\ntwo = three\" > #{tmpdir}/ini_setting.ini")
|
|
end
|
|
end
|
|
after :all do
|
|
shell("cat #{tmpdir}/ini_setting.ini", :acceptable_exit_codes => [0, 1, 2])
|
|
shell("rm #{tmpdir}/ini_setting.ini", :acceptable_exit_codes => [0, 1, 2])
|
|
end
|
|
|
|
pp = <<-EOS
|
|
ini_setting { 'ensure => absent for global':
|
|
ensure => absent,
|
|
path => "#{tmpdir}/ini_setting.ini",
|
|
section => '',
|
|
setting => 'four',
|
|
value => 'five',
|
|
}
|
|
EOS
|
|
|
|
it 'applies the manifest twice' do
|
|
apply_manifest(pp, :catch_failures => true)
|
|
apply_manifest(pp, :catch_changes => true)
|
|
end
|
|
|
|
describe file("#{tmpdir}/ini_setting.ini") do
|
|
it { should be_file }
|
|
its(:content) {
|
|
should_not match /four = five/
|
|
should match /\[one\]/
|
|
should match /two = three/
|
|
}
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'section, setting, value parameters' do
|
|
{
|
|
"section => 'test', setting => 'foo', value => 'bar'," => /\[test\]\nfoo = bar/,
|
|
"section => 'more', setting => 'baz', value => 'quux'," => /\[more\]\nbaz = quux/,
|
|
"section => '', setting => 'top', value => 'level'," => /top = level/,
|
|
"section => 'z', setting => 'sp aces', value => 'foo bar'," => /\[z\]\nsp aces = foo bar/,
|
|
}.each do |parameter_list, content|
|
|
context parameter_list do
|
|
pp = <<-EOS
|
|
ini_setting { "#{parameter_list}":
|
|
ensure => present,
|
|
path => "#{tmpdir}/ini_setting.ini",
|
|
#{parameter_list}
|
|
}
|
|
EOS
|
|
|
|
it_behaves_like 'has_content', "#{tmpdir}/ini_setting.ini", pp, content
|
|
end
|
|
end
|
|
|
|
{
|
|
"section => 'test'," => /setting is a required.+value is a required/,
|
|
"setting => 'foo', value => 'bar'," => /section is a required/,
|
|
"section => 'test', setting => 'foo'," => /value is a required/,
|
|
"section => 'test', value => 'bar'," => /setting is a required/,
|
|
"value => 'bar'," => /section is a required.+setting is a required/,
|
|
"setting => 'foo'," => /section is a required.+value is a required/,
|
|
}.each do |parameter_list, error|
|
|
context parameter_list, :pending => 'no error checking yet' do
|
|
pp = <<-EOS
|
|
ini_setting { "#{parameter_list}":
|
|
ensure => present,
|
|
path => "#{tmpdir}/ini_setting.ini",
|
|
#{parameter_list}
|
|
}
|
|
EOS
|
|
|
|
it_behaves_like 'has_error', "#{tmpdir}/ini_setting.ini", pp, error
|
|
end
|
|
end
|
|
end
|
|
|
|
describe 'path parameter' do
|
|
[
|
|
"#{tmpdir}/one.ini",
|
|
"#{tmpdir}/two.ini",
|
|
"#{tmpdir}/three.ini",
|
|
].each do |path|
|
|
context "path => #{path}" do
|
|
pp = <<-EOS
|
|
ini_setting { 'path => #{path}':
|
|
ensure => present,
|
|
section => 'one',
|
|
setting => 'two',
|
|
value => 'three',
|
|
path => '#{path}',
|
|
}
|
|
EOS
|
|
|
|
it_behaves_like 'has_content', path, pp, /\[one\]\ntwo = three/
|
|
end
|
|
end
|
|
|
|
context "path => foo" do
|
|
pp = <<-EOS
|
|
ini_setting { 'path => foo':
|
|
ensure => present,
|
|
section => 'one',
|
|
setting => 'two',
|
|
value => 'three',
|
|
path => 'foo',
|
|
}
|
|
EOS
|
|
|
|
it_behaves_like 'has_error', 'foo', pp, /must be fully qualified/
|
|
end
|
|
end
|
|
|
|
describe 'key_val_separator parameter' do
|
|
{
|
|
"" => /two = three/,
|
|
"key_val_separator => '='," => /two=three/,
|
|
"key_val_separator => ' = '," => /two = three/,
|
|
"key_val_separator => ' '," => /two three/,
|
|
"key_val_separator => ' '," => /two three/,
|
|
}.each do |parameter, content|
|
|
context "with \"#{parameter}\" makes \"#{content}\"" do
|
|
pp = <<-EOS
|
|
ini_setting { "with #{parameter} makes #{content}":
|
|
ensure => present,
|
|
section => 'one',
|
|
setting => 'two',
|
|
value => 'three',
|
|
path => "#{tmpdir}/key_val_separator.ini",
|
|
#{parameter}
|
|
}
|
|
EOS
|
|
|
|
it_behaves_like 'has_content', "#{tmpdir}/key_val_separator.ini", pp, content
|
|
end
|
|
end
|
|
end
|
|
end
|