diff options
Diffstat (limited to 'tests/unit')
34 files changed, 419 insertions, 2869 deletions
diff --git a/tests/unit/apiserver/__init__.py b/tests/unit/apiserver/__init__.py deleted file mode 100644 index 5e1ed2ea1..000000000 --- a/tests/unit/apiserver/__init__.py +++ /dev/null @@ -1,47 +0,0 @@ -from __future__ import absolute_import - -import mock -import os -import socket -import unittest -import tempfile - -from oslo_serialization import jsonutils - -from yardstick.common import constants as consts - - -class APITestCase(unittest.TestCase): - - def setUp(self): - self.db_fd, self.db_path = tempfile.mkstemp() - consts.SQLITE = 'sqlite:///{}'.format(self.db_path) - - # server calls gethostbyname which takes 4 seconds, and we should mock it anyway - self.socket_mock = mock.patch.dict("sys.modules", {"socket": mock.MagicMock( - **{"gethostbyname.return_value": "127.0.0.1", "gethostname.return_value": "localhost"})}) - self.socket_mock.start() - try: - from api import server - except socket.gaierror: - self.app = None - return - - server.app.config['TESTING'] = True - self.app = server.app.test_client() - - server.init_db() - - def tearDown(self): - os.close(self.db_fd) - os.unlink(self.db_path) - self.socket_mock.stop() - - def _post(self, url, data): - headers = {'Content-Type': 'application/json'} - resp = self.app.post(url, data=jsonutils.dumps(data), headers=headers) - return jsonutils.loads(resp.data) - - def _get(self, url): - resp = self.app.get(url) - return jsonutils.loads(resp.data) diff --git a/tests/unit/apiserver/resources/test_env_action.py b/tests/unit/apiserver/resources/test_env_action.py deleted file mode 100644 index 5417ad953..000000000 --- a/tests/unit/apiserver/resources/test_env_action.py +++ /dev/null @@ -1,44 +0,0 @@ -############################################################################## -# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -from __future__ import absolute_import - -import time -import unittest - -from tests.unit.apiserver import APITestCase - - -class EnvTestCase(APITestCase): - - def test_create_grafana(self): - if self.app is None: - unittest.skip('host config error') - return - - url = 'yardstick/env/action' - data = {'action': 'create_grafana'} - resp = self._post(url, data) - - time.sleep(0) - - task_id = resp['result']['task_id'] - url = '/yardstick/asynctask?task_id={}'.format(task_id) - resp = self._get(url) - - time.sleep(0) - - self.assertTrue(u'status' in resp) - - -def main(): - unittest.main() - - -if __name__ == '__main__': - main() diff --git a/tests/unit/apiserver/utils/test_influx.py b/tests/unit/apiserver/utils/test_influx.py deleted file mode 100644 index aff0cab5c..000000000 --- a/tests/unit/apiserver/utils/test_influx.py +++ /dev/null @@ -1,62 +0,0 @@ -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -from __future__ import absolute_import -import unittest -import mock - -from api.utils import influx - -import six.moves.configparser as ConfigParser - - -class GetDataDbClientTestCase(unittest.TestCase): - - @mock.patch('api.utils.influx.ConfigParser') - def test_get_data_db_client_dispatcher_not_influxdb(self, mock_parser): - mock_parser.ConfigParser().get.return_value = 'file' - # reset exception to avoid - # TypeError: catching classes that do not inherit from BaseException - mock_parser.NoOptionError = ConfigParser.NoOptionError - try: - influx.get_data_db_client() - except Exception as e: - self.assertIsInstance(e, RuntimeError) - - -class GetIpTestCase(unittest.TestCase): - - def test_get_url(self): - url = 'http://localhost:8086/hello' - output = influx._get_ip(url) - - result = 'localhost' - self.assertEqual(result, output) - - -class QueryTestCase(unittest.TestCase): - - @mock.patch('api.utils.influx.ConfigParser') - def test_query_dispatcher_not_influxdb(self, mock_parser): - mock_parser.ConfigParser().get.return_value = 'file' - # reset exception to avoid - # TypeError: catching classes that do not inherit from BaseException - mock_parser.NoOptionError = ConfigParser.NoOptionError - try: - sql = 'select * form tasklist' - influx.query(sql) - except Exception as e: - self.assertIsInstance(e, RuntimeError) - - -def main(): - unittest.main() - - -if __name__ == '__main__': - main() diff --git a/tests/unit/benchmark/scenarios/compute/test_spec_cpu_for_vm.py b/tests/unit/benchmark/scenarios/compute/test_spec_cpu_for_vm.py new file mode 100644 index 000000000..c428e1fb8 --- /dev/null +++ b/tests/unit/benchmark/scenarios/compute/test_spec_cpu_for_vm.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python + +############################################################################## +# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +# Unittest for yardstick.benchmark.scenarios.compute.spec_cpu_for_vm.SpecCPUforVM + +from __future__ import absolute_import + +import unittest + +import mock + +from yardstick.benchmark.scenarios.compute import spec_cpu_for_vm + + +@mock.patch('yardstick.benchmark.scenarios.compute.spec_cpu_for_vm.ssh') +class SpecCPUforVMTestCase(unittest.TestCase): + + def setUp(self): + self.ctx = { + 'host': { + 'ip': '172.16.0.137', + 'user': 'root', + 'key_filename': "mykey.key" + } + } + + self.result = {} + + def test_spec_cpu_successful_setup(self, mock_ssh): + + options = { + "SPECint_benchmark": "perlbench", + "runspec_tune": "all", + "output_format": "all", + "runspec_iterations": "1", + "runspec_size": "test" + } + args = {"options": options} + s = spec_cpu_for_vm.SpecCPUforVM(args, self.ctx) + mock_ssh.SSH.from_node().execute.return_value = (0, '', '') + + s.setup() + self.assertIsNotNone(s.client) + self.assertTrue(s.setup_done, True) + + def test_spec_cpu_successful__run_no_sla(self, mock_ssh): + + options = { + "SPECint_benchmark": "perlbench", + "runspec_tune": "all", + "output_format": "all" + } + args = {"options": options} + s = spec_cpu_for_vm.SpecCPUforVM(args, self.ctx) + + mock_ssh.SSH.from_node().execute.return_value = (0, '', '') + mock_ssh.SSH.from_node().get.return_value = (0, '', '') + s.run(self.result) + expected_result = {'SPEC_CPU_result': ''} + self.assertEqual(self.result, expected_result) + + def test_spec_cpu_unsuccessful_script_error(self, mock_ssh): + options = { + "benchmark_subset": "int" + } + args = {"options": options} + s = spec_cpu_for_vm.SpecCPUforVM(args, self.ctx) + + mock_ssh.SSH.from_node().execute.return_value = (1, '', 'FOOBAR') + self.assertRaises(RuntimeError, s.run, self.result) + +def main(): + unittest.main() + +if __name__ == '__main__': + main() diff --git a/tests/unit/cmd/commands/__init__.py b/tests/unit/cmd/commands/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/cmd/commands/__init__.py +++ /dev/null diff --git a/tests/unit/common/__init__.py b/tests/unit/common/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/common/__init__.py +++ /dev/null diff --git a/tests/unit/common/config_sample.yaml b/tests/unit/common/config_sample.yaml deleted file mode 100644 index 09218cc79..000000000 --- a/tests/unit/common/config_sample.yaml +++ /dev/null @@ -1,10 +0,0 @@ -############################################################################## -# Copyright (c) 2017 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -releng: - dir: /home/opnfv/repos/releng diff --git a/tests/unit/common/test_ansible_common.py b/tests/unit/common/test_ansible_common.py deleted file mode 100644 index 1ef8eee5f..000000000 --- a/tests/unit/common/test_ansible_common.py +++ /dev/null @@ -1,248 +0,0 @@ -# Copyright (c) 2016-2017 Intel Corporation -# -# 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. - - -from __future__ import absolute_import - -import os -import tempfile -from collections import defaultdict - -import mock -import unittest - -from six.moves.configparser import ConfigParser -from six.moves import StringIO - -from yardstick.common import ansible_common - -PREFIX = 'yardstick.common.ansible_common' - - -class OverwriteDictTestCase(unittest.TestCase): - def test_overwrite_dict_cfg(self): - c = ConfigParser(allow_no_value=True) - d = { - "section_a": "empty_value", - "section_b": {"key_c": "Val_d", "key_d": "VAL_D"}, - "section_c": ["key_c", "key_d"], - } - ansible_common.overwrite_dict_to_cfg(c, d) - # Python3 and Python2 convert empty values into None or '' - # we don't really care but we need to compare correctly for unittest - self.assertTrue(c.has_option("section_a", "empty_value")) - self.assertEqual(sorted(c.items("section_b")), [('key_c', 'Val_d'), ('key_d', 'VAL_D')]) - self.assertTrue(c.has_option("section_c", "key_c")) - self.assertTrue(c.has_option("section_c", "key_d")) - - -class FilenameGeneratorTestCase(unittest.TestCase): - @mock.patch('{}.NamedTemporaryFile'.format(PREFIX)) - def test__handle_existing_file(self, mock_tmp): - ansible_common.FileNameGenerator._handle_existing_file("/dev/null") - - def test_get_generator_from_file(self): - ansible_common.FileNameGenerator.get_generator_from_filename("/dev/null", "", "", "") - - def test_get_generator_from_file_middle(self): - ansible_common.FileNameGenerator.get_generator_from_filename("/dev/null", "", "", - "null") - - def test_get_generator_from_file_prefix(self): - ansible_common.FileNameGenerator.get_generator_from_filename("/dev/null", "", "null", - "middle") - - -class AnsibleNodeTestCase(unittest.TestCase): - def test_ansible_node(self): - ansible_common.AnsibleNode() - - def test_ansible_node_len(self): - a = ansible_common.AnsibleNode() - len(a) - - def test_ansible_node_repr(self): - a = ansible_common.AnsibleNode() - repr(a) - - def test_ansible_node_iter(self): - a = ansible_common.AnsibleNode() - for _ in a: - pass - - def test_is_role(self): - a = ansible_common.AnsibleNode() - self.assertFalse(a.is_role("", default="foo")) - - def test_ansible_node_get_tuple(self): - a = ansible_common.AnsibleNode({"name": "name"}) - self.assertEqual(a.get_tuple(), ('name', a)) - - def test_gen_inventory_line(self): - a = ansible_common.AnsibleNode(defaultdict(str)) - self.assertEqual(a.gen_inventory_line(), "") - - def test_ansible_node_delitem(self): - a = ansible_common.AnsibleNode({"name": "name"}) - del a['name'] - - def test_ansible_node_getattr(self): - a = ansible_common.AnsibleNode({"name": "name"}) - self.assertEqual(getattr(a, "nosuch", None), None) - - -class AnsibleNodeDictTestCase(unittest.TestCase): - def test_ansible_node_dict(self): - n = ansible_common.AnsibleNode - ansible_common.AnsibleNodeDict(n, {}) - - def test_ansible_node_dict_len(self): - n = ansible_common.AnsibleNode - a = ansible_common.AnsibleNodeDict(n, {}) - len(a) - - def test_ansible_node_dict_repr(self): - n = ansible_common.AnsibleNode - a = ansible_common.AnsibleNodeDict(n, {}) - repr(a) - - def test_ansible_node_dict_iter(self): - n = ansible_common.AnsibleNode - a = ansible_common.AnsibleNodeDict(n, {}) - for _ in a: - pass - - def test_ansible_node_dict_get(self): - n = ansible_common.AnsibleNode - a = ansible_common.AnsibleNodeDict(n, {}) - self.assertIsNone(a.get("")) - - def test_gen_inventory_lines_for_all_of_type(self): - n = ansible_common.AnsibleNode - a = ansible_common.AnsibleNodeDict(n, {}) - self.assertEqual(a.gen_inventory_lines_for_all_of_type(""), []) - - def test_gen_inventory_lines(self): - n = ansible_common.AnsibleNode - a = ansible_common.AnsibleNodeDict(n, [{ - "name": "name", "user": "user", "password": "PASS", - "role": "role", - }]) - self.assertEqual(a.gen_all_inventory_lines(), - ["name ansible_ssh_pass=PASS ansible_user=user"]) - - -class AnsibleCommonTestCase(unittest.TestCase): - def test_get_timeouts(self): - self.assertAlmostEquals(ansible_common.AnsibleCommon.get_timeout(-100), 1200.0) - - def test__init__(self): - ansible_common.AnsibleCommon({}) - - def test_reset(self): - a = ansible_common.AnsibleCommon({}) - a.reset() - - def test_do_install_no_dir(self): - a = ansible_common.AnsibleCommon({}) - self.assertRaises(OSError, a.do_install, '', '') - - def test_gen_inventory_dict(self): - nodes = [{ - "name": "name", "user": "user", "password": "PASS", - "role": "role", - }] - a = ansible_common.AnsibleCommon(nodes) - a.gen_inventory_ini_dict() - self.assertEqual(a.inventory_dict, { - 'nodes': ['name ansible_ssh_pass=PASS ansible_user=user'], - 'role': ['name'] - }) - - def test_deploy_dir(self): - a = ansible_common.AnsibleCommon({}) - self.assertRaises(ValueError, getattr, a, "deploy_dir") - - def test_deploy_dir_set(self): - a = ansible_common.AnsibleCommon({}) - a.deploy_dir = "" - - def test_deploy_dir_set_get(self): - a = ansible_common.AnsibleCommon({}) - a.deploy_dir = "d" - self.assertEqual(a.deploy_dir, "d") - - @mock.patch('{}.open'.format(PREFIX)) - def test__gen_ansible_playbook_file_list(self, mock_open): - d = tempfile.mkdtemp() - try: - a = ansible_common.AnsibleCommon({}) - a._gen_ansible_playbook_file(["a"], d) - finally: - os.rmdir(d) - - @mock.patch('{}.NamedTemporaryFile'.format(PREFIX)) - @mock.patch('{}.open'.format(PREFIX)) - def test__gen_ansible_inventory_file(self, mock_open, mock_tmp): - nodes = [{ - "name": "name", "user": "user", "password": "PASS", - "role": "role", - }] - d = tempfile.mkdtemp() - try: - a = ansible_common.AnsibleCommon(nodes) - a.gen_inventory_ini_dict() - inv_context = a._gen_ansible_inventory_file(d) - with inv_context: - c = StringIO() - inv_context.write_func(c) - self.assertIn("ansible_ssh_pass=PASS", c.getvalue()) - finally: - os.rmdir(d) - - @mock.patch('{}.NamedTemporaryFile'.format(PREFIX)) - @mock.patch('{}.open'.format(PREFIX)) - def test__gen_ansible_playbook_file_list_multiple(self, mock_open, mock_tmp): - d = tempfile.mkdtemp() - try: - a = ansible_common.AnsibleCommon({}) - a._gen_ansible_playbook_file(["a", "b"], d) - finally: - os.rmdir(d) - - @mock.patch('{}.NamedTemporaryFile'.format(PREFIX)) - @mock.patch('{}.Popen'.format(PREFIX)) - @mock.patch('{}.open'.format(PREFIX)) - def test_do_install_tmp_dir(self, mock_open, mock_popen, mock_tmp): - mock_popen.return_value.communicate.return_value = "", "" - mock_popen.return_value.wait.return_value = 0 - d = tempfile.mkdtemp() - try: - a = ansible_common.AnsibleCommon({}) - a.do_install('', d) - finally: - os.rmdir(d) - - @mock.patch('{}.NamedTemporaryFile'.format(PREFIX)) - @mock.patch('{}.Popen'.format(PREFIX)) - @mock.patch('{}.open'.format(PREFIX)) - def test_execute_ansible_check(self, mock_open, mock_popen, mock_tmp): - mock_popen.return_value.communicate.return_value = "", "" - mock_popen.return_value.wait.return_value = 0 - d = tempfile.mkdtemp() - try: - a = ansible_common.AnsibleCommon({}) - a.execute_ansible('', d, ansible_check=True, verbose=True) - finally: - os.rmdir(d) diff --git a/tests/unit/common/test_httpClient.py b/tests/unit/common/test_httpClient.py deleted file mode 100644 index eb09d1a52..000000000 --- a/tests/unit/common/test_httpClient.py +++ /dev/null @@ -1,43 +0,0 @@ -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## -from __future__ import absolute_import - -import unittest - -import mock -from oslo_serialization import jsonutils - -from yardstick.common import httpClient - - -class HttpClientTestCase(unittest.TestCase): - - @mock.patch('yardstick.common.httpClient.requests') - def test_post(self, mock_requests): - url = 'http://localhost:5000/hello' - data = {'hello': 'world'} - headers = {'Content-Type': 'application/json'} - httpClient.HttpClient().post(url, data) - mock_requests.post.assert_called_with( - url, data=jsonutils.dump_as_bytes(data), - headers=headers) - - @mock.patch('yardstick.common.httpClient.requests') - def test_get(self, mock_requests): - url = 'http://localhost:5000/hello' - httpClient.HttpClient().get(url) - mock_requests.get.assert_called_with(url) - - -def main(): - unittest.main() - - -if __name__ == '__main__': - main() diff --git a/tests/unit/common/test_openstack_utils.py b/tests/unit/common/test_openstack_utils.py deleted file mode 100644 index b3dc2d9c4..000000000 --- a/tests/unit/common/test_openstack_utils.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -############################################################################## -# Copyright (c) 2016 Huawei Technologies Co.,Ltd and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -# Unittest for yardstick.common.openstack_utils - -from __future__ import absolute_import -import unittest -import mock - -from yardstick.common import openstack_utils - - -class GetCredentialsTestCase(unittest.TestCase): - - @mock.patch('yardstick.common.openstack_utils.os') - def test_get_credentials(self, mock_os): - with mock.patch.dict('os.environ', {'OS_IDENTITY_API_VERSION': '2'}, - clear=True): - openstack_utils.get_credentials() - - -class GetHeatApiVersionTestCase(unittest.TestCase): - - def test_get_heat_api_version_check_result(self): - API = 'HEAT_API_VERSION' - expected_result = '2' - - with mock.patch.dict('os.environ', {API: '2'}, clear=True): - api_version = openstack_utils.get_heat_api_version() - self.assertEqual(api_version, expected_result) - - -def main(): - unittest.main() - - -if __name__ == '__main__': - main() diff --git a/tests/unit/common/test_process.py b/tests/unit/common/test_process.py deleted file mode 100644 index 1c6dfec27..000000000 --- a/tests/unit/common/test_process.py +++ /dev/null @@ -1,150 +0,0 @@ -# Copyright (c) 2017 Intel Corporation -# -# 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. - -import mock -import unittest - -from oslo_utils import encodeutils - -from yardstick.common import exceptions -from yardstick.common import process - - -class ProcessTestcase(unittest.TestCase): - def test_check_if_procces_failed_None(self): - p = mock.MagicMock(**{"exitcode": None, "name": "debug"}) - process.check_if_process_failed(p) - - def test_check_if_procces_failed_0(self): - p = mock.MagicMock(**{"exitcode": 0, "name": "debug"}) - process.check_if_process_failed(p) - - def test_check_if_procces_failed_1(self): - p = mock.MagicMock(**{"exitcode": 1, "name": "debug"}) - with self.assertRaises(RuntimeError): - process.check_if_process_failed(p) - - -@mock.patch("yardstick.common.process.multiprocessing") -class TerminateChildrenTestcase(unittest.TestCase): - def test_some_children(self, mock_multiprocessing): - p1 = mock.MagicMock() - p2 = mock.MagicMock() - mock_multiprocessing.active_children.return_value = [p1, p2] - process.terminate_children() - - def test_no_children(self, mock_multiprocessing): - mock_multiprocessing.active_children.return_value = [] - process.terminate_children() - - -class ExecuteTestCase(unittest.TestCase): - - RET_CODE_OK = 0 - RET_CODE_WRONG = 1 - - def setUp(self): - self._mock_create_process = mock.patch.object(process, - 'create_process') - self.mock_create_process = self._mock_create_process.start() - self.obj = mock.Mock() - self.cmd = mock.Mock() - self.obj.communicate = mock.Mock() - self.stdout = 'std out' - self.stderr = 'std err' - self.obj.communicate.return_value = (self.stdout, self.stderr) - self.mock_create_process.return_value = (self.obj, self.cmd) - self.input_cmd = 'input cmd' - self.additional_env = mock.Mock() - - def test_execute_with_input(self): - process_input = 'process input' - self.obj.returncode = self.RET_CODE_OK - out = process.execute(self.input_cmd, process_input=process_input, - additional_env=self.additional_env) - self.obj.communicate.assert_called_once_with( - encodeutils.to_utf8(process_input)) - self.mock_create_process.assert_called_once_with( - self.input_cmd, run_as_root=False, - additional_env=self.additional_env) - self.assertEqual(self.stdout, out) - - def test_execute_no_input(self): - self.obj.returncode = self.RET_CODE_OK - out = process.execute(self.input_cmd, - additional_env=self.additional_env) - self.obj.communicate.assert_called_once_with(None) - self.mock_create_process.assert_called_once_with( - self.input_cmd, run_as_root=False, - additional_env=self.additional_env) - self.assertEqual(self.stdout, out) - - def test_execute_exception(self): - self.obj.returncode = self.RET_CODE_WRONG - self.assertRaises(exceptions.ProcessExecutionError, process.execute, - self.input_cmd, additional_env=self.additional_env) - self.obj.communicate.assert_called_once_with(None) - - def test_execute_with_extra_code(self): - self.obj.returncode = self.RET_CODE_WRONG - out = process.execute(self.input_cmd, - additional_env=self.additional_env, - extra_ok_codes=[self.RET_CODE_WRONG]) - self.obj.communicate.assert_called_once_with(None) - self.mock_create_process.assert_called_once_with( - self.input_cmd, run_as_root=False, - additional_env=self.additional_env) - self.assertEqual(self.stdout, out) - - def test_execute_exception_no_check(self): - self.obj.returncode = self.RET_CODE_WRONG - out = process.execute(self.input_cmd, - additional_env=self.additional_env, - check_exit_code=False) - self.obj.communicate.assert_called_once_with(None) - self.mock_create_process.assert_called_once_with( - self.input_cmd, run_as_root=False, - additional_env=self.additional_env) - self.assertEqual(self.stdout, out) - - -class CreateProcessTestCase(unittest.TestCase): - - @mock.patch.object(process, 'subprocess_popen') - def test_process_string_command(self, mock_subprocess_popen): - cmd = 'command' - obj = mock.Mock() - mock_subprocess_popen.return_value = obj - out1, out2 = process.create_process(cmd) - self.assertEqual(obj, out1) - self.assertEqual([cmd], out2) - - @mock.patch.object(process, 'subprocess_popen') - def test_process_list_command(self, mock_subprocess_popen): - cmd = ['command'] - obj = mock.Mock() - mock_subprocess_popen.return_value = obj - out1, out2 = process.create_process(cmd) - self.assertEqual(obj, out1) - self.assertEqual(cmd, out2) - - @mock.patch.object(process, 'subprocess_popen') - def test_process_with_env(self, mock_subprocess_popen): - cmd = ['command'] - obj = mock.Mock() - additional_env = {'var1': 'value1'} - mock_subprocess_popen.return_value = obj - out1, out2 = process.create_process(cmd, additional_env=additional_env) - self.assertEqual(obj, out1) - self.assertEqual(['env', 'var1=value1'] + cmd, out2) diff --git a/tests/unit/common/test_template_format.py b/tests/unit/common/test_template_format.py deleted file mode 100644 index 2a7d80b4d..000000000 --- a/tests/unit/common/test_template_format.py +++ /dev/null @@ -1,51 +0,0 @@ -# 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. - -# yardstick: this file is copied from python-heatclient and slightly modified - -from __future__ import absolute_import -import mock -import unittest -import yaml - -from yardstick.common import template_format - - -class TemplateFormatTestCase(unittest.TestCase): - - def test_parse_to_value_exception(self): - - with mock.patch.object(yaml, 'load') as yaml_loader: - yaml_loader.side_effect = yaml.scanner.ScannerError() - self.assertRaises(ValueError, template_format.parse, 'FOOBAR') - yaml_loader.side_effect = yaml.parser.ParserError() - self.assertRaises(ValueError, template_format.parse, 'FOOBAR') - yaml_loader.side_effect = \ - yaml.reader.ReaderError('', '', '', '', '') - self.assertRaises(ValueError, template_format.parse, 'FOOBAR') - - def test_parse_no_version_format(self): - - yaml = '' - self.assertRaises(ValueError, template_format.parse, yaml) - yaml2 = "Parameters: {}\n" \ - "Mappings: {}\n" \ - "Resources: {}\n" \ - "Outputs: {}" - self.assertRaises(ValueError, template_format.parse, yaml2) - - -def main(): - unittest.main() - -if __name__ == '__main__': - main() diff --git a/tests/unit/common/test_utils.py b/tests/unit/common/test_utils.py deleted file mode 100644 index 452b93a56..000000000 --- a/tests/unit/common/test_utils.py +++ /dev/null @@ -1,1085 +0,0 @@ -############################################################################## -# Copyright (c) 2015 Ericsson AB and others. -# -# All rights reserved. This program and the accompanying materials -# are made available under the terms of the Apache License, Version 2.0 -# which accompanies this distribution, and is available at -# http://www.apache.org/licenses/LICENSE-2.0 -############################################################################## - -# Unittest for yardstick.common.utils - -from __future__ import absolute_import - -from copy import deepcopy -import errno -import ipaddress -from itertools import product, chain -import mock -import os -import six -from six.moves import configparser -import unittest - -import yardstick -from yardstick.common import utils -from yardstick.common import constants - - -class IterSubclassesTestCase(unittest.TestCase): - # Disclaimer: this class is a modified copy from - # rally/tests/unit/common/plugin/test_discover.py - # Copyright 2015: Mirantis Inc. - - def test_itersubclasses(self): - class A(object): - pass - - class B(A): - pass - - class C(A): - pass - - class D(C): - pass - - self.assertEqual([B, C, D], list(utils.itersubclasses(A))) - - -class ImportModulesFromPackageTestCase(unittest.TestCase): - - @mock.patch('yardstick.common.utils.os.walk') - def test_import_modules_from_package_no_mod(self, mock_walk): - yardstick_root = os.path.dirname(os.path.dirname(yardstick.__file__)) - mock_walk.return_value = ([ - (os.path.join(yardstick_root, 'foo'), ['bar'], ['__init__.py']), - (os.path.join(yardstick_root, 'foo', 'bar'), [], ['baz.txt', 'qux.rst']) - ]) - - utils.import_modules_from_package('foo.bar') - - @mock.patch('yardstick.common.utils.os.walk') - @mock.patch('yardstick.common.utils.importutils') - def test_import_modules_from_package(self, mock_importutils, mock_walk): - - yardstick_root = os.path.dirname(os.path.dirname(yardstick.__file__)) - mock_walk.return_value = ([ - (os.path.join(yardstick_root, 'foo', os.pardir, 'bar'), [], ['baz.py']) - ]) - - utils.import_modules_from_package('foo.bar') - mock_importutils.import_module.assert_called_with('bar.baz') - - -class GetParaFromYaml(unittest.TestCase): - - @mock.patch('yardstick.common.utils.os.environ.get') - def test_get_param_para_not_found(self, get_env): - file_path = 'config_sample.yaml' - get_env.return_value = self._get_file_abspath(file_path) - args = 'releng.file' - default = 'hello' - self.assertTrue(constants.get_param(args, default), default) - - @mock.patch('yardstick.common.utils.os.environ.get') - def test_get_param_para_exists(self, get_env): - file_path = 'config_sample.yaml' - get_env.return_value = self._get_file_abspath(file_path) - args = 'releng.dir' - para = '/home/opnfv/repos/releng' - self.assertEqual(para, constants.get_param(args)) - - def _get_file_abspath(self, filename): - curr_path = os.path.dirname(os.path.abspath(__file__)) - file_path = os.path.join(curr_path, filename) - return file_path - - -class CommonUtilTestCase(unittest.TestCase): - - def setUp(self): - self.data = { - "benchmark": { - "data": { - "mpstat": { - "cpu0": { - "%sys": "0.00", - "%idle": "99.00" - }, - "loadavg": [ - "1.09", - "0.29" - ] - }, - "rtt": "1.03" - } - } - } - - def test__dict_key_flatten(self): - line = 'mpstat.loadavg1=0.29,rtt=1.03,mpstat.loadavg0=1.09,' \ - 'mpstat.cpu0.%idle=99.00,mpstat.cpu0.%sys=0.00' - # need to sort for assert to work - line = ",".join(sorted(line.split(','))) - flattened_data = utils.flatten_dict_key( - self.data['benchmark']['data']) - result = ",".join( - ("=".join(item) for item in sorted(flattened_data.items()))) - self.assertEqual(result, line) - - -class TestMacAddressToHex(unittest.TestCase): - - def test_mac_address_to_hex_list(self): - self.assertEqual(utils.mac_address_to_hex_list("ea:3e:e1:9a:99:e8"), - ['0xea', '0x3e', '0xe1', '0x9a', '0x99', '0xe8']) - - -class TranslateToStrTestCase(unittest.TestCase): - - def test_translate_to_str_unicode(self): - input_str = u'hello' - output_str = utils.translate_to_str(input_str) - - result = 'hello' - self.assertEqual(result, output_str) - - def test_translate_to_str_dict_list_unicode(self): - input_str = { - u'hello': {u'hello': [u'world']} - } - output_str = utils.translate_to_str(input_str) - - result = { - 'hello': {'hello': ['world']} - } - self.assertEqual(result, output_str) - - def test_translate_to_str_non_string(self): - input_value = object() - result = utils.translate_to_str(input_value) - self.assertIs(input_value, result) - - -class TestParseCpuInfo(unittest.TestCase): - - def test_single_socket_no_hyperthread(self): - cpuinfo = """\ -processor : 2 -vendor_id : GenuineIntel -cpu family : 6 -model : 60 -model name : Intel Core Processor (Haswell, no TSX) -stepping : 1 -microcode : 0x1 -cpu MHz : 2294.684 -cache size : 4096 KB -physical id : 0 -siblings : 5 -core id : 2 -cpu cores : 5 -apicid : 2 -initial apicid : 2 -fpu : yes -fpu_exception : yes -cpuid level : 13 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat -bugs : -bogomips : 4589.36 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 3 -vendor_id : GenuineIntel -cpu family : 6 -model : 60 -model name : Intel Core Processor (Haswell, no TSX) -stepping : 1 -microcode : 0x1 -cpu MHz : 2294.684 -cache size : 4096 KB -physical id : 0 -siblings : 5 -core id : 3 -cpu cores : 5 -apicid : 3 -initial apicid : 3 -fpu : yes -fpu_exception : yes -cpuid level : 13 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat -bugs : -bogomips : 4589.36 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 4 -vendor_id : GenuineIntel -cpu family : 6 -model : 60 -model name : Intel Core Processor (Haswell, no TSX) -stepping : 1 -microcode : 0x1 -cpu MHz : 2294.684 -cache size : 4096 KB -physical id : 0 -siblings : 5 -core id : 4 -cpu cores : 5 -apicid : 4 -initial apicid : 4 -fpu : yes -fpu_exception : yes -cpuid level : 13 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat -bugs : -bogomips : 4589.36 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -""" - socket_map = utils.SocketTopology.parse_cpuinfo(cpuinfo) - assert sorted(socket_map.keys()) == [0] - assert sorted(socket_map[0].keys()) == [2, 3, 4] - - def test_single_socket_hyperthread(self): - cpuinfo = """\ -processor : 5 -vendor_id : GenuineIntel -cpu family : 6 -model : 60 -model name : Intel(R) Xeon(R) CPU E3-1275 v3 @ 3.50GHz -stepping : 3 -microcode : 0x1d -cpu MHz : 3501.708 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 1 -cpu cores : 4 -apicid : 3 -initial apicid : 3 -fpu : yes -fpu_exception : yes -cpuid level : 13 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts -bugs : -bogomips : 6987.36 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 6 -vendor_id : GenuineIntel -cpu family : 6 -model : 60 -model name : Intel(R) Xeon(R) CPU E3-1275 v3 @ 3.50GHz -stepping : 3 -microcode : 0x1d -cpu MHz : 3531.829 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 2 -cpu cores : 4 -apicid : 5 -initial apicid : 5 -fpu : yes -fpu_exception : yes -cpuid level : 13 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts -bugs : -bogomips : 6987.36 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -processor : 7 -vendor_id : GenuineIntel -cpu family : 6 -model : 60 -model name : Intel(R) Xeon(R) CPU E3-1275 v3 @ 3.50GHz -stepping : 3 -microcode : 0x1d -cpu MHz : 3500.213 -cache size : 8192 KB -physical id : 0 -siblings : 8 -core id : 3 -cpu cores : 4 -apicid : 7 -initial apicid : 7 -fpu : yes -fpu_exception : yes -cpuid level : 13 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts -bugs : -bogomips : 6987.24 -clflush size : 64 -cache_alignment : 64 -address sizes : 39 bits physical, 48 bits virtual -power management: - -""" - socket_map = utils.SocketTopology.parse_cpuinfo(cpuinfo) - assert sorted(socket_map.keys()) == [0] - assert sorted(socket_map[0].keys()) == [1, 2, 3] - assert sorted(socket_map[0][1]) == [5] - assert sorted(socket_map[0][2]) == [6] - assert sorted(socket_map[0][3]) == [7] - - def test_dual_socket_hyperthread(self): - cpuinfo = """\ -processor : 1 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.976 -cache size : 56320 KB -physical id : 0 -siblings : 44 -core id : 1 -cpu cores : 22 -apicid : 2 -initial apicid : 2 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4401.07 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 2 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1226.892 -cache size : 56320 KB -physical id : 0 -siblings : 44 -core id : 2 -cpu cores : 22 -apicid : 4 -initial apicid : 4 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4400.84 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 43 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.305 -cache size : 56320 KB -physical id : 1 -siblings : 44 -core id : 28 -cpu cores : 22 -apicid : 120 -initial apicid : 120 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4411.31 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 44 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.305 -cache size : 56320 KB -physical id : 0 -siblings : 44 -core id : 0 -cpu cores : 22 -apicid : 1 -initial apicid : 1 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4410.61 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 85 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.573 -cache size : 56320 KB -physical id : 1 -siblings : 44 -core id : 26 -cpu cores : 22 -apicid : 117 -initial apicid : 117 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4409.07 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 86 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.305 -cache size : 56320 KB -physical id : 1 -siblings : 44 -core id : 27 -cpu cores : 22 -apicid : 119 -initial apicid : 119 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4406.62 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 87 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.708 -cache size : 56320 KB -physical id : 1 -siblings : 44 -core id : 28 -cpu cores : 22 -apicid : 121 -initial apicid : 121 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4413.48 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -""" - socket_map = utils.SocketTopology.parse_cpuinfo(cpuinfo) - assert sorted(socket_map.keys()) == [0, 1] - assert sorted(socket_map[0].keys()) == [0, 1, 2] - assert sorted(socket_map[1].keys()) == [26, 27, 28] - assert sorted(socket_map[0][0]) == [44] - assert sorted(socket_map[0][1]) == [1] - assert sorted(socket_map[0][2]) == [2] - assert sorted(socket_map[1][26]) == [85] - assert sorted(socket_map[1][27]) == [86] - assert sorted(socket_map[1][28]) == [43, 87] - - def test_dual_socket_no_hyperthread(self): - cpuinfo = """\ -processor : 1 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.976 -cache size : 56320 KB -physical id : 0 -siblings : 44 -core id : 1 -cpu cores : 22 -apicid : 2 -initial apicid : 2 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4401.07 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 2 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1226.892 -cache size : 56320 KB -physical id : 0 -siblings : 44 -core id : 2 -cpu cores : 22 -apicid : 4 -initial apicid : 4 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4400.84 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 43 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.305 -cache size : 56320 KB -physical id : 1 -siblings : 44 -core id : 28 -cpu cores : 22 -apicid : 120 -initial apicid : 120 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4411.31 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 44 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.305 -cache size : 56320 KB -physical id : 0 -siblings : 44 -core id : 0 -cpu cores : 22 -apicid : 1 -initial apicid : 1 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4410.61 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 85 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.573 -cache size : 56320 KB -physical id : 1 -siblings : 44 -core id : 26 -cpu cores : 22 -apicid : 117 -initial apicid : 117 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4409.07 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 86 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.305 -cache size : 56320 KB -physical id : 1 -siblings : 44 -core id : 27 -cpu cores : 22 -apicid : 119 -initial apicid : 119 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4406.62 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -processor : 87 -vendor_id : GenuineIntel -cpu family : 6 -model : 79 -model name : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz -stepping : 1 -microcode : 0xb00001f -cpu MHz : 1200.708 -cache size : 56320 KB -physical id : 1 -siblings : 44 -core id : 28 -cpu cores : 22 -apicid : 121 -initial apicid : 121 -fpu : yes -fpu_exception : yes -cpuid level : 20 -wp : yes -flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts -bugs : -bogomips : 4413.48 -clflush size : 64 -cache_alignment : 64 -address sizes : 46 bits physical, 48 bits virtual -power management: - -""" - socket_map = utils.SocketTopology.parse_cpuinfo(cpuinfo) - processors = socket_map.processors() - assert processors == [1, 2, 43, 44, 85, 86, 87] - cores = socket_map.cores() - assert cores == [0, 1, 2, 26, 27, 28] - sockets = socket_map.sockets() - assert sockets == [0, 1] - - -class ChangeObjToDictTestCase(unittest.TestCase): - - def test_change_obj_to_dict(self): - class A(object): - def __init__(self): - self.name = 'yardstick' - - obj = A() - obj_r = utils.change_obj_to_dict(obj) - obj_s = {'name': 'yardstick'} - self.assertEqual(obj_r, obj_s) - - -class SetDictValueTestCase(unittest.TestCase): - - def test_set_dict_value(self): - input_dic = { - 'hello': 'world' - } - output_dic = utils.set_dict_value(input_dic, 'welcome.to', 'yardstick') - self.assertEqual(output_dic.get('welcome', {}).get('to'), 'yardstick') - - -class RemoveFileTestCase(unittest.TestCase): - - def test_remove_file(self): - try: - utils.remove_file('notexistfile.txt') - except Exception as e: # pylint: disable=broad-except - # NOTE(ralonsoh): to narrow the scope of this exception. - self.assertTrue(isinstance(e, OSError)) - - -class TestUtils(unittest.TestCase): - - @mock.patch('yardstick.common.utils.os.makedirs') - def test_makedirs(self, *_): - self.assertIsNone(utils.makedirs('a/b/c/d')) - - @mock.patch('yardstick.common.utils.os.makedirs') - def test_makedirs_exists(self, mock_os_makedirs): - mock_os_makedirs.side_effect = OSError(errno.EEXIST, 'exists') - self.assertIsNone(utils.makedirs('a/b/c/d')) - - @mock.patch('yardstick.common.utils.os.makedirs') - def test_makedirs_busy(self, mock_os_makedirs): - mock_os_makedirs.side_effect = OSError(errno.EBUSY, 'busy') - with self.assertRaises(OSError): - utils.makedirs('a/b/c/d') - - @mock.patch('yardstick.common.utils.jsonify') - def test_result_handler(self, mock_jsonify): - mock_jsonify.return_value = 432 - - self.assertEqual(utils.result_handler('x', 234), 432) - mock_jsonify.assert_called_once_with({'status': 'x', 'result': 234}) - - @mock.patch('random.randint') - @mock.patch('socket.socket') - def test_get_free_port(self, mock_socket, mock_randint): - mock_randint.return_value = 7777 - s = mock_socket('x', 'y') - s.connect_ex.side_effect = iter([0, 1]) - result = utils.get_free_port('10.20.30.40') - self.assertEqual(result, 7777) - self.assertEqual(s.connect_ex.call_count, 2) - - @mock.patch('subprocess.check_output') - def test_execute_command(self, mock_check_output): - expected = ['hello world', '1234'] - mock_check_output.return_value = os.linesep.join(expected) - result = utils.execute_command('my_command arg1 arg2') - self.assertEqual(result, expected) - - @mock.patch('subprocess.Popen') - def test_source_env(self, mock_popen): - base_env = deepcopy(os.environ) - mock_process = mock_popen() - output_list = [ - 'garbage line before', - 'NEW_ENV_VALUE=234', - 'garbage line after', - ] - mock_process.communicate.return_value = os.linesep.join(output_list), '', 0 - expected = {'NEW_ENV_VALUE': '234'} - result = utils.source_env('my_file') - self.assertDictEqual(result, expected) - os.environ.clear() - os.environ.update(base_env) - - @mock.patch('yardstick.common.utils.configparser.ConfigParser') - def test_parse_ini_file(self, mock_config_parser_type): - defaults = { - 'default1': 'value1', - 'default2': 'value2', - } - s1 = { - 'key1': 'value11', - 'key2': 'value22', - } - s2 = { - 'key1': 'value123', - 'key2': 'value234', - } - - mock_config_parser = mock_config_parser_type() - mock_config_parser.read.return_value = True - mock_config_parser.sections.return_value = ['s1', 's2'] - mock_config_parser.items.side_effect = iter([ - defaults.items(), - s1.items(), - s2.items(), - ]) - - expected = { - 'DEFAULT': defaults, - 's1': s1, - 's2': s2, - } - result = utils.parse_ini_file('my_path') - self.assertDictEqual(result, expected) - - @mock.patch('yardstick.common.utils.configparser.ConfigParser') - def test_parse_ini_file_missing_section_header(self, mock_config_parser_type): - mock_config_parser = mock_config_parser_type() - mock_config_parser.read.side_effect = \ - configparser.MissingSectionHeaderError(mock.Mock(), 321, mock.Mock()) - - with self.assertRaises(configparser.MissingSectionHeaderError): - utils.parse_ini_file('my_path') - - @mock.patch('yardstick.common.utils.configparser.ConfigParser') - def test_parse_ini_file_no_file(self, mock_config_parser_type): - mock_config_parser = mock_config_parser_type() - mock_config_parser.read.return_value = False - with self.assertRaises(RuntimeError): - utils.parse_ini_file('my_path') - - @mock.patch('yardstick.common.utils.configparser.ConfigParser') - def test_parse_ini_file_no_default_section_header(self, mock_config_parser_type): - s1 = { - 'key1': 'value11', - 'key2': 'value22', - } - s2 = { - 'key1': 'value123', - 'key2': 'value234', - } - - mock_config_parser = mock_config_parser_type() - mock_config_parser.read.return_value = True - mock_config_parser.sections.return_value = ['s1', 's2'] - mock_config_parser.items.side_effect = iter([ - configparser.NoSectionError(mock.Mock()), - s1.items(), - s2.items(), - ]) - - expected = { - 'DEFAULT': {}, - 's1': s1, - 's2': s2, - } - result = utils.parse_ini_file('my_path') - self.assertDictEqual(result, expected) - - def test_join_non_strings(self): - self.assertEqual(utils.join_non_strings(':'), '') - self.assertEqual(utils.join_non_strings(':', 'a'), 'a') - self.assertEqual(utils.join_non_strings(':', 'a', 2, 'c'), 'a:2:c') - self.assertEqual(utils.join_non_strings(':', ['a', 2, 'c']), 'a:2:c') - self.assertEqual(utils.join_non_strings(':', 'abc'), 'abc') - - def test_validate_non_string_sequence(self): - self.assertEqual(utils.validate_non_string_sequence([1, 2, 3]), [1, 2, 3]) - self.assertIsNone(utils.validate_non_string_sequence('123')) - self.assertIsNone(utils.validate_non_string_sequence(1)) - - self.assertEqual(utils.validate_non_string_sequence(1, 2), 2) - self.assertEqual(utils.validate_non_string_sequence(1, default=2), 2) - - with self.assertRaises(RuntimeError): - utils.validate_non_string_sequence(1, raise_exc=RuntimeError) - - def test_error_class(self): - with self.assertRaises(RuntimeError): - utils.ErrorClass() - - error_instance = utils.ErrorClass(test='') - with self.assertRaises(AttributeError): - error_instance.get_name() - - -class TestUtilsIpAddrMethods(unittest.TestCase): - - GOOD_IP_V4_ADDRESS_STR_LIST = [ - u'0.0.0.0', - u'10.20.30.40', - u'127.0.0.1', - u'10.20.30.40', - u'172.29.50.75', - u'192.168.230.9', - u'255.255.255.255', - ] - - GOOD_IP_V4_MASK_STR_LIST = [ - u'/1', - u'/8', - u'/13', - u'/19', - u'/24', - u'/32', - ] - - GOOD_IP_V6_ADDRESS_STR_LIST = [ - u'::1', - u'fe80::250:56ff:fe89:91ff', - u'123:4567:89ab:cdef:123:4567:89ab:cdef', - ] - - GOOD_IP_V6_MASK_STR_LIST = [ - u'/1', - u'/16', - u'/29', - u'/64', - u'/99', - u'/128', - ] - - INVALID_IP_ADDRESS_STR_LIST = [ - 1, - u'w.x.y.z', - u'10.20.30.40/33', - u'123:4567:89ab:cdef:123:4567:89ab:cdef/129', - ] - - def test_safe_ip_address(self): - addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST - for addr in addr_list: - # test with no mask - expected = ipaddress.ip_address(addr) - self.assertEqual(utils.safe_ip_address(addr), expected, addr) - - def test_safe_ip_address_v6_ip(self): - addr_list = self.GOOD_IP_V6_ADDRESS_STR_LIST - for addr in addr_list: - # test with no mask - expected = ipaddress.ip_address(addr) - self.assertEqual(utils.safe_ip_address(addr), expected, addr) - - @mock.patch("yardstick.common.utils.logging") - def test_safe_ip_address_negative(self, *args): - # NOTE(ralonsoh): check the calls to mocked functions. - for value in self.INVALID_IP_ADDRESS_STR_LIST: - self.assertIsNone(utils.safe_ip_address(value), value) - - addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST - mask_list = self.GOOD_IP_V4_MASK_STR_LIST - for addr_mask_pair in product(addr_list, mask_list): - value = ''.join(addr_mask_pair) - self.assertIsNone(utils.safe_ip_address(value), value) - - addr_list = self.GOOD_IP_V6_ADDRESS_STR_LIST - mask_list = self.GOOD_IP_V6_MASK_STR_LIST - for addr_mask_pair in product(addr_list, mask_list): - value = ''.join(addr_mask_pair) - self.assertIsNone(utils.safe_ip_address(value), value) - - def test_get_ip_version(self): - addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST - for addr in addr_list: - # test with no mask - self.assertEqual(utils.get_ip_version(addr), 4, addr) - - def test_get_ip_version_v6_ip(self): - addr_list = self.GOOD_IP_V6_ADDRESS_STR_LIST - for addr in addr_list: - # test with no mask - self.assertEqual(utils.get_ip_version(addr), 6, addr) - - @mock.patch("yardstick.common.utils.logging") - def test_get_ip_version_negative(self, *args): - # NOTE(ralonsoh): check the calls to mocked functions. - for value in self.INVALID_IP_ADDRESS_STR_LIST: - self.assertIsNone(utils.get_ip_version(value), value) - - addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST - mask_list = self.GOOD_IP_V4_MASK_STR_LIST - for addr_mask_pair in product(addr_list, mask_list): - value = ''.join(addr_mask_pair) - self.assertIsNone(utils.get_ip_version(value), value) - - addr_list = self.GOOD_IP_V6_ADDRESS_STR_LIST - mask_list = self.GOOD_IP_V6_MASK_STR_LIST - for addr_mask_pair in product(addr_list, mask_list): - value = ''.join(addr_mask_pair) - self.assertIsNone(utils.get_ip_version(value), value) - - def test_ip_to_hex(self): - self.assertEqual(utils.ip_to_hex('0.0.0.0'), '00000000') - self.assertEqual(utils.ip_to_hex('10.20.30.40'), '0a141e28') - self.assertEqual(utils.ip_to_hex('127.0.0.1'), '7f000001') - self.assertEqual(utils.ip_to_hex('172.31.90.100'), 'ac1f5a64') - self.assertEqual(utils.ip_to_hex('192.168.254.253'), 'c0a8fefd') - self.assertEqual(utils.ip_to_hex('255.255.255.255'), 'ffffffff') - - def test_ip_to_hex_v6_ip(self): - for value in self.GOOD_IP_V6_ADDRESS_STR_LIST: - self.assertEqual(utils.ip_to_hex(value), value) - - @mock.patch("yardstick.common.utils.logging") - def test_ip_to_hex_negative(self, *args): - # NOTE(ralonsoh): check the calls to mocked functions. - addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST - mask_list = self.GOOD_IP_V4_MASK_STR_LIST - value_iter = (''.join(pair) for pair in product(addr_list, mask_list)) - for value in chain(value_iter, self.INVALID_IP_ADDRESS_STR_LIST): - self.assertEqual(utils.ip_to_hex(value), value) - - -class SafeDecodeUtf8TestCase(unittest.TestCase): - - @unittest.skipIf(six.PY2, - 'This test should only be launched with Python 3.x') - def test_safe_decode_utf8(self): - _bytes = b'this is a byte array' - out = utils.safe_decode_utf8(_bytes) - self.assertIs(type(out), str) - self.assertEqual('this is a byte array', out) - - -def main(): - unittest.main() - -if __name__ == '__main__': - main() diff --git a/tests/unit/common/test_yaml_loader.py b/tests/unit/common/test_yaml_loader.py deleted file mode 100644 index 90cbb8157..000000000 --- a/tests/unit/common/test_yaml_loader.py +++ /dev/null @@ -1,32 +0,0 @@ -# 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. - -# yardstick: this file is copied from python-heatclient and slightly modified - -from __future__ import absolute_import -import unittest - -from yardstick.common import yaml_loader - - -class TemplateFormatTestCase(unittest.TestCase): - - def test_parse_to_value_exception(self): - - self.assertEquals(yaml_loader.yaml_load("string"), u"string") - - -def main(): - unittest.main() - -if __name__ == '__main__': - main() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py index e9444b493..2a2647a91 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_acl_vnf.py @@ -15,8 +15,6 @@ # limitations under the License. # -from __future__ import absolute_import - import unittest import mock import os @@ -241,14 +239,14 @@ class TestAclApproxVnf(unittest.TestCase): 'password': 'r00t', 'VNF model': 'acl_vnf.yaml'}}} - def test___init__(self, mock_process): + def test___init__(self, *args): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] acl_approx_vnf = AclApproxVnf(name, vnfd) self.assertIsNone(acl_approx_vnf._vnf_process) @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, mock_time, mock_process): + def test_collect_kpi(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -263,7 +261,7 @@ class TestAclApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_vnf_execute_command(self, ssh, mock_time, mock_process): + def test_vnf_execute_command(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -275,7 +273,7 @@ class TestAclApproxVnf(unittest.TestCase): self.assertEqual("", acl_approx_vnf.vnf_execute(cmd)) @mock.patch(SSH_HELPER) - def test_get_stats(self, ssh, mock_process): + def test_get_stats(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -296,7 +294,7 @@ class TestAclApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.eval") @mock.patch('yardstick.network_services.vnf_generic.vnf.acl_vnf.open') @mock.patch(SSH_HELPER) - def test_run_acl(self, ssh, mock_open, mock_eval, mock_hex, mock_process): + def test_run_acl(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -317,7 +315,7 @@ class TestAclApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.acl_vnf.find_relative_file") @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, mock_context, mock_yang, mock_find, mock_process): + def test_instantiate(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -333,16 +331,9 @@ class TestAclApproxVnf(unittest.TestCase): self.assertIsNone(acl_approx_vnf.instantiate(self.scenario_cfg, self.context_cfg)) - def test_scale(self, mock_process): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - acl_approx_vnf = AclApproxVnf(name, vnfd) - flavor = "" - with self.assertRaises(NotImplementedError): - acl_approx_vnf.scale(flavor) - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, mock_time, mock_process): + def test_terminate(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -355,6 +346,3 @@ class TestAclApproxVnf(unittest.TestCase): acl_approx_vnf.dpdk_nic_bind = "dpdk_nic_bind.py" acl_approx_vnf._resource_collect_stop = mock.Mock() self.assertEqual(None, acl_approx_vnf.terminate()) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_base.py b/tests/unit/network_services/vnf_generic/vnf/test_base.py index f812d67ef..e9488f76f 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_base.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_base.py @@ -17,20 +17,20 @@ # Unittest for yardstick.network_services.vnf_generic.vnf.test_base -from __future__ import absolute_import -import unittest +import multiprocessing import os + import mock -from multiprocessing import Queue +import unittest -from yardstick.network_services.vnf_generic.vnf.base import \ - QueueFileWrapper, GenericVNF, GenericTrafficGen +from yardstick.network_services.vnf_generic.vnf import base from yardstick.ssh import SSH -IP_PIPELINE_CFG_FILE_TPL = """ -arp_route_tbl = ({port0_local_ip_hex},{port0_netmask_hex},1,""" -"""{port1_local_ip_hex}) ({port1_local_ip_hex},{port1_netmask_hex},0,""" -"""{port0_local_ip_hex})""" + +IP_PIPELINE_CFG_FILE_TPL = ("arp_route_tbl = ({port0_local_ip_hex}," + "{port0_netmask_hex},1,{port1_local_ip_hex}) " + "({port1_local_ip_hex},{port1_netmask_hex},0," + "{port0_local_ip_hex})") IP_PIPELINE_ND_CFG_FILE_TPL = """ nd_route_tbl = ({port1_dst_ip_hex6},""" @@ -38,6 +38,111 @@ nd_route_tbl = ({port1_dst_ip_hex6},""" _LOCAL_OBJECT = object() +VNFD_0 = { + 'short-name': 'VpeVnf', + 'vdu': [ + { + 'routing_table': [ + { + 'network': '152.16.100.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.100.20', + 'if': 'xe0' + }, + { + 'network': '152.16.40.20', + 'netmask': '255.255.255.0', + 'gateway': '152.16.40.20', + 'if': 'xe1' + }, + ], + 'description': 'VPE approximation using DPDK', + 'name': 'vpevnf-baremetal', + 'nd_route_tbl': [ + { + 'network': '0064:ff9b:0:0:0:0:9810:6414', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:6414', + 'if': 'xe0' + }, + { + 'network': '0064:ff9b:0:0:0:0:9810:2814', + 'netmask': '112', + 'gateway': '0064:ff9b:0:0:0:0:9810:2814', + 'if': 'xe1' + }, + ], + 'id': 'vpevnf-baremetal', + 'external-interface': [ + { + 'virtual-interface': { + 'dst_mac': '00:00:00:00:00:03', + 'vpci': '0000:05:00.0', + 'local_ip': '152.16.100.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': 0, + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.100.20', + 'local_mac': '00:00:00:00:00:01' + }, + 'vnfd-connection-point-ref': 'xe0', + 'name': 'xe0' + }, + { + 'virtual-interface': { + 'dst_mac': '00:00:00:00:00:04', + 'vpci': '0000:05:00.1', + 'local_ip': '152.16.40.19', + 'type': 'PCI-PASSTHROUGH', + 'netmask': '255.255.255.0', + 'dpdk_port_num': 1, + 'bandwidth': '10 Gbps', + 'dst_ip': '152.16.40.20', + 'local_mac': '00:00:00:00:00:02' + }, + 'vnfd-connection-point-ref': 'xe1', + 'name': 'xe1' + }, + ], + }, + ], + 'description': 'Vpe approximation using DPDK', + 'mgmt-interface': { + 'vdu-id': 'vpevnf-baremetal', + 'host': '1.1.1.1', + 'password': 'r00t', + 'user': 'root', + 'ip': '1.1.1.1' + }, + 'benchmark': { + 'kpi': [ + 'packets_in', + 'packets_fwd', + 'packets_dropped', + ], + }, + 'connection-point': [ + { + 'type': 'VPORT', + 'name': 'xe0', + }, + { + 'type': 'VPORT', + 'name': 'xe1', + }, + ], + 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' +} + +VNFD = { + 'vnfd:vnfd-catalog': { + 'vnfd': [ + VNFD_0, + ] + } +} + class FileAbsPath(object): def __init__(self, module_file): @@ -70,17 +175,17 @@ def mock_ssh(mock_ssh_type, spec=None, exec_result=_LOCAL_OBJECT, run_result=_LO class TestQueueFileWrapper(unittest.TestCase): def setUp(self): self.prompt = "pipeline>" - self.q_in = Queue() - self.q_out = Queue() + self.q_in = multiprocessing.Queue() + self.q_out = multiprocessing.Queue() def test___init__(self): queue_file_wrapper = \ - QueueFileWrapper(self.q_in, self.q_out, self.prompt) + base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) self.assertEqual(queue_file_wrapper.prompt, self.prompt) def test_clear(self): queue_file_wrapper = \ - QueueFileWrapper(self.q_in, self.q_out, self.prompt) + base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) queue_file_wrapper.bufsize = 5 queue_file_wrapper.write("pipeline>") queue_file_wrapper.close() @@ -89,167 +194,45 @@ class TestQueueFileWrapper(unittest.TestCase): def test_close(self): queue_file_wrapper = \ - QueueFileWrapper(self.q_in, self.q_out, self.prompt) + base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) self.assertEqual(None, queue_file_wrapper.close()) def test_read(self): queue_file_wrapper = \ - QueueFileWrapper(self.q_in, self.q_out, self.prompt) + base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) queue_file_wrapper.q_in.put("pipeline>") self.assertEqual("pipeline>", queue_file_wrapper.read(20)) def test_write(self): queue_file_wrapper = \ - QueueFileWrapper(self.q_in, self.q_out, self.prompt) + base.QueueFileWrapper(self.q_in, self.q_out, self.prompt) queue_file_wrapper.write("pipeline>") self.assertIsNotNone(queue_file_wrapper.q_out.empty()) class TestGenericVNF(unittest.TestCase): - VNFD_0 = { - 'short-name': 'VpeVnf', - 'vdu': [ - { - 'routing_table': [ - { - 'network': '152.16.100.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.100.20', - 'if': 'xe0' - }, - { - 'network': '152.16.40.20', - 'netmask': '255.255.255.0', - 'gateway': '152.16.40.20', - 'if': 'xe1' - }, - ], - 'description': 'VPE approximation using DPDK', - 'name': 'vpevnf-baremetal', - 'nd_route_tbl': [ - { - 'network': '0064:ff9b:0:0:0:0:9810:6414', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:6414', - 'if': 'xe0' - }, - { - 'network': '0064:ff9b:0:0:0:0:9810:2814', - 'netmask': '112', - 'gateway': '0064:ff9b:0:0:0:0:9810:2814', - 'if': 'xe1' - }, - ], - 'id': 'vpevnf-baremetal', - 'external-interface': [ - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:03', - 'vpci': '0000:05:00.0', - 'local_ip': '152.16.100.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 0, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.100.20', - 'local_mac': '00:00:00:00:00:01' - }, - 'vnfd-connection-point-ref': 'xe0', - 'name': 'xe0' - }, - { - 'virtual-interface': { - 'dst_mac': '00:00:00:00:00:04', - 'vpci': '0000:05:00.1', - 'local_ip': '152.16.40.19', - 'type': 'PCI-PASSTHROUGH', - 'netmask': '255.255.255.0', - 'dpdk_port_num': 1, - 'bandwidth': '10 Gbps', - 'dst_ip': '152.16.40.20', - 'local_mac': '00:00:00:00:00:02' - }, - 'vnfd-connection-point-ref': 'xe1', - 'name': 'xe1' - }, - ], - }, - ], - 'description': 'Vpe approximation using DPDK', - 'mgmt-interface': { - 'vdu-id': 'vpevnf-baremetal', - 'host': '1.1.1.1', - 'password': 'r00t', - 'user': 'root', - 'ip': '1.1.1.1' - }, - 'benchmark': { - 'kpi': [ - 'packets_in', - 'packets_fwd', - 'packets_dropped', - ], - }, - 'connection-point': [ - { - 'type': 'VPORT', - 'name': 'xe0', - }, - { - 'type': 'VPORT', - 'name': 'xe1', - }, - ], - 'id': 'VpeApproxVnf', 'name': 'VPEVnfSsh' - } - - VNFD = { - 'vnfd:vnfd-catalog': { - 'vnfd': [ - VNFD_0, - ] - } - } - - def test___init__(self): - generic_vnf = GenericVNF('vnf1', self.VNFD_0) - assert generic_vnf.kpi - - def test_collect_kpi(self): - generic_vnf = GenericVNF('vnf1', self.VNFD_0) - self.assertRaises(NotImplementedError, generic_vnf.collect_kpi) - - def test__get_kpi_definition(self): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - generic_vnf = GenericVNF('vnf1', vnfd) - kpi = generic_vnf._get_kpi_definition() - self.assertEqual(kpi, ['packets_in', 'packets_fwd', 'packets_dropped']) - - def test_instantiate(self): - generic_vnf = GenericVNF('vnf1', self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) - with self.assertRaises(NotImplementedError): - generic_vnf.instantiate({}, {}) - - def test_scale(self): - generic_vnf = GenericVNF('vnf1', self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) - with self.assertRaises(NotImplementedError): - generic_vnf.scale() - - def test_terminate(self): - generic_vnf = GenericVNF('vnf1', self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]) - with self.assertRaises(NotImplementedError): - generic_vnf.terminate() + def test_definition(self): + """Make sure that the abstract class cannot be instantiated""" + with self.assertRaises(TypeError) as exc: + # pylint: disable=abstract-class-instantiated + base.GenericVNF('vnf1', VNFD['vnfd:vnfd-catalog']['vnfd'][0]) + msg = ("Can't instantiate abstract class GenericVNF with abstract " + "methods collect_kpi, instantiate, scale, terminate, " + "wait_for_instantiate") + self.assertEqual(msg, str(exc.exception)) class TestGenericTrafficGen(unittest.TestCase): def test_definition(self): """Make sure that the abstract class cannot be instantiated""" - vnfd = TestGenericVNF.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + vnfd = VNFD['vnfd:vnfd-catalog']['vnfd'][0] name = 'vnf1' with self.assertRaises(TypeError) as exc: - GenericTrafficGen(name, vnfd) + # pylint: disable=abstract-class-instantiated + base.GenericTrafficGen(name, vnfd) msg = ("Can't instantiate abstract class GenericTrafficGen with " - "abstract methods run_traffic, terminate") + "abstract methods collect_kpi, instantiate, run_traffic, " + "scale, terminate") self.assertEqual(msg, str(exc.exception)) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py index 832509ea7..f2ce18fb3 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_cgnapt_vnf.py @@ -15,14 +15,11 @@ # limitations under the License. # -from __future__ import absolute_import - +from copy import deepcopy import os import unittest import mock -from copy import deepcopy - from tests.unit import STL_MOCKS from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh @@ -305,14 +302,14 @@ class TestCgnaptApproxVnf(unittest.TestCase): def setUp(self): self.scenario_cfg = deepcopy(self.SCENARIO_CFG) - def test___init__(self, mock_process): + def test___init__(self, *args): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) self.assertIsNone(cgnapt_approx_vnf._vnf_process) @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, mock_time, mock_process): + def test_collect_kpi(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -328,7 +325,7 @@ class TestCgnaptApproxVnf(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') @mock.patch(SSH_HELPER) - def test_vnf_execute_command(self, ssh, mock_time, mock_process): + def test_vnf_execute_command(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -340,7 +337,7 @@ class TestCgnaptApproxVnf(unittest.TestCase): self.assertEqual("", cgnapt_approx_vnf.vnf_execute(cmd)) @mock.patch(SSH_HELPER) - def test_get_stats(self, ssh, mock_process): + def test_get_stats(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -362,7 +359,7 @@ class TestCgnaptApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.eval") @mock.patch('yardstick.network_services.vnf_generic.vnf.cgnapt_vnf.open') @mock.patch(SSH_HELPER) - def test_run_vcgnapt(self, ssh, mock_hex, mock_eval, mock_open, mock_process): + def test_run_vcgnapt(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -377,7 +374,7 @@ class TestCgnaptApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, mock_context, mock_process): + def test_instantiate(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -393,15 +390,9 @@ class TestCgnaptApproxVnf(unittest.TestCase): self.assertIsNone(cgnapt_approx_vnf.instantiate(self.scenario_cfg, self.context_cfg)) - def test_scale(self, mock_process): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - cgnapt_approx_vnf = CgnaptApproxVnf(name, vnfd) - flavor = "" - self.assertRaises(NotImplementedError, cgnapt_approx_vnf.scale, flavor) - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, mock_time, mock_process): + def test_terminate(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -417,7 +408,7 @@ class TestCgnaptApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test__vnf_up_post(self, ssh, mock_time, mock_process): + def test__vnf_up_post(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -433,7 +424,7 @@ class TestCgnaptApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test__vnf_up_post_short(self, ssh, mock_time, mock_process): + def test__vnf_up_post_short(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -444,7 +435,3 @@ class TestCgnaptApproxVnf(unittest.TestCase): cgnapt_approx_vnf.scenario_helper.scenario_cfg = self.scenario_cfg cgnapt_approx_vnf._resource_collect_stop = mock.Mock() cgnapt_approx_vnf._vnf_up_post() - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py b/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py index 84eb5dc0d..ed49c7000 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py @@ -15,13 +15,12 @@ # limitations under the License. # -from __future__ import absolute_import - +from itertools import repeat, chain +import mock import os import socket +import time import unittest -from itertools import repeat, chain -import mock from tests.unit import STL_MOCKS from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper @@ -288,29 +287,32 @@ no data length value """ -@mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') class TestProxSocketHelper(unittest.TestCase): + + def setUp(self): + self.mock_time_sleep = mock.patch.object(time, 'sleep').start() + @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') - def test___init__(self, mock_socket, mock_time): + def test___init__(self, mock_socket): expected = mock_socket.socket() prox = ProxSocketHelper() result = prox._sock self.assertEqual(result, expected) - def test_connect(self, mock_time): + def test_connect(self): mock_sock = mock.MagicMock() prox = ProxSocketHelper(mock_sock) prox.connect('10.20.30.40', 23456) self.assertEqual(mock_sock.connect.call_count, 1) - def test_get_sock(self, mock_time): + def test_get_sock(self): mock_sock = mock.MagicMock() prox = ProxSocketHelper(mock_sock) result = prox.get_socket() self.assertIs(result, mock_sock) @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select') - def test_get_data(self, mock_select, mock_time): + def test_get_data(self, mock_select): mock_select.select.side_effect = [[1], [0]] mock_socket = mock.MagicMock() mock_recv = mock_socket.recv() @@ -336,7 +338,7 @@ class TestProxSocketHelper(unittest.TestCase): self.assertEqual(ret, 'jumped over') self.assertEqual(len(prox._pkt_dumps), 3) - def test__parse_socket_data_mixed_data(self, mock_time): + def test__parse_socket_data_mixed_data(self): prox = ProxSocketHelper(mock.MagicMock()) ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False) self.assertEqual(ret, 'not_a_dump,1,2') @@ -346,7 +348,7 @@ class TestProxSocketHelper(unittest.TestCase): self.assertEqual(ret, 'not_a_dump,1,2') self.assertEqual(len(prox._pkt_dumps), 1) - def test__parse_socket_data_bad_data(self, mock_time): + def test__parse_socket_data_bad_data(self): prox = ProxSocketHelper(mock.MagicMock()) with self.assertRaises(ValueError): prox._parse_socket_data(PACKET_DUMP_BAD_1, False) @@ -357,7 +359,7 @@ class TestProxSocketHelper(unittest.TestCase): ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False) self.assertEqual(ret, 'pktdump,3') - def test__parse_socket_data_pkt_dump_only(self, mock_time): + def test__parse_socket_data_pkt_dump_only(self): prox = ProxSocketHelper(mock.MagicMock()) ret = prox._parse_socket_data('', True) self.assertFalse(ret) @@ -368,20 +370,20 @@ class TestProxSocketHelper(unittest.TestCase): ret = prox._parse_socket_data(PACKET_DUMP_2, True) self.assertTrue(ret) - def test_put_command(self, mock_time): + def test_put_command(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.put_command("data") mock_socket.sendall.assert_called_once() - def test_put_command_socket_error(self, mock_time): + def test_put_command_socket_error(self): mock_socket = mock.MagicMock() mock_socket.sendall.side_effect = OSError prox = ProxSocketHelper(mock_socket) prox.put_command("data") mock_socket.sendall.assert_called_once() - def test_get_packet_dump(self, mock_time): + def test_get_packet_dump(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox._pkt_dumps = [] @@ -391,67 +393,67 @@ class TestProxSocketHelper(unittest.TestCase): self.assertEqual(prox.get_packet_dump(), 234) self.assertEqual(prox._pkt_dumps, []) - def test_stop_all_reset(self, mock_time): + def test_stop_all_reset(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.stop_all_reset() mock_socket.sendall.assert_called() - def test_stop_all(self, mock_time): + def test_stop_all(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.stop_all() mock_socket.sendall.assert_called() - def test_stop(self, mock_time): + def test_stop(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.stop([3, 4, 5], 16) mock_socket.sendall.assert_called() - def test_start_all(self, mock_time): + def test_start_all(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.start_all() mock_socket.sendall.assert_called() - def test_start(self, mock_time): + def test_start(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.start([3, 4, 5]) mock_socket.sendall.assert_called() - def test_reset_stats(self, mock_time): + def test_reset_stats(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.reset_stats() mock_socket.sendall.assert_called() - def test_set_pkt_size(self, mock_time): + def test_set_pkt_size(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.set_pkt_size([3, 4, 5], 1024) self.assertEqual(mock_socket.sendall.call_count, 3) - def test_set_value(self, mock_time): + def test_set_value(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.set_value([3, 4, 5], 10, 20, 30) self.assertEqual(mock_socket.sendall.call_count, 3) - def test_reset_values(self, mock_time): + def test_reset_values(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.reset_values([3, 4, 5]) self.assertEqual(mock_socket.sendall.call_count, 3) - def test_set_speed(self, mock_time): + def test_set_speed(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.set_speed([3, 4, 5], 1000) self.assertEqual(mock_socket.sendall.call_count, 3) - def test_slope_speed(self, mock_time): + def test_slope_speed(self): core_data = [ { 'cores': [3, 4, 5], @@ -473,13 +475,13 @@ class TestProxSocketHelper(unittest.TestCase): prox.slope_speed(core_data, 5, 5) self.assertEqual(set_speed.call_count, 10) - def test_set_pps(self, mock_time): + def test_set_pps(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.set_pps([3, 4, 5], 1000, 512) self.assertEqual(mock_socket.sendall.call_count, 3) - def test_lat_stats(self, mock_time): + def test_lat_stats(self): latency_output = [ '1, 2 , 3', # has white space '4,5', # too short @@ -510,7 +512,7 @@ class TestProxSocketHelper(unittest.TestCase): self.assertEqual(mock_socket.sendall.call_count, 5) self.assertEqual(result, expected) - def test_get_all_tot_stats_error(self, mock_time): + def test_get_all_tot_stats_error(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5') @@ -518,7 +520,7 @@ class TestProxSocketHelper(unittest.TestCase): result = prox.get_all_tot_stats() self.assertEqual(result, expected) - def test_get_all_tot_stats(self, mock_time): + def test_get_all_tot_stats(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5,6') @@ -526,7 +528,7 @@ class TestProxSocketHelper(unittest.TestCase): result = prox.get_all_tot_stats() self.assertEqual(result, expected) - def test_hz(self, mock_time): + def test_hz(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5,6') @@ -534,7 +536,7 @@ class TestProxSocketHelper(unittest.TestCase): result = prox.hz() self.assertEqual(result, expected) - def test_core_stats(self, mock_time): + def test_core_stats(self): core_stats = [ '3,4,5,6', '7,8,9,10,NaN', @@ -548,7 +550,7 @@ class TestProxSocketHelper(unittest.TestCase): result = prox.core_stats([3, 4, 5], 16) self.assertEqual(result, expected) - def test_port_stats(self, mock_time): + def test_port_stats(self): port_stats = [ ','.join(str(n) for n in range(3, 15)), ','.join(str(n) for n in range(8, 32, 2)), @@ -562,7 +564,7 @@ class TestProxSocketHelper(unittest.TestCase): result = prox.port_stats([3, 4, 5]) self.assertEqual(result, expected) - def test_measure_tot_stats(self, mock_time): + def test_measure_tot_stats(self): start_tot = 3, 4, 5, 6 end_tot = 7, 9, 11, 13 delta_tot = 4, 5, 6, 7 @@ -584,7 +586,7 @@ class TestProxSocketHelper(unittest.TestCase): pass self.assertEqual(result, expected) - def test_tot_stats(self, mock_time): + def test_tot_stats(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5,6') @@ -592,7 +594,7 @@ class TestProxSocketHelper(unittest.TestCase): result = prox.tot_stats() self.assertEqual(result, expected) - def test_tot_ierrors(self, mock_time): + def test_tot_ierrors(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5,6') @@ -600,25 +602,25 @@ class TestProxSocketHelper(unittest.TestCase): result = prox.tot_ierrors() self.assertEqual(result, expected) - def test_set_count(self, mock_time): + def test_set_count(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.set_count(432, [3, 4, 5]) self.assertEqual(mock_socket.sendall.call_count, 3) - def test_dump_rx(self, mock_time): + def test_dump_rx(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.dump_rx(3, 5, 8) self.assertEqual(mock_socket.sendall.call_count, 1) - def test_quit(self, mock_time): + def test_quit(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.quit() mock_socket.sendall.assert_called() - def test_force_quit(self, mock_time): + def test_force_quit(self): mock_socket = mock.MagicMock() prox = ProxSocketHelper(mock_socket) prox.force_quit() @@ -1062,8 +1064,7 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): self.assertEqual(helper._prox_config_data, '44') self.assertEqual(helper.remote_path, '55') - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file') - def test_build_config(self, mock_find_path): + def test_build_config(self): vnf1 = { 'prox_args': {'-f': ""}, 'prox_path': '/opt/nsb_bin/prox', @@ -1075,10 +1076,9 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ], } - mock_find_path.side_effect = ['1', '2'] - vnfd_helper = mock.MagicMock() - ssh_helper = mock.MagicMock() - ssh_helper.provision_tool.return_value = "/opt/nsb_bin/prox" + vnfd_helper = mock.Mock() + ssh_helper = mock.Mock() + ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/prox' scenario_helper = ScenarioHelper('vnf1') scenario_helper.scenario_cfg = { 'task_path': 'a/b', @@ -1087,12 +1087,16 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): }, } - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper.remote_path = "/tmp/prox.cfg" - expected = "sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli -f -f /tmp/prox.cfg '" - with mock.patch.object(helper, "build_config_file") as mock_build_config: + expected = ("sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli " + "-f -f /tmp/prox.cfg '") + + helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, + scenario_helper) + with mock.patch.object(helper, 'build_config_file') as mock_cfg_file: + helper.remote_path = '/tmp/prox.cfg' prox_cmd = helper.build_config() self.assertEqual(prox_cmd, expected) + mock_cfg_file.assert_called_once() def test__insert_additional_file(self): vnfd_helper = mock.MagicMock() @@ -1256,16 +1260,6 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): result = helper.put_string_to_file('my long string', 'a/b') self.assertEqual(result, expected) - def test__build_pipeline_kwarags(self): - vnfd_helper = mock.MagicMock() - ssh_helper = mock.MagicMock() - ssh_helper.provision_tool.return_value = "/tmp/nosuch" - scenario_helper = mock.MagicMock() - - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) - helper._build_pipeline_kwargs() - self.assertEqual(helper.pipeline_kwargs, {'tool_path': '/tmp/nosuch', 'tool_dir': '/tmp'}) - def test_copy_to_target(self): vnfd_helper = mock.MagicMock() vnfd_helper.interfaces = [] @@ -1416,7 +1410,7 @@ class TestProxResourceHelper(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0) @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper') - def test_sut(self, mock_socket_helper): + def test_sut(self, *args): helper = ProxResourceHelper(mock.MagicMock()) self.assertIsNone(helper.client) result = helper.sut @@ -1466,7 +1460,7 @@ class TestProxResourceHelper(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper') - def test__connect(self, mock_socket_helper_type, mock_time): + def test__connect(self, mock_socket_helper_type, *args): client = mock_socket_helper_type() client.connect.side_effect = chain(repeat(socket.error, 5), [None]) @@ -1869,7 +1863,7 @@ class TestProxProfileHelper(unittest.TestCase): self.assertIs(result, expected) @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time') - def test_traffic_context(self, mock_time): + def test_traffic_context(self, *args): setup_helper = mock.MagicMock() setup_helper.vnfd_helper.interfaces = [] diff --git a/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py index e29e8ddcd..769279066 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_prox_vnf.py @@ -15,8 +15,6 @@ # limitations under the License. # -from __future__ import absolute_import - import errno import os import unittest @@ -316,13 +314,13 @@ class TestProxApproxVnf(unittest.TestCase): } @mock.patch(SSH_HELPER) - def test___init__(self, ssh, mock_time): + def test___init__(self, ssh, *args): mock_ssh(ssh) prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) self.assertIsNone(prox_approx_vnf._vnf_process) @mock.patch(SSH_HELPER) - def test_collect_kpi_no_client(self, ssh, mock_time): + def test_collect_kpi_no_client(self, ssh, *args): mock_ssh(ssh) prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) @@ -337,7 +335,7 @@ class TestProxApproxVnf(unittest.TestCase): self.assertEqual(result, expected) @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, mock_time): + def test_collect_kpi(self, ssh, *args): mock_ssh(ssh) resource_helper = mock.MagicMock() @@ -357,7 +355,7 @@ class TestProxApproxVnf(unittest.TestCase): self.assertEqual(result, expected) @mock.patch(SSH_HELPER) - def test_collect_kpi_error(self, ssh, mock_time): + def test_collect_kpi_error(self, ssh, *args): mock_ssh(ssh) resource_helper = mock.MagicMock() @@ -370,31 +368,13 @@ class TestProxApproxVnf(unittest.TestCase): with self.assertRaises(RuntimeError): prox_approx_vnf.collect_kpi() - def _get_file_abspath(self, filename, mock_time): + def _get_file_abspath(self, filename, *args): curr_path = os.path.dirname(os.path.abspath(__file__)) file_path = os.path.join(curr_path, filename) return file_path - @mock.patch('yardstick.benchmark.scenarios.networking.vnf_generic.open', create=True) - @mock.patch('yardstick.network_services.helpers.iniparser.open', create=True) - @mock.patch(SSH_HELPER) - def test_run_prox(self, ssh, *_): - mock_ssh(ssh) - - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - prox_approx_vnf.scenario_helper.scenario_cfg = self.SCENARIO_CFG - prox_approx_vnf.ssh_helper.provision_tool.return_value = '/tool_path12/tool_file34' - prox_approx_vnf.setup_helper.remote_path = 'configs/file56.cfg' - - expected = "sudo bash -c 'cd /tool_path12; " \ - "/tool_path12/tool_file34 -o cli -t -f /tmp/l3-swap-2.cfg '" - - prox_approx_vnf._run() - result = prox_approx_vnf.ssh_helper.run.call_args[0][0] - self.assertEqual(result, expected) - @mock.patch(SSH_HELPER) - def bad_test_instantiate(self, ssh, mock_time): + def bad_test_instantiate(self, *args): prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) prox_approx_vnf.scenario_helper = mock.MagicMock() prox_approx_vnf.setup_helper = mock.MagicMock() @@ -403,7 +383,7 @@ class TestProxApproxVnf(unittest.TestCase): prox_approx_vnf.setup_helper.build_config.assert_called_once() @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_panic(self, ssh, mock_time): + def test_wait_for_instantiate_panic(self, ssh, *args): mock_ssh(ssh, exec_result=(1, "", "")) prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) prox_approx_vnf._vnf_process = mock.MagicMock(**{"is_alive.return_value": True}) @@ -413,16 +393,9 @@ class TestProxApproxVnf(unittest.TestCase): with self.assertRaises(RuntimeError): prox_approx_vnf.wait_for_instantiate() - @mock.patch(SSH_HELPER) - def test_scale(self, ssh, mock_time): - mock_ssh(ssh) - prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) - with self.assertRaises(NotImplementedError): - prox_approx_vnf.scale() - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, mock_socket, mock_time): + def test_terminate(self, ssh, *args): mock_ssh(ssh) prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) prox_approx_vnf._vnf_process = mock.MagicMock() @@ -434,7 +407,7 @@ class TestProxApproxVnf(unittest.TestCase): self.assertIsNone(prox_approx_vnf.terminate()) @mock.patch(SSH_HELPER) - def test__vnf_up_post(self, ssh, mock_time): + def test__vnf_up_post(self, ssh, *args): mock_ssh(ssh) prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) prox_approx_vnf.resource_helper = resource_helper = mock.Mock() @@ -443,7 +416,7 @@ class TestProxApproxVnf(unittest.TestCase): self.assertEqual(resource_helper.up_post.call_count, 1) @mock.patch(SSH_HELPER) - def test_vnf_execute_oserror(self, ssh, mock_time): + def test_vnf_execute_oserror(self, ssh, *args): mock_ssh(ssh) prox_approx_vnf = ProxApproxVnf(NAME, self.VNFD0) prox_approx_vnf.resource_helper = resource_helper = mock.Mock() @@ -457,6 +430,3 @@ class TestProxApproxVnf(unittest.TestCase): resource_helper.execute.side_effect = OSError(errno.EADDRINUSE, "") with self.assertRaises(OSError): prox_approx_vnf.vnf_execute("", _ignore_errors=True) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py index 85b10c5a9..beb4f8f9f 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py @@ -15,10 +15,6 @@ # limitations under the License. # -# Unittest for yardstick.network_services.vnf_generic.vnf.sample_vnf - -from __future__ import absolute_import - import unittest import mock from copy import deepcopy @@ -26,8 +22,8 @@ from copy import deepcopy from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh from tests.unit import STL_MOCKS from yardstick.benchmark.contexts.base import Context +from yardstick.common import exceptions as y_exceptions from yardstick.network_services.nfvi.resource import ResourceProfile -from yardstick.network_services.traffic_profile.base import TrafficProfile from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper @@ -571,7 +567,7 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.open') @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.find_relative_file') @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.MultiPortConfig') - def test_build_config(self, mock_multi_port_config_class, mock_find, _): + def test_build_config(self, mock_multi_port_config_class, mock_find, *args): mock_multi_port_config = mock_multi_port_config_class() vnfd_helper = VnfdHelper(self.VNFD_0) ssh_helper = mock.Mock() @@ -610,8 +606,8 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') @mock.patch('yardstick.ssh.SSH') - def test_setup_vnf_environment(self, _, mock_time): - def execute(cmd, *args, **kwargs): + def test_setup_vnf_environment(self, *args): + def execute(cmd): if cmd.startswith('which '): return exec_failure return exec_success @@ -643,7 +639,7 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase): @mock.patch('yardstick.ssh.SSH') def test__setup_dpdk_short(self, _): - def execute_side(cmd, *args, **kwargs): + def execute_side(cmd): if 'joined_path' in cmd: return 0, 'output', '' return 1, 'bad output', 'error output' @@ -691,7 +687,7 @@ class TestDpdkVnfSetupEnvHelper(unittest.TestCase): self.assertEqual(dpdk_setup_helper.socket, 1) @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') - def test__detect_and_bind_drivers(self, mock_time): + def test__detect_and_bind_drivers(self, *args): vnfd_helper = VnfdHelper(deepcopy(self.VNFD_0)) ssh_helper = mock.Mock() # ssh_helper.execute = mock.Mock(return_value = (0, 'text', '')) @@ -1002,7 +998,7 @@ class TestClientResourceHelper(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG') @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError', new_callable=lambda: MockError) - def test_get_stats_not_connected(self, mock_state_error, mock_logger): + def test_get_stats_not_connected(self, mock_state_error, *args): vnfd_helper = VnfdHelper(self.VNFD_0) ssh_helper = mock.Mock() scenario_helper = mock.Mock() @@ -1221,7 +1217,7 @@ class TestClientResourceHelper(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.LOG') @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.STLError', new_callable=lambda: MockError) - def test__connect_with_failures(self, mock_error, mock_logger, mock_time): + def test__connect_with_failures(self, mock_error, *args): vnfd_helper = VnfdHelper(self.VNFD_0) ssh_helper = mock.Mock() scenario_helper = mock.Mock() @@ -1393,7 +1389,7 @@ class TestSampleVNFDeployHelper(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') @mock.patch('subprocess.check_output') - def test_deploy_vnfs_disabled(self, mock_check_output, mock_time): + def test_deploy_vnfs_disabled(self, *args): vnfd_helper = mock.Mock() ssh_helper = mock.Mock() ssh_helper.join_bin_path.return_value = 'joined_path' @@ -1408,7 +1404,7 @@ class TestSampleVNFDeployHelper(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') @mock.patch('subprocess.check_output') - def test_deploy_vnfs(self, mock_check_output, mock_time): + def test_deploy_vnfs(self, *args): vnfd_helper = mock.Mock() ssh_helper = mock.Mock() ssh_helper.join_bin_path.return_value = 'joined_path' @@ -1422,7 +1418,7 @@ class TestSampleVNFDeployHelper(unittest.TestCase): self.assertEqual(ssh_helper.put.call_count, 1) @mock.patch('subprocess.check_output') - def test_deploy_vnfs_early_success(self, mock_check_output): + def test_deploy_vnfs_early_success(self, *args): vnfd_helper = mock.Mock() ssh_helper = mock.Mock() ssh_helper.join_bin_path.return_value = 'joined_path' @@ -1700,7 +1696,7 @@ class TestSampleVnf(unittest.TestCase): self.assertEqual(result, expected) @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.Process') - def test__start_vnf(self, mock_process_type): + def test__start_vnf(self, *args): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] sample_vnf = SampleVNF('vnf1', vnfd) sample_vnf._run = mock.Mock() @@ -1754,7 +1750,7 @@ class TestSampleVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch("yardstick.ssh.SSH") - def test_wait_for_instantiate_empty_queue(self, ssh, mock_time): + def test_wait_for_instantiate_empty_queue(self, ssh, *args): mock_ssh(ssh, exec_result=(1, "", "")) queue_size_list = [ @@ -1798,7 +1794,7 @@ class TestSampleVnf(unittest.TestCase): self.assertIsNotNone(sample_vnf.my_ports) @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") - def test_vnf_execute_with_queue_data(self, mock_time): + def test_vnf_execute_with_queue_data(self, *args): queue_size_list = [ 1, 1, @@ -1843,7 +1839,7 @@ class TestSampleVnf(unittest.TestCase): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] sample_vnf = SampleVNF('vnf1', vnfd) sample_vnf.APP_NAME = 'sample1' - sample_vnf.COLLECT_KPI = '\s(\d+)\D*(\d+)\D*(\d+)' + sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)' sample_vnf.COLLECT_MAP = { 'k1': 3, 'k2': 1, @@ -1866,7 +1862,7 @@ class TestSampleVnf(unittest.TestCase): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] sample_vnf = SampleVNF('vnf1', vnfd) sample_vnf.APP_NAME = 'sample1' - sample_vnf.COLLECT_KPI = '\s(\d+)\D*(\d+)\D*(\d+)' + sample_vnf.COLLECT_KPI = r'\s(\d+)\D*(\d+)\D*(\d+)' sample_vnf.get_stats = mock.Mock(return_value='') expected = { @@ -1877,6 +1873,29 @@ class TestSampleVnf(unittest.TestCase): result = sample_vnf.collect_kpi() self.assertDictEqual(result, expected) + def test_scale(self): + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + sample_vnf = SampleVNF('vnf1', vnfd) + self.assertRaises(y_exceptions.FunctionNotImplemented, + sample_vnf.scale) + + def test__run(self): + test_cmd = 'test cmd' + run_kwargs = {'arg1': 'val1', 'arg2': 'val2'} + vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] + sample_vnf = SampleVNF('vnf1', vnfd) + sample_vnf.ssh_helper = mock.Mock() + sample_vnf.setup_helper = mock.Mock() + with mock.patch.object(sample_vnf, '_build_config', + return_value=test_cmd), \ + mock.patch.object(sample_vnf, '_build_run_kwargs'): + sample_vnf.run_kwargs = run_kwargs + sample_vnf._run() + sample_vnf.ssh_helper.drop_connection.assert_called_once() + sample_vnf.ssh_helper.run.assert_called_once_with(test_cmd, + **run_kwargs) + sample_vnf.setup_helper.kill_vnf.assert_called_once() + class TestSampleVNFTrafficGen(unittest.TestCase): @@ -2051,3 +2070,8 @@ class TestSampleVNFTrafficGen(unittest.TestCase): self.assertEqual(sample_vnf_tg._wait_for_process(), 234) mock_proc.is_alive.assert_has_calls([mock.call(), mock.call()]) mock_status.assert_has_calls([mock.call(), mock.call()]) + + def test_scale(self): + sample_vnf_tg = SampleVNFTrafficGen('tg1', self.VNFD_0) + self.assertRaises(y_exceptions.FunctionNotImplemented, + sample_vnf_tg.scale) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py index ab3570740..63b2ac4ab 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_ping.py @@ -288,14 +288,6 @@ class TestPingTrafficGen(unittest.TestCase): self.assertIsNone(ping_traffic_gen.listen_traffic({})) @mock.patch("yardstick.ssh.SSH") - def test_scale_negative(self, ssh): - ssh.from_node.return_value.execute.return_value = 0, "success", "" - ssh.from_node.return_value.run.return_value = 0, "success", "" - - ping_traffic_gen = PingTrafficGen('vnf1', self.VNFD_0) - ping_traffic_gen.scale() - - @mock.patch("yardstick.ssh.SSH") def test_terminate(self, ssh): ssh.from_node.return_value.execute.return_value = 0, "success", "" ssh.from_node.return_value.run.return_value = 0, "success", "" diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py index 23d448c5e..7b4d79e02 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py @@ -13,14 +13,13 @@ # limitations under the License. # -from __future__ import absolute_import - import unittest import mock from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh from tests.unit import STL_MOCKS + SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' NAME = 'vnf__1' @@ -319,14 +318,14 @@ class TestProxTrafficGen(unittest.TestCase): 'upper_bound': 100.0}} @mock.patch(SSH_HELPER) - def test___init__(self, ssh, mock_time): + def test___init__(self, ssh, *args): mock_ssh(ssh) prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0) self.assertIsNone(prox_traffic_gen._tg_process) self.assertIsNone(prox_traffic_gen._traffic_process) @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, mock_time): + def test_collect_kpi(self, ssh, *args): mock_ssh(ssh) prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0) @@ -335,10 +334,12 @@ class TestProxTrafficGen(unittest.TestCase): prox_traffic_gen._vnf_wrapper.vnf_execute = mock.Mock(return_value="") self.assertEqual({}, prox_traffic_gen.collect_kpi()) - @mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores') + @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file') + @mock.patch( + 'yardstick.network_services.vnf_generic.vnf.sample_vnf.CpuSysCores') @mock.patch(SSH_HELPER) - def bad_test_instantiate(self, ssh, mock_find, mock_cpu_sys_cores, mock_time): + def bad_test_instantiate(self, ssh, mock_cpu_sys_cores, *args): mock_ssh(ssh) mock_cpu_sys_cores.get_core_socket.return_value = {'0': '01234'} @@ -381,7 +382,7 @@ class TestProxTrafficGen(unittest.TestCase): prox_traffic_gen.instantiate(scenario_cfg, {}) @mock.patch(SSH_HELPER) - def test__traffic_runner(self, ssh, mock_time): + def test__traffic_runner(self, ssh, *args): mock_ssh(ssh) mock_traffic_profile = mock.Mock(autospec=TrafficProfile) @@ -399,17 +400,9 @@ class TestProxTrafficGen(unittest.TestCase): sut._connect_client.get_stats = mock.Mock(return_value="0") sut._traffic_runner(mock_traffic_profile) - @mock.patch(SSH_HELPER) - def test_scale(self, ssh, mock_time): - mock_ssh(ssh, exec_result=(1, "", "")) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - prox_traffic_gen = ProxTrafficGen(NAME, vnfd) - with self.assertRaises(NotImplementedError): - prox_traffic_gen.scale('') - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') @mock.patch(SSH_HELPER) - def test_listen_traffic(self, ssh, mock_socket, mock_time): + def test_listen_traffic(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] prox_traffic_gen = ProxTrafficGen(NAME, vnfd) @@ -417,7 +410,7 @@ class TestProxTrafficGen(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, mock_socket, mock_time): + def test_terminate(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] prox_traffic_gen = ProxTrafficGen(NAME, vnfd) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py index f62a0fb3b..e9f718cb7 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py @@ -15,8 +15,6 @@ # limitations under the License. # -from __future__ import absolute_import - import os import unittest import mock @@ -40,14 +38,14 @@ NAME = "tg__1" @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.IxNextgen") class TestIxiaResourceHelper(unittest.TestCase): - def test___init___with_custom_rfc_helper(self, mock_ix_nextgen): + def test___init___with_custom_rfc_helper(self, *args): class MyRfcHelper(IxiaRfc2544Helper): pass ixia_resource_helper = IxiaResourceHelper(mock.Mock(), MyRfcHelper) self.assertIsInstance(ixia_resource_helper.rfc_helper, MyRfcHelper) - def test_stop_collect_with_client(self, mock_ix_nextgen): + def test_stop_collect_with_client(self, *args): mock_client = mock.Mock() ixia_resource_helper = IxiaResourceHelper(mock.Mock()) @@ -154,16 +152,17 @@ class TestIXIATrafficGen(unittest.TestCase): 'file': '/etc/yardstick/nodes/pod.yaml'}, 'schema': 'yardstick:task:0.1'} - def test___init__(self, mock_ixnextgen): + def test___init__(self, *args): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ mock.Mock(return_value=(0, "", "")) ssh.from_node.return_value = ssh_mock vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd) + # NOTE(ralonsoh): check the object returned. + IxiaTrafficGen(NAME, vnfd) - def test_listen_traffic(self, mock_ixnextgen): + def test_listen_traffic(self, *args): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ @@ -173,7 +172,7 @@ class TestIXIATrafficGen(unittest.TestCase): ixnet_traffic_gen = IxiaTrafficGen(NAME, vnfd) self.assertEqual(None, ixnet_traffic_gen.listen_traffic({})) - def test_instantiate(self, mock_ixnextgen): + def test_instantiate(self, *args): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ @@ -203,7 +202,7 @@ class TestIXIATrafficGen(unittest.TestCase): IOError, ixnet_traffic_gen.instantiate(scenario_cfg, {})) - def test_collect_kpi(self, mock_ixnextgen): + def test_collect_kpi(self, *args): with mock.patch("yardstick.ssh.SSH") as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) ssh_mock.execute = \ @@ -215,7 +214,7 @@ class TestIXIATrafficGen(unittest.TestCase): restult = ixnet_traffic_gen.collect_kpi() self.assertEqual({}, restult) - def test_terminate(self, mock_ixnextgen): + def test_terminate(self, *args): with mock.patch("yardstick.ssh.SSH") as ssh: vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] ssh_mock = mock.Mock(autospec=ssh.SSH) @@ -236,19 +235,14 @@ class TestIXIATrafficGen(unittest.TestCase): file_path = os.path.join(curr_path, filename) return file_path - def test_scale(self, mock_ix_nextgen): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - sut = IxiaTrafficGen('vnf1', vnfd) - sut.scale() - - def test__check_status(self, mock_ix_nextgen): + def test__check_status(self, *args): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] sut = IxiaTrafficGen('vnf1', vnfd) sut._check_status() @mock.patch("yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.time") @mock.patch("yardstick.ssh.SSH") - def test_traffic_runner(self, mock_ixnextgen, mock_ssh, mock_time): + def test_traffic_runner(self, mock_ssh, *args): mock_traffic_profile = mock.Mock(autospec=TrafficProfile) mock_traffic_profile.get_traffic_definition.return_value = "64" mock_traffic_profile.params = self.TRAFFIC_PROFILE diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py index 637706fb4..7342cfcdc 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_trex.py @@ -331,15 +331,6 @@ class TestTrexTrafficGenRFC(unittest.TestCase): trex_traffic_gen.resource_helper.ssh_helper = mock.MagicMock() self.assertIsNone(trex_traffic_gen.resource_helper.generate_cfg()) - def test_scale(self): - with mock.patch(SSH_HELPER) as ssh: - ssh_mock = mock.Mock(autospec=ssh.SSH) - ssh_mock.execute = mock.Mock(return_value=(0, "", "")) - ssh_mock.run = mock.Mock(return_value=(0, "", "")) - ssh.from_node.return_value = ssh_mock - trex_traffic_gen = TrexTrafficGenRFC('vnf1', self.VNFD_0) - trex_traffic_gen.scale('') - def test_terminate(self): with mock.patch(SSH_HELPER) as ssh: ssh_mock = mock.Mock(autospec=ssh.SSH) diff --git a/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py index a2a5058fc..618071507 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py @@ -15,18 +15,16 @@ # limitations under the License. # -from __future__ import absolute_import - -import unittest - import copy import mock -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' +import unittest from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh from tests.unit import STL_MOCKS + +SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' NAME = 'vnf_1' STLClient = mock.MagicMock() @@ -469,13 +467,6 @@ class TestTrexTrafficGen(unittest.TestCase): self.assertIsNotNone(result) @mock.patch(SSH_HELPER) - def test_scale(self, ssh): - mock_ssh(ssh, exec_result=(1, "", "")) - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - trex_traffic_gen = TrexTrafficGen(NAME, vnfd) - trex_traffic_gen.scale('') - - @mock.patch(SSH_HELPER) def test_terminate(self, ssh): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] diff --git a/tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py b/tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py index d4d3439f3..635ce2735 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_udp_replay.py @@ -15,26 +15,24 @@ # limitations under the License. # -from __future__ import absolute_import - import unittest import mock import os from tests.unit import STL_MOCKS -SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' +from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh +SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' + STLClient = mock.MagicMock() stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) stl_patch.start() if stl_patch: from yardstick.network_services.vnf_generic.vnf.udp_replay import UdpReplayApproxVnf - from yardstick.network_services.nfvi.resource import ResourceProfile from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh TEST_FILE_YAML = 'nsb_test_case.yaml' @@ -329,13 +327,13 @@ class TestUdpReplayApproxVnf(unittest.TestCase): } } - def test___init__(self, _): + def test___init__(self, *args): udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) self.assertIsNone(udp_replay_approx_vnf._vnf_process) @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, mock_time, _): + def test_collect_kpi(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD_0 @@ -354,7 +352,7 @@ class TestUdpReplayApproxVnf(unittest.TestCase): self.assertEqual(result, udp_replay_approx_vnf.collect_kpi()) @mock.patch(SSH_HELPER) - def test_get_stats(self, ssh, _): + def test_get_stats(self, ssh, *args): mock_ssh(ssh) udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) @@ -376,7 +374,7 @@ class TestUdpReplayApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") @mock.patch(SSH_HELPER) - def test__build_config(self, ssh, mock_context, *_): + def test__build_config(self, ssh, mock_context, *args): mock_ssh(ssh) udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) @@ -397,7 +395,7 @@ class TestUdpReplayApproxVnf(unittest.TestCase): @mock.patch('yardstick.network_services.vnf_generic.vnf.udp_replay.open') @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") @mock.patch(SSH_HELPER) - def test__build_pipeline_kwargs(self, ssh, mock_context, *_): + def test__build_pipeline_kwargs(self, ssh, mock_context, *args): mock_ssh(ssh) udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) udp_replay_approx_vnf.nfvi_context = mock_context @@ -420,7 +418,7 @@ class TestUdpReplayApproxVnf(unittest.TestCase): }) @mock.patch(SSH_HELPER) - def test_run_udp_replay(self, ssh, _): + def test_run_udp_replay(self, ssh, *args): mock_ssh(ssh) udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) @@ -434,11 +432,9 @@ class TestUdpReplayApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, *_): + def test_instantiate(self, ssh, *args): mock_ssh(ssh) - resource = mock.Mock(autospec=ResourceProfile) - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) udp_replay_approx_vnf.q_out.put("Replay>") udp_replay_approx_vnf.WAIT_TIME = 0 @@ -456,7 +452,7 @@ class TestUdpReplayApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") @mock.patch('yardstick.ssh.SSH') @mock.patch(SSH_HELPER) - def test_instantiate_panic(self, ssh, resource_ssh, *_): + def test_instantiate_panic(self, *args): udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) udp_replay_approx_vnf.WAIT_TIME = 0 udp_replay_approx_vnf.q_out.put("some text PANIC some text") @@ -467,15 +463,9 @@ class TestUdpReplayApproxVnf(unittest.TestCase): with self.assertRaises(RuntimeError): udp_replay_approx_vnf.wait_for_instantiate() - def test_scale(self, _): - udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) - flavor = "" - - self.assertRaises(NotImplementedError, udp_replay_approx_vnf.scale, flavor) - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, mock_time, _): + def test_terminate(self, ssh, *args): mock_ssh(ssh) udp_replay_approx_vnf = UdpReplayApproxVnf(NAME, self.VNFD_0) @@ -484,6 +474,3 @@ class TestUdpReplayApproxVnf(unittest.TestCase): udp_replay_approx_vnf.used_drivers = {"01:01.0": "i40e", "01:01.1": "i40e"} udp_replay_approx_vnf.dpdk_nic_bind = "dpdk_nic_bind.py" self.assertEqual(None, udp_replay_approx_vnf.terminate()) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py index 958099a03..d128db0b4 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_vfw_vnf.py @@ -15,8 +15,6 @@ # limitations under the License. # -from __future__ import absolute_import - import unittest import mock import os @@ -32,10 +30,10 @@ if stl_patch: from yardstick.network_services.vnf_generic.vnf.vfw_vnf import FWApproxVnf from yardstick.network_services.nfvi.resource import ResourceProfile + TEST_FILE_YAML = 'nsb_test_case.yaml' SSH_HELPER = 'yardstick.network_services.vnf_generic.vnf.sample_vnf.VnfSshHelper' - name = 'vnf__1' @@ -239,7 +237,7 @@ class TestFWApproxVnf(unittest.TestCase): 'password': 'r00t', 'VNF model': 'vfw_vnf.yaml'}}} - def test___init__(self, mock_process): + def test___init__(self, *args): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] vfw_approx_vnf = FWApproxVnf(name, vnfd) self.assertIsNone(vfw_approx_vnf._vnf_process) @@ -260,7 +258,7 @@ pipeline> @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_collect_kpi(self, ssh, mock_time, mock_process): + def test_collect_kpi(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -282,7 +280,7 @@ pipeline> @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_vnf_execute_command(self, ssh, mock_time, mock_process): + def test_vnf_execute_command(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -294,7 +292,7 @@ pipeline> self.assertEqual(vfw_approx_vnf.vnf_execute(cmd), "") @mock.patch(SSH_HELPER) - def test_get_stats(self, ssh, mock_process): + def test_get_stats(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -314,7 +312,7 @@ pipeline> @mock.patch("yardstick.network_services.vnf_generic.vnf.vfw_vnf.eval") @mock.patch("yardstick.network_services.vnf_generic.vnf.vfw_vnf.open") @mock.patch(SSH_HELPER) - def test_run_vfw(self, ssh, mock_open, mock_eval, mock_hex, mock_process): + def test_run_vfw(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -337,7 +335,7 @@ pipeline> @mock.patch("yardstick.network_services.vnf_generic.vnf.vfw_vnf.YangModel") @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.Context") @mock.patch(SSH_HELPER) - def test_instantiate(self, ssh, mock_context, mock_yang, mock_find, mock_process): + def test_instantiate(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -351,16 +349,9 @@ pipeline> self.scenario_cfg.update({"nodes": {"vnf__1": ""}}) self.assertIsNone(vfw_approx_vnf.instantiate(self.scenario_cfg, self.context_cfg)) - def test_scale(self, mock_process): - vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] - vfw_approx_vnf = FWApproxVnf(name, vnfd) - flavor = "" - with self.assertRaises(NotImplementedError): - vfw_approx_vnf.scale(flavor) - @mock.patch("yardstick.network_services.vnf_generic.vnf.sample_vnf.time") @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, mock_time, mock_process): + def test_terminate(self, ssh, *args): mock_ssh(ssh) vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -372,6 +363,3 @@ pipeline> vfw_approx_vnf.dpdk_nic_bind = "dpdk_nic_bind.py" vfw_approx_vnf._resource_collect_stop = mock.Mock() self.assertIsNone(vfw_approx_vnf.terminate()) - -if __name__ == '__main__': - unittest.main() diff --git a/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py b/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py index 4103d7825..55cd4d2e8 100644 --- a/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py +++ b/tests/unit/network_services/vnf_generic/vnf/test_vpe_vnf.py @@ -15,15 +15,16 @@ # limitations under the License. # -from __future__ import absolute_import -import six.moves.configparser as configparser - -import os -import unittest import mock from multiprocessing import Process, Queue +import os +import six.moves.configparser as configparser +import time +import unittest from tests.unit import STL_MOCKS +from tests.unit.network_services.vnf_generic.vnf.test_base import FileAbsPath +from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh from yardstick.network_services.vnf_generic.vnf.base import QueueFileWrapper from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper @@ -40,9 +41,6 @@ if stl_patch: from yardstick.network_services.vnf_generic.vnf.vpe_vnf import \ VpeApproxVnf, VpeApproxSetupEnvHelper -from tests.unit.network_services.vnf_generic.vnf.test_base import FileAbsPath -from tests.unit.network_services.vnf_generic.vnf.test_base import mock_ssh - TEST_FILE_YAML = 'nsb_test_case.yaml' @@ -227,28 +225,6 @@ class TestConfigCreate(unittest.TestCase): self.assertNotEqual(result, '') def test_create_vpe_config(self): - uplink_ports = [ - { - 'index': 0, - 'dpdk_port_num': 1, - 'peer_intf': { - 'dpdk_port_num': 2, - 'index': 3, - }, - }, - ] - - downlink_ports = [ - { - 'index': 2, - 'dpdk_port_num': 3, - 'peer_intf': { - 'dpdk_port_num': 0, - 'index': 1, - }, - }, - ] - vnfd_helper = VnfdHelper(self.VNFD_0) config_create = ConfigCreate(vnfd_helper, 23) config_create.downlink_ports = ['xe1'] @@ -260,7 +236,6 @@ class TestConfigCreate(unittest.TestCase): os.system("git checkout -- %s" % vnf_cfg) -@mock.patch('yardstick.network_services.vnf_generic.vnf.sample_vnf.time') class TestVpeApproxVnf(unittest.TestCase): VNFD_0 = { @@ -556,12 +531,15 @@ class TestVpeApproxVnf(unittest.TestCase): }, } - def test___init__(self, _): + def setUp(self): + self.mock_sleep = mock.patch.object(time, 'sleep').start() + + def test___init__(self): vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) self.assertIsNone(vpe_approx_vnf._vnf_process) @mock.patch(SSH_HELPER) - def test_collect_kpi_sa_not_running(self, ssh, _): + def test_collect_kpi_sa_not_running(self, ssh): mock_ssh(ssh) resource = mock.Mock(autospec=ResourceProfile) @@ -585,7 +563,7 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertEqual(vpe_approx_vnf.collect_kpi(), expected) @mock.patch(SSH_HELPER) - def test_collect_kpi_sa_running(self, ssh, _): + def test_collect_kpi_sa_running(self, ssh): mock_ssh(ssh) resource = mock.Mock(autospec=ResourceProfile) @@ -608,7 +586,7 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertEqual(vpe_approx_vnf.collect_kpi(), expected) @mock.patch(SSH_HELPER) - def test_vnf_execute(self, ssh, _): + def test_vnf_execute(self, ssh): mock_ssh(ssh) vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) vpe_approx_vnf.q_in = mock.MagicMock() @@ -617,7 +595,7 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertEqual(vpe_approx_vnf.vnf_execute("quit", 0), '') @mock.patch(SSH_HELPER) - def test_run_vpe(self, ssh, _): + def test_run_vpe(self, ssh): mock_ssh(ssh) vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) @@ -651,7 +629,7 @@ class TestVpeApproxVnf(unittest.TestCase): @mock.patch("yardstick.network_services.vnf_generic.vnf.vpe_vnf.ConfigCreate") @mock.patch("yardstick.network_services.vnf_generic.vnf.vpe_vnf.open") @mock.patch(SSH_HELPER) - def test_build_config(self, mock_mul, mock_context, mock_config, mock_open, ssh, _): + def test_build_config(self, ssh, *args): mock_ssh(ssh) vpe_approx_vnf = VpeApproxSetupEnvHelper(mock.MagicMock(), mock.MagicMock, mock.MagicMock) @@ -684,7 +662,7 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertIsNotNone(vpe_approx_vnf.build_config()) @mock.patch(SSH_HELPER) - def test_wait_for_instantiate(self, ssh, _): + def test_wait_for_instantiate(self, ssh): mock_ssh(ssh) mock_process = mock.Mock(autospec=Process) @@ -707,7 +685,7 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432) @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_fragmented(self, ssh, _): + def test_wait_for_instantiate_fragmented(self, ssh): mock_ssh(ssh) mock_process = mock.Mock(autospec=Process) @@ -730,7 +708,7 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertEqual(vpe_approx_vnf.wait_for_instantiate(), 432) @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_crash(self, ssh, _): + def test_wait_for_instantiate_crash(self, ssh): mock_ssh(ssh, exec_result=(1, "", "")) mock_process = mock.Mock(autospec=Process) @@ -749,7 +727,7 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertIn('VNF process died', str(raised.exception)) @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_panic(self, ssh, _): + def test_wait_for_instantiate_panic(self, ssh): mock_ssh(ssh, exec_result=(1, "", "")) mock_process = mock.Mock(autospec=Process) @@ -769,7 +747,7 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertIn('Error starting', str(raised.exception)) @mock.patch(SSH_HELPER) - def test_wait_for_instantiate_panic_fragmented(self, ssh, _): + def test_wait_for_instantiate_panic_fragmented(self, ssh): mock_ssh(ssh, exec_result=(1, "", "")) mock_process = mock.Mock(autospec=Process) @@ -793,13 +771,8 @@ class TestVpeApproxVnf(unittest.TestCase): self.assertIn('Error starting', str(raised.exception)) - def test_scale(self, _): - vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) - with self.assertRaises(NotImplementedError): - vpe_approx_vnf.scale('') - @mock.patch(SSH_HELPER) - def test_terminate(self, ssh, _): + def test_terminate(self, ssh): mock_ssh(ssh) vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) @@ -808,7 +781,3 @@ class TestVpeApproxVnf(unittest.TestCase): vpe_approx_vnf.resource_helper = mock.MagicMock() self.assertIsNone(vpe_approx_vnf.terminate()) - - -if __name__ == '__main__': - unittest.main() diff --git a/tests/unit/apiserver/resources/__init__.py b/tests/unit/test_cmd/__init__.py index e69de29bb..e69de29bb 100644 --- a/tests/unit/apiserver/resources/__init__.py +++ b/tests/unit/test_cmd/__init__.py diff --git a/tests/unit/cmd/__init__.py b/tests/unit/test_cmd/commands/__init__.py index e69de29bb..e69de29bb 100644 --- a/tests/unit/cmd/__init__.py +++ b/tests/unit/test_cmd/commands/__init__.py diff --git a/tests/unit/cmd/commands/test_env.py b/tests/unit/test_cmd/commands/test_env.py index 73cd5af47..13c3ed44a 100644 --- a/tests/unit/cmd/commands/test_env.py +++ b/tests/unit/test_cmd/commands/test_env.py @@ -49,6 +49,9 @@ class EnvCommandTestCase(unittest.TestCase): @mock.patch('yardstick.cmd.commands.env.HttpClient.get') @mock.patch('yardstick.cmd.commands.env.EnvCommand._print_status') def test_check_status(self, print_mock, get_mock): + # pylint: disable=unused-argument + # NOTE(ralonsoh): the pylint exception must be removed. The mocked + # command call must be tested. task_id = str(uuid.uuid4()) get_mock.return_value = {'status': 2, 'result': 'error'} status = EnvCommand()._check_status(task_id, 'hello world') @@ -57,7 +60,8 @@ class EnvCommandTestCase(unittest.TestCase): def test_print_status(self): try: EnvCommand()._print_status('hello', 'word') - except Exception as e: + except Exception as e: # pylint: disable=broad-except + # NOTE(ralonsoh): try to reduce the scope of this exception. self.assertIsInstance(e, IndexError) diff --git a/tests/unit/cmd/commands/test_testcase.py b/tests/unit/test_cmd/commands/test_testcase.py index 7ef157c19..7ef157c19 100644 --- a/tests/unit/cmd/commands/test_testcase.py +++ b/tests/unit/test_cmd/commands/test_testcase.py diff --git a/tests/unit/cmd/test_NSBperf.py b/tests/unit/test_cmd/test_NSBperf.py index e1b4da7fc..19eb0afa0 100644 --- a/tests/unit/cmd/test_NSBperf.py +++ b/tests/unit/test_cmd/test_NSBperf.py @@ -27,7 +27,8 @@ from yardstick.cmd import NSBperf @mock.patch('six.moves.input', return_value='0') class TestHandler(unittest.TestCase): - def test_handler(self, test): + + def test_handler(self, *args): subprocess.call = mock.Mock(return_value=0) self.assertRaises(SystemExit, NSBperf.sigint_handler) diff --git a/tests/unit/test_ssh.py b/tests/unit/test_ssh.py deleted file mode 100644 index 88699fd85..000000000 --- a/tests/unit/test_ssh.py +++ /dev/null @@ -1,572 +0,0 @@ -# Copyright 2013: Mirantis 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. - -# yardstick comment: this file is a modified copy of -# rally/tests/unit/common/test_sshutils.py - -from __future__ import absolute_import -import os -import socket -import unittest -from io import StringIO - -import mock -from oslo_utils import encodeutils - -from yardstick import ssh -from yardstick.ssh import SSHError -from yardstick.ssh import SSH -from yardstick.ssh import AutoConnectSSH - - -class FakeParamikoException(Exception): - pass - - -class SSHTestCase(unittest.TestCase): - """Test all small SSH methods.""" - - def setUp(self): - super(SSHTestCase, self).setUp() - self.test_client = ssh.SSH("root", "example.net") - - @mock.patch("yardstick.ssh.SSH._get_pkey") - def test_construct(self, mock_ssh__get_pkey): - mock_ssh__get_pkey.return_value = "pkey" - test_ssh = ssh.SSH("root", "example.net", port=33, pkey="key", - key_filename="kf", password="secret") - mock_ssh__get_pkey.assert_called_once_with("key") - self.assertEqual("root", test_ssh.user) - self.assertEqual("example.net", test_ssh.host) - self.assertEqual(33, test_ssh.port) - self.assertEqual("pkey", test_ssh.pkey) - self.assertEqual("kf", test_ssh.key_filename) - self.assertEqual("secret", test_ssh.password) - - @mock.patch("yardstick.ssh.SSH._get_pkey") - def test_ssh_from_node(self, mock_ssh__get_pkey): - mock_ssh__get_pkey.return_value = "pkey" - node = { - "user": "root", "ip": "example.net", "ssh_port": 33, - "key_filename": "kf", "password": "secret" - } - test_ssh = ssh.SSH.from_node(node) - self.assertEqual("root", test_ssh.user) - self.assertEqual("example.net", test_ssh.host) - self.assertEqual(33, test_ssh.port) - self.assertEqual("kf", test_ssh.key_filename) - self.assertEqual("secret", test_ssh.password) - - @mock.patch("yardstick.ssh.SSH._get_pkey") - def test_ssh_from_node_password_default(self, mock_ssh__get_pkey): - mock_ssh__get_pkey.return_value = "pkey" - node = { - "user": "root", "ip": "example.net", "ssh_port": 33, - "key_filename": "kf" - } - test_ssh = ssh.SSH.from_node(node) - self.assertEqual("root", test_ssh.user) - self.assertEqual("example.net", test_ssh.host) - self.assertEqual(33, test_ssh.port) - self.assertEqual("kf", test_ssh.key_filename) - self.assertIsNone(test_ssh.password) - - @mock.patch("yardstick.ssh.SSH._get_pkey") - def test_ssh_from_node_ssh_port_default(self, mock_ssh__get_pkey): - mock_ssh__get_pkey.return_value = "pkey" - node = { - "user": "root", "ip": "example.net", - "key_filename": "kf", "password": "secret" - } - test_ssh = ssh.SSH.from_node(node) - self.assertEqual("root", test_ssh.user) - self.assertEqual("example.net", test_ssh.host) - self.assertEqual(ssh.SSH.SSH_PORT, test_ssh.port) - self.assertEqual("kf", test_ssh.key_filename) - self.assertEqual("secret", test_ssh.password) - - @mock.patch("yardstick.ssh.SSH._get_pkey") - def test_ssh_from_node_key_filename_default(self, mock_ssh__get_pkey): - mock_ssh__get_pkey.return_value = "pkey" - node = { - "user": "root", "ip": "example.net", "ssh_port": 33, - "password": "secret" - } - test_ssh = ssh.SSH.from_node(node) - self.assertEqual("root", test_ssh.user) - self.assertEqual("example.net", test_ssh.host) - self.assertEqual(33, test_ssh.port) - self.assertIsNone(test_ssh.key_filename) - self.assertEqual("secret", test_ssh.password) - - def test_construct_default(self): - self.assertEqual("root", self.test_client.user) - self.assertEqual("example.net", self.test_client.host) - self.assertEqual(22, self.test_client.port) - self.assertIsNone(self.test_client.pkey) - self.assertIsNone(self.test_client.key_filename) - self.assertIsNone(self.test_client.password) - - @mock.patch("yardstick.ssh.paramiko") - def test__get_pkey_invalid(self, mock_paramiko): - mock_paramiko.SSHException = FakeParamikoException - rsa = mock_paramiko.rsakey.RSAKey - dss = mock_paramiko.dsskey.DSSKey - rsa.from_private_key.side_effect = mock_paramiko.SSHException - dss.from_private_key.side_effect = mock_paramiko.SSHException - self.assertRaises(ssh.SSHError, self.test_client._get_pkey, "key") - - @mock.patch("yardstick.ssh.six.moves.StringIO") - @mock.patch("yardstick.ssh.paramiko") - def test__get_pkey_dss(self, mock_paramiko, mock_string_io): - mock_paramiko.SSHException = FakeParamikoException - mock_string_io.return_value = "string_key" - mock_paramiko.dsskey.DSSKey.from_private_key.return_value = "dss_key" - rsa = mock_paramiko.rsakey.RSAKey - rsa.from_private_key.side_effect = mock_paramiko.SSHException - key = self.test_client._get_pkey("key") - dss_calls = mock_paramiko.dsskey.DSSKey.from_private_key.mock_calls - self.assertEqual([mock.call("string_key")], dss_calls) - self.assertEqual(key, "dss_key") - mock_string_io.assert_called_once_with("key") - - @mock.patch("yardstick.ssh.six.moves.StringIO") - @mock.patch("yardstick.ssh.paramiko") - def test__get_pkey_rsa(self, mock_paramiko, mock_string_io): - mock_paramiko.SSHException = FakeParamikoException - mock_string_io.return_value = "string_key" - mock_paramiko.rsakey.RSAKey.from_private_key.return_value = "rsa_key" - dss = mock_paramiko.dsskey.DSSKey - dss.from_private_key.side_effect = mock_paramiko.SSHException - key = self.test_client._get_pkey("key") - rsa_calls = mock_paramiko.rsakey.RSAKey.from_private_key.mock_calls - self.assertEqual([mock.call("string_key")], rsa_calls) - self.assertEqual(key, "rsa_key") - mock_string_io.assert_called_once_with("key") - - @mock.patch("yardstick.ssh.SSH._get_pkey") - @mock.patch("yardstick.ssh.paramiko") - def test__get_client(self, mock_paramiko, mock_ssh__get_pkey): - mock_ssh__get_pkey.return_value = "key" - fake_client = mock.Mock() - mock_paramiko.SSHClient.return_value = fake_client - mock_paramiko.AutoAddPolicy.return_value = "autoadd" - - test_ssh = ssh.SSH("admin", "example.net", pkey="key") - client = test_ssh._get_client() - - self.assertEqual(fake_client, client) - client_calls = [ - mock.call.set_missing_host_key_policy("autoadd"), - mock.call.connect("example.net", username="admin", - port=22, pkey="key", key_filename=None, - password=None, - allow_agent=False, look_for_keys=False, - timeout=1), - ] - self.assertEqual(client_calls, client.mock_calls) - - @mock.patch("yardstick.ssh.SSH._get_pkey") - @mock.patch("yardstick.ssh.paramiko") - def test__get_client_with_exception(self, mock_paramiko, mock_ssh__get_pkey): - class MyError(Exception): - pass - - mock_ssh__get_pkey.return_value = "pkey" - fake_client = mock.Mock() - fake_client.connect.side_effect = MyError - fake_client.set_missing_host_key_policy.return_value = None - mock_paramiko.SSHClient.return_value = fake_client - mock_paramiko.AutoAddPolicy.return_value = "autoadd" - - test_ssh = ssh.SSH("admin", "example.net", pkey="key") - - with self.assertRaises(SSHError) as raised: - test_ssh._get_client() - - self.assertEqual(mock_paramiko.SSHClient.call_count, 1) - self.assertEqual(mock_paramiko.AutoAddPolicy.call_count, 1) - self.assertEqual(fake_client.set_missing_host_key_policy.call_count, 1) - self.assertEqual(fake_client.connect.call_count, 1) - exc_str = str(raised.exception) - self.assertIn('raised during connect', exc_str) - self.assertIn('MyError', exc_str) - - @mock.patch("yardstick.ssh.SSH._get_pkey") - @mock.patch("yardstick.ssh.paramiko") - def test_copy(self, mock_paramiko, mock_ssh__get_pkey): - mock_ssh__get_pkey.return_value = "pkey" - fake_client = mock.Mock() - fake_client.connect.side_effect = IOError - mock_paramiko.SSHClient.return_value = fake_client - mock_paramiko.AutoAddPolicy.return_value = "autoadd" - - test_ssh = ssh.SSH("admin", "example.net", pkey="key") - result = test_ssh.copy() - self.assertIsNot(test_ssh, result) - - def test_close(self): - with mock.patch.object(self.test_client, "_client") as m_client: - self.test_client.close() - m_client.close.assert_called_once_with() - self.assertFalse(self.test_client._client) - - @mock.patch("yardstick.ssh.six.moves.StringIO") - def test_execute(self, mock_string_io): - mock_string_io.side_effect = stdio = [mock.Mock(), mock.Mock()] - stdio[0].read.return_value = "stdout fake data" - stdio[1].read.return_value = "stderr fake data" - with mock.patch.object(self.test_client, "run", return_value=0)\ - as mock_run: - status, stdout, stderr = self.test_client.execute( - "cmd", - stdin="fake_stdin", - timeout=43) - mock_run.assert_called_once_with( - "cmd", stdin="fake_stdin", stdout=stdio[0], - stderr=stdio[1], timeout=43, raise_on_error=False) - self.assertEqual(0, status) - self.assertEqual("stdout fake data", stdout) - self.assertEqual("stderr fake data", stderr) - - @mock.patch("yardstick.ssh.time") - def test_wait_timeout(self, mock_time): - mock_time.time.side_effect = [1, 50, 150] - self.test_client.execute = mock.Mock(side_effect=[ssh.SSHError, - ssh.SSHError, - 0]) - self.assertRaises(ssh.SSHTimeout, self.test_client.wait) - self.assertEqual([mock.call("uname")] * 2, - self.test_client.execute.mock_calls) - - @mock.patch("yardstick.ssh.time") - def test_wait(self, mock_time): - mock_time.time.side_effect = [1, 50, 100] - self.test_client.execute = mock.Mock(side_effect=[ssh.SSHError, - ssh.SSHError, - 0]) - self.test_client.wait() - self.assertEqual([mock.call("uname")] * 3, - self.test_client.execute.mock_calls) - - @mock.patch("yardstick.ssh.paramiko") - def test_send_command(self, mock_paramiko): - paramiko_sshclient = self.test_client._get_client() - with mock.patch.object(paramiko_sshclient, "exec_command") \ - as mock_paramiko_exec_command: - self.test_client.send_command('cmd') - mock_paramiko_exec_command.assert_called_once_with('cmd', - get_pty=True) - - -class SSHRunTestCase(unittest.TestCase): - """Test SSH.run method in different aspects. - - Also tested method "execute". - """ - - def setUp(self): - super(SSHRunTestCase, self).setUp() - - self.fake_client = mock.Mock() - self.fake_session = mock.Mock() - self.fake_transport = mock.Mock() - - self.fake_transport.open_session.return_value = self.fake_session - self.fake_client.get_transport.return_value = self.fake_transport - - self.fake_session.recv_ready.return_value = False - self.fake_session.recv_stderr_ready.return_value = False - self.fake_session.send_ready.return_value = False - self.fake_session.exit_status_ready.return_value = True - self.fake_session.recv_exit_status.return_value = 0 - - self.test_client = ssh.SSH("admin", "example.net") - self.test_client._get_client = mock.Mock(return_value=self.fake_client) - - @mock.patch("yardstick.ssh.select") - def test_execute(self, mock_select): - mock_select.select.return_value = ([], [], []) - self.fake_session.recv_ready.side_effect = [1, 0, 0] - self.fake_session.recv_stderr_ready.side_effect = [1, 0] - self.fake_session.recv.return_value = "ok" - self.fake_session.recv_stderr.return_value = "error" - self.fake_session.exit_status_ready.return_value = 1 - self.fake_session.recv_exit_status.return_value = 127 - self.assertEqual((127, "ok", "error"), self.test_client.execute("cmd")) - self.fake_session.exec_command.assert_called_once_with("cmd") - - @mock.patch("yardstick.ssh.select") - def test_execute_args(self, mock_select): - mock_select.select.return_value = ([], [], []) - self.fake_session.recv_ready.side_effect = [1, 0, 0] - self.fake_session.recv_stderr_ready.side_effect = [1, 0] - self.fake_session.recv.return_value = "ok" - self.fake_session.recv_stderr.return_value = "error" - self.fake_session.exit_status_ready.return_value = 1 - self.fake_session.recv_exit_status.return_value = 127 - - result = self.test_client.execute("cmd arg1 'arg2 with space'") - self.assertEqual((127, "ok", "error"), result) - self.fake_session.exec_command.assert_called_once_with( - "cmd arg1 'arg2 with space'") - - @mock.patch("yardstick.ssh.select") - def test_run(self, mock_select): - mock_select.select.return_value = ([], [], []) - self.assertEqual(0, self.test_client.run("cmd")) - - @mock.patch("yardstick.ssh.select") - def test_run_nonzero_status(self, mock_select): - mock_select.select.return_value = ([], [], []) - self.fake_session.recv_exit_status.return_value = 1 - self.assertRaises(ssh.SSHError, self.test_client.run, "cmd") - self.assertEqual(1, self.test_client.run("cmd", raise_on_error=False)) - - @mock.patch("yardstick.ssh.select") - def test_run_stdout(self, mock_select): - mock_select.select.return_value = ([], [], []) - self.fake_session.recv_ready.side_effect = [True, True, False] - self.fake_session.recv.side_effect = ["ok1", "ok2"] - stdout = mock.Mock() - self.test_client.run("cmd", stdout=stdout) - self.assertEqual([mock.call("ok1"), mock.call("ok2")], - stdout.write.mock_calls) - - @mock.patch("yardstick.ssh.select") - def test_run_stderr(self, mock_select): - mock_select.select.return_value = ([], [], []) - self.fake_session.recv_stderr_ready.side_effect = [True, False] - self.fake_session.recv_stderr.return_value = "error" - stderr = mock.Mock() - self.test_client.run("cmd", stderr=stderr) - stderr.write.assert_called_once_with("error") - - @mock.patch("yardstick.ssh.select") - def test_run_stdin(self, mock_select): - """Test run method with stdin. - - Third send call was called with "e2" because only 3 bytes was sent - by second call. So remainig 2 bytes of "line2" was sent by third call. - """ - mock_select.select.return_value = ([], [], []) - self.fake_session.exit_status_ready.side_effect = [0, 0, 0, True] - self.fake_session.send_ready.return_value = True - self.fake_session.send.side_effect = [5, 3, 2] - fake_stdin = mock.Mock() - fake_stdin.read.side_effect = ["line1", "line2", ""] - fake_stdin.closed = False - - def close(): - fake_stdin.closed = True - fake_stdin.close = mock.Mock(side_effect=close) - self.test_client.run("cmd", stdin=fake_stdin) - call = mock.call - send_calls = [call(encodeutils.safe_encode("line1", "utf-8")), - call(encodeutils.safe_encode("line2", "utf-8")), - call(encodeutils.safe_encode("e2", "utf-8"))] - self.assertEqual(send_calls, self.fake_session.send.mock_calls) - - @mock.patch("yardstick.ssh.select") - def test_run_stdin_keep_open(self, mock_select): - """Test run method with stdin. - - Third send call was called with "e2" because only 3 bytes was sent - by second call. So remainig 2 bytes of "line2" was sent by third call. - """ - mock_select.select.return_value = ([], [], []) - self.fake_session.exit_status_ready.side_effect = [0, 0, 0, True] - self.fake_session.send_ready.return_value = True - self.fake_session.send.side_effect = len - fake_stdin = StringIO(u"line1\nline2\n") - self.test_client.run("cmd", stdin=fake_stdin, keep_stdin_open=True) - call = mock.call - send_calls = [call(encodeutils.safe_encode("line1\nline2\n", "utf-8"))] - self.assertEqual(send_calls, self.fake_session.send.mock_calls) - - @mock.patch("yardstick.ssh.select") - def test_run_select_error(self, mock_select): - self.fake_session.exit_status_ready.return_value = False - mock_select.select.return_value = ([], [], [True]) - self.assertRaises(ssh.SSHError, self.test_client.run, "cmd") - - @mock.patch("yardstick.ssh.time") - @mock.patch("yardstick.ssh.select") - def test_run_timemout(self, mock_select, mock_time): - mock_time.time.side_effect = [1, 3700] - mock_select.select.return_value = ([], [], []) - self.fake_session.exit_status_ready.return_value = False - self.assertRaises(ssh.SSHTimeout, self.test_client.run, "cmd") - - @mock.patch("yardstick.ssh.open", create=True) - def test__put_file_shell(self, mock_open): - with mock.patch.object(self.test_client, "run") as run_mock: - self.test_client._put_file_shell("localfile", "remotefile", 0o42) - run_mock.assert_called_once_with( - 'cat > "remotefile"&& chmod -- 042 "remotefile"', - stdin=mock_open.return_value.__enter__.return_value) - - @mock.patch("yardstick.ssh.open", create=True) - def test__put_file_shell_space(self, mock_open): - with mock.patch.object(self.test_client, "run") as run_mock: - self.test_client._put_file_shell("localfile", - "filename with space", 0o42) - run_mock.assert_called_once_with( - 'cat > "filename with space"&& chmod -- 042 "filename with ' - 'space"', - stdin=mock_open.return_value.__enter__.return_value) - - @mock.patch("yardstick.ssh.open", create=True) - def test__put_file_shell_tilde(self, mock_open): - with mock.patch.object(self.test_client, "run") as run_mock: - self.test_client._put_file_shell("localfile", "~/remotefile", 0o42) - run_mock.assert_called_once_with( - 'cat > ~/"remotefile"&& chmod -- 042 ~/"remotefile"', - stdin=mock_open.return_value.__enter__.return_value) - - @mock.patch("yardstick.ssh.open", create=True) - def test__put_file_shell_tilde_spaces(self, mock_open): - with mock.patch.object(self.test_client, "run") as run_mock: - self.test_client._put_file_shell("localfile", "~/file with space", - 0o42) - run_mock.assert_called_once_with( - 'cat > ~/"file with space"&& chmod -- 042 ~/"file with space"', - stdin=mock_open.return_value.__enter__.return_value) - - @mock.patch("yardstick.ssh.os.stat") - def test__put_file_sftp(self, mock_stat): - sftp = self.fake_client.open_sftp.return_value = mock.MagicMock() - sftp.__enter__.return_value = sftp - - mock_stat.return_value = os.stat_result([0o753] + [0] * 9) - - self.test_client._put_file_sftp("localfile", "remotefile") - - sftp.put.assert_called_once_with("localfile", "remotefile") - mock_stat.assert_any_call("localfile") - sftp.chmod.assert_any_call("remotefile", 0o753) - sftp.__exit__.assert_called_once_with(None, None, None) - - def test__put_file_sftp_mode(self): - sftp = self.fake_client.open_sftp.return_value = mock.MagicMock() - sftp.__enter__.return_value = sftp - - self.test_client._put_file_sftp("localfile", "remotefile", mode=0o753) - - sftp.put.assert_called_once_with("localfile", "remotefile") - sftp.chmod.assert_called_once_with("remotefile", 0o753) - sftp.__exit__.assert_called_once_with(None, None, None) - - def test_put_file_SSHException(self): - exc = ssh.paramiko.SSHException - self.test_client._put_file_sftp = mock.Mock(side_effect=exc()) - self.test_client._put_file_shell = mock.Mock() - - self.test_client.put_file("foo", "bar", 42) - self.test_client._put_file_sftp.assert_called_once_with("foo", "bar", - mode=42) - self.test_client._put_file_shell.assert_called_once_with("foo", "bar", - mode=42) - - def test_put_file_socket_error(self): - exc = socket.error - self.test_client._put_file_sftp = mock.Mock(side_effect=exc()) - self.test_client._put_file_shell = mock.Mock() - - self.test_client.put_file("foo", "bar", 42) - self.test_client._put_file_sftp.assert_called_once_with("foo", "bar", - mode=42) - self.test_client._put_file_shell.assert_called_once_with("foo", "bar", - mode=42) - - @mock.patch("yardstick.ssh.os.stat") - def test_put_file_obj_with_mode(self, mock_stat): - sftp = self.fake_client.open_sftp.return_value = mock.MagicMock() - sftp.__enter__.return_value = sftp - - mock_stat.return_value = os.stat_result([0o753] + [0] * 9) - - self.test_client.put_file_obj("localfile", "remotefile", 'my_mode') - - sftp.__enter__.assert_called_once() - sftp.putfo.assert_called_once_with("localfile", "remotefile") - sftp.chmod.assert_called_once_with("remotefile", 'my_mode') - sftp.__exit__.assert_called_once_with(None, None, None) - - -class TestAutoConnectSSH(unittest.TestCase): - - def test__connect_with_wait(self): - auto_connect_ssh = AutoConnectSSH('user1', 'host1', wait=True) - auto_connect_ssh._get_client = mock.Mock() - auto_connect_ssh.wait = mock_wait = mock.Mock() - - auto_connect_ssh._connect() - self.assertEqual(mock_wait.call_count, 1) - - def test__make_dict(self): - auto_connect_ssh = AutoConnectSSH('user1', 'host1') - - expected = { - 'user': 'user1', - 'host': 'host1', - 'port': SSH.SSH_PORT, - 'pkey': None, - 'key_filename': None, - 'password': None, - 'name': None, - 'wait': True, - } - result = auto_connect_ssh._make_dict() - self.assertDictEqual(result, expected) - - def test_get_class(self): - auto_connect_ssh = AutoConnectSSH('user1', 'host1') - - self.assertEqual(auto_connect_ssh.get_class(), AutoConnectSSH) - - @mock.patch('yardstick.ssh.SCPClient') - def test_put(self, mock_scp_client_type): - auto_connect_ssh = AutoConnectSSH('user1', 'host1') - auto_connect_ssh._client = mock.Mock() - - auto_connect_ssh.put('a', 'z') - with mock_scp_client_type() as mock_scp_client: - self.assertEqual(mock_scp_client.put.call_count, 1) - - @mock.patch('yardstick.ssh.SCPClient') - def test_get(self, mock_scp_client_type): - auto_connect_ssh = AutoConnectSSH('user1', 'host1') - auto_connect_ssh._client = mock.Mock() - - auto_connect_ssh.get('a', 'z') - with mock_scp_client_type() as mock_scp_client: - self.assertEqual(mock_scp_client.get.call_count, 1) - - def test_put_file(self): - auto_connect_ssh = AutoConnectSSH('user1', 'host1') - auto_connect_ssh._client = mock.Mock() - auto_connect_ssh._put_file_sftp = mock_put_sftp = mock.Mock() - - auto_connect_ssh.put_file('a', 'b') - self.assertEqual(mock_put_sftp.call_count, 1) - - -def main(): - unittest.main() - - -if __name__ == '__main__': - main() |