# -*- coding: utf-8 -*- ''' :codeauthor: :email:`Jayesh Kariya ` ''' # Import Python libs from __future__ import absolute_import # Import Salt Testing Libs from salttesting import skipIf, TestCase from salttesting.mock import ( NO_MOCK, NO_MOCK_REASON, MagicMock, patch ) from salttesting.helpers import ensure_in_syspath from salt.exceptions import CommandExecutionError ensure_in_syspath('../../') # Import Salt Libs from salt.states import sysctl sysctl.__opts__ = {} sysctl.__salt__ = {} @skipIf(NO_MOCK, NO_MOCK_REASON) class SysctlTestCase(TestCase): ''' Test cases for salt.states.sysctl ''' # 'present' function tests: 1 def test_present(self): ''' Test to ensure that the named sysctl value is set in memory and persisted to the named configuration file. ''' name = 'net.ipv4.conf.all.rp_filter' value = '1' config = '/etc/sysctl.conf' comment = ('Sysctl option {0} might be changed, we failed to check ' 'config file at {1}. The file is either unreadable, or ' 'missing.'.format(name, config)) ret = {'name': name, 'result': None, 'changes': {}, 'comment': comment} comment1 = ('Sysctl option {0} set to be changed to {1}' .format(name, value)) comment2 = ('Sysctl value is currently set on the running system but ' 'not in a config file. Sysctl option {0} set to be ' 'changed to 2 in config file.'.format(name)) comt3 = ('Sysctl value {0} is present in configuration file but is not ' 'present in the running config. The value {0} is set to be ' 'changed to {1}'.format(name, value)) comt4 = ('Sysctl value {0} = {1} is already set'.format(name, value)) comt5 = ('Sysctl option {0} would be changed to {1}' .format(name, value)) comt6 = ('Failed to set {0} to {1}: '.format(name, value)) comt7 = ('Sysctl value {0} = {1} is already set'.format(name, value)) def mock_current(config_file=None): ''' Mock return value for __salt__. ''' if config_file is None: return {name: '2'} return [''] def mock_config(config_file=None): ''' Mock return value for __salt__. ''' if config_file is None: return {'salt': '2'} return [name] def mock_both(config_file=None): ''' Mock return value for __salt__. ''' if config_file is None: return {name: value} return [name] with patch.dict(sysctl.__opts__, {'test': True}): mock = MagicMock(return_value=False) with patch.dict(sysctl.__salt__, {'sysctl.show': mock}): self.assertDictEqual(sysctl.present(name, value), ret) with patch.dict(sysctl.__salt__, {'sysctl.show': mock_current}): ret.update({'comment': comment1}) self.assertDictEqual(sysctl.present(name, value), ret) ret.update({'comment': comment2}) self.assertDictEqual(sysctl.present(name, '2'), ret) with patch.dict(sysctl.__salt__, {'sysctl.show': mock_config}): ret.update({'comment': comt3}) self.assertDictEqual(sysctl.present(name, value), ret) mock = MagicMock(return_value=value) with patch.dict(sysctl.__salt__, {'sysctl.show': mock_both, 'sysctl.get': mock}): ret.update({'comment': comt4, 'result': True}) self.assertDictEqual(sysctl.present(name, value), ret) mock = MagicMock(return_value=[True]) with patch.dict(sysctl.__salt__, {'sysctl.show': mock}): ret.update({'comment': comt5, 'result': None}) self.assertDictEqual(sysctl.present(name, value), ret) with patch.dict(sysctl.__opts__, {'test': False}): mock = MagicMock(side_effect=CommandExecutionError) with patch.dict(sysctl.__salt__, {'sysctl.persist': mock}): ret.update({'comment': comt6, 'result': False}) self.assertDictEqual(sysctl.present(name, value), ret) mock = MagicMock(return_value='Already set') with patch.dict(sysctl.__salt__, {'sysctl.persist': mock}): ret.update({'comment': comt7, 'result': True}) self.assertDictEqual(sysctl.present(name, value), ret) if __name__ == '__main__': from integration import run_tests run_tests(SysctlTestCase, needs_daemon=False)