From 2aa81bf05db0fa55a1c79263896787ac69cb7d5e Mon Sep 17 00:00:00 2001 From: hlrichardson Date: Wed, 4 Jul 2018 10:12:51 -0400 Subject: [PATCH] add tests for exos_command module (#42268) --- test/units/modules/network/exos/__init__.py | 0 .../units/modules/network/exos/exos_module.py | 87 +++++++++++++ .../network/exos/fixtures/show_version | 6 + .../modules/network/exos/test_exos_command.py | 120 ++++++++++++++++++ 4 files changed, 213 insertions(+) create mode 100644 test/units/modules/network/exos/__init__.py create mode 100644 test/units/modules/network/exos/exos_module.py create mode 100644 test/units/modules/network/exos/fixtures/show_version create mode 100644 test/units/modules/network/exos/test_exos_command.py diff --git a/test/units/modules/network/exos/__init__.py b/test/units/modules/network/exos/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/test/units/modules/network/exos/exos_module.py b/test/units/modules/network/exos/exos_module.py new file mode 100644 index 00000000000..067df1e0144 --- /dev/null +++ b/test/units/modules/network/exos/exos_module.py @@ -0,0 +1,87 @@ +# (c) 2018 Extreme Networks Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import os +import json + +from units.modules.utils import AnsibleExitJson, AnsibleFailJson, ModuleTestCase + + +fixture_path = os.path.join(os.path.dirname(__file__), 'fixtures') +fixture_data = {} + + +def load_fixture(name): + path = os.path.join(fixture_path, name) + + if path in fixture_data: + return fixture_data[path] + + with open(path) as file_desc: + data = file_desc.read() + + try: + data = json.loads(data) + except: + pass + + fixture_data[path] = data + return data + + +class TestExosModule(ModuleTestCase): + + def execute_module(self, failed=False, changed=False, commands=None, sort=True, defaults=False): + + self.load_fixtures(commands) + + if failed: + result = self.failed() + self.assertTrue(result['failed'], result) + else: + result = self.changed(changed) + self.assertEqual(result['changed'], changed, result) + + if commands is not None: + if sort: + self.assertEqual(sorted(commands), sorted(result['commands']), result['commands']) + else: + self.assertEqual(commands, result['commands'], result['commands']) + + return result + + def failed(self): + with self.assertRaises(AnsibleFailJson) as exc: + self.module.main() + + result = exc.exception.args[0] + self.assertTrue(result['failed'], result) + return result + + def changed(self, changed=False): + with self.assertRaises(AnsibleExitJson) as exc: + self.module.main() + + result = exc.exception.args[0] + self.assertEqual(result['changed'], changed, result) + return result + + def load_fixtures(self, commands=None): + pass diff --git a/test/units/modules/network/exos/fixtures/show_version b/test/units/modules/network/exos/fixtures/show_version new file mode 100644 index 00000000000..a34236ee4de --- /dev/null +++ b/test/units/modules/network/exos/fixtures/show_version @@ -0,0 +1,6 @@ +Switch : 800745-00-01 1604G-00175 Rev 01 IMG: 22.5.1.7 + +Image : ExtremeXOS version 22.5.1.7 by release-manager + on Tue May 22 11:25:12 EDT 2018 +Diagnostics : +Certified Version : EXOS Linux 3.18.48, FIPS fips-ecp-2.0.16 diff --git a/test/units/modules/network/exos/test_exos_command.py b/test/units/modules/network/exos/test_exos_command.py new file mode 100644 index 00000000000..3c4b38dde34 --- /dev/null +++ b/test/units/modules/network/exos/test_exos_command.py @@ -0,0 +1,120 @@ +# +# (c) 2018 Extreme Networks Inc. +# +# This file is part of Ansible +# +# Ansible is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Ansible is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with Ansible. If not, see . +# +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import json + +from ansible.compat.tests.mock import patch +from ansible.modules.network.exos import exos_command +from units.modules.utils import set_module_args +from .exos_module import TestExosModule, load_fixture + + +class TestExosCommandModule(TestExosModule): + + module = exos_command + + def setUp(self): + super(TestExosCommandModule, self).setUp() + + self.mock_run_commands = patch('ansible.modules.network.exos.exos_command.run_commands') + self.run_commands = self.mock_run_commands.start() + + def tearDown(self): + super(TestExosCommandModule, self).tearDown() + self.mock_run_commands.stop() + + def load_fixtures(self, commands=None): + + def load_from_file(*args, **kwargs): + module, commands = args + output = list() + + for item in commands: + try: + obj = json.loads(item['command']) + command = obj['command'] + except ValueError: + command = item['command'] + filename = str(command).replace(' ', '_') + output.append(load_fixture(filename)) + return output + + self.run_commands.side_effect = load_from_file + + def test_exos_command_simple(self): + set_module_args(dict(commands=['show version'])) + result = self.execute_module() + self.assertEqual(len(result['stdout']), 1) + self.assertTrue(result['stdout'][0].startswith('Switch :')) + + def test_exos_command_multiple(self): + set_module_args(dict(commands=['show version', 'show version'])) + result = self.execute_module() + self.assertEqual(len(result['stdout']), 2) + self.assertTrue(result['stdout'][0].startswith('Switch :')) + + def test_exos_command_wait_for(self): + wait_for = 'result[0] contains "Switch :"' + set_module_args(dict(commands=['show version'], wait_for=wait_for)) + self.execute_module() + + def test_exos_command_wait_for_fails(self): + wait_for = 'result[0] contains "test string"' + set_module_args(dict(commands=['show version'], wait_for=wait_for)) + self.execute_module(failed=True) + self.assertEqual(self.run_commands.call_count, 10) + + def test_exos_command_retries(self): + wait_for = 'result[0] contains "test string"' + set_module_args(dict(commands=['show version'], wait_for=wait_for, retries=2)) + self.execute_module(failed=True) + self.assertEqual(self.run_commands.call_count, 2) + + def test_exos_command_match_any(self): + wait_for = ['result[0] contains "Switch"', + 'result[0] contains "test string"'] + set_module_args(dict(commands=['show version'], wait_for=wait_for, match='any')) + self.execute_module() + + def test_exos_command_match_all(self): + wait_for = ['result[0] contains "Switch"', + 'result[0] contains "Switch :"'] + set_module_args(dict(commands=['show version'], wait_for=wait_for, match='all')) + self.execute_module() + + def test_exos_command_match_all_failure(self): + wait_for = ['result[0] contains "Switch :"', + 'result[0] contains "test string"'] + commands = ['show version', 'show version'] + set_module_args(dict(commands=commands, wait_for=wait_for, match='all')) + self.execute_module(failed=True) + + def test_exos_command_configure_error(self): + commands = ['disable ospf'] + set_module_args({ + 'commands': commands, + '_ansible_check_mode': True, + }) + result = self.execute_module() + self.assertEqual( + result['warnings'], + ['only show commands are supported when using check mode, not executing `disable ospf`'] + )