diff options
Diffstat (limited to 'tests/unit')
27 files changed, 140 insertions, 3083 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/__init__.py b/tests/unit/apiserver/resources/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/apiserver/resources/__init__.py +++ /dev/null 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/contexts/standalone/test_model.py b/tests/unit/benchmark/contexts/standalone/test_model.py index 31ec2b7d1..a8c54f193 100644 --- a/tests/unit/benchmark/contexts/standalone/test_model.py +++ b/tests/unit/benchmark/contexts/standalone/test_model.py @@ -134,9 +134,9 @@ class ModelLibvirtTestCase(unittest.TestCase): as mock_parse: xml = copy.deepcopy(self.xml) mock_parse.return_value = xml - vf_pci = '0001:05:04.2' + vm_pci = '0001:05:04.2' model.Libvirt.add_sriov_interfaces( - self.pci_address_str, vf_pci, self.mac, xml_input) + vm_pci, self.pci_address_str, self.mac, xml_input) mock_parse.assert_called_once_with(xml_input) self.mock_write_xml.assert_called_once_with(xml_input) interface = xml.find('devices').find('interface') @@ -145,8 +145,29 @@ class ModelLibvirtTestCase(unittest.TestCase): mac = interface.find('mac') self.assertEqual(self.mac, mac.get('address')) source = interface.find('source') + source_address = source.find('address') self.assertIsNotNone(source.find('address')) - self.assertIsNotNone(interface.find('address')) + + self.assertEqual('pci', source_address.get('type')) + self.assertEqual('0x' + self.pci_address_str.split(':')[0], + source_address.get('domain')) + self.assertEqual('0x' + self.pci_address_str.split(':')[1], + source_address.get('bus')) + self.assertEqual('0x' + self.pci_address_str.split(':')[2].split('.')[0], + source_address.get('slot')) + self.assertEqual('0x' + self.pci_address_str.split(':')[2].split('.')[1], + source_address.get('function')) + + interface_address = interface.find('address') + self.assertEqual('pci', interface_address.get('type')) + self.assertEqual('0x' + vm_pci.split(':')[0], + interface_address.get('domain')) + self.assertEqual('0x' + vm_pci.split(':')[1], + interface_address.get('bus')) + self.assertEqual('0x' + vm_pci.split(':')[2].split('.')[0], + interface_address.get('slot')) + self.assertEqual('0x' + vm_pci.split(':')[2].split('.')[1], + interface_address.get('function')) def test_create_snapshot_qemu(self): result = "/var/lib/libvirt/images/0.qcow2" diff --git a/tests/unit/benchmark/scenarios/availability/test_util.py b/tests/unit/benchmark/scenarios/availability/test_util.py index 0974f385a..03dc70e2a 100644 --- a/tests/unit/benchmark/scenarios/availability/test_util.py +++ b/tests/unit/benchmark/scenarios/availability/test_util.py @@ -16,36 +16,42 @@ import unittest from yardstick.benchmark.scenarios.availability import util -@mock.patch('yardstick.benchmark.scenarios.availability.util.subprocess') class ExecuteShellTestCase(unittest.TestCase): def setUp(self): self.param_config = {'serviceName': '@serviceName', 'value': 1} self.intermediate_variables = {'@serviceName': 'nova-api'} self.std_output = '| id | 1 |' - self.cmd_config = {'cmd':'ls','param':'-a'} + self.cmd_config = {'cmd':'ls', 'param':'-a'} - def test_util_build_command_shell(self,mock_subprocess): + self._mock_subprocess = mock.patch.object(util, 'subprocess') + self.mock_subprocess = self._mock_subprocess.start() + self.addCleanup(self._stop_mock) + + def _stop_mock(self): + self._mock_subprocess.stop() + + def test_util_build_command_shell(self): result = util.build_shell_command(self.param_config, True, self.intermediate_variables) - self.assertEqual("nova-api" in result, True) + self.assertIn("nova-api", result) - def test_read_stdout_item(self,mock_subprocess): - result = util.read_stdout_item(self.std_output,'id') - self.assertEquals('1',result) + def test_read_stdout_item(self): + result = util.read_stdout_item(self.std_output, 'id') + self.assertEquals('1', result) - def test_buildshellparams(self,mock_subprocess): - result = util.buildshellparams(self.cmd_config,True) + def test_buildshellparams(self): + result = util.buildshellparams(self.cmd_config, True) self.assertEquals('/bin/bash -s {0} {1}', result) - def test__fun_execute_shell_command_successful(self, mock_subprocess): + def test__fun_execute_shell_command_successful(self): cmd = "env" - mock_subprocess.check_output.return_value = (0, 'unittest') - exitcode, output = util.execute_shell_command(cmd) + self.mock_subprocess.check_output.return_value = (0, 'unittest') + exitcode, _ = util.execute_shell_command(cmd) self.assertEqual(exitcode, 0) - def test__fun_execute_shell_command_fail_cmd_exception(self, mock_subprocess): + def test__fun_execute_shell_command_fail_cmd_exception(self): cmd = "env" - mock_subprocess.check_output.side_effect = RuntimeError - exitcode, output = util.execute_shell_command(cmd) + self.mock_subprocess.check_output.side_effect = RuntimeError + exitcode, _ = util.execute_shell_command(cmd) self.assertEqual(exitcode, -1) diff --git a/tests/unit/benchmark/scenarios/lib/test_create_volume.py b/tests/unit/benchmark/scenarios/lib/test_create_volume.py index fc633139e..ef2c0ccaf 100644 --- a/tests/unit/benchmark/scenarios/lib/test_create_volume.py +++ b/tests/unit/benchmark/scenarios/lib/test_create_volume.py @@ -9,28 +9,79 @@ import unittest import mock -from yardstick.benchmark.scenarios.lib.create_volume import CreateVolume +import yardstick.benchmark.scenarios.lib.create_volume class CreateVolumeTestCase(unittest.TestCase): + def setUp(self): + self._mock_cinder_client = mock.patch( + 'yardstick.common.openstack_utils.get_cinder_client') + self.mock_cinder_client = self._mock_cinder_client.start() + self._mock_glance_client = mock.patch( + 'yardstick.common.openstack_utils.get_glance_client') + self.mock_glance_client = self._mock_glance_client.start() + self.addCleanup(self._stop_mock) + + self.scenario_cfg = { + "options" : + { + 'volume_name': 'yardstick_test_volume_01', + 'size': '256', + 'image': 'cirros-0.3.5' + } + } + + self.scenario = ( + yardstick.benchmark.scenarios.lib.create_volume.CreateVolume( + scenario_cfg=self.scenario_cfg, + context_cfg={})) + + def _stop_mock(self): + self._mock_cinder_client.stop() + self._mock_glance_client.stop() + + def test_init(self): + self.mock_cinder_client.return_value = "All volumes are equal" + self.mock_glance_client.return_value = "Images are more equal" + + expected_vol_name = self.scenario_cfg["options"]["volume_name"] + expected_vol_size = self.scenario_cfg["options"]["size"] + expected_im_name = self.scenario_cfg["options"]["image"] + expected_im_id = None + + scenario = ( + yardstick.benchmark.scenarios.lib.create_volume.CreateVolume( + scenario_cfg=self.scenario_cfg, + context_cfg={})) + + self.assertEqual(expected_vol_name, scenario.volume_name) + self.assertEqual(expected_vol_size, scenario.volume_size) + self.assertEqual(expected_im_name, scenario.image_name) + self.assertEqual(expected_im_id, scenario.image_id) + self.assertEqual("All volumes are equal", scenario.cinder_client) + self.assertEqual("Images are more equal", scenario.glance_client) + + def test_setup(self): + self.assertFalse(self.scenario.setup_done) + self.scenario.setup() + self.assertTrue(self.scenario.setup_done) + @mock.patch('yardstick.common.openstack_utils.create_volume') @mock.patch('yardstick.common.openstack_utils.get_image_id') - @mock.patch('yardstick.common.openstack_utils.get_cinder_client') - @mock.patch('yardstick.common.openstack_utils.get_glance_client') - def test_create_volume(self, mock_get_glance_client, mock_get_cinder_client, mock_image_id, mock_create_volume): - options = { - 'volume_name': 'yardstick_test_volume_01', - 'size': '256', - 'image': 'cirros-0.3.5' - } - args = {"options": options} - obj = CreateVolume(args, {}) - obj.run({}) - self.assertTrue(mock_create_volume.called) - self.assertTrue(mock_image_id.called) - self.assertTrue(mock_get_glance_client.called) - self.assertTrue(mock_get_cinder_client.called) + def test_run(self, mock_image_id, mock_create_volume): + self.scenario.run() + + mock_image_id.assert_called_once() + mock_create_volume.assert_called_once() + + @mock.patch.object( + yardstick.benchmark.scenarios.lib.create_volume.CreateVolume, 'setup') + def test_run_no_setup(self, scenario_setup): + self.scenario.setup_done = False + self.scenario.run() + scenario_setup.assert_called_once() + def main(): unittest.main() 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/dispatcher/__init__.py b/tests/unit/dispatcher/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/dispatcher/__init__.py +++ /dev/null diff --git a/tests/unit/dispatcher/test_influxdb.py b/tests/unit/dispatcher/test_influxdb.py deleted file mode 100644 index 7ebe8c90b..000000000 --- a/tests/unit/dispatcher/test_influxdb.py +++ /dev/null @@ -1,119 +0,0 @@ -#!/usr/bin/env python - -############################################################################## -# Copyright (c) 2015 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.dispatcher.influxdb - -from __future__ import absolute_import -import unittest - - -try: - from unittest import mock -except ImportError: - import mock - -from yardstick import _init_logging -_init_logging() - -from yardstick.dispatcher.influxdb import InfluxdbDispatcher - - -class InfluxdbDispatcherTestCase(unittest.TestCase): - - def setUp(self): - self.data1 = { - "runner_id": 8921, - "context_cfg": { - "host": { - "ip": "10.229.43.154", - "key_filename": - "/root/yardstick/yardstick/resources/files" - "/yardstick_key", - "name": "kvm.LF", - "user": "root" - }, - "target": { - "ipaddr": "10.229.44.134" - } - }, - "scenario_cfg": { - "runner": { - "interval": 1, - "object": "yardstick.benchmark.scenarios.networking.ping" - ".Ping", - "output_filename": "/tmp/yardstick.out", - "runner_id": 8921, - "duration": 10, - "type": "Duration" - }, - "host": "kvm.LF", - "type": "Ping", - "target": "10.229.44.134", - "sla": { - "action": "monitor", - "max_rtt": 10 - }, - "tc": "ping", - "task_id": "ea958583-c91e-461a-af14-2a7f9d7f79e7" - } - } - self.data2 = { - "benchmark": { - "timestamp": "1451478117.883505", - "errors": "", - "data": { - "rtt": 0.613 - }, - "sequence": 1 - }, - "runner_id": 8921 - } - - self.yardstick_conf = {'dispatcher_influxdb': {}} - - @mock.patch('yardstick.dispatcher.influxdb.requests') - def test_record_result_data(self, mock_requests): - type(mock_requests.post.return_value).status_code = 204 - influxdb = InfluxdbDispatcher(self.yardstick_conf) - data = { - 'status': 1, - 'result': { - 'criteria': 'PASS', - 'info': { - }, - 'task_id': 'b9e2bbc2-dfd8-410d-8c24-07771e9f7979', - 'testcases': { - } - } - } - self.assertEqual(influxdb.flush_result_data(data), 0) - - def test__get_nano_timestamp(self): - influxdb = InfluxdbDispatcher(self.yardstick_conf) - results = {'timestamp': '1451461248.925574'} - self.assertEqual(influxdb._get_nano_timestamp(results), - '1451461248925574144') - - @mock.patch('yardstick.dispatcher.influxdb.time') - def test__get_nano_timestamp_except(self, mock_time): - results = {} - influxdb = InfluxdbDispatcher(self.yardstick_conf) - mock_time.time.return_value = 1451461248.925574 - self.assertEqual(influxdb._get_nano_timestamp(results), - '1451461248925574144') - - -def main(): - unittest.main() - - -if __name__ == '__main__': - main() diff --git a/tests/unit/dispatcher/test_influxdb_line_protocol.py b/tests/unit/dispatcher/test_influxdb_line_protocol.py deleted file mode 100644 index 51dc39e3c..000000000 --- a/tests/unit/dispatcher/test_influxdb_line_protocol.py +++ /dev/null @@ -1,64 +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 -############################################################################## -# Unittest for yardstick.dispatcher.influxdb_line_protocol - -# yardstick comment: this file is a modified copy of -# influxdb-python/influxdb/tests/test_line_protocol.py - -from __future__ import absolute_import -import unittest -from third_party.influxdb.influxdb_line_protocol import make_lines - - -class TestLineProtocol(unittest.TestCase): - - def test_make_lines(self): - data = { - "tags": { - "empty_tag": "", - "none_tag": None, - "integer_tag": 2, - "string_tag": "hello" - }, - "points": [ - { - "measurement": "test", - "fields": { - "string_val": "hello!", - "int_val": 1, - "float_val": 1.1, - "none_field": None, - "bool_val": True, - } - } - ] - } - - self.assertEqual( - make_lines(data), - 'test,integer_tag=2,string_tag=hello ' - 'bool_val=True,float_val=1.1,int_val=1i,string_val="hello!"\n' - ) - - def test_string_val_newline(self): - data = { - "points": [ - { - "measurement": "m1", - "fields": { - "multi_line": "line1\nline1\nline3" - } - } - ] - } - - self.assertEqual( - make_lines(data), - 'm1 multi_line="line1\\nline1\\nline3"\n' - ) diff --git a/tests/unit/network_services/nfvi/test_resource.py b/tests/unit/network_services/nfvi/test_resource.py index 5c2f890e8..4584b093d 100644 --- a/tests/unit/network_services/nfvi/test_resource.py +++ b/tests/unit/network_services/nfvi/test_resource.py @@ -12,11 +12,10 @@ # See the License for the specific language governing permissions and # limitations under the License. -from __future__ import absolute_import -import unittest - import errno + import mock +import unittest from yardstick.network_services.nfvi.resource import ResourceProfile from yardstick.network_services.nfvi import resource, collectd @@ -105,14 +104,16 @@ class TestResourceProfile(unittest.TestCase): def test___init__(self): self.assertEqual(True, self.resource_profile.enable) - def test_check_if_sa_running(self): - self.assertEqual(self.resource_profile.check_if_sa_running("collectd"), + def test_check_if_system_agent_running(self): + self.assertEqual(self.resource_profile.check_if_system_agent_running("collectd"), (0, "")) - def test_check_if_sa_running_excetion(self): + def test_check_if_system_agent_running_excetion(self): with mock.patch.object(self.resource_profile.connection, "execute") as mock_execute: mock_execute.side_effect = OSError(errno.ECONNRESET, "error") - self.assertEqual(self.resource_profile.check_if_sa_running("collectd"), (1, None)) + self.assertEqual( + self.resource_profile.check_if_system_agent_running("collectd"), + (1, None)) def test_get_cpu_data(self): reskey = ["", "cpufreq", "cpufreq-0"] @@ -139,8 +140,7 @@ class TestResourceProfile(unittest.TestCase): self.resource_profile._setup_ovs_stats(self.ssh_mock)) @mock.patch("yardstick.network_services.nfvi.resource.open") - @mock.patch("yardstick.network_services.nfvi.resource.os") - def test__provide_config_file(self, mock_open, mock_os): + def test__provide_config_file(self, *args): loadplugin = range(5) port_names = range(5) kwargs = { @@ -152,13 +152,13 @@ class TestResourceProfile(unittest.TestCase): self.ssh_mock.execute.assert_called_once() @mock.patch("yardstick.network_services.nfvi.resource.open") - def test_initiate_systemagent(self, mock_open): + def test_initiate_systemagent(self, *args): self.resource_profile._start_collectd = mock.Mock() self.assertIsNone( self.resource_profile.initiate_systemagent("/opt/nsb_bin")) @mock.patch("yardstick.network_services.nfvi.resource.open") - def test_initiate_systemagent_raise(self, mock_open): + def test_initiate_systemagent_raise(self, *args): self.resource_profile._start_collectd = mock.Mock(side_effect=RuntimeError) with self.assertRaises(RuntimeError): self.resource_profile.initiate_systemagent("/opt/nsb_bin") @@ -267,8 +267,10 @@ class TestResourceProfile(unittest.TestCase): def test_stop(self): self.assertIsNone(self.resource_profile.stop()) - def test_stop(self): + def test_stop_amqp_not_running(self): self.resource_profile.amqp_client = mock.MagicMock() + # TODO(efoley): Fix this incorrect test. + # Should check that we don't try to stop amqp when it's not running self.assertIsNone(self.resource_profile.stop()) if __name__ == '__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 ed49c7000..0ac46c632 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 @@ -16,15 +16,17 @@ # from itertools import repeat, chain -import mock import os import socket import time + +import mock import unittest from tests.unit import STL_MOCKS from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper + STLClient = mock.MagicMock() stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) stl_patch.start() @@ -1433,9 +1435,9 @@ class TestProxResourceHelper(unittest.TestCase): helper = ProxResourceHelper(mock.MagicMock()) helper.resource = resource = mock.MagicMock() - resource.check_if_sa_running.return_value = 0, '1234' + resource.check_if_system_agent_running.return_value = 0, '1234' resource.amqp_collect_nfvi_kpi.return_value = 543 - resource.check_if_sa_running.return_value = (0, None) + resource.check_if_system_agent_running.return_value = (0, None) expected = {'core': 543} result = helper.collect_collectd_kpi() @@ -1447,9 +1449,9 @@ class TestProxResourceHelper(unittest.TestCase): helper._result = {'z': 123} helper.resource = resource = mock.MagicMock() - resource.check_if_sa_running.return_value = 0, '1234' + resource.check_if_system_agent_running.return_value = 0, '1234' resource.amqp_collect_nfvi_kpi.return_value = 543 - resource.check_if_sa_running.return_value = (0, None) + resource.check_if_system_agent_running.return_value = (0, None) queue.empty.return_value = False queue.get.return_value = {'a': 789} 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 7b4d79e02..0104e7f63 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 @@ -330,7 +330,7 @@ class TestProxTrafficGen(unittest.TestCase): prox_traffic_gen = ProxTrafficGen(NAME, self.VNFD0) prox_traffic_gen._vnf_wrapper.resource_helper.resource = mock.MagicMock( - **{"check_if_sa_running.return_value": [False]}) + **{"self.check_if_system_agent_running.return_value": [False]}) prox_traffic_gen._vnf_wrapper.vnf_execute = mock.Mock(return_value="") self.assertEqual({}, prox_traffic_gen.collect_kpi()) 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 55cd4d2e8..1abc53688 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,11 +15,12 @@ # limitations under the License. # -import mock from multiprocessing import Process, Queue import os -import six.moves.configparser as configparser import time + +import mock +import six.moves.configparser as configparser import unittest from tests.unit import STL_MOCKS @@ -543,9 +544,9 @@ class TestVpeApproxVnf(unittest.TestCase): mock_ssh(ssh) resource = mock.Mock(autospec=ResourceProfile) - resource.check_if_sa_running.return_value = 1, '' + resource.check_if_system_agent_running.return_value = 1, '' resource.amqp_collect_nfvi_kpi.return_value = {'foo': 234} - resource.check_if_sa_running.return_value = (1, None) + resource.check_if_system_agent_running.return_value = (1, None) vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) vpe_approx_vnf.q_in = mock.MagicMock() @@ -567,7 +568,7 @@ class TestVpeApproxVnf(unittest.TestCase): mock_ssh(ssh) resource = mock.Mock(autospec=ResourceProfile) - resource.check_if_sa_running.return_value = 0, '1234' + resource.check_if_system_agent_running.return_value = 0, '1234' resource.amqp_collect_nfvi_kpi.return_value = {'foo': 234} vpe_approx_vnf = VpeApproxVnf(NAME, self.VNFD_0) diff --git a/tests/unit/orchestrator/__init__.py b/tests/unit/orchestrator/__init__.py deleted file mode 100644 index e69de29bb..000000000 --- a/tests/unit/orchestrator/__init__.py +++ /dev/null diff --git a/tests/unit/orchestrator/test_heat.py b/tests/unit/orchestrator/test_heat.py deleted file mode 100644 index c34ea53fc..000000000 --- a/tests/unit/orchestrator/test_heat.py +++ /dev/null @@ -1,339 +0,0 @@ -#!/usr/bin/env python - -############################################################################## -# Copyright (c) 2017 Intel Corporation -# -# 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.orchestrator.heat -from contextlib import contextmanager -from itertools import count -from tempfile import NamedTemporaryFile -import unittest -import uuid -import time -import mock - -from yardstick.benchmark.contexts import node -from yardstick.orchestrator import heat - - -TARGET_MODULE = 'yardstick.orchestrator.heat' - - -def mock_patch_target_module(inner_import): - return mock.patch('.'.join([TARGET_MODULE, inner_import])) - - -@contextmanager -def timer(): - start = time.time() - data = {'start': start} - try: - yield data - finally: - data['end'] = end = time.time() - data['delta'] = end - start - - -def index_value_iter(index, index_value, base_value=None): - for current_index in count(): - if current_index == index: - yield index_value - else: - yield base_value - - -def get_error_message(error): - try: - # py2 - return error.message - except AttributeError: - # py3 - return next((arg for arg in error.args if isinstance(arg, str)), None) - - -class HeatContextTestCase(unittest.TestCase): - - def test_get_short_key_uuid(self): - u = uuid.uuid4() - k = heat.get_short_key_uuid(u) - self.assertEqual(heat.HEAT_KEY_UUID_LENGTH, len(k)) - self.assertIn(k, str(u)) - -class HeatTemplateTestCase(unittest.TestCase): - - def setUp(self): - self.template = heat.HeatTemplate('test') - - def test_add_tenant_network(self): - self.template.add_network('some-network') - - self.assertEqual(self.template.resources['some-network']['type'], 'OS::Neutron::Net') - - def test_add_provider_network(self): - self.template.add_network('some-network', 'physnet2', 'sriov') - - self.assertEqual(self.template.resources['some-network']['type'], 'OS::Neutron::ProviderNet') - self.assertEqual(self.template.resources['some-network']['properties']['physical_network'], 'physnet2') - - def test_add_subnet(self): - netattrs = {'cidr': '10.0.0.0/24', 'provider': None, 'external_network': 'ext_net'} - self.template.add_subnet('some-subnet', "some-network", netattrs['cidr']) - - self.assertEqual(self.template.resources['some-subnet']['type'], 'OS::Neutron::Subnet') - self.assertEqual(self.template.resources['some-subnet']['properties']['cidr'], '10.0.0.0/24') - - def test_add_router(self): - self.template.add_router('some-router', 'ext-net', 'some-subnet') - - self.assertEqual(self.template.resources['some-router']['type'], 'OS::Neutron::Router') - self.assertIn('some-subnet', self.template.resources['some-router']['depends_on']) - - def test_add_router_interface(self): - self.template.add_router_interface('some-router-if', 'some-router', 'some-subnet') - - self.assertEqual(self.template.resources['some-router-if']['type'], 'OS::Neutron::RouterInterface') - self.assertIn('some-subnet', self.template.resources['some-router-if']['depends_on']) - - def test_add_servergroup(self): - self.template.add_servergroup('some-server-group', 'anti-affinity') - - self.assertEqual(self.template.resources['some-server-group']['type'], 'OS::Nova::ServerGroup') - self.assertEqual(self.template.resources['some-server-group']['properties']['policies'], ['anti-affinity']) - - def test__add_resources_to_template_raw(self): - test_context = node.NodeContext() - test_context.name = 'foo' - test_context.template_file = '/tmp/some-heat-file' - test_context.heat_parameters = {'image': 'cirros'} - test_context.key_filename = "/tmp/1234" - test_context.keypair_name = "foo-key" - test_context.secgroup_name = "foo-secgroup" - test_context.key_uuid = "2f2e4997-0a8e-4eb7-9fa4-f3f8fbbc393b" - heat_object = heat.HeatObject() - - heat_stack = heat.HeatStack("tmpStack") - self.assertTrue(heat_stack.stacks_exist()) - - test_context.tmpfile = NamedTemporaryFile(delete=True, mode='w+t') - test_context.tmpfile.write("heat_template_version: 2015-04-30") - test_context.tmpfile.flush() - test_context.tmpfile.seek(0) - heat_template = heat.HeatTemplate(heat_object) - heat_template.resources = {} - - heat_template.add_network("network1") - heat_template.add_network("network2") - heat_template.add_security_group("sec_group1") - heat_template.add_security_group("sec_group2") - heat_template.add_subnet("subnet1", "network1", "cidr1") - heat_template.add_subnet("subnet2", "network2", "cidr2") - heat_template.add_router("router1", "gw1", "subnet1") - heat_template.add_router_interface("router_if1", "router1", "subnet1") - heat_template.add_port("port1", "network1", "subnet1", "normal") - heat_template.add_port("port2", "network2", "subnet2", "normal", sec_group_id="sec_group1",provider="not-sriov") - heat_template.add_port("port3", "network2", "subnet2", "normal", sec_group_id="sec_group1",provider="sriov") - heat_template.add_floating_ip("floating_ip1", "network1", "port1", "router_if1") - heat_template.add_floating_ip("floating_ip2", "network2", "port2", "router_if2", "foo-secgroup") - heat_template.add_floating_ip_association("floating_ip1_association", "floating_ip1", "port1") - heat_template.add_servergroup("server_grp2", "affinity") - heat_template.add_servergroup("server_grp3", "anti-affinity") - heat_template.add_security_group("security_group") - heat_template.add_server(name="server1", image="image1", flavor="flavor1", flavors=[]) - heat_template.add_server_group(name="servergroup", policies=["policy1","policy2"]) - heat_template.add_server_group(name="servergroup", policies="policy1") - heat_template.add_server(name="server2", image="image1", flavor="flavor1", flavors=[], ports=["port1", "port2"], - networks=["network1", "network2"], scheduler_hints="hints1", user="user1", - key_name="foo-key", user_data="user", metadata={"cat": 1, "doc": 2}, - additional_properties={"prop1": 1, "prop2": 2}) - heat_template.add_server(name="server2", image="image1", flavor="flavor1", flavors=["flavor1", "flavor2"], - ports=["port1", "port2"], - networks=["network1", "network2"], scheduler_hints="hints1", user="user1", - key_name="foo-key", user_data="user", metadata={"cat": 1, "doc": 2}, - additional_properties={"prop1": 1, "prop2": 2} ) - heat_template.add_server(name="server2", image="image1", flavor="flavor1", flavors=["flavor3", "flavor4"], - ports=["port1", "port2"], - networks=["network1", "network2"], scheduler_hints="hints1", user="user1", - key_name="foo-key", user_data="user", metadata={"cat": 1, "doc": 2}, - additional_properties={"prop1": 1, "prop2": 2}) - heat_template.add_flavor(name="flavor1", vcpus=1, ram=2048, disk=1,extra_specs={"cat": 1, "dog": 2}) - heat_template.add_flavor(name=None, vcpus=1, ram=2048) - heat_template.add_server(name="server1", - image="image1", - flavor="flavor1", - flavors=[], - ports=["port1", "port2"], - networks=["network1", "network2"], - scheduler_hints="hints1", - user="user1", - key_name="foo-key", - user_data="user", - metadata={"cat": 1, "doc": 2}, - additional_properties= {"prop1": 1, "prop2": 2} ) - heat_template.add_network("network1") - - heat_template.add_flavor("test") - self.assertEqual(heat_template.resources['test']['type'], 'OS::Nova::Flavor') - - @mock_patch_target_module('op_utils') - @mock_patch_target_module('heatclient') - def test_create_negative(self, mock_heat_client_class, mock_op_utils): - self.template.HEAT_WAIT_LOOP_INTERVAL = 0 - mock_heat_client = mock_heat_client_class() # get the constructed mock - - # populate attributes of the constructed mock - mock_heat_client.stacks.get().stack_status_reason = 'the reason' - - expected_status_calls = 0 - expected_constructor_calls = 1 # above, to get the instance - expected_create_calls = 0 - expected_op_utils_usage = 0 - - with mock.patch.object(self.template, 'status', return_value=None) as mock_status: - # block with timeout hit - timeout = 0 - with self.assertRaises(RuntimeError) as raised, timer() as time_data: - self.template.create(block=True, timeout=timeout) - - # ensure op_utils was used - expected_op_utils_usage += 1 - self.assertEqual(mock_op_utils.get_session.call_count, expected_op_utils_usage) - self.assertEqual(mock_op_utils.get_endpoint.call_count, expected_op_utils_usage) - self.assertEqual(mock_op_utils.get_heat_api_version.call_count, expected_op_utils_usage) - - # ensure the constructor and instance were used - self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) - self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) - - # ensure that the status was used - self.assertGreater(mock_status.call_count, expected_status_calls) - expected_status_calls = mock_status.call_count # synchronize the value - - # ensure the expected exception was raised - error_message = get_error_message(raised.exception) - self.assertIn('timeout', error_message) - self.assertNotIn('the reason', error_message) - - # block with create failed - timeout = 10 - mock_status.side_effect = iter([None, None, u'CREATE_FAILED']) - with self.assertRaises(RuntimeError) as raised, timer() as time_data: - self.template.create(block=True, timeout=timeout) - - # ensure the existing heat_client was used and op_utils was used again - self.assertEqual(mock_op_utils.get_session.call_count, expected_op_utils_usage) - self.assertEqual(mock_op_utils.get_endpoint.call_count, expected_op_utils_usage) - self.assertEqual(mock_op_utils.get_heat_api_version.call_count, expected_op_utils_usage) - - # ensure the constructor was not used but the instance was used - self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) - self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) - - # ensure that the status was used three times - expected_status_calls += 3 - self.assertEqual(mock_status.call_count, expected_status_calls) - - @mock_patch_target_module('op_utils') - @mock_patch_target_module('heatclient') - def test_create(self, mock_heat_client_class, mock_op_utils): - self.template.HEAT_WAIT_LOOP_INTERVAL = 0.2 - mock_heat_client = mock_heat_client_class() - - # populate attributes of the constructed mock - mock_heat_client.stacks.get().outputs = [ - {'output_key': 'key1', 'output_value': 'value1'}, - {'output_key': 'key2', 'output_value': 'value2'}, - {'output_key': 'key3', 'output_value': 'value3'}, - ] - expected_outputs = { - 'key1': 'value1', - 'key2': 'value2', - 'key3': 'value3', - } - - expected_status_calls = 0 - expected_constructor_calls = 1 # above, to get the instance - expected_create_calls = 0 - expected_op_utils_usage = 0 - - with mock.patch.object(self.template, 'status') as mock_status: - self.template.name = 'no block test' - mock_status.return_value = None - - # no block - self.assertIsInstance(self.template.create(block=False, timeout=2), heat.HeatStack) - - # ensure op_utils was used - expected_op_utils_usage += 1 - self.assertEqual(mock_op_utils.get_session.call_count, expected_op_utils_usage) - self.assertEqual(mock_op_utils.get_endpoint.call_count, expected_op_utils_usage) - self.assertEqual(mock_op_utils.get_heat_api_version.call_count, expected_op_utils_usage) - - # ensure the constructor and instance were used - self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) - self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) - - # ensure that the status was not used - self.assertEqual(mock_status.call_count, expected_status_calls) - - # ensure no outputs because this requires blocking - self.assertEqual(self.template.outputs, {}) - - # block with immediate complete - self.template.name = 'block, immediate complete test' - - mock_status.return_value = self.template.HEAT_CREATE_COMPLETE_STATUS - self.assertIsInstance(self.template.create(block=True, timeout=2), heat.HeatStack) - - # ensure existing instance was re-used and op_utils was not used - self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) - self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) - - # ensure status was checked once - expected_status_calls += 1 - self.assertEqual(mock_status.call_count, expected_status_calls) - - # reset template outputs - self.template.outputs = None - - # block with delayed complete - self.template.name = 'block, delayed complete test' - - success_index = 2 - mock_status.side_effect = index_value_iter(success_index, - self.template.HEAT_CREATE_COMPLETE_STATUS) - self.assertIsInstance(self.template.create(block=True, timeout=2), heat.HeatStack) - - # ensure existing instance was re-used and op_utils was not used - self.assertEqual(mock_heat_client_class.call_count, expected_constructor_calls) - self.assertEqual(mock_heat_client.stacks.create.call_count, expected_create_calls) - - # ensure status was checked three more times - expected_status_calls += 1 + success_index - self.assertEqual(mock_status.call_count, expected_status_calls) - - -class HeatStackTestCase(unittest.TestCase): - - def test_delete_calls__delete_multiple_times(self): - stack = heat.HeatStack('test') - stack.uuid = 1 - with mock.patch.object(stack, "_delete") as delete_mock: - stack.delete() - # call once and then call again if uuid is not none - self.assertGreater(delete_mock.call_count, 1) - - @mock.patch('yardstick.orchestrator.heat.op_utils') - def test_delete_all_calls_delete(self, mock_op): - # we must patch the object before we create an instance - # so we can override delete() in all the instances - with mock.patch.object(heat.HeatStack, "delete") as delete_mock: - stack = heat.HeatStack('test') - stack.uuid = 1 - stack.delete_all() - self.assertGreater(delete_mock.call_count, 0) diff --git a/tests/unit/orchestrator/test_kubernetes.py b/tests/unit/orchestrator/test_kubernetes.py deleted file mode 100644 index 1a3291c89..000000000 --- a/tests/unit/orchestrator/test_kubernetes.py +++ /dev/null @@ -1,114 +0,0 @@ -#!/usr/bin/env python - -############################################################################## -# Copyright (c) 2017 Intel Corporation -# -# 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.orchestrator.heat -import unittest -import mock - -from yardstick.orchestrator.kubernetes import KubernetesObject -from yardstick.orchestrator.kubernetes import KubernetesTemplate - - -class GetTemplateTestCase(unittest.TestCase): - - def test_get_template(self): - output_t = { - "apiVersion": "v1", - "kind": "ReplicationController", - "metadata": { - "name": "host-k8s-86096c30" - }, - "spec": { - "replicas": 1, - "template": { - "metadata": { - "labels": { - "app": "host-k8s-86096c30" - } - }, - "spec": { - "containers": [ - { - "args": [ - "-c", - "chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; \ -service ssh restart;while true ; do sleep 10000; done" - ], - "command": [ - "/bin/bash" - ], - "image": "openretriever/yardstick", - "name": "host-k8s-86096c30-container", - "volumeMounts": [ - { - "mountPath": "/root/.ssh/", - "name": "k8s-86096c30-key" - } - ] - } - ], - "volumes": [ - { - "configMap": { - "name": "k8s-86096c30-key" - }, - "name": "k8s-86096c30-key" - } - ], - "nodeSelector": { - "kubernetes.io/hostname": "node-01" - } - } - } - } - } - input_s = { - 'command': '/bin/bash', - 'args': ['-c', 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; \ -service ssh restart;while true ; do sleep 10000; done'], - 'ssh_key': 'k8s-86096c30-key', - 'nodeSelector': { 'kubernetes.io/hostname': 'node-01'} - } - name = 'host-k8s-86096c30' - output_r = KubernetesObject(name, **input_s).get_template() - self.assertEqual(output_r, output_t) - - -class GetRcPodsTestCase(unittest.TestCase): - - @mock.patch('yardstick.orchestrator.kubernetes.k8s_utils.get_pod_list') - def test_get_rc_pods(self, mock_get_pod_list): - servers = { - 'host': { - 'image': 'openretriever/yardstick', - 'command': '/bin/bash', - 'args': ['-c', 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; \ -service ssh restart;while true ; do sleep 10000; done'] - }, - 'target': { - 'image': 'openretriever/yardstick', - 'command': '/bin/bash', - 'args': ['-c', 'chmod 700 ~/.ssh; chmod 600 ~/.ssh/*; \ -service ssh restart;while true ; do sleep 10000; done'] - } - } - k8s_template = KubernetesTemplate('k8s-86096c30', servers) - mock_get_pod_list.return_value.items = [] - pods = k8s_template.get_rc_pods() - self.assertEqual(pods, []) - - -def main(): - unittest.main() - - -if __name__ == '__main__': - main() 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() |