cookbooks/fb_systemd/spec/public_spec.rb (137 lines of code) (raw):
# vim: syntax=ruby:expandtab:shiftwidth=2:softtabstop=2:tabstop=2
#
# Copyright (c) 2019-present, Facebook, Inc.
# All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
require_relative '../libraries/systemd_helpers'
default_systemd = {
'Service' => {
'CapabilityBoundingSet' => ['CAP_CHOWN'],
'Environment' => ['VAR1="def_val1"'],
'Environment2' => ['VAR1="def_val1"'],
'ProtectControlGroups' => 'yes',
'SyslogIdentifier' => 'syslog1',
},
'Unit' => {},
'Install' => {},
}
pruned = {
'Service' => {
'CapabilityBoundingSet' => ['CAP_CHOWN'],
'Environment' => ['VAR1="def_val1"'],
'Environment2' => ['VAR1="def_val1"'],
'ProtectControlGroups' => 'yes',
'SyslogIdentifier' => 'syslog1',
},
}
override_systemd = {
'Service' => {
'CapabilityBoundingSet' => ['', 'CAP_SETUID'],
'Environment' => ['VAR2="def_val2"'],
'Environment2' => 'VAR2="def_val2"',
'ProtectControlGroups' => 'no',
'ProtectKernelTunables' => 'yes',
},
}
describe FB::Systemd do
let(:merged) { FB::Systemd.merge_unit(default_systemd, override_systemd) }
context 'sanitize' do
it 'returns a printable string unaltered' do
expect(FB::Systemd.sanitize('Foo123')).to eq('Foo123')
end
it 'sanitizes a string with spaces' do
expect(FB::Systemd.sanitize('Foo Bar 123')).to eq('Foo_Bar_123')
end
it 'sanitizes a string with non-alphanumeric characters' do
expect(FB::Systemd.sanitize("\u2603Foo")).to eq('_Foo')
end
end
context 'to_ini' do
it 'renders a unit from a Hash' do
expect(FB::Systemd.to_ini({
'Service' => {
'User' => 'nobody',
},
})).to eq("[Service]\nUser = nobody\n")
end
it 'renders a unit from a String' do
expect(FB::Systemd.to_ini("[Service]\nUser=nobody")).to eq(
"[Service]\nUser=nobody\n",
)
end
it 'renders a unit with a list' do
expect(FB::Systemd.to_ini({
'Service' => {
'DisableControllers' => ['cpu', 'memory'],
},
})).to eq(
"[Service]\nDisableControllers = cpu\n" +
"DisableControllers = memory\n",
)
end
it 'renders a unit with a boolean' do
expect(FB::Systemd.to_ini({
'Service' => {
'PrivateNetwork' => true,
'PrivateUsers' => false,
},
})).to eq(
"[Service]\nPrivateNetwork = true\n" +
"PrivateUsers = false\n",
)
end
it 'renders a unit with multiple sections of the same name' do
expect(FB::Systemd.to_ini({
'Network' => {
'Address' => [
'2001:db00::1/64',
'192.168.1.1/24',
'2401:db00::1/64',
],
'IPv6AcceptRA' => true,
},
'Address' => [
{
'Address' => '2001:db00::1/64',
'PreferredLifetime' => 'infinity',
},
{
'Address' => '2401:db00::1/64',
'PreferredLifetime' => '0',
},
],
})).to eq(
"[Network]\nAddress = 2001:db00::1/64\n" +
"Address = 192.168.1.1/24\n" +
"Address = 2401:db00::1/64\n" +
"IPv6AcceptRA = true\n\n" +
"[Address]\nAddress = 2001:db00::1/64\n" +
"PreferredLifetime = infinity\n\n" +
"[Address]\nAddress = 2401:db00::1/64\n" +
"PreferredLifetime = 0\n",
)
end
end
context 'merge systemd unit' do
it 'should merge when no conflict' do
merged['Service']['SyslogIdentifier'].should eql('syslog1')
merged['Service']['ProtectKernelTunables'].should eql('yes')
end
it 'should override settings' do
merged['Service']['ProtectControlGroups'].should eql('no')
end
it 'should append lists together' do
merged['Service']['Environment'].should eql(
['VAR1="def_val1"', 'VAR2="def_val2"'],
)
# A list and not a list should still be appended together
merged['Service']['Environment2'].should eql(
['VAR1="def_val1"', 'VAR2="def_val2"'],
)
end
it 'should handle when zeroing a list' do
merged['Service']['CapabilityBoundingSet'].should eql(
['CAP_CHOWN', '', 'CAP_SETUID'],
)
end
it 'should handle empty inputs' do
FB::Systemd.merge_unit({}, {}).should eql({})
FB::Systemd.merge_unit(default_systemd, {}).should eql(pruned)
FB::Systemd.merge_unit({}, override_systemd).should eql(override_systemd)
end
end
end