diff options
Diffstat (limited to 'yardstick/tests/unit')
22 files changed, 1224 insertions, 224 deletions
diff --git a/yardstick/tests/unit/benchmark/contexts/standalone/test_ovs_dpdk.py b/yardstick/tests/unit/benchmark/contexts/standalone/test_ovs_dpdk.py index 5be22a034..a4a8359d5 100644 --- a/yardstick/tests/unit/benchmark/contexts/standalone/test_ovs_dpdk.py +++ b/yardstick/tests/unit/benchmark/contexts/standalone/test_ovs_dpdk.py @@ -58,7 +58,10 @@ class OvsDpdkContextTestCase(unittest.TestCase): 'file': self._get_file_abspath(self.NODES_ovs_dpdk_SAMPLE) } self.ovs_dpdk = ovs_dpdk.OvsDpdkContext() + self._mock_log = mock.patch.object(ovs_dpdk, 'LOG') + self.mock_log = self._mock_log.start() self.addCleanup(self._remove_contexts) + self.addCleanup(self._stop_mocks) @staticmethod def _remove_contexts(): @@ -66,6 +69,9 @@ class OvsDpdkContextTestCase(unittest.TestCase): context._delete_context() base.Context.list = [] + def _stop_mocks(self): + self._mock_log.stop() + @mock.patch('yardstick.benchmark.contexts.standalone.model.Server') @mock.patch('yardstick.benchmark.contexts.standalone.model.StandaloneContextHelper') def test___init__(self, mock_helper, mock_server): diff --git a/yardstick/tests/unit/benchmark/contexts/test_base.py b/yardstick/tests/unit/benchmark/contexts/test_base.py index 1e63b4831..5fd7352f5 100644 --- a/yardstick/tests/unit/benchmark/contexts/test_base.py +++ b/yardstick/tests/unit/benchmark/contexts/test_base.py @@ -19,6 +19,7 @@ import mock from yardstick.benchmark.contexts import base from yardstick.benchmark.contexts.base import Context +from yardstick.common import yaml_loader from yardstick.tests.unit import base as ut_base from yardstick.common.constants import YARDSTICK_ROOT_PATH @@ -131,7 +132,7 @@ class ContextTestCase(ut_base.BaseUnitTestCase): mock_get_ctx.assert_called_once() self.assertIsNone(result) - @mock.patch('yardstick.common.utils.read_yaml_file') + @mock.patch.object(yaml_loader, 'read_yaml_file') def test_read_pod_file(self, mock_read_yaml_file): attrs = {'name': 'foo', 'task_id': '12345678', diff --git a/yardstick/tests/unit/benchmark/contexts/test_heat.py b/yardstick/tests/unit/benchmark/contexts/test_heat.py index 7605ef29a..7782d96bd 100644 --- a/yardstick/tests/unit/benchmark/contexts/test_heat.py +++ b/yardstick/tests/unit/benchmark/contexts/test_heat.py @@ -20,6 +20,7 @@ from yardstick.benchmark.contexts import model from yardstick.common import constants as consts from yardstick.common import exceptions as y_exc from yardstick.common import openstack_utils +from yardstick.common import yaml_loader from yardstick import ssh @@ -80,12 +81,13 @@ class HeatContextTestCase(unittest.TestCase): self.assertIsNone(self.test_context.heat_parameters) self.assertIsNone(self.test_context.key_filename) - @mock.patch('yardstick.common.utils.read_yaml_file') + @mock.patch.object(yaml_loader, 'read_yaml_file') @mock.patch('yardstick.benchmark.contexts.heat.PlacementGroup') @mock.patch('yardstick.benchmark.contexts.heat.ServerGroup') @mock.patch('yardstick.benchmark.contexts.heat.Network') @mock.patch('yardstick.benchmark.contexts.heat.Server') - def test_init(self, mock_server, mock_network, mock_sg, mock_pg, mock_read_yaml): + def test_init(self, mock_server, mock_network, mock_sg, mock_pg, + mock_read_yaml): mock_read_yaml.return_value = self.HEAT_POD_SAMPLE pgs = {'pgrp1': {'policy': 'availability'}} @@ -764,7 +766,7 @@ class HeatContextTestCase(unittest.TestCase): nodes = self.test_context._get_physical_nodes() self.assertEquals(nodes, {}) - @mock.patch('yardstick.common.utils.read_yaml_file') + @mock.patch.object(yaml_loader, 'read_yaml_file') def test__get_physical_node_for_server(self, mock_read_yaml): attrs = {'name': 'foo', 'task_id': '12345678', diff --git a/yardstick/tests/unit/benchmark/contexts/test_kubernetes.py b/yardstick/tests/unit/benchmark/contexts/test_kubernetes.py index 821b84a1f..3957aab91 100644 --- a/yardstick/tests/unit/benchmark/contexts/test_kubernetes.py +++ b/yardstick/tests/unit/benchmark/contexts/test_kubernetes.py @@ -163,12 +163,12 @@ class KubernetesTestCase(unittest.TestCase): self.k8s_context._get_node_ip() mock_get_node_list.assert_called_once() - @mock.patch('yardstick.orchestrator.kubernetes.ServiceObject.create') + @mock.patch.object(orchestrator_kubernetes.ServiceNodePortObject, 'create') def test_create_services(self, mock_create): self.k8s_context._create_services() mock_create.assert_called() - @mock.patch('yardstick.orchestrator.kubernetes.ServiceObject.delete') + @mock.patch.object(orchestrator_kubernetes.ServiceNodePortObject, 'delete') def test_delete_services(self, mock_delete): self.k8s_context._delete_services() mock_delete.assert_called() diff --git a/yardstick/tests/unit/benchmark/contexts/test_node.py b/yardstick/tests/unit/benchmark/contexts/test_node.py index 7fd13a406..da16074d9 100644 --- a/yardstick/tests/unit/benchmark/contexts/test_node.py +++ b/yardstick/tests/unit/benchmark/contexts/test_node.py @@ -8,14 +8,16 @@ ############################################################################## import os -import unittest import errno + import mock +import unittest -from yardstick.common import constants as consts from yardstick.benchmark.contexts import base from yardstick.benchmark.contexts import node +from yardstick.common import constants as consts from yardstick.common import exceptions +from yardstick.common import yaml_loader class NodeContextTestCase(unittest.TestCase): @@ -56,7 +58,7 @@ class NodeContextTestCase(unittest.TestCase): self.assertEqual(self.test_context.env, {}) self.assertEqual(self.test_context.attrs, {}) - @mock.patch('yardstick.common.utils.read_yaml_file') + @mock.patch.object(yaml_loader, 'read_yaml_file') @mock.patch('{}.os.path.join'.format(PREFIX)) def test_init_negative(self, mock_path_join, read_mock): special_path = '/foo/bar/error_file' diff --git a/yardstick/tests/unit/benchmark/runner/test_base.py b/yardstick/tests/unit/benchmark/runner/test_base.py index 727207f5a..49ba1efe4 100644 --- a/yardstick/tests/unit/benchmark/runner/test_base.py +++ b/yardstick/tests/unit/benchmark/runner/test_base.py @@ -8,38 +8,47 @@ ############################################################################## import time +import uuid import mock -import unittest -from subprocess import CalledProcessError +from oslo_config import cfg +import oslo_messaging +import subprocess - -from yardstick.benchmark.runners import base +from yardstick.benchmark.runners import base as runner_base from yardstick.benchmark.runners import iteration +from yardstick.common import messaging +from yardstick.common.messaging import payloads +from yardstick.tests.unit import base as ut_base -class ActionTestCase(unittest.TestCase): +class ActionTestCase(ut_base.BaseUnitTestCase): - @mock.patch("yardstick.benchmark.runners.base.subprocess") - def test__execute_shell_command(self, mock_subprocess): - mock_subprocess.check_output.side_effect = CalledProcessError(-1, '') + def setUp(self): + self._mock_log = mock.patch.object(runner_base.log, 'error') + self.mock_log = self._mock_log.start() + self.addCleanup(self._stop_mocks) - self.assertEqual(base._execute_shell_command("")[0], -1) + def _stop_mocks(self): + self._mock_log.stop() - @mock.patch("yardstick.benchmark.runners.base.subprocess") - def test__single_action(self, mock_subprocess): - mock_subprocess.check_output.side_effect = CalledProcessError(-1, '') + @mock.patch.object(subprocess, 'check_output') + def test__execute_shell_command(self, mock_subprocess): + mock_subprocess.side_effect = subprocess.CalledProcessError(-1, '') + self.assertEqual(runner_base._execute_shell_command("")[0], -1) - base._single_action(0, "echo", mock.MagicMock()) + @mock.patch.object(subprocess, 'check_output') + def test__single_action(self, mock_subprocess): + mock_subprocess.side_effect = subprocess.CalledProcessError(-1, '') + runner_base._single_action(0, 'echo', mock.Mock()) - @mock.patch("yardstick.benchmark.runners.base.subprocess") + @mock.patch.object(subprocess, 'check_output') def test__periodic_action(self, mock_subprocess): - mock_subprocess.check_output.side_effect = CalledProcessError(-1, '') - - base._periodic_action(0, "echo", mock.MagicMock()) + mock_subprocess.side_effect = subprocess.CalledProcessError(-1, '') + runner_base._periodic_action(0, 'echo', mock.Mock()) -class RunnerTestCase(unittest.TestCase): +class RunnerTestCase(ut_base.BaseUnitTestCase): def setUp(self): config = { @@ -86,7 +95,58 @@ class RunnerTestCase(unittest.TestCase): self.assertEqual(idle_result, actual_result) def test__run_benchmark(self): - runner = base.Runner(mock.Mock()) + runner = runner_base.Runner(mock.Mock()) with self.assertRaises(NotImplementedError): runner._run_benchmark(mock.Mock(), mock.Mock(), mock.Mock(), mock.Mock()) + + +class RunnerProducerTestCase(ut_base.BaseUnitTestCase): + + @mock.patch.object(oslo_messaging, 'Target', return_value='rpc_target') + @mock.patch.object(oslo_messaging, 'RPCClient') + @mock.patch.object(oslo_messaging, 'get_rpc_transport', + return_value='rpc_transport') + @mock.patch.object(cfg, 'CONF') + def test__init(self, mock_config, mock_transport, mock_rpcclient, + mock_target): + _id = uuid.uuid1().int + runner_producer = runner_base.RunnerProducer(_id) + mock_transport.assert_called_once_with( + mock_config, url='rabbit://yardstick:yardstick@localhost:5672/') + mock_target.assert_called_once_with(topic=messaging.TOPIC_RUNNER, + fanout=True, + server=messaging.SERVER) + mock_rpcclient.assert_called_once_with('rpc_transport', 'rpc_target') + self.assertEqual(_id, runner_producer._id) + self.assertEqual(messaging.TOPIC_RUNNER, runner_producer._topic) + + @mock.patch.object(oslo_messaging, 'Target', return_value='rpc_target') + @mock.patch.object(oslo_messaging, 'RPCClient') + @mock.patch.object(oslo_messaging, 'get_rpc_transport', + return_value='rpc_transport') + @mock.patch.object(payloads, 'RunnerPayload', return_value='runner_pload') + def test_start_iteration(self, mock_runner_payload, *args): + runner_producer = runner_base.RunnerProducer(uuid.uuid1().int) + with mock.patch.object(runner_producer, + 'send_message') as mock_message: + runner_producer.start_iteration(version=10) + + mock_message.assert_called_once_with( + messaging.RUNNER_METHOD_START_ITERATION, 'runner_pload') + mock_runner_payload.assert_called_once_with(version=10, data={}) + + @mock.patch.object(oslo_messaging, 'Target', return_value='rpc_target') + @mock.patch.object(oslo_messaging, 'RPCClient') + @mock.patch.object(oslo_messaging, 'get_rpc_transport', + return_value='rpc_transport') + @mock.patch.object(payloads, 'RunnerPayload', return_value='runner_pload') + def test_stop_iteration(self, mock_runner_payload, *args): + runner_producer = runner_base.RunnerProducer(uuid.uuid1().int) + with mock.patch.object(runner_producer, + 'send_message') as mock_message: + runner_producer.stop_iteration(version=15) + + mock_message.assert_called_once_with( + messaging.RUNNER_METHOD_STOP_ITERATION, 'runner_pload') + mock_runner_payload.assert_called_once_with(version=15, data={}) diff --git a/yardstick/tests/unit/benchmark/runner/test_iteration_ipc.py b/yardstick/tests/unit/benchmark/runner/test_iteration_ipc.py new file mode 100644 index 000000000..10d14a8a0 --- /dev/null +++ b/yardstick/tests/unit/benchmark/runner/test_iteration_ipc.py @@ -0,0 +1,136 @@ +# Copyright (c) 2018 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 multiprocessing +import time +import os +import uuid + +import mock + +from yardstick.benchmark.runners import iteration_ipc +from yardstick.common import messaging +from yardstick.common.messaging import payloads +from yardstick.tests.unit import base as ut_base + + +class RunnerIterationIPCEndpointTestCase(ut_base.BaseUnitTestCase): + + def setUp(self): + self._id = uuid.uuid1().int + self._ctx_ids = [uuid.uuid1().int, uuid.uuid1().int] + self._queue = multiprocessing.Queue() + self.runner = iteration_ipc.RunnerIterationIPCEndpoint( + self._id, self._ctx_ids, self._queue) + self._kwargs = {'version': 1, 'iteration': 10, 'kpi': {}} + self._pload_dict = payloads.TrafficGeneratorPayload.dict_to_obj( + self._kwargs).obj_to_dict() + + def test_tg_method_started(self): + self._queue.empty() + ctxt = {'id': self._ctx_ids[0]} + self.runner.tg_method_started(ctxt, **self._kwargs) + time.sleep(0.2) + + output = [] + while not self._queue.empty(): + output.append(self._queue.get(True, 1)) + + self.assertEqual(1, len(output)) + self.assertEqual(self._ctx_ids[0], output[0]['id']) + self.assertEqual(messaging.TG_METHOD_STARTED, output[0]['action']) + self.assertEqual(self._pload_dict, output[0]['payload'].obj_to_dict()) + + def test_tg_method_finished(self): + self._queue.empty() + ctxt = {'id': self._ctx_ids[0]} + self.runner.tg_method_finished(ctxt, **self._kwargs) + time.sleep(0.2) + + output = [] + while not self._queue.empty(): + output.append(self._queue.get(True, 1)) + + self.assertEqual(1, len(output)) + self.assertEqual(self._ctx_ids[0], output[0]['id']) + self.assertEqual(messaging.TG_METHOD_FINISHED, output[0]['action']) + self.assertEqual(self._pload_dict, output[0]['payload'].obj_to_dict()) + + def test_tg_method_iteration(self): + self._queue.empty() + ctxt = {'id': self._ctx_ids[0]} + self.runner.tg_method_iteration(ctxt, **self._kwargs) + time.sleep(0.2) + + output = [] + while not self._queue.empty(): + output.append(self._queue.get(True, 1)) + + self.assertEqual(1, len(output)) + self.assertEqual(self._ctx_ids[0], output[0]['id']) + self.assertEqual(messaging.TG_METHOD_ITERATION, output[0]['action']) + self.assertEqual(self._pload_dict, output[0]['payload'].obj_to_dict()) + + +class RunnerIterationIPCConsumerTestCase(ut_base.BaseUnitTestCase): + + def setUp(self): + self._id = uuid.uuid1().int + self._ctx_ids = [uuid.uuid1().int, uuid.uuid1().int] + self.consumer = iteration_ipc.RunnerIterationIPCConsumer( + self._id, self._ctx_ids) + self.consumer._queue = mock.Mock() + + def test__init(self): + self.assertEqual({self._ctx_ids[0]: [], self._ctx_ids[1]: []}, + self.consumer._kpi_per_id) + + def test_is_all_kpis_received_in_iteration(self): + payload = payloads.TrafficGeneratorPayload( + version=1, iteration=1, kpi={}) + msg1 = {'action': messaging.TG_METHOD_ITERATION, + 'id': self._ctx_ids[0], 'payload': payload} + msg2 = {'action': messaging.TG_METHOD_ITERATION, + 'id': self._ctx_ids[1], 'payload': payload} + self.consumer.iteration_index = 1 + + self.consumer._queue.empty.side_effect = [False, True] + self.consumer._queue.get.return_value = msg1 + self.assertFalse(self.consumer.is_all_kpis_received_in_iteration()) + + self.consumer._queue.empty.side_effect = [False, True] + self.consumer._queue.get.return_value = msg2 + self.assertTrue(self.consumer.is_all_kpis_received_in_iteration()) + + +class IterationIPCRunnerTestCase(ut_base.BaseUnitTestCase): + + @mock.patch.object(iteration_ipc, '_worker_process') + @mock.patch.object(os, 'getpid', return_value=12345678) + @mock.patch.object(multiprocessing, 'Process', return_value=mock.Mock()) + def test__run_benchmark(self, mock_process, mock_getpid, mock_worker): + method = 'method' + scenario_cfg = {'type': 'scenario_type'} + context_cfg = 'context_cfg' + name = '%s-%s-%s' % ('IterationIPC', 'scenario_type', 12345678) + runner = iteration_ipc.IterationIPCRunner(mock.ANY) + mock_getpid.reset_mock() + + runner._run_benchmark('class', method, scenario_cfg, context_cfg) + mock_process.assert_called_once_with( + name=name, + target=mock_worker, + args=(runner.result_queue, 'class', method, scenario_cfg, + context_cfg, runner.aborted, runner.output_queue)) + mock_getpid.assert_called_once() diff --git a/yardstick/tests/unit/benchmark/scenarios/availability/test_scenario_general.py b/yardstick/tests/unit/benchmark/scenarios/availability/test_scenario_general.py index cd065c961..dbf3d83b2 100644 --- a/yardstick/tests/unit/benchmark/scenarios/availability/test_scenario_general.py +++ b/yardstick/tests/unit/benchmark/scenarios/availability/test_scenario_general.py @@ -13,6 +13,7 @@ import unittest from yardstick.benchmark.scenarios.availability import scenario_general from yardstick.common import exceptions as y_exc + class ScenarioGeneralTestCase(unittest.TestCase): @mock.patch.object(scenario_general, 'Director') @@ -37,19 +38,21 @@ class ScenarioGeneralTestCase(unittest.TestCase): 'index': 2}] } } - self.instance = scenario_general.ScenarioGeneral(self.scenario_cfg, None) + self.instance = scenario_general.ScenarioGeneral(self.scenario_cfg, + None) self.instance.setup() self.instance.director.verify.return_value = True def test_scenario_general_all_successful(self): - ret = {} self.instance.run(ret) self.instance.teardown() self.assertEqual(ret['sla_pass'], 1) - def test_scenario_general_exception(self): - self.instance.director.createActionPlayer.side_effect = KeyError('Wrong') + @mock.patch.object(scenario_general.LOG, 'exception') + def test_scenario_general_exception(self, *args): + self.instance.director.createActionPlayer.side_effect = ( + KeyError('Wrong')) self.instance.director.data = {} ret = {} self.instance.run(ret) diff --git a/yardstick/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py b/yardstick/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py index bb1a7aaca..77a54c0b8 100644 --- a/yardstick/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py +++ b/yardstick/tests/unit/benchmark/scenarios/networking/test_vnf_generic.py @@ -553,6 +553,7 @@ class TestNetworkServiceTestCase(unittest.TestCase): tgen.verify_traffic = lambda x: verified_dict tgen.terminate = mock.Mock(return_value=True) tgen.name = "tgen__1" + tgen.run_traffic.return_value = 'tg_id' vnf = mock.Mock(autospec=GenericVNF) vnf.runs_traffic = False vnf.terminate = mock.Mock(return_value=True) @@ -565,7 +566,6 @@ class TestNetworkServiceTestCase(unittest.TestCase): self.s.load_vnf_models = mock.Mock(return_value=self.s.vnfs) self.s._fill_traffic_profile = \ mock.Mock(return_value=TRAFFIC_PROFILE) - self.assertIsNone(self.s.setup()) def test_setup_exception(self): with mock.patch("yardstick.ssh.SSH") as ssh: @@ -656,6 +656,9 @@ class TestNetworkServiceTestCase(unittest.TestCase): ) self.assertEqual(self.s.topology, 'fake_nsd') + def test_get_mq_ids(self): + self.assertEqual(self.s._mq_ids, self.s.get_mq_ids()) + def test_teardown(self): vnf = mock.Mock(autospec=GenericVNF) vnf.terminate = mock.Mock(return_value=True) diff --git a/yardstick/tests/unit/common/messaging/test_payloads.py b/yardstick/tests/unit/common/messaging/test_payloads.py index 00ec220c9..37b1f1926 100644 --- a/yardstick/tests/unit/common/messaging/test_payloads.py +++ b/yardstick/tests/unit/common/messaging/test_payloads.py @@ -44,3 +44,39 @@ class PayloadTestCase(ut_base.BaseUnitTestCase): _dict = {'version': 2, 'key1': 'value100', 'key2': 'value200'} payload = _DummyPayload.dict_to_obj(_dict) self.assertEqual(set(_dict.keys()), payload._fields) + + +class TrafficGeneratorPayloadTestCase(ut_base.BaseUnitTestCase): + + def test_init(self): + tg_payload = payloads.TrafficGeneratorPayload( + version=1, iteration=10, kpi={'key1': 'value1'}) + self.assertEqual(1, tg_payload.version) + self.assertEqual(10, tg_payload.iteration) + self.assertEqual({'key1': 'value1'}, tg_payload.kpi) + self.assertEqual(3, len(tg_payload._fields)) + + def test__init_missing_required_fields(self): + with self.assertRaises(exceptions.PayloadMissingAttributes): + payloads.TrafficGeneratorPayload(version=1, iteration=10) + with self.assertRaises(exceptions.PayloadMissingAttributes): + payloads.TrafficGeneratorPayload(iteration=10, kpi={}) + with self.assertRaises(exceptions.PayloadMissingAttributes): + payloads.TrafficGeneratorPayload(iteration=10) + + +class RunnerPayloadTestCase(ut_base.BaseUnitTestCase): + + def test_init(self): + runner_payload = payloads.RunnerPayload(version=5, + data={'key1': 'value1'}) + self.assertEqual(5, runner_payload.version) + self.assertEqual({'key1': 'value1'}, runner_payload.data) + + def test__init_missing_required_fields(self): + with self.assertRaises(exceptions.PayloadMissingAttributes): + payloads.RunnerPayload(version=1) + with self.assertRaises(exceptions.PayloadMissingAttributes): + payloads.RunnerPayload(data=None) + with self.assertRaises(exceptions.PayloadMissingAttributes): + payloads.RunnerPayload() diff --git a/yardstick/tests/unit/common/messaging/test_producer.py b/yardstick/tests/unit/common/messaging/test_producer.py index 0289689dc..22286e5c3 100644 --- a/yardstick/tests/unit/common/messaging/test_producer.py +++ b/yardstick/tests/unit/common/messaging/test_producer.py @@ -44,3 +44,10 @@ class MessagingProducerTestCase(ut_base.BaseUnitTestCase): topic='test_topic', fanout=True, server=messaging.SERVER) mock_RPCClient.assert_called_once_with('test_rpc_transport', 'test_Target') + + def test_id(self): + with mock.patch.object(oslo_messaging, 'RPCClient'), \ + mock.patch.object(oslo_messaging, 'get_rpc_transport'), \ + mock.patch.object(oslo_messaging, 'Target'): + msg_producer = _MessagingProducer('topic', 'id_to_check') + self.assertEqual('id_to_check', msg_producer.id) diff --git a/yardstick/tests/unit/common/test_kubernetes_utils.py b/yardstick/tests/unit/common/test_kubernetes_utils.py new file mode 100644 index 000000000..bf9992b57 --- /dev/null +++ b/yardstick/tests/unit/common/test_kubernetes_utils.py @@ -0,0 +1,224 @@ +# Copyright (c) 2018 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 +from kubernetes import client +from kubernetes.client import rest +from kubernetes import config + +from yardstick.common import constants +from yardstick.common import exceptions +from yardstick.common import kubernetes_utils +from yardstick.tests.unit import base + + +class GetExtensionsV1betaApiTestCase(base.BaseUnitTestCase): + + @mock.patch.object(client, 'ApiextensionsV1beta1Api', return_value='api') + @mock.patch.object(config, 'load_kube_config') + def test_execute_correct(self, mock_load_kube_config, mock_api): + self.assertEqual('api', kubernetes_utils.get_extensions_v1beta_api()) + mock_load_kube_config.assert_called_once_with( + config_file=constants.K8S_CONF_FILE) + mock_api.assert_called_once() + + @mock.patch.object(config, 'load_kube_config') + def test_execute_exception(self, mock_load_kube_config): + mock_load_kube_config.side_effect = IOError + with self.assertRaises(exceptions.KubernetesConfigFileNotFound): + kubernetes_utils.get_extensions_v1beta_api() + + +class GetCustomObjectsApiTestCase(base.BaseUnitTestCase): + + @mock.patch.object(client, 'CustomObjectsApi', return_value='api') + @mock.patch.object(config, 'load_kube_config') + def test_execute_correct(self, mock_load_kube_config, mock_api): + self.assertEqual('api', kubernetes_utils.get_custom_objects_api()) + mock_load_kube_config.assert_called_once_with( + config_file=constants.K8S_CONF_FILE) + mock_api.assert_called_once() + + @mock.patch.object(config, 'load_kube_config') + def test_execute_exception(self, mock_load_kube_config): + mock_load_kube_config.side_effect = IOError + with self.assertRaises(exceptions.KubernetesConfigFileNotFound): + kubernetes_utils.get_custom_objects_api() + + +class CreateCustomResourceDefinitionTestCase(base.BaseUnitTestCase): + + @mock.patch.object(client, 'V1beta1CustomResourceDefinition', + return_value='crd_obj') + @mock.patch.object(kubernetes_utils, 'get_extensions_v1beta_api') + def test_execute_correct(self, mock_get_api, mock_crd): + mock_create_crd = mock.Mock() + mock_get_api.return_value = mock_create_crd + body = {'spec': 'fake_spec', 'metadata': 'fake_metadata'} + + kubernetes_utils.create_custom_resource_definition(body) + mock_get_api.assert_called_once() + mock_crd.assert_called_once_with(spec='fake_spec', + metadata='fake_metadata') + mock_create_crd.create_custom_resource_definition.\ + assert_called_once_with('crd_obj') + + @mock.patch.object(client, 'V1beta1CustomResourceDefinition', + return_value='crd_obj') + @mock.patch.object(kubernetes_utils, 'get_extensions_v1beta_api') + def test_execute_exception(self, mock_get_api, mock_crd): + mock_create_crd = mock.Mock() + mock_create_crd.create_custom_resource_definition.\ + side_effect = rest.ApiException + mock_get_api.return_value = mock_create_crd + body = {'spec': 'fake_spec', 'metadata': 'fake_metadata'} + + with self.assertRaises(exceptions.KubernetesApiException): + kubernetes_utils.create_custom_resource_definition(body) + mock_get_api.assert_called_once() + mock_crd.assert_called_once_with(spec='fake_spec', + metadata='fake_metadata') + mock_create_crd.create_custom_resource_definition.\ + assert_called_once_with('crd_obj') + + +class DeleteCustomResourceDefinitionTestCase(base.BaseUnitTestCase): + + @mock.patch.object(client, 'V1DeleteOptions', return_value='del_obj') + @mock.patch.object(kubernetes_utils, 'get_extensions_v1beta_api') + def test_execute_correct(self, mock_get_api, mock_delobj): + mock_delete_crd = mock.Mock() + mock_get_api.return_value = mock_delete_crd + + kubernetes_utils.delete_custom_resource_definition('name') + mock_get_api.assert_called_once() + mock_delobj.assert_called_once() + mock_delete_crd.delete_custom_resource_definition.\ + assert_called_once_with('name', 'del_obj') + + @mock.patch.object(client, 'V1DeleteOptions', return_value='del_obj') + @mock.patch.object(kubernetes_utils, 'get_extensions_v1beta_api') + def test_execute_exception(self, mock_get_api, mock_delobj): + mock_delete_crd = mock.Mock() + mock_delete_crd.delete_custom_resource_definition.\ + side_effect = rest.ApiException + mock_get_api.return_value = mock_delete_crd + + with self.assertRaises(exceptions.KubernetesApiException): + kubernetes_utils.delete_custom_resource_definition('name') + mock_delobj.assert_called_once() + mock_delete_crd.delete_custom_resource_definition.\ + assert_called_once_with('name', 'del_obj') + + +class GetCustomResourceDefinitionTestCase(base.BaseUnitTestCase): + + @mock.patch.object(kubernetes_utils, 'get_extensions_v1beta_api') + def test_execute_value(self, mock_get_api): + crd_obj = mock.Mock() + crd_obj.spec.names.kind = 'some_kind' + crd_list = mock.Mock() + crd_list.items = [crd_obj] + mock_api = mock.Mock() + mock_api.list_custom_resource_definition.return_value = crd_list + mock_get_api.return_value = mock_api + self.assertEqual( + crd_obj, + kubernetes_utils.get_custom_resource_definition('some_kind')) + + @mock.patch.object(kubernetes_utils, 'get_extensions_v1beta_api') + def test_execute_none(self, mock_get_api): + crd_obj = mock.Mock() + crd_obj.spec.names.kind = 'some_kind' + crd_list = mock.Mock() + crd_list.items = [crd_obj] + mock_api = mock.Mock() + mock_api.list_custom_resource_definition.return_value = crd_list + mock_get_api.return_value = mock_api + self.assertIsNone( + kubernetes_utils.get_custom_resource_definition('other_kind')) + + @mock.patch.object(kubernetes_utils, 'get_extensions_v1beta_api') + def test_execute_exception(self, mock_get_api): + mock_api = mock.Mock() + mock_api.list_custom_resource_definition.\ + side_effect = rest.ApiException + mock_get_api.return_value = mock_api + with self.assertRaises(exceptions.KubernetesApiException): + kubernetes_utils.get_custom_resource_definition('kind') + + +class CreateNetworkTestCase(base.BaseUnitTestCase): + @mock.patch.object(kubernetes_utils, 'get_custom_objects_api') + def test_execute_correct(self, mock_get_api): + mock_api = mock.Mock() + mock_get_api.return_value = mock_api + group = 'group.com' + version = mock.Mock() + plural = 'networks' + body = mock.Mock() + + kubernetes_utils.create_network( + constants.SCOPE_CLUSTER, group, version, plural, body) + mock_api.create_cluster_custom_object.assert_called_once_with( + group, version, plural, body) + + mock_api.reset_mock() + kubernetes_utils.create_network( + constants.SCOPE_NAMESPACED, group, version, plural, body) + mock_api.create_namespaced_custom_object.assert_called_once_with( + group, version, 'default', plural, body) + + + @mock.patch.object(kubernetes_utils, 'get_custom_objects_api') + def test_execute_exception(self, mock_get_api): + mock_api = mock.Mock() + mock_api.create_cluster_custom_object.side_effect = rest.ApiException + mock_get_api.return_value = mock_api + with self.assertRaises(exceptions.KubernetesApiException): + kubernetes_utils.create_network( + constants.SCOPE_CLUSTER, mock.ANY, mock.ANY, mock.ANY, + mock.ANY) + + +class DeleteNetworkTestCase(base.BaseUnitTestCase): + @mock.patch.object(kubernetes_utils, 'get_custom_objects_api') + def test_execute_correct(self, mock_get_api): + mock_api = mock.Mock() + mock_get_api.return_value = mock_api + group = 'group.com' + version = mock.Mock() + plural = 'networks' + name = 'network' + + kubernetes_utils.delete_network( + constants.SCOPE_CLUSTER, group, version, plural, name) + mock_api.delete_cluster_custom_object.assert_called_once_with( + group, version, plural, name, {}) + + mock_api.reset_mock() + kubernetes_utils.delete_network( + constants.SCOPE_NAMESPACED, group, version, plural, name) + mock_api.delete_namespaced_custom_object.assert_called_once_with( + group, version, 'default', plural, name, {}) + + @mock.patch.object(kubernetes_utils, 'get_custom_objects_api') + def test_execute_exception(self, mock_get_api): + mock_api = mock.Mock() + mock_api.delete_cluster_custom_object.side_effect = rest.ApiException + mock_get_api.return_value = mock_api + with self.assertRaises(exceptions.KubernetesApiException): + kubernetes_utils.delete_network( + constants.SCOPE_CLUSTER, mock.ANY, mock.ANY, mock.ANY, + mock.ANY) diff --git a/yardstick/tests/unit/common/test_utils.py b/yardstick/tests/unit/common/test_utils.py index 6247afd18..446afdd38 100644 --- a/yardstick/tests/unit/common/test_utils.py +++ b/yardstick/tests/unit/common/test_utils.py @@ -16,6 +16,7 @@ import mock import os import six from six.moves import configparser +import socket import time import unittest @@ -1282,3 +1283,29 @@ class WaitUntilTrueTestCase(ut_base.BaseUnitTestCase): self.assertIsNone( utils.wait_until_true(lambda: False, timeout=1, sleep=1, exception=MyTimeoutException)) + + +class SendSocketCommandTestCase(unittest.TestCase): + + @mock.patch.object(socket, 'socket') + def test_execute_correct(self, mock_socket): + mock_socket_obj = mock.Mock() + mock_socket_obj.connect_ex.return_value = 0 + mock_socket.return_value = mock_socket_obj + self.assertEqual(0, utils.send_socket_command('host', 22, 'command')) + mock_socket.assert_called_once_with(socket.AF_INET, socket.SOCK_STREAM) + mock_socket_obj.connect_ex.assert_called_once_with(('host', 22)) + mock_socket_obj.sendall.assert_called_once_with(six.b('command')) + mock_socket_obj.close.assert_called_once() + + @mock.patch.object(socket, 'socket') + def test_execute_exception(self, mock_socket): + mock_socket_obj = mock.Mock() + mock_socket_obj.connect_ex.return_value = 0 + mock_socket.return_value = mock_socket_obj + mock_socket_obj.sendall.side_effect = socket.error + self.assertEqual(1, utils.send_socket_command('host', 22, 'command')) + mock_socket.assert_called_once_with(socket.AF_INET, socket.SOCK_STREAM) + mock_socket_obj.connect_ex.assert_called_once_with(('host', 22)) + mock_socket_obj.sendall.assert_called_once_with(six.b('command')) + mock_socket_obj.close.assert_called_once() diff --git a/yardstick/tests/unit/network_services/libs/ixia_libs/test_ixnet_api.py b/yardstick/tests/unit/network_services/libs/ixia_libs/test_ixnet_api.py index 34afa3d5b..541855aa8 100644 --- a/yardstick/tests/unit/network_services/libs/ixia_libs/test_ixnet_api.py +++ b/yardstick/tests/unit/network_services/libs/ixia_libs/test_ixnet_api.py @@ -203,13 +203,9 @@ class TestIxNextgen(unittest.TestCase): ixnet_gen._ixnet = self.ixnet framesize = {'64B': '75', '512b': '25'} output = ixnet_gen._parse_framesize(framesize) - for idx in range(len(framesize)): - if output[idx * 2] == 64: - self.assertEqual(75, output[idx * 2 + 1]) - elif output[idx * 2] == 512: - self.assertEqual(25, output[idx * 2 + 1]) - else: - raise self.failureException('Framesize (64, 512) not present') + self.assertEqual(2, len(output)) + self.assertIn([64, 64, 75], output) + self.assertIn([512, 512, 25], output) @mock.patch.object(IxNetwork, 'IxNet') def test_connect(self, mock_ixnet): diff --git a/yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py b/yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py index 6b3532fa2..3bb8b9192 100644 --- a/yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py +++ b/yardstick/tests/unit/network_services/traffic_profile/test_ixia_rfc2544.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from copy import deepcopy +import copy import mock import unittest @@ -440,6 +440,12 @@ class TestIXIARFC2544Profile(unittest.TestCase): result = r_f_c2544_profile._get_ixia_traffic_profile(profile_data, mac) self.assertIsNotNone(result) + def test__init__(self): + t_profile_data = copy.deepcopy(self.TRAFFIC_PROFILE) + t_profile_data['traffic_profile']['frame_rate'] = 12345678 + r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile(t_profile_data) + self.assertEqual(12345678, r_f_c2544_profile.rate) + def test__get_ixia_traffic_profile_default_args(self): r_f_c2544_profile = ixia_rfc2544.IXIARFC2544Profile( self.TRAFFIC_PROFILE) @@ -521,7 +527,7 @@ class TestIXIARFC2544Profile(unittest.TestCase): traffic_generator.vnfd_helper.port_num.side_effect = ports_expected traffic_generator.client.return_value = True - traffic_profile = deepcopy(self.TRAFFIC_PROFILE) + traffic_profile = copy.deepcopy(self.TRAFFIC_PROFILE) traffic_profile.update({ "uplink_0": ["xe0"], "downlink_0": ["xe1", "xe2"], diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_base.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_base.py index ebedcb451..43e5ac839 100644 --- a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_base.py +++ b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_base.py @@ -15,10 +15,15 @@ import multiprocessing import os +import uuid import mock +from oslo_config import cfg +import oslo_messaging import unittest +from yardstick.common import messaging +from yardstick.common.messaging import payloads from yardstick.network_services.vnf_generic.vnf import base from yardstick.ssh import SSH @@ -140,6 +145,24 @@ VNFD = { } +class _DummyGenericTrafficGen(base.GenericTrafficGen): # pragma: no cover + + def run_traffic(self, *args): + pass + + def terminate(self): + pass + + def collect_kpi(self): + pass + + def instantiate(self, *args): + pass + + def scale(self, flavor=''): + pass + + class FileAbsPath(object): def __init__(self, module_file): super(FileAbsPath, self).__init__() @@ -221,7 +244,7 @@ class TestGenericVNF(unittest.TestCase): self.assertEqual(msg, str(exc.exception)) -class TestGenericTrafficGen(unittest.TestCase): +class GenericTrafficGenTestCase(unittest.TestCase): def test_definition(self): """Make sure that the abstract class cannot be instantiated""" @@ -234,3 +257,81 @@ class TestGenericTrafficGen(unittest.TestCase): "abstract methods collect_kpi, instantiate, run_traffic, " "scale, terminate") self.assertEqual(msg, str(exc.exception)) + + def test_get_mq_producer_id(self): + vnfd = {'benchmark': {'kpi': mock.ANY}, + 'vdu': [{'external-interface': 'ext_int'}] + } + tg = _DummyGenericTrafficGen('name', vnfd) + tg._mq_producer = mock.Mock() + tg._mq_producer.get_id.return_value = 'fake_id' + self.assertEqual('fake_id', tg.get_mq_producer_id()) + + +class TrafficGeneratorProducerTestCase(unittest.TestCase): + + @mock.patch.object(oslo_messaging, 'Target', return_value='rpc_target') + @mock.patch.object(oslo_messaging, 'RPCClient') + @mock.patch.object(oslo_messaging, 'get_rpc_transport', + return_value='rpc_transport') + @mock.patch.object(cfg, 'CONF') + def test__init(self, mock_config, mock_transport, mock_rpcclient, + mock_target): + _id = uuid.uuid1().int + tg_producer = base.TrafficGeneratorProducer(_id) + mock_transport.assert_called_once_with( + mock_config, url='rabbit://yardstick:yardstick@localhost:5672/') + mock_target.assert_called_once_with(topic=messaging.TOPIC_TG, + fanout=True, + server=messaging.SERVER) + mock_rpcclient.assert_called_once_with('rpc_transport', 'rpc_target') + self.assertEqual(_id, tg_producer._id) + self.assertEqual(messaging.TOPIC_TG, tg_producer._topic) + + @mock.patch.object(oslo_messaging, 'Target', return_value='rpc_target') + @mock.patch.object(oslo_messaging, 'RPCClient') + @mock.patch.object(oslo_messaging, 'get_rpc_transport', + return_value='rpc_transport') + @mock.patch.object(payloads, 'TrafficGeneratorPayload', + return_value='tg_pload') + def test_tg_method_started(self, mock_tg_payload, *args): + tg_producer = base.TrafficGeneratorProducer(uuid.uuid1().int) + with mock.patch.object(tg_producer, 'send_message') as mock_message: + tg_producer.tg_method_started(version=10) + + mock_message.assert_called_once_with(messaging.TG_METHOD_STARTED, + 'tg_pload') + mock_tg_payload.assert_called_once_with(version=10, iteration=0, + kpi={}) + + @mock.patch.object(oslo_messaging, 'Target', return_value='rpc_target') + @mock.patch.object(oslo_messaging, 'RPCClient') + @mock.patch.object(oslo_messaging, 'get_rpc_transport', + return_value='rpc_transport') + @mock.patch.object(payloads, 'TrafficGeneratorPayload', + return_value='tg_pload') + def test_tg_method_finished(self, mock_tg_payload, *args): + tg_producer = base.TrafficGeneratorProducer(uuid.uuid1().int) + with mock.patch.object(tg_producer, 'send_message') as mock_message: + tg_producer.tg_method_finished(version=20) + + mock_message.assert_called_once_with(messaging.TG_METHOD_FINISHED, + 'tg_pload') + mock_tg_payload.assert_called_once_with(version=20, iteration=0, + kpi={}) + + @mock.patch.object(oslo_messaging, 'Target', return_value='rpc_target') + @mock.patch.object(oslo_messaging, 'RPCClient') + @mock.patch.object(oslo_messaging, 'get_rpc_transport', + return_value='rpc_transport') + @mock.patch.object(payloads, 'TrafficGeneratorPayload', + return_value='tg_pload') + def test_tg_method_iteration(self, mock_tg_payload, *args): + tg_producer = base.TrafficGeneratorProducer(uuid.uuid1().int) + with mock.patch.object(tg_producer, 'send_message') as mock_message: + tg_producer.tg_method_iteration(100, version=30, kpi={'k': 'v'}) + + mock_message.assert_called_once_with(messaging.TG_METHOD_ITERATION, + 'tg_pload') + mock_tg_payload.assert_called_once_with(version=30, iteration=100, + kpi={'k': 'v'}) diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py index 1c3acb6e5..3b095647c 100644 --- a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py +++ b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_prox_helpers.py @@ -1,4 +1,3 @@ - # Copyright (c) 2016-2017 Intel Corporation # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,7 +11,6 @@ # 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 itertools import repeat, chain import os @@ -22,39 +20,21 @@ import time import mock import unittest -from yardstick.tests import STL_MOCKS from yardstick.common import utils -from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper from yardstick.network_services import constants +from yardstick.network_services.vnf_generic.vnf import base as vnf_base +from yardstick.network_services.vnf_generic.vnf import prox_helpers +from yardstick.network_services.vnf_generic.vnf import sample_vnf -STLClient = mock.MagicMock() -stl_patch = mock.patch.dict("sys.modules", STL_MOCKS) -stl_patch.start() - -if stl_patch: - from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump - from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDataHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxMplsProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxBngProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxVpeProfileHelper - from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxlwAFTRProfileHelper class TestCoreTuple(unittest.TestCase): def test___init__(self): - core_tuple = CoreSocketTuple('core 5s6') + core_tuple = prox_helpers.CoreSocketTuple('core 5s6') self.assertEqual(core_tuple.core_id, 5) self.assertEqual(core_tuple.socket_id, 6) self.assertFalse(core_tuple.is_hyperthread()) - core_tuple = CoreSocketTuple('core 5s6h') + core_tuple = prox_helpers.CoreSocketTuple('core 5s6h') self.assertEqual(core_tuple.core_id, 5) self.assertEqual(core_tuple.socket_id, 6) self.assertTrue(core_tuple.is_hyperthread()) @@ -82,7 +62,7 @@ class TestCoreTuple(unittest.TestCase): for bad_input in bad_inputs: with self.assertRaises(ValueError): - CoreSocketTuple(bad_input) + prox_helpers.CoreSocketTuple(bad_input) def test_find_in_topology(self): topology_in = { @@ -94,20 +74,20 @@ class TestCoreTuple(unittest.TestCase): }, } - core_tuple = CoreSocketTuple('core 5s6') + core_tuple = prox_helpers.CoreSocketTuple('core 5s6') expected = 'a' result = core_tuple.find_in_topology(topology_in) self.assertEqual(result, expected) - core_tuple = CoreSocketTuple('core 5s6h') + core_tuple = prox_helpers.CoreSocketTuple('core 5s6h') expected = 'c' result = core_tuple.find_in_topology(topology_in) self.assertEqual(result, expected) def test_find_in_topology_negative(self): - core_tuple = CoreSocketTuple('core 6s5') + core_tuple = prox_helpers.CoreSocketTuple('core 6s5') with self.assertRaises(ValueError): # no socket key core_tuple.find_in_topology({}) @@ -120,7 +100,7 @@ class TestCoreTuple(unittest.TestCase): # no first value (as needed by non-hyperthread core) core_tuple.find_in_topology({5: {6: {'key1': []}}}) - core_tuple = CoreSocketTuple('core 6s5h') + core_tuple = prox_helpers.CoreSocketTuple('core 6s5h') with self.assertRaises(ValueError): # no second value (as needed by hyperthread core) core_tuple.find_in_topology({5: {6: {'key1': ['e']}}}) @@ -130,20 +110,21 @@ class TestTotStatsTuple(unittest.TestCase): def test___new___negative(self): with self.assertRaises(TypeError): # no values - TotStatsTuple() + prox_helpers.TotStatsTuple() with self.assertRaises(TypeError): # one, non-integer value - TotStatsTuple('a') + prox_helpers.TotStatsTuple('a') with self.assertRaises(TypeError): # too many values - TotStatsTuple(3, 4, 5, 6, 7) + prox_helpers.TotStatsTuple(3, 4, 5, 6, 7) class TestProxTestDataTuple(unittest.TestCase): def test___init__(self): - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9) + prox_test_data = prox_helpers.ProxTestDataTuple( + 1, 2, 3, 4, 5, 6, 7, 8, 9) self.assertEqual(prox_test_data.tolerated, 1) self.assertEqual(prox_test_data.tsc_hz, 2) self.assertEqual(prox_test_data.delta_rx, 3) @@ -155,22 +136,26 @@ class TestProxTestDataTuple(unittest.TestCase): self.assertEqual(prox_test_data.requested_pps, 9) def test_properties(self): - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9) + prox_test_data = prox_helpers.ProxTestDataTuple( + 1, 2, 3, 4, 5, 6, 7, 8, 9) self.assertEqual(prox_test_data.pkt_loss, 12.5) self.assertEqual(prox_test_data.tx_mpps, 1.6 / 1e6) self.assertEqual(prox_test_data.can_be_lost, 0) self.assertEqual(prox_test_data.drop_total, 1) self.assertFalse(prox_test_data.success) - prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9) + prox_test_data = prox_helpers.ProxTestDataTuple( + 10, 2, 3, 4, 5, 6, 997, 998, 9) self.assertTrue(prox_test_data.success) def test_pkt_loss_zero_division(self): - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9) + prox_test_data = prox_helpers.ProxTestDataTuple( + 1, 2, 3, 4, 5, 6, 7, 0, 9) self.assertEqual(prox_test_data.pkt_loss, 100.0) def test_get_samples(self): - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9) + prox_test_data = prox_helpers.ProxTestDataTuple( + 1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9) expected = { "Throughput": 1.2 / 1e6, @@ -206,7 +191,8 @@ class TestProxTestDataTuple(unittest.TestCase): @mock.patch('yardstick.LOG_RESULT', create=True) def test_log_data(self, mock_logger): my_mock_logger = mock.MagicMock() - prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9) + prox_test_data = prox_helpers.ProxTestDataTuple( + 1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9) prox_test_data.log_data() my_mock_logger.debug.assert_not_called() @@ -222,23 +208,24 @@ class TestPacketDump(unittest.TestCase): PAYLOAD = "payload" def test__init__(self): - PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) + prox_helpers.PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) def test___str__(self): expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD) - dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) + dump1 = prox_helpers.PacketDump( + "port_id", len(self.PAYLOAD), self.PAYLOAD) self.assertEqual(str(dump1), expected) def test_port_id(self): - p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) + p = prox_helpers.PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) self.assertEqual(p.port_id, "port_id") def test_data_len(self): - p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) + p = prox_helpers.PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) self.assertEqual(p.data_len, len(self.PAYLOAD)) def test_payload(self): - p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) + p = prox_helpers.PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD) self.assertEqual(p.payload(), self.PAYLOAD) self.assertEqual(p.payload(3), self.PAYLOAD[3:]) @@ -301,33 +288,33 @@ class TestProxSocketHelper(unittest.TestCase): def _stop_mocks(self): self._mock_time_sleep.stop() - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') + @mock.patch.object(prox_helpers, 'socket') def test___init__(self, mock_socket): expected = mock_socket.socket() - prox = ProxSocketHelper() + prox = prox_helpers.ProxSocketHelper() result = prox._sock self.assertEqual(result, expected) def test_connect(self): mock_sock = mock.MagicMock() - prox = ProxSocketHelper(mock_sock) + prox = prox_helpers.ProxSocketHelper(mock_sock) prox.connect('10.20.30.40', 23456) mock_sock.connect.assert_called_once() def test_get_sock(self): mock_sock = mock.MagicMock() - prox = ProxSocketHelper(mock_sock) + prox = prox_helpers.ProxSocketHelper(mock_sock) result = prox.get_socket() self.assertIs(result, mock_sock) # TODO(elfoley): Split this into three tests - @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select') + @mock.patch.object(prox_helpers, 'select') def test_get_data(self, mock_select): mock_select.select.side_effect = [[1], [0]] mock_socket = mock.MagicMock() mock_recv = mock_socket.recv() mock_recv.decode.return_value = "" - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) ret = prox.get_data() self.assertEqual(ret, "") self.assertEqual(len(prox._pkt_dumps), 0) @@ -349,7 +336,7 @@ class TestProxSocketHelper(unittest.TestCase): self.assertEqual(len(prox._pkt_dumps), 3) def test__parse_socket_data_mixed_data(self): - prox = ProxSocketHelper(mock.MagicMock()) + prox = prox_helpers.ProxSocketHelper(mock.MagicMock()) ret, _ = prox._parse_socket_data(PACKET_DUMP_NON_1, False) self.assertEqual(ret, 'not_a_dump,1,2') self.assertEqual(len(prox._pkt_dumps), 0) @@ -359,7 +346,7 @@ class TestProxSocketHelper(unittest.TestCase): self.assertEqual(len(prox._pkt_dumps), 1) def test__parse_socket_data_bad_data(self): - prox = ProxSocketHelper(mock.MagicMock()) + prox = prox_helpers.ProxSocketHelper(mock.MagicMock()) with self.assertRaises(ValueError): prox._parse_socket_data(PACKET_DUMP_BAD_1, False) @@ -370,7 +357,7 @@ class TestProxSocketHelper(unittest.TestCase): self.assertEqual(ret, 'pktdump,3') def test__parse_socket_data_pkt_dump_only(self): - prox = ProxSocketHelper(mock.MagicMock()) + prox = prox_helpers.ProxSocketHelper(mock.MagicMock()) ret, _ = prox._parse_socket_data('', True) self.assertFalse(ret) @@ -382,20 +369,20 @@ class TestProxSocketHelper(unittest.TestCase): def test_put_command(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.put_command("data") mock_socket.sendall.assert_called_once() def test_put_command_socket_error(self): mock_socket = mock.MagicMock() mock_socket.sendall.side_effect = OSError - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.put_command("data") mock_socket.sendall.assert_called_once() def test_get_packet_dump(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox._pkt_dumps = [] self.assertIsNone(prox.get_packet_dump()) @@ -405,61 +392,61 @@ class TestProxSocketHelper(unittest.TestCase): def test_stop_all_reset(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.stop_all_reset() mock_socket.sendall.assert_called() def test_stop_all(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.stop_all() mock_socket.sendall.assert_called() def test_stop(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.stop([3, 4, 5], 16) mock_socket.sendall.assert_called() def test_start_all(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.start_all() mock_socket.sendall.assert_called() def test_start(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.start([3, 4, 5]) mock_socket.sendall.assert_called() def test_reset_stats(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.reset_stats() mock_socket.sendall.assert_called() def test_set_pkt_size(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.set_pkt_size([3, 4, 5], 1024) self.assertEqual(mock_socket.sendall.call_count, 3) def test_set_value(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.set_value([3, 4, 5], 10, 20, 30) self.assertEqual(mock_socket.sendall.call_count, 3) def test_reset_values(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.reset_values([3, 4, 5]) self.assertEqual(mock_socket.sendall.call_count, 3) def test_set_speed(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.set_speed([3, 4, 5], 1000) self.assertEqual(mock_socket.sendall.call_count, 3) @@ -476,7 +463,7 @@ class TestProxSocketHelper(unittest.TestCase): ] mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.set_speed = set_speed = mock.MagicMock() prox.slope_speed(core_data, 5) self.assertEqual(set_speed.call_count, 20) @@ -487,7 +474,7 @@ class TestProxSocketHelper(unittest.TestCase): def test_set_pps(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.set_pps([3, 4, 5], 1000, 512) self.assertEqual(mock_socket.sendall.call_count, 3) @@ -501,7 +488,7 @@ class TestProxSocketHelper(unittest.TestCase): ] mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(side_effect=latency_output) expected = ( @@ -524,7 +511,7 @@ class TestProxSocketHelper(unittest.TestCase): def test_get_all_tot_stats_error(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5') expected = [0, 0, 0, 0] result = prox.get_all_tot_stats() @@ -532,7 +519,7 @@ class TestProxSocketHelper(unittest.TestCase): def test_get_all_tot_stats(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5,6') expected = 3, 4, 5, 6 result = prox.get_all_tot_stats() @@ -540,7 +527,7 @@ class TestProxSocketHelper(unittest.TestCase): def test_hz(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5,6') expected = 6 result = prox.hz() @@ -554,16 +541,16 @@ class TestProxSocketHelper(unittest.TestCase): ] mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(side_effect=core_stats) expected = 21, 24, 27, 14 result = prox.core_stats([3, 4, 5], 16) self.assertEqual(result, expected) - def test_multi_port_stats(self): - + @mock.patch.object(prox_helpers.LOG, 'error') + def test_multi_port_stats(self, *args): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='0,1,2,3,4,5;1,1,2,3,4,5') expected = [[0, 1, 2, 3, 4, 5], [1, 1, 2, 3, 4, 5]] result = prox.multi_port_stats([0, 1]) @@ -593,7 +580,7 @@ class TestProxSocketHelper(unittest.TestCase): ] mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(side_effect=port_stats) expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126] result = prox.port_stats([3, 4, 5]) @@ -610,7 +597,7 @@ class TestProxSocketHelper(unittest.TestCase): ] mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(side_effect=get_data_output) expected = { 'start_tot': start_tot, @@ -623,7 +610,7 @@ class TestProxSocketHelper(unittest.TestCase): def test_tot_stats(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5,6') expected = 3, 4, 5 result = prox.tot_stats() @@ -631,7 +618,7 @@ class TestProxSocketHelper(unittest.TestCase): def test_tot_ierrors(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.get_data = mock.MagicMock(return_value='3,4,5,6') expected = 3, 3 result = prox.tot_ierrors() @@ -639,25 +626,25 @@ class TestProxSocketHelper(unittest.TestCase): def test_set_count(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.set_count(432, [3, 4, 5]) self.assertEqual(mock_socket.sendall.call_count, 3) def test_dump_rx(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.dump_rx(3, 5, 8) mock_socket.sendall.assert_called_once() def test_quit(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.quit() mock_socket.sendall.assert_called() def test_force_quit(self): mock_socket = mock.MagicMock() - prox = ProxSocketHelper(mock_socket) + prox = prox_helpers.ProxSocketHelper(mock_socket) prox.force_quit() mock_socket.sendall.assert_called() @@ -769,8 +756,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): } def test_global_section(self): - setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(), - mock.MagicMock()) + setup_helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + mock.MagicMock(), mock.MagicMock(), mock.MagicMock()) setup_helper._prox_config_data = [('a', [])] @@ -818,8 +805,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): self.assertEqual(result, global_section[1]) def test_find_in_section(self): - setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(), - mock.MagicMock()) + setup_helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + mock.MagicMock(), mock.MagicMock(), mock.MagicMock()) setup_helper._prox_config_data = [ ('global', [ @@ -872,44 +859,51 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): # empty string input_str = '' expected = '' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _replace_quoted_with_value(input_str, 'cat')) self.assertEqual(result, expected) # no quoted substring input_str = 'lion tiger bear' expected = 'lion tiger bear' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _replace_quoted_with_value(input_str, 'cat')) self.assertEqual(result, expected) # partially quoted substring input_str = 'lion "tiger bear' expected = 'lion "tiger bear' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _replace_quoted_with_value(input_str, 'cat')) self.assertEqual(result, expected) # one quoted substring input_str = 'lion "tiger" bear' expected = 'lion "cat" bear' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _replace_quoted_with_value(input_str, 'cat')) self.assertEqual(result, expected) # two quoted substrings input_str = 'lion "tiger" bear "shark" whale' expected = 'lion "cat" bear "shark" whale' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat') + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _replace_quoted_with_value(input_str, 'cat')) self.assertEqual(result, expected) # two quoted substrings, both replaced input_str = 'lion "tiger" bear "shark" whale' expected = 'lion "cat" bear "cat" whale' - result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2) + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _replace_quoted_with_value(input_str, 'cat', 2)) self.assertEqual(result, expected) def test__get_tx_port(self): # no data input_data = {'section1': []} expected = -1 - result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data) + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _get_tx_port('section1', input_data)) self.assertEqual(result, expected) # data for other section @@ -921,7 +915,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ], } expected = -1 - result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data) + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _get_tx_port('section1', input_data)) self.assertEqual(result, expected) # data for section @@ -930,7 +925,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ('tx port', '3'), ] expected = 3 - result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data) + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _get_tx_port('section1', input_data)) self.assertEqual(result, expected) # more data for section, @@ -939,14 +935,16 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ('tx port', '1', 'and more', 234), ]) expected = 1 - result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data) + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + _get_tx_port('section1', input_data)) self.assertEqual(result, expected) # TODO(elfoley): Split this into several smaller tests def test_write_prox_config(self): input_data = {} expected = '' - result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data) + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + write_prox_config(input_data)) self.assertEqual(result, expected) input_data = [ @@ -956,7 +954,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ], ] expected = '[section1]' - result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data) + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + write_prox_config(input_data)) self.assertEqual(result, expected) input_data = [ @@ -983,12 +982,13 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): 'key3=234', 'key4=multi-line\n\tvalue', ]) - result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data) + result = (prox_helpers.ProxDpdkVnfSetupEnvHelper. + write_prox_config(input_data)) self.assertEqual(result, expected) def test_prox_config_data(self): - setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(), - mock.MagicMock()) + setup_helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + mock.MagicMock(), mock.MagicMock(), mock.MagicMock()) setup_helper.config_queue = config_queue = mock.MagicMock() config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])] @@ -1009,7 +1009,7 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): vnfd_helper = mock.MagicMock() ssh_helper = mock.MagicMock() - scenario_helper = ScenarioHelper('vnf1') + scenario_helper = sample_vnf.ScenarioHelper('vnf1') scenario_helper.scenario_cfg = { 'task_path': 'a/b', 'options': { @@ -1017,7 +1017,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): }, } - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) helper.copy_to_target = mock.MagicMock(return_value='3') helper.generate_prox_config_file = mock.MagicMock(return_value='4') helper.upload_prox_config = mock.MagicMock(return_value='5') @@ -1043,7 +1044,7 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): mock_find_path.side_effect = ['1', '2'] vnfd_helper = mock.MagicMock() ssh_helper = mock.MagicMock() - scenario_helper = ScenarioHelper('vnf1') + scenario_helper = sample_vnf.ScenarioHelper('vnf1') scenario_helper.scenario_cfg = { 'task_path': 'a/b', 'options': { @@ -1052,7 +1053,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): } vnfd_helper.port_pairs.all_ports = ['xe0', 'xe1', 'xe2', 'xe3'] - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35']) helper.generate_prox_config_file = mock.MagicMock(return_value='44') helper.upload_prox_config = mock.MagicMock(return_value='55') @@ -1078,7 +1080,7 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))] vnfd_helper = mock.MagicMock() ssh_helper = mock.MagicMock() - scenario_helper = ScenarioHelper('vnf1') + scenario_helper = sample_vnf.ScenarioHelper('vnf1') scenario_helper.scenario_cfg = { 'task_path': 'a/b', 'options': { @@ -1086,7 +1088,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): }, } - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35']) helper.generate_prox_config_file = mock.MagicMock(return_value='44') helper.upload_prox_config = mock.MagicMock(return_value='55') @@ -1115,7 +1118,7 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): vnfd_helper = mock.Mock() ssh_helper = mock.Mock() ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/prox' - scenario_helper = ScenarioHelper('vnf1') + scenario_helper = sample_vnf.ScenarioHelper('vnf1') scenario_helper.scenario_cfg = { 'task_path': 'a/b', 'options': { @@ -1126,8 +1129,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): expected = ("sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli " "-f -f /tmp/prox.cfg '") - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, - scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) with mock.patch.object(helper, 'build_config_file') as mock_cfg_file: helper.remote_path = '/tmp/prox.cfg' prox_cmd = helper.build_config() @@ -1139,7 +1142,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ssh_helper = mock.MagicMock() scenario_helper = mock.MagicMock() - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"} res = helper._insert_additional_file('dofile("ipv4.lua")') self.assertEqual(res, 'dofile("/tmp/ipv4.lua")') @@ -1155,11 +1159,12 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): mock_parser_type.side_effect = init - vnfd_helper = VnfdHelper(self.VNFD0) + vnfd_helper = vnf_base.VnfdHelper(self.VNFD0) ssh_helper = mock.MagicMock() scenario_helper = mock.MagicMock() - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) helper.additional_files = {} expected = [] @@ -1244,7 +1249,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ssh_helper = mock.MagicMock() scenario_helper = mock.MagicMock() - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) helper.additional_files = {} helper.remote_prox_file_name = 'remote' vnfd_helper.interfaces = [ @@ -1290,7 +1296,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ssh_helper = mock.MagicMock() scenario_helper = mock.MagicMock() - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) expected = 'a/b' result = helper.put_string_to_file('my long string', 'a/b') @@ -1302,7 +1309,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ssh_helper = mock.MagicMock() scenario_helper = mock.MagicMock() - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) expected = '/tmp/c' result = helper.copy_to_target('a/b', 'c') self.assertEqual(result, expected) @@ -1313,7 +1321,8 @@ class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase): ssh_helper = mock.MagicMock() scenario_helper = mock.MagicMock() - helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper) + helper = prox_helpers.ProxDpdkVnfSetupEnvHelper( + vnfd_helper, ssh_helper, scenario_helper) helper.write_prox_config = mock.MagicMock(return_value='a long string') expected = '/tmp/a' result = helper.upload_prox_config('a', {}) @@ -1432,7 +1441,8 @@ class TestProxResourceHelper(unittest.TestCase): 'nor here', 'and still not', ] - result = ProxResourceHelper.find_pci('target', input_str_list) + result = prox_helpers.ProxResourceHelper.find_pci('target', + input_str_list) self.assertFalse(result) input_str_list = [ @@ -1441,13 +1451,14 @@ class TestProxResourceHelper(unittest.TestCase): 'this is a target', 'did we miss it', ] - result = ProxResourceHelper.find_pci('target', input_str_list) + result = prox_helpers.ProxResourceHelper.find_pci('target', + input_str_list) self.assertTrue(result) @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0) @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper') def test_sut(self, *args): - helper = ProxResourceHelper(mock.MagicMock()) + helper = prox_helpers.ProxResourceHelper(mock.MagicMock()) self.assertIsNone(helper.client) result = helper.sut self.assertIsNotNone(result) @@ -1458,7 +1469,7 @@ class TestProxResourceHelper(unittest.TestCase): setup_helper = mock.MagicMock() setup_helper.find_in_section.return_value = expected = 'prox type' - helper = ProxResourceHelper(setup_helper) + helper = prox_helpers.ProxResourceHelper(setup_helper) self.assertIsNone(helper._test_type) self.assertEqual(helper.test_type, expected) @@ -1466,7 +1477,7 @@ class TestProxResourceHelper(unittest.TestCase): self.assertEqual(helper.test_type, expected) def test_collect_collectd_kpi(self): - helper = ProxResourceHelper(mock.MagicMock()) + helper = prox_helpers.ProxResourceHelper(mock.MagicMock()) helper.resource = resource = mock.MagicMock() resource.check_if_system_agent_running.return_value = 0, '1234' @@ -1478,7 +1489,7 @@ class TestProxResourceHelper(unittest.TestCase): self.assertDictEqual(result, expected) def test_collect_kpi(self): - helper = ProxResourceHelper(mock.MagicMock()) + helper = prox_helpers.ProxResourceHelper(mock.MagicMock()) helper._queue = queue = mock.MagicMock() helper._result = {'z': 123} helper.resource = resource = mock.MagicMock() @@ -1503,7 +1514,7 @@ class TestProxResourceHelper(unittest.TestCase): setup_helper = mock.MagicMock() setup_helper.vnfd_helper.interfaces = [] - helper = ProxResourceHelper(setup_helper) + helper = prox_helpers.ProxResourceHelper(setup_helper) result = helper._connect() self.assertIs(result, client) @@ -1515,41 +1526,41 @@ class TestProxResourceHelper(unittest.TestCase): def test_run_traffic(self): setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) + helper = prox_helpers.ProxResourceHelper(setup_helper) traffic_profile = mock.MagicMock(**{"done": True}) helper.run_traffic(traffic_profile) self.assertEqual(helper._terminated.value, 1) def test__run_traffic_once(self): setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) + helper = prox_helpers.ProxResourceHelper(setup_helper) traffic_profile = mock.MagicMock(**{"done": True}) helper._run_traffic_once(traffic_profile) self.assertEqual(helper._terminated.value, 1) def test_start_collect(self): setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) + helper = prox_helpers.ProxResourceHelper(setup_helper) helper.resource = resource = mock.MagicMock() self.assertIsNone(helper.start_collect()) resource.start.assert_called_once() def test_terminate(self): setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) + helper = prox_helpers.ProxResourceHelper(setup_helper) with self.assertRaises(NotImplementedError): helper.terminate() def test_up_post(self): setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) + helper = prox_helpers.ProxResourceHelper(setup_helper) helper.client = expected = mock.MagicMock() result = helper.up_post() self.assertEqual(result, expected) def test_execute(self): setup_helper = mock.MagicMock() - helper = ProxResourceHelper(setup_helper) + helper = prox_helpers.ProxResourceHelper(setup_helper) helper.client = mock.MagicMock() expected = helper.client.my_command() @@ -1574,7 +1585,7 @@ class TestProxDataHelper(unittest.TestCase): sut.multi_port_stats.return_value = [[0, 1, 2, 3, 4, 5], [1, 1, 2, 3, 4, 5], [2, 1, 2, 3, 4, 5], [3, 1, 2, 3, 4, 5]] - data_helper = ProxDataHelper( + data_helper = prox_helpers.ProxDataHelper( vnfd_helper, sut, pkt_size, 25, None, constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) @@ -1589,7 +1600,8 @@ class TestProxDataHelper(unittest.TestCase): sut = mock.MagicMock() sut.multi_port_stats.return_value = [[0, 1, 2, 3, 4, 5], [1, 11, 12, 3, 4, 5]] - data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None, None) + data_helper = prox_helpers.ProxDataHelper( + vnfd_helper, sut, None, None, None, None) expected = { 'xe0': { @@ -1612,17 +1624,19 @@ class TestProxDataHelper(unittest.TestCase): sut = mock.MagicMock() sut.port_stats.return_value = list(range(10)) - data_helper = ProxDataHelper(vnfd_helper, sut, None, None, + data_helper = prox_helpers.ProxDataHelper(vnfd_helper, sut, None, None, 5.4, constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) data_helper._totals_and_pps = 12, 32, 4.5 data_helper.tsc_hz = 9.8 - data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)} + data_helper.measured_stats = { + 'delta': prox_helpers.TotStatsTuple(6.1, 6.2, 6.3, 6.4)} data_helper.latency = 7 self.assertIsNone(data_helper.result_tuple) self.assertEqual(data_helper.line_speed, 10000000000) - expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5) + expected = prox_helpers.ProxTestDataTuple( + 5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5) with data_helper: pass @@ -1635,7 +1649,8 @@ class TestProxDataHelper(unittest.TestCase): def test___enter___negative(self): vnfd_helper = mock.MagicMock() - data_helper = ProxDataHelper(vnfd_helper, None, None, None, None, None) + data_helper = prox_helpers.ProxDataHelper( + vnfd_helper, None, None, None, None, None) vnfd_helper.port_pairs.all_ports = [] with self.assertRaises(AssertionError): @@ -1654,17 +1669,18 @@ class TestProxDataHelper(unittest.TestCase): start = (3, 4, 1, 2) end = (9, 7, 6, 8) - sut = ProxSocketHelper(mock.MagicMock()) + sut = prox_helpers.ProxSocketHelper(mock.MagicMock()) sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end]) - data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4, None) + data_helper = prox_helpers.ProxDataHelper( + vnfd_helper, sut, None, None, 5.4, None) self.assertIsNone(data_helper.measured_stats) expected = { 'start_tot': start, 'end_tot': end, - 'delta': TotStatsTuple(6, 3, 5, 6), + 'delta': prox_helpers.TotStatsTuple(6, 3, 5, 6), } with data_helper.measure_tot_stats(): pass @@ -1678,7 +1694,8 @@ class TestProxDataHelper(unittest.TestCase): sut = mock.MagicMock() sut.hz.return_value = '54.6' - data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None, None) + data_helper = prox_helpers.ProxDataHelper( + vnfd_helper, sut, None, None, None, None) self.assertIsNone(data_helper.tsc_hz) @@ -1697,12 +1714,13 @@ class TestProxProfileHelper(unittest.TestCase): mock_type2.__prox_profile_type__ = 'my_type' mock_utils.itersubclasses.return_value = [mock_type1, mock_type2] - self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2) + self.assertEqual(prox_helpers.ProxProfileHelper.get_cls('my_type'), + mock_type2) @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils') def test_get_cls_default(self, mock_utils): mock_utils.itersubclasses.return_value = [] - ProxProfileHelper.get_cls('my_type') + prox_helpers.ProxProfileHelper.get_cls('my_type') @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology') def test_cpu_topology(self, mock_socket_topology): @@ -1711,7 +1729,7 @@ class TestProxProfileHelper(unittest.TestCase): resource_helper = mock.MagicMock() resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', '' - helper = ProxProfileHelper(resource_helper) + helper = prox_helpers.ProxProfileHelper(resource_helper) self.assertIsNone(helper._cpu_topology) result = helper.cpu_topology self.assertEqual(result, 432) @@ -1723,7 +1741,7 @@ class TestProxProfileHelper(unittest.TestCase): resource_helper = mock.MagicMock() resource_helper.setup_helper.prox_config_data = [] - helper = ProxProfileHelper(resource_helper) + helper = prox_helpers.ProxProfileHelper(resource_helper) helper._cpu_topology = [] expected = [] @@ -1751,7 +1769,7 @@ class TestProxProfileHelper(unittest.TestCase): ]), ] - helper = ProxProfileHelper(resource_helper) + helper = prox_helpers.ProxProfileHelper(resource_helper) helper._cpu_topology = { 1: { 3: { @@ -1781,7 +1799,7 @@ class TestProxProfileHelper(unittest.TestCase): resource_helper = mock.MagicMock() resource_helper.setup_helper.prox_config_data = [] - helper = ProxProfileHelper(resource_helper) + helper = prox_helpers.ProxProfileHelper(resource_helper) helper._cpu_topology = [] expected = [] @@ -1809,7 +1827,7 @@ class TestProxProfileHelper(unittest.TestCase): ]), ] - helper = ProxProfileHelper(resource_helper) + helper = prox_helpers.ProxProfileHelper(resource_helper) helper._cpu_topology = { 1: { 3: { @@ -1835,7 +1853,7 @@ class TestProxProfileHelper(unittest.TestCase): self.assertIs(result, helper.latency_cores) def test_all_rx_cores(self): - helper = ProxBngProfileHelper(mock.MagicMock()) + helper = prox_helpers.ProxBngProfileHelper(mock.MagicMock()) helper._latency_cores = expected = [3, 4, 6] helper._test_cores = [5, 2, 1] @@ -1865,7 +1883,7 @@ class TestProxProfileHelper(unittest.TestCase): ]), ] - helper = ProxProfileHelper(resource_helper) + helper = prox_helpers.ProxProfileHelper(resource_helper) helper._cpu_topology = { 0: { 1: { @@ -1891,7 +1909,7 @@ class TestProxProfileHelper(unittest.TestCase): resource_helper = mock.MagicMock() resource_helper.setup_helper.vnfd_helper.interfaces = [] - helper = ProxProfileHelper(resource_helper) + helper = prox_helpers.ProxProfileHelper(resource_helper) helper._latency_cores = [] expected = [] @@ -1910,7 +1928,7 @@ class TestProxProfileHelper(unittest.TestCase): setup_helper = mock.MagicMock() setup_helper.vnfd_helper.interfaces = [] - helper = ProxProfileHelper(setup_helper) + helper = prox_helpers.ProxProfileHelper(setup_helper) helper._cpu_topology = { 0: { 1: { @@ -1975,7 +1993,7 @@ class TestProxProfileHelper(unittest.TestCase): resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2)) resource_helper.sut.port_stats.return_value = list(range(10)) - helper = ProxProfileHelper(resource_helper) + helper = prox_helpers.ProxProfileHelper(resource_helper) helper.run_test(120, 5, 6.5, constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) @@ -2008,7 +2026,7 @@ class TestProxMplsProfileHelper(unittest.TestCase): ]), ] - helper = ProxMplsProfileHelper(resource_helper) + helper = prox_helpers.ProxMplsProfileHelper(resource_helper) helper._cpu_topology = { 0: { 1: { @@ -2035,7 +2053,7 @@ class TestProxMplsProfileHelper(unittest.TestCase): def test_traffic_context(self): setup_helper = mock.MagicMock() - helper = ProxMplsProfileHelper(setup_helper) + helper = prox_helpers.ProxMplsProfileHelper(setup_helper) with helper.traffic_context(120, 5.4): pass @@ -2078,7 +2096,7 @@ class TestProxBngProfileHelper(unittest.TestCase): ]), ] - helper = ProxBngProfileHelper(resource_helper) + helper = prox_helpers.ProxBngProfileHelper(resource_helper) helper._cpu_topology = { 0: { 1: { @@ -2122,7 +2140,7 @@ class TestProxBngProfileHelper(unittest.TestCase): resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2)) resource_helper.sut.port_stats.return_value = list(range(10)) - helper = ProxBngProfileHelper(resource_helper) + helper = prox_helpers.ProxBngProfileHelper(resource_helper) helper.run_test(120, 5, 6.5, constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS) @@ -2159,7 +2177,7 @@ class TestProxVpeProfileHelper(unittest.TestCase): ]), ] - helper = ProxVpeProfileHelper(resource_helper) + helper = prox_helpers.ProxVpeProfileHelper(resource_helper) helper._cpu_topology = { 0: { 1: { @@ -2206,7 +2224,7 @@ class TestProxVpeProfileHelper(unittest.TestCase): ]), ] - helper = ProxVpeProfileHelper(resource_helper) + helper = prox_helpers.ProxVpeProfileHelper(resource_helper) helper._port_list = { 0: { 1: { @@ -2240,7 +2258,7 @@ class TestProxVpeProfileHelper(unittest.TestCase): resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2)) resource_helper.sut.port_stats.return_value = list(range(10)) - helper = ProxVpeProfileHelper(resource_helper) + helper = prox_helpers.ProxVpeProfileHelper(resource_helper) helper.run_test(120, 5, 6.5) helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1 @@ -2273,7 +2291,7 @@ class TestProxlwAFTRProfileHelper(unittest.TestCase): ]), ] - helper = ProxlwAFTRProfileHelper(resource_helper) + helper = prox_helpers.ProxlwAFTRProfileHelper(resource_helper) helper._cpu_topology = { 0: { 1: { @@ -2320,7 +2338,7 @@ class TestProxlwAFTRProfileHelper(unittest.TestCase): ]), ] - helper = ProxlwAFTRProfileHelper(resource_helper) + helper = prox_helpers.ProxlwAFTRProfileHelper(resource_helper) helper._port_list = { 0: { 1: { @@ -2354,7 +2372,7 @@ class TestProxlwAFTRProfileHelper(unittest.TestCase): resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2)) resource_helper.sut.port_stats.return_value = list(range(10)) - helper = ProxlwAFTRProfileHelper(resource_helper) + helper = prox_helpers.ProxlwAFTRProfileHelper(resource_helper) helper.run_test(120, 5, 6.5) helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1 diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py index 331e80d00..48ae3b505 100644 --- a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py +++ b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_sample_vnf.py @@ -1090,6 +1090,57 @@ class TestClientResourceHelper(unittest.TestCase): self.assertIs(client_resource_helper._connect(client), client) + @mock.patch.object(ClientResourceHelper, '_build_ports') + @mock.patch.object(ClientResourceHelper, '_run_traffic_once') + def test_run_traffic(self, mock_run_traffic_once, mock_build_ports): + client_resource_helper = ClientResourceHelper(mock.Mock()) + client = mock.Mock() + traffic_profile = mock.Mock() + mq_producer = mock.Mock() + with mock.patch.object(client_resource_helper, '_connect') \ + as mock_connect, \ + mock.patch.object(client_resource_helper, '_terminated') \ + as mock_terminated: + mock_connect.return_value = client + type(mock_terminated).value = mock.PropertyMock( + side_effect=[0, 1, lambda x: x]) + client_resource_helper.run_traffic(traffic_profile, mq_producer) + + mock_build_ports.assert_called_once() + traffic_profile.register_generator.assert_called_once() + mq_producer.tg_method_started.assert_called_once() + mq_producer.tg_method_finished.assert_called_once() + mq_producer.tg_method_iteration.assert_called_once_with(1) + mock_run_traffic_once.assert_called_once_with(traffic_profile) + + @mock.patch.object(ClientResourceHelper, '_build_ports') + @mock.patch.object(ClientResourceHelper, '_run_traffic_once', + side_effect=Exception) + def test_run_traffic_exception(self, mock_run_traffic_once, + mock_build_ports): + client_resource_helper = ClientResourceHelper(mock.Mock()) + client = mock.Mock() + traffic_profile = mock.Mock() + mq_producer = mock.Mock() + with mock.patch.object(client_resource_helper, '_connect') \ + as mock_connect, \ + mock.patch.object(client_resource_helper, '_terminated') \ + as mock_terminated: + mock_connect.return_value = client + type(mock_terminated).value = mock.PropertyMock(return_value=0) + mq_producer.reset_mock() + # NOTE(ralonsoh): "trex_stl_exceptions.STLError" is mocked + with self.assertRaises(Exception): + client_resource_helper.run_traffic(traffic_profile, + mq_producer) + + mock_build_ports.assert_called_once() + traffic_profile.register_generator.assert_called_once() + mock_run_traffic_once.assert_called_once_with(traffic_profile) + mq_producer.tg_method_started.assert_called_once() + mq_producer.tg_method_finished.assert_not_called() + mq_producer.tg_method_iteration.assert_not_called() + class TestRfc2544ResourceHelper(unittest.TestCase): diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py index 050aa4aa0..3e2f598d2 100644 --- a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py +++ b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_prox.py @@ -406,7 +406,8 @@ class TestProxTrafficGen(unittest.TestCase): sut.setup_helper.prox_config_dict = {} sut._connect_client = mock.Mock(autospec=STLClient) sut._connect_client.get_stats = mock.Mock(return_value="0") - sut._traffic_runner(mock_traffic_profile) + sut._setup_mq_producer = mock.Mock(return_value='mq_producer') + sut._traffic_runner(mock_traffic_profile, mock.ANY) @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket') @mock.patch(SSH_HELPER) diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py index 42ac40b50..4ade157a3 100644 --- a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py +++ b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_rfc2544_ixia.py @@ -379,7 +379,8 @@ class TestIXIATrafficGen(unittest.TestCase): mock.mock_open(), create=True) @mock.patch('yardstick.network_services.vnf_generic.vnf.tg_rfc2544_ixia.LOG.exception') def _traffic_runner(*args): - result = sut._traffic_runner(mock_traffic_profile) + sut._setup_mq_producer = mock.Mock(return_value='mq_producer') + result = sut._traffic_runner(mock_traffic_profile, mock.ANY) self.assertIsNone(result) _traffic_runner() diff --git a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py index 350ba8448..700e910f9 100644 --- a/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py +++ b/yardstick/tests/unit/network_services/vnf_generic/vnf/test_tg_trex.py @@ -387,8 +387,9 @@ class TestTrexTrafficGen(unittest.TestCase): # must generate cfg before we can run traffic so Trex port mapping is # created self.sut.resource_helper.generate_cfg() + self.sut._setup_mq_producer = mock.Mock() with mock.patch.object(self.sut.resource_helper, 'run_traffic'): - self.sut._traffic_runner(mock_traffic_profile) + self.sut._traffic_runner(mock_traffic_profile, mock.ANY) def test__generate_trex_cfg(self): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] @@ -453,9 +454,8 @@ class TestTrexTrafficGen(unittest.TestCase): self.sut.ssh_helper.run = mock.Mock() self.sut._traffic_runner = mock.Mock(return_value=0) self.sut.resource_helper.client_started.value = 1 - result = self.sut.run_traffic(mock_traffic_profile) + self.sut.run_traffic(mock_traffic_profile) self.sut._traffic_process.terminate() - self.assertIsNotNone(result) def test_terminate(self): vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0] diff --git a/yardstick/tests/unit/orchestrator/test_kubernetes.py b/yardstick/tests/unit/orchestrator/test_kubernetes.py index 4323c026a..f248338ee 100644 --- a/yardstick/tests/unit/orchestrator/test_kubernetes.py +++ b/yardstick/tests/unit/orchestrator/test_kubernetes.py @@ -66,7 +66,11 @@ service ssh restart;while true ; do sleep 10000; done" ], "nodeSelector": { "kubernetes.io/hostname": "node-01" - } + }, + "restartPolicy": "Always", + "tolerations": [ + {"operator": "Exists"} + ] } } } @@ -77,12 +81,21 @@ service ssh restart;while true ; do sleep 10000; done" service ssh restart;while true ; do sleep 10000; done'], 'ssh_key': 'k8s-86096c30-key', 'nodeSelector': {'kubernetes.io/hostname': 'node-01'}, - 'volumes': [] + 'volumes': [], + 'restartPolicy': 'Always' } name = 'host-k8s-86096c30' - output_r = kubernetes.KubernetesObject(name, **input_s).get_template() + output_r = kubernetes.ReplicationControllerObject( + name, **input_s).get_template() self.assertEqual(output_r, output_t) + def test_get_template_invalid_restart_policy(self): + input_s = {'restartPolicy': 'invalid_option'} + name = 'host-k8s-86096c30' + with self.assertRaises(exceptions.KubernetesWrongRestartPolicy): + kubernetes.ReplicationControllerObject( + name, **input_s).get_template() + class GetRcPodsTestCase(base.BaseUnitTestCase): @@ -108,14 +121,14 @@ service ssh restart;while true ; do sleep 10000; done'] self.assertEqual(pods, []) -class KubernetesObjectTestCase(base.BaseUnitTestCase): +class ReplicationControllerObjectTestCase(base.BaseUnitTestCase): def test__init_one_container(self): pod_name = 'pod_name' _kwargs = {'args': ['arg1', 'arg2'], 'image': 'fake_image', 'command': 'fake_command'} - k8s_obj = kubernetes.KubernetesObject(pod_name, **_kwargs) + k8s_obj = kubernetes.ReplicationControllerObject(pod_name, **_kwargs) self.assertEqual(1, len(k8s_obj._containers)) container = k8s_obj._containers[0] self.assertEqual(['arg1', 'arg2'], container._args) @@ -131,7 +144,7 @@ class KubernetesObjectTestCase(base.BaseUnitTestCase): 'image': 'fake_image_%s' % i, 'command': 'fake_command_%s' % i}) _kwargs = {'containers': containers} - k8s_obj = kubernetes.KubernetesObject(pod_name, **_kwargs) + k8s_obj = kubernetes.ReplicationControllerObject(pod_name, **_kwargs) self.assertEqual(5, len(k8s_obj._containers)) for i in range(5): container = k8s_obj._containers[i] @@ -145,8 +158,8 @@ class KubernetesObjectTestCase(base.BaseUnitTestCase): 'configMap': {'name': 'fake_sshkey'}} volume2 = {'name': 'volume2', 'configMap': 'data'} - k8s_obj = kubernetes.KubernetesObject('name', ssh_key='fake_sshkey', - volumes=[volume2]) + k8s_obj = kubernetes.ReplicationControllerObject( + 'name', ssh_key='fake_sshkey', volumes=[volume2]) k8s_obj._add_volumes() volumes = k8s_obj.template['spec']['template']['spec']['volumes'] self.assertEqual(sorted([volume1, volume2], key=lambda k: k['name']), @@ -155,7 +168,8 @@ class KubernetesObjectTestCase(base.BaseUnitTestCase): def test__add_volumes_no_volumes(self): volume1 = {'name': 'fake_sshkey', 'configMap': {'name': 'fake_sshkey'}} - k8s_obj = kubernetes.KubernetesObject('name', ssh_key='fake_sshkey') + k8s_obj = kubernetes.ReplicationControllerObject( + 'name', ssh_key='fake_sshkey') k8s_obj._add_volumes() volumes = k8s_obj.template['spec']['template']['spec']['volumes'] self.assertEqual([volume1], volumes) @@ -163,7 +177,8 @@ class KubernetesObjectTestCase(base.BaseUnitTestCase): def test__create_ssh_key_volume(self): expected = {'name': 'fake_sshkey', 'configMap': {'name': 'fake_sshkey'}} - k8s_obj = kubernetes.KubernetesObject('name', ssh_key='fake_sshkey') + k8s_obj = kubernetes.ReplicationControllerObject( + 'name', ssh_key='fake_sshkey') self.assertEqual(expected, k8s_obj._create_ssh_key_volume()) def test__create_volume_item(self): @@ -172,13 +187,76 @@ class KubernetesObjectTestCase(base.BaseUnitTestCase): vol_type: 'data'} self.assertEqual( volume, - kubernetes.KubernetesObject._create_volume_item(volume)) + kubernetes.ReplicationControllerObject. + _create_volume_item(volume)) def test__create_volume_item_invalid_type(self): volume = {'name': 'vol_name', 'invalid_type': 'data'} with self.assertRaises(exceptions.KubernetesTemplateInvalidVolumeType): - kubernetes.KubernetesObject._create_volume_item(volume) + kubernetes.ReplicationControllerObject._create_volume_item(volume) + + def test__add_security_context(self): + k8s_obj = kubernetes.ReplicationControllerObject('pod_name') + self.assertNotIn('securityContext', + k8s_obj.template['spec']['template']['spec']) + + k8s_obj._security_context = {'key_pod': 'value_pod'} + k8s_obj._add_security_context() + self.assertEqual( + {'key_pod': 'value_pod'}, + k8s_obj.template['spec']['template']['spec']['securityContext']) + + def test__add_security_context_by_init(self): + containers = [] + for i in range(5): + containers.append( + {'securityContext': {'key%s' % i: 'value%s' % i}}) + _kwargs = {'containers': containers, + 'securityContext': {'key_pod': 'value_pod'}} + k8s_obj = kubernetes.ReplicationControllerObject('pod_name', **_kwargs) + self.assertEqual( + {'key_pod': 'value_pod'}, + k8s_obj.template['spec']['template']['spec']['securityContext']) + for i in range(5): + container = ( + k8s_obj.template['spec']['template']['spec']['containers'][i]) + self.assertEqual({'key%s' % i: 'value%s' % i}, + container['securityContext']) + + def test__add_networks(self): + k8s_obj = kubernetes.ReplicationControllerObject( + 'name', networks=['network1', 'network2', 'network3']) + k8s_obj._add_networks() + networks = k8s_obj.\ + template['spec']['template']['metadata']['annotations']['networks'] + expected = ('[{"name": "network1"}, {"name": "network2"}, ' + '{"name": "network3"}]') + self.assertEqual(expected, networks) + + def test__add_tolerations(self): + _kwargs = {'tolerations': [{'key': 'key1', + 'value': 'value2', + 'effect': 'effect3', + 'operator': 'operator4', + 'wrong_key': 'error_key'}] + } + k8s_obj = kubernetes.ReplicationControllerObject('pod_name', **_kwargs) + k8s_obj._add_tolerations() + _tol = k8s_obj.template['spec']['template']['spec']['tolerations'] + self.assertEqual(1, len(_tol)) + self.assertEqual({'key': 'key1', + 'value': 'value2', + 'effect': 'effect3', + 'operator': 'operator4'}, + _tol[0]) + + def test__add_tolerations_default(self): + k8s_obj = kubernetes.ReplicationControllerObject('pod_name') + k8s_obj._add_tolerations() + _tol = k8s_obj.template['spec']['template']['spec']['tolerations'] + self.assertEqual(1, len(_tol)) + self.assertEqual({'operator': 'Exists'}, _tol[0]) class ContainerObjectTestCase(base.BaseUnitTestCase): @@ -227,3 +305,244 @@ class ContainerObjectTestCase(base.BaseUnitTestCase): 'name': 'cname-container', 'volumeMounts': container_obj._create_volume_mounts()} self.assertEqual(expected, container_obj.get_container_item()) + + def test_get_container_item_with_security_context(self): + volume_mount = {'name': 'fake_name', + 'mountPath': 'fake_path'} + args = ['arg1', 'arg2'] + container_obj = kubernetes.ContainerObject( + 'cname', ssh_key='fake_sshkey', volumeMount=[volume_mount], + args=args, securityContext={'key': 'value'}) + expected = {'args': args, + 'command': [kubernetes.ContainerObject.COMMAND_DEFAULT], + 'image': kubernetes.ContainerObject.IMAGE_DEFAULT, + 'name': 'cname-container', + 'volumeMounts': container_obj._create_volume_mounts(), + 'securityContext': {'key': 'value'}} + self.assertEqual(expected, container_obj.get_container_item()) + + def test_get_container_item_with_env(self): + volume_mount = {'name': 'fake_name', + 'mountPath': 'fake_path'} + args = ['arg1', 'arg2'] + container_obj = kubernetes.ContainerObject( + 'cname', ssh_key='fake_sshkey', volumeMount=[volume_mount], + args=args, env=[{'name': 'fake_var_name', + 'value': 'fake_var_value'}]) + expected = {'args': args, + 'command': [kubernetes.ContainerObject.COMMAND_DEFAULT], + 'image': kubernetes.ContainerObject.IMAGE_DEFAULT, + 'name': 'cname-container', + 'volumeMounts': container_obj._create_volume_mounts(), + 'env': [{'name': 'fake_var_name', + 'value': 'fake_var_value'}]} + self.assertEqual(expected, container_obj.get_container_item()) + + def test_get_container_item_with_ports_multi_parameter(self): + volume_mount = {'name': 'fake_name', + 'mountPath': 'fake_path'} + args = ['arg1', 'arg2'] + container_obj = kubernetes.ContainerObject( + 'cname', ssh_key='fake_sshkey', volumeMount=[volume_mount], + args=args, ports=[{'containerPort': 'fake_port_name', + 'hostPort': 'fake_host_port', + 'name': 'fake_name', + 'protocol': 'fake_protocol', + 'invalid_varible': 'fakeinvalid_varible', + 'hostIP': 'fake_port_number'}]) + expected = {'args': args, + 'command': [ + kubernetes.ContainerObject.COMMAND_DEFAULT], + 'image': kubernetes.ContainerObject.IMAGE_DEFAULT, + 'name': 'cname-container', + 'volumeMounts': container_obj._create_volume_mounts(), + 'ports': [{'containerPort': 'fake_port_name', + 'hostPort': 'fake_host_port', + 'name': 'fake_name', + 'protocol': 'fake_protocol', + 'hostIP': 'fake_port_number'}]} + self.assertEqual(expected, container_obj.get_container_item()) + + def test_get_container_item_with_ports_no_container_port(self): + with self.assertRaises(exceptions.KubernetesContainerPortNotDefined): + volume_mount = {'name': 'fake_name', + 'mountPath': 'fake_path'} + args = ['arg1', 'arg2'] + container_obj = kubernetes.ContainerObject( + 'cname', ssh_key='fake_sshkey', volumeMount=[volume_mount], + args=args, ports=[{'hostPort': 'fake_host_port', + 'name': 'fake_name', + 'protocol': 'fake_protocol', + 'hostIP': 'fake_port_number'}]) + container_obj.get_container_item() + + def test_get_container_item_with_resources(self): + volume_mount = {'name': 'fake_name', + 'mountPath': 'fake_path'} + args = ['arg1', 'arg2'] + resources = {'requests': {'key1': 'val1'}, + 'limits': {'key2': 'val2'}, + 'other_key': {'key3': 'val3'}} + container_obj = kubernetes.ContainerObject( + 'cname', ssh_key='fake_sshkey', volumeMount=[volume_mount], + args=args, resources=resources) + expected = {'args': args, + 'command': [kubernetes.ContainerObject.COMMAND_DEFAULT], + 'image': kubernetes.ContainerObject.IMAGE_DEFAULT, + 'name': 'cname-container', + 'volumeMounts': container_obj._create_volume_mounts(), + 'resources': {'requests': {'key1': 'val1'}, + 'limits': {'key2': 'val2'}}} + self.assertEqual(expected, container_obj.get_container_item()) + + +class CustomResourceDefinitionObjectTestCase(base.BaseUnitTestCase): + + def test__init(self): + template = { + 'metadata': { + 'name': 'newcrds.ctx_name.com' + }, + 'spec': { + 'group': 'ctx_name.com', + 'version': 'v2', + 'scope': 'scope', + 'names': {'plural': 'newcrds', + 'singular': 'newcrd', + 'kind': 'Newcrd'} + } + } + crd_obj = kubernetes.CustomResourceDefinitionObject( + 'ctx_name', name='newcrd', version='v2', scope='scope') + self.assertEqual('newcrds.ctx_name.com', crd_obj._name) + self.assertEqual(template, crd_obj._template) + + def test__init_missing_parameter(self): + with self.assertRaises(exceptions.KubernetesCRDObjectDefinitionError): + kubernetes.CustomResourceDefinitionObject('ctx_name', + noname='name') + + +class NetworkObjectTestCase(base.BaseUnitTestCase): + + def setUp(self): + self.net_obj = kubernetes.NetworkObject(name='fake_name', + plugin='fake_plugin', + args='fake_args') + + def test__init_missing_parameter(self): + with self.assertRaises( + exceptions.KubernetesNetworkObjectDefinitionError): + kubernetes.NetworkObject('network_name', plugin='plugin') + with self.assertRaises( + exceptions.KubernetesNetworkObjectDefinitionError): + kubernetes.NetworkObject('network_name', args='args') + + @mock.patch.object(kubernetes_utils, 'get_custom_resource_definition') + def test_crd(self, mock_get_crd): + mock_crd = mock.Mock() + mock_get_crd.return_value = mock_crd + net_obj = copy.deepcopy(self.net_obj) + self.assertEqual(mock_crd, net_obj.crd) + + def test_template(self): + net_obj = copy.deepcopy(self.net_obj) + expected = {'apiVersion': 'group.com/v2', + 'kind': kubernetes.NetworkObject.KIND, + 'metadata': { + 'name': 'fake_name'}, + 'plugin': 'fake_plugin', + 'args': 'fake_args'} + crd = mock.Mock() + crd.spec.group = 'group.com' + crd.spec.version = 'v2' + net_obj._crd = crd + self.assertEqual(expected, net_obj.template) + + def test_group(self): + net_obj = copy.deepcopy(self.net_obj) + net_obj._crd = mock.Mock() + net_obj._crd.spec.group = 'fake_group' + self.assertEqual('fake_group', net_obj.group) + + def test_version(self): + net_obj = copy.deepcopy(self.net_obj) + net_obj._crd = mock.Mock() + net_obj._crd.spec.version = 'version_4' + self.assertEqual('version_4', net_obj.version) + + def test_plural(self): + net_obj = copy.deepcopy(self.net_obj) + net_obj._crd = mock.Mock() + net_obj._crd.spec.names.plural = 'name_ending_in_s' + self.assertEqual('name_ending_in_s', net_obj.plural) + + def test_scope(self): + net_obj = copy.deepcopy(self.net_obj) + net_obj._crd = mock.Mock() + net_obj._crd.spec.scope = 'Cluster' + self.assertEqual('Cluster', net_obj.scope) + + @mock.patch.object(kubernetes_utils, 'create_network') + def test_create(self, mock_create_network): + net_obj = copy.deepcopy(self.net_obj) + net_obj._scope = 'scope' + net_obj._group = 'group' + net_obj._version = 'version' + net_obj._plural = 'plural' + net_obj._template = 'template' + net_obj.create() + mock_create_network.assert_called_once_with( + 'scope', 'group', 'version', 'plural', 'template') + + @mock.patch.object(kubernetes_utils, 'delete_network') + def test_delete(self, mock_delete_network): + net_obj = copy.deepcopy(self.net_obj) + net_obj._scope = 'scope' + net_obj._group = 'group' + net_obj._version = 'version' + net_obj._plural = 'plural' + net_obj._name = 'name' + net_obj.delete() + mock_delete_network.assert_called_once_with( + 'scope', 'group', 'version', 'plural', 'name') + + +class ServiceNodePortObjectTestCase(base.BaseUnitTestCase): + + def test__init(self): + with mock.patch.object(kubernetes.ServiceNodePortObject, '_add_port') \ + as mock_add_port: + kubernetes.ServiceNodePortObject('fake_name', + node_ports=[{'port': 80}]) + + mock_add_port.assert_has_calls([mock.call(22, protocol='TCP'), + mock.call(80)]) + + def test__add_port(self): + nodeport_object = kubernetes.ServiceNodePortObject('fake_name') + port_ssh = {'port': 22, + 'protocol': 'TCP',} + port_definition = {'port': 80, + 'protocol': 'TCP', + 'name': 'web', + 'targetPort': 10080, + 'nodePort': 30080} + port = copy.deepcopy(port_definition) + port.pop('port') + nodeport_object._add_port(80, **port) + self.assertEqual([port_ssh, port_definition], + nodeport_object.template['spec']['ports']) + + @mock.patch.object(kubernetes_utils, 'create_service') + def test_create(self, mock_create_service): + nodeport_object = kubernetes.ServiceNodePortObject('fake_name') + nodeport_object.template = 'fake_template' + nodeport_object.create() + mock_create_service.assert_called_once_with('fake_template') + + @mock.patch.object(kubernetes_utils, 'delete_service') + def test_delete(self, mock_delete_service): + nodeport_object = kubernetes.ServiceNodePortObject('fake_name') + nodeport_object.delete() + mock_delete_service.assert_called_once_with('fake_name-service') |