Merge "Fix vPE VNF characterization issues."
[yardstick.git] / tests / unit / network_services / vnf_generic / vnf / test_prox_helpers.py
index 98eccae..995b4a2 100644 (file)
 
 from __future__ import absolute_import
 
+import copy
 import os
 import socket
 import unittest
-from collections import OrderedDict
 from itertools import repeat, chain
 from contextlib import contextmanager
 import mock
 
 from tests.unit import STL_MOCKS
-
+from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
 
 STLClient = mock.MagicMock()
 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
@@ -44,7 +44,6 @@ if stl_patch:
 
 
 class TestCoreTuple(unittest.TestCase):
-
     def test___init__(self):
         core_tuple = CoreSocketTuple('core 5s6')
         self.assertEqual(core_tuple.core_id, 5)
@@ -65,7 +64,6 @@ class TestCoreTuple(unittest.TestCase):
             '5s6',
             'core',
             'core h',
-            'core 5',
             'core 5s',
             'core 5 6',
             'core 5 6h',
@@ -125,7 +123,6 @@ class TestCoreTuple(unittest.TestCase):
 
 
 class TestTotStatsTuple(unittest.TestCase):
-
     def test___new___negative(self):
         with self.assertRaises(TypeError):
             # no values
@@ -141,7 +138,6 @@ class TestTotStatsTuple(unittest.TestCase):
 
 
 class TestProxTestDataTuple(unittest.TestCase):
-
     def test___init__(self):
         prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
         self.assertEqual(prox_test_data.tolerated, 1)
@@ -179,11 +175,12 @@ class TestProxTestDataTuple(unittest.TestCase):
             "TxThroughput": 9 / 1e6,
             "RxThroughput": 1.6 / 1e6,
             "PktSize": 64,
+            "PortSample": 1,
             "LatencyMin": 6.1,
             "LatencyMax": 6.9,
             "LatencyAvg": 6.4,
         }
-        result = prox_test_data.get_samples(64)
+        result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
         self.assertDictEqual(result, expected)
 
         expected = {
@@ -215,7 +212,6 @@ class TestProxTestDataTuple(unittest.TestCase):
 
 
 class TestPacketDump(unittest.TestCase):
-
     PAYLOAD = "payload"
 
     def test__init__(self):
@@ -290,7 +286,6 @@ no data length value
 
 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
 class TestProxSocketHelper(unittest.TestCase):
-
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
     def test___init__(self, mock_socket, mock_time):
         expected = mock_socket.socket()
@@ -375,6 +370,13 @@ class TestProxSocketHelper(unittest.TestCase):
         prox.put_command("data")
         mock_socket.sendall.assert_called_once()
 
+    def test_put_command_socket_error(self, mock_time):
+        mock_socket = mock.MagicMock()
+        mock_socket.sendall.side_effect = OSError
+        prox = ProxSocketHelper(mock_socket)
+        prox.put_command("data")
+        mock_socket.sendall.assert_called_once()
+
     def test_get_packet_dump(self, mock_time):
         mock_socket = mock.MagicMock()
         prox = ProxSocketHelper(mock_socket)
@@ -475,11 +477,11 @@ class TestProxSocketHelper(unittest.TestCase):
 
     def test_lat_stats(self, mock_time):
         latency_output = [
-            '1, 2 , 3',       # has white space
-            '4,5',            # too short
+            '1, 2 , 3',  # has white space
+            '4,5',  # too short
             '7,8,9,10.5,11',  # too long with float, but float is in unused portion
-            'twelve,13,14',   # value as English word
-            '15,16.2,17',     # float in used portion
+            'twelve,13,14',  # value as English word
+            '15,16.2,17',  # float in used portion
         ]
 
         mock_socket = mock.MagicMock()
@@ -504,6 +506,14 @@ class TestProxSocketHelper(unittest.TestCase):
         self.assertEqual(mock_socket.sendall.call_count, 5)
         self.assertEqual(result, expected)
 
+    def test_get_all_tot_stats_error(self, mock_time):
+        mock_socket = mock.MagicMock()
+        prox = ProxSocketHelper(mock_socket)
+        prox.get_data = mock.MagicMock(return_value='3,4,5')
+        expected = [0, 0, 0, 0]
+        result = prox.get_all_tot_stats()
+        self.assertEqual(result, expected)
+
     def test_get_all_tot_stats(self, mock_time):
         mock_socket = mock.MagicMock()
         prox = ProxSocketHelper(mock_socket)
@@ -627,78 +637,152 @@ class TestProxSocketHelper(unittest.TestCase):
 
 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
 
-    def test_rebind_drivers(self):
-        def find_drivers(*args, **kwargs):
-            setup_helper.used_drivers = used_drivers
-
-        used_drivers = {
-            'a': (1, 'b'),
-            'c': (2, 'd'),
-        }
-
-        vnfd_helper = mock.MagicMock()
-        ssh_helper = mock.MagicMock()
-        scenario_helper = mock.MagicMock()
-        setup_helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
-        setup_helper._find_used_drivers = mock_find = mock.MagicMock(side_effect=find_drivers)
-
-        setup_helper.rebind_drivers()
-        self.assertEqual(mock_find.call_count, 1)
-        self.assertEqual(ssh_helper.execute.call_count, 2)
-        self.assertIn('--force', ssh_helper.execute.call_args[0][0])
-
-        mock_find.reset_mock()
-        ssh_helper.execute.reset_mock()
-        setup_helper.rebind_drivers(False)
-        self.assertEqual(mock_find.call_count, 0)
-        self.assertEqual(ssh_helper.execute.call_count, 2)
-        self.assertNotIn('--force', ssh_helper.execute.call_args[0][0])
-
-
-class TestProxResourceHelper(unittest.TestCase):
+    VNFD0 = {
+        'short-name': 'ProxVnf',
+        'vdu': [
+            {
+                'routing_table': [
+                    {
+                        'network': '152.16.100.20',
+                        'netmask': '255.255.255.0',
+                        'gateway': '152.16.100.20',
+                        'if': 'xe0',
+                    },
+                    {
+                        'network': '152.16.40.20',
+                        'netmask': '255.255.255.0',
+                        'gateway': '152.16.40.20',
+                        'if': 'xe1',
+                    },
+                ],
+                'description': 'PROX approximation using DPDK',
+                'name': 'proxvnf-baremetal',
+                'nd_route_tbl': [
+                    {
+                        'network': '0064:ff9b:0:0:0:0:9810:6414',
+                        'netmask': '112',
+                        'gateway': '0064:ff9b:0:0:0:0:9810:6414',
+                        'if': 'xe0',
+                    },
+                    {
+                        'network': '0064:ff9b:0:0:0:0:9810:2814',
+                        'netmask': '112',
+                        'gateway': '0064:ff9b:0:0:0:0:9810:2814',
+                        'if': 'xe1',
+                    },
+                ],
+                'id': 'proxvnf-baremetal',
+                'external-interface': [
+                    {
+                        'virtual-interface': {
+                            'dst_mac': '00:00:00:00:00:04',
+                            'vpci': '0000:05:00.0',
+                            'local_ip': '152.16.100.19',
+                            'type': 'PCI-PASSTHROUGH',
+                            'vld_id': 'uplink_0',
+                            'netmask': '255.255.255.0',
+                            'dpdk_port_num': 0,
+                            'bandwidth': '10 Gbps',
+                            'driver': "i40e",
+                            'dst_ip': '152.16.100.19',
+                            'local_iface_name': 'xe0',
+                            'local_mac': '00:00:00:00:00:02',
+                            'ifname': 'xe0',
+                        },
+                        'vnfd-connection-point-ref': 'xe0',
+                        'name': 'xe0',
+                    },
+                    {
+                        'virtual-interface': {
+                            'dst_mac': '00:00:00:00:00:03',
+                            'vpci': '0000:05:00.1',
+                            'local_ip': '152.16.40.19',
+                            'type': 'PCI-PASSTHROUGH',
+                            'vld_id': 'downlink_0',
+                            'driver': "i40e",
+                            'netmask': '255.255.255.0',
+                            'dpdk_port_num': 1,
+                            'bandwidth': '10 Gbps',
+                            'dst_ip': '152.16.40.20',
+                            'local_iface_name': 'xe1',
+                            'local_mac': '00:00:00:00:00:01',
+                            'ifname': 'xe1',
+                        },
+                        'vnfd-connection-point-ref': 'xe1',
+                        'name': 'xe1',
+                    },
+                ],
+            },
+        ],
+        'description': 'PROX approximation using DPDK',
+        'mgmt-interface': {
+            'vdu-id': 'proxvnf-baremetal',
+            'host': '1.2.1.1',
+            'password': 'r00t',
+            'user': 'root',
+            'ip': '1.2.1.1',
+        },
+        'benchmark': {
+            'kpi': [
+                'packets_in',
+                'packets_fwd',
+                'packets_dropped',
+            ],
+        },
+        'id': 'ProxApproxVnf',
+        'name': 'ProxVnf',
+    }
+
+    VNFD = {
+        'vnfd:vnfd-catalog': {
+            'vnfd': [
+                VNFD0,
+            ],
+        },
+    }
 
     def test__replace_quoted_with_value(self):
         # empty string
         input_str = ''
         expected = ''
-        result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
+        result = 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 = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
+        result = 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 = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
+        result = 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 = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
+        result = 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 = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
+        result = 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 = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat', 2)
+        result = 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 = ProxResourceHelper._get_tx_port('section1', input_data)
+        result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
         self.assertEqual(result, expected)
 
         # data for other section
@@ -710,7 +794,7 @@ class TestProxResourceHelper(unittest.TestCase):
             ],
         }
         expected = -1
-        result = ProxResourceHelper._get_tx_port('section1', input_data)
+        result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
         self.assertEqual(result, expected)
 
         # data for section
@@ -719,7 +803,7 @@ class TestProxResourceHelper(unittest.TestCase):
             ('tx port', '3'),
         ]
         expected = 3
-        result = ProxResourceHelper._get_tx_port('section1', input_data)
+        result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
         self.assertEqual(result, expected)
 
         # more data for section,
@@ -728,57 +812,41 @@ class TestProxResourceHelper(unittest.TestCase):
             ('tx port', '1', 'and more', 234),
         ])
         expected = 1
-        result = ProxResourceHelper._get_tx_port('section1', input_data)
-        self.assertEqual(result, expected)
-
-    def test_line_rate_to_pps(self):
-        expected = 0.25 * 1e8
-        result = ProxResourceHelper.line_rate_to_pps(180, 4)
+        result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
         self.assertEqual(result, expected)
 
-    def test_find_pci(self):
-        input_str_list = [
-            'no target here',
-            'nor here',
-            'and still not',
-        ]
-        result = ProxResourceHelper.find_pci('target', input_str_list)
-        self.assertFalse(result)
-
-        input_str_list = [
-            'no target here',
-            'nor here',
-            'this is a target',
-            'did we miss it',
-        ]
-        result = ProxResourceHelper.find_pci('target', input_str_list)
-        self.assertTrue(result)
-
     def test_write_prox_config(self):
         input_data = {}
         expected = ''
-        result = ProxResourceHelper.write_prox_config(input_data)
+        result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
         self.assertEqual(result, expected)
 
-        input_data = {
-            'section1': [],
-        }
+        input_data = [
+            [
+                'section1',
+                [],
+            ],
+        ]
         expected = '[section1]'
-        result = ProxResourceHelper.write_prox_config(input_data)
+        result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
         self.assertEqual(result, expected)
 
-        input_data = OrderedDict([
-            ('section1', []),
-            (
-                'section2', [
-                    ('key1', 'value1'),
-                    ('__name__', 'not this one'),
-                    ('key2', None),
-                    ('key3', 234),
-                    ('key4', 'multi-line\nvalue'),
-                ]
-            )
-        ])
+        input_data = [
+            [
+                'section1',
+                [],
+            ],
+            [
+                'section2',
+                [
+                    ['key1', 'value1'],
+                    ['__name__', 'not this one'],
+                    ['key2', None],
+                    ['key3', 234],
+                    ['key4', 'multi-line\nvalue'],
+                ],
+            ],
+        ]
         expected = os.linesep.join([
             '[section1]',
             '[section2]',
@@ -787,364 +855,324 @@ class TestProxResourceHelper(unittest.TestCase):
             'key3=234',
             'key4=multi-line\n\tvalue',
         ])
-        result = ProxResourceHelper.write_prox_config(input_data)
+        result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
         self.assertEqual(result, expected)
 
-    def test_sut(self):
-        helper = ProxResourceHelper(mock.MagicMock())
-        self.assertIsNone(helper.client)
-        result = helper.sut
-        self.assertIsNotNone(result)
-        self.assertIs(result, helper.client)
-        self.assertIs(result, helper.sut)
-
-    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
-    def test_cpu_topology(self, mock_socket_topology):
-        mock_socket_topology.parse_cpuinfo.return_value = 432
-
-        setup_helper = mock.MagicMock()
-        setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
-
-        helper = ProxResourceHelper(setup_helper)
-        self.assertIsNone(helper._cpu_topology)
-        result = helper.cpu_topology
-        self.assertEqual(result, 432)
-        self.assertIs(result, helper._cpu_topology)
-        self.assertIs(result, helper.cpu_topology)
-
-    def test_vpci_to_if_name_map(self):
-        setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
-
-        helper = ProxResourceHelper(setup_helper)
-        self.assertIsNone(helper._vpci_to_if_name_map)
-        result = helper.vpci_to_if_name_map
-        self.assertEqual(result, {})
-        self.assertIs(result, helper._vpci_to_if_name_map)
-        self.assertIs(result, helper.vpci_to_if_name_map)
-
-        setup_helper.vnfd_helper.interfaces = [
-            {
-                'name': 'vnf1',
-                'virtual-interface': {
-                    'vpci': '0000:01.02.03',
-                },
-            },
-            {
-                'name': 'vnf2',
-                'virtual-interface': {
-                    'vpci': '0000:04.05.06',
-                },
-            },
-        ]
-        expected = {
-            '0000:01.02.03': 'vnf1',
-            '0000:04.05.06': 'vnf2',
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
+    def test_build_config_file_no_additional_file(self, mock_find_path):
+        vnf1 = {
+            'prox_args': {'-c': ""},
+            'prox_path': 'd',
+            'prox_config': 'e/f',
         }
-        helper = ProxResourceHelper(setup_helper)
-        self.assertIsNone(helper._vpci_to_if_name_map)
-        result = helper.vpci_to_if_name_map
-        self.assertDictEqual(result, expected)
-        self.assertIs(result, helper._vpci_to_if_name_map)
-        self.assertIs(result, helper.vpci_to_if_name_map)
-
-    def test_test_cores(self):
-        setup_helper = mock.MagicMock()
-        helper = ProxResourceHelper(setup_helper)
-        helper.prox_config_dict = {}
-        helper._cpu_topology = []
 
-        expected = []
-        result = helper.test_cores
-        self.assertEqual(result, expected)
+        mock_find_path.side_effect = ['1', '2']
 
-        helper = ProxResourceHelper(setup_helper)
-        helper.prox_config_dict = OrderedDict([
-            ('section1', []),
-            ('section2', [
-                ('a', 'b'),
-                ('c', 'd'),
-            ]),
-            ('core 1s3', []),
-            ('core 2s5', [
-                ('index', 8),
-                ('mode', ''),
-            ]),
-            ('core 3s1', [
-                ('index', 5),
-                ('mode', 'gen'),
-            ]),
-            ('core 4s9h', [
-                ('index', 7),
-                ('mode', 'gen'),
-            ]),
-        ])
-        helper._cpu_topology = {
-            1: {
-                3: {
-                    'key1': (23, 32),
-                    'key2': (12, 21),
-                    'key3': (44, 33),
-                },
-            },
-            9: {
-                4: {
-                    'key1': (44, 32),
-                    'key2': (23, 21),
-                    'key3': (12, 33),
-                },
+        vnfd_helper = mock.MagicMock()
+        ssh_helper = mock.MagicMock()
+        scenario_helper = ScenarioHelper('vnf1')
+        scenario_helper.scenario_cfg = {
+            'task_path': 'a/b',
+            'options': {
+                'vnf1': vnf1,
             },
         }
 
-        self.assertIsNone(helper._test_cores)
-        expected = [12, 23]
-        result = helper.test_cores
-        self.assertEqual(result, expected)
-        self.assertIs(result, helper._test_cores)
-        self.assertIs(result, helper.test_cores)
+        helper = 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')
 
-    def test_latency_cores(self):
-        setup_helper = mock.MagicMock()
-        helper = ProxResourceHelper(setup_helper)
-        helper.prox_config_dict = {}
-        helper._cpu_topology = []
+        self.assertEqual(helper.additional_files, {})
+        self.assertNotEqual(helper._prox_config_data, '4')
+        self.assertNotEqual(helper.remote_path, '5')
+        helper.build_config_file()
+        self.assertEqual(helper.additional_files, {})
+        self.assertEqual(helper._prox_config_data, '4')
+        self.assertEqual(helper.remote_path, '5')
 
-        expected = []
-        result = helper.latency_cores
-        self.assertEqual(result, expected)
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
+    def test_build_config_file_additional_file_string(self, mock_find_path):
+        vnf1 = {
+            'prox_args': {'-c': ""},
+            'prox_path': 'd',
+            'prox_config': 'e/f',
+            'prox_files': 'g/h.i',
+        }
 
-        helper = ProxResourceHelper(setup_helper)
-        helper.prox_config_dict = OrderedDict([
-            ('section1', []),
-            ('section2', [
-                ('a', 'b'),
-                ('c', 'd'),
-            ]),
-            ('core 1s3', []),
-            ('core 2s5', [
-                ('index', 8),
-                ('mode', ''),
-            ]),
-            ('core 3s1', [
-                ('index', 5),
-                ('mode', 'lat'),
-            ]),
-            ('core 4s9h', [
-                ('index', 7),
-                ('mode', 'lat'),
-            ]),
-        ])
-        helper._cpu_topology = {
-            1: {
-                3: {
-                    'key1': (23, 32),
-                    'key2': (12, 21),
-                    'key3': (44, 33),
-                },
-            },
-            9: {
-                4: {
-                    'key1': (44, 32),
-                    'key2': (23, 21),
-                    'key3': (12, 33),
-                },
+        mock_find_path.side_effect = ['1', '2']
+        vnfd_helper = mock.MagicMock()
+        ssh_helper = mock.MagicMock()
+        scenario_helper = ScenarioHelper('vnf1')
+        scenario_helper.scenario_cfg = {
+            'task_path': 'a/b',
+            'options': {
+                'vnf1': vnf1,
             },
         }
 
-        self.assertIsNone(helper._latency_cores)
-        expected = [12, 23]
-        result = helper.latency_cores
-        self.assertEqual(result, expected)
-        self.assertIs(result, helper._latency_cores)
-        self.assertIs(result, helper.latency_cores)
-
-    def test_start_collect(self):
-        setup_helper = mock.MagicMock()
-        helper = ProxResourceHelper(setup_helper)
-        self.assertIsNone(helper.start_collect())
+        helper = 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')
 
-    def test_terminate(self):
-        setup_helper = mock.MagicMock()
-        helper = ProxResourceHelper(setup_helper)
-        self.assertIsNone(helper.terminate())
+        self.assertEqual(helper.additional_files, {})
+        expected = {'h.i': '33'}
+        helper.build_config_file()
+        self.assertDictEqual(helper.additional_files, expected)
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
-    def test_get_process_args_no_additional_file(self, mock_find_path):
+    def test_build_config_file_additional_file(self, mock_find_path):
         vnf1 = {
-            'prox_args': 'c',
+            'prox_args': {'-c': ""},
             'prox_path': 'd',
             'prox_config': 'e/f',
+            'prox_files': [
+                'g/h.i',
+                'j/k/l',
+                'm_n',
+            ],
         }
 
-        mock_find_path.side_effect = ['1', '2']
-        setup_helper = mock.MagicMock()
-        setup_helper.scenario_helper = ScenarioHelper('vnf1')
-        setup_helper.scenario_helper.scenario_cfg = {
+        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.scenario_cfg = {
             'task_path': 'a/b',
             'options': {
                 'vnf1': vnf1,
             },
         }
 
-        helper = ProxResourceHelper(setup_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')
+        helper = 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')
 
-        expected = 'c', 'd', '5'
-        result = helper.get_process_args()
-        self.assertEqual(result, expected)
-        self.assertFalse(helper.additional_file)
-        self.assertIsNone(helper.remote_prox_file_name)
+        self.assertEqual(helper.additional_files, {})
+        self.assertNotEqual(helper._prox_config_data, '44')
+        self.assertNotEqual(helper.remote_path, '55')
+        expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
+        helper.build_config_file()
+        self.assertDictEqual(helper.additional_files, expected)
+        self.assertEqual(helper._prox_config_data, '44')
+        self.assertEqual(helper.remote_path, '55')
 
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
-    def test_get_process_args_additional_file(self, mock_find_path):
+    def test_build_config(self, mock_find_path):
         vnf1 = {
-            'prox_args': 'c',
-            'prox_path': 'd',
-            'prox_config': 'e/f',
-            'prox_files': 'g/h',
+            'prox_args': {'-f': ""},
+            'prox_path': '/opt/nsb_bin/prox',
+            'prox_config': 'configs/gen_l2fwd-2.cfg',
+            'prox_files': [
+                'g/h.i',
+                'j/k/l',
+                'm_n',
+            ],
         }
 
         mock_find_path.side_effect = ['1', '2']
-        setup_helper = mock.MagicMock()
-        setup_helper.scenario_helper = ScenarioHelper('vnf1')
-        setup_helper.scenario_helper.scenario_cfg = {
+        vnfd_helper = mock.MagicMock()
+        ssh_helper = mock.MagicMock()
+        ssh_helper.provision_tool.return_value = "/opt/nsb_bin/prox"
+        scenario_helper = ScenarioHelper('vnf1')
+        scenario_helper.scenario_cfg = {
             'task_path': 'a/b',
             'options': {
                 'vnf1': vnf1,
             },
         }
 
-        helper = ProxResourceHelper(setup_helper)
-        helper.copy_to_target = mock.MagicMock(return_value='33')
-        helper.generate_prox_config_file = mock.MagicMock(return_value='44')
-        helper.upload_prox_config = mock.MagicMock(return_value='55')
+        helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        helper.remote_path = "/tmp/prox.cfg"
+        expected = "sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli -f  -f /tmp/prox.cfg '"
+        with mock.patch.object(helper, "build_config_file") as mock_build_config:
+            prox_cmd = helper.build_config()
+            self.assertEqual(prox_cmd, expected)
 
-        expected = 'c', 'd', '55'
-        result = helper.get_process_args()
-        self.assertEqual(result, expected)
-        self.assertTrue(helper.additional_file)
-        self.assertEqual(helper.remote_prox_file_name, '33')
+    def test__insert_additional_file(self):
+        vnfd_helper = mock.MagicMock()
+        ssh_helper = mock.MagicMock()
+        scenario_helper = mock.MagicMock()
 
-    def test_up_post(self):
-        setup_helper = mock.MagicMock()
-        helper = ProxResourceHelper(setup_helper)
-        helper.client = expected = mock.MagicMock()
-        result = helper.up_post()
-        self.assertEqual(result, expected)
+        helper = 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")')
 
-    def test_execute(self):
-        setup_helper = mock.MagicMock()
-        helper = ProxResourceHelper(setup_helper)
-        helper.client = mock.MagicMock()
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
+    def test_generate_prox_config_file(self, mock_parser_type):
+        def init(*args):
+            if sections_data:
+                args[-1].extend(sections_data)
+            return mock.MagicMock()
 
-        expected = helper.client.my_command()
-        result = helper.execute('my_command')
-        self.assertEqual(result, expected)
+        sections_data = []
 
-        helper.client = object()
+        mock_parser_type.side_effect = init
 
-        result = helper.execute('my_command')
-        self.assertIsNone(result)
+        vnfd_helper = VnfdHelper(self.VNFD0)
+        ssh_helper = mock.MagicMock()
+        scenario_helper = mock.MagicMock()
 
-    def test_copy_to_target(self):
-        setup_helper = mock.MagicMock()
-        helper = ProxResourceHelper(setup_helper)
-        expected = '/tmp/c'
-        result = helper.copy_to_target('a/b', 'c')
-        self.assertEqual(result, expected)
+        helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        helper.additional_files = {}
 
-    def test_upload_prox_config(self):
-        setup_helper = mock.MagicMock()
-        helper = ProxResourceHelper(setup_helper)
-        helper.write_prox_config = mock.MagicMock(return_value='a long string')
-        expected = '/tmp/a'
-        result = helper.upload_prox_config('a', {})
+        expected = []
+        result = helper.generate_prox_config_file('a/b')
         self.assertEqual(result, expected)
 
-    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
-    def test_run_test(self, mock_time):
-        @contextmanager
-        def measure(*args, **kwargs):
-            yield stats
-
-        setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
-
-        stats = {
-            'delta': TotStatsTuple(6, 7, 8, 9),
-        }
-
-        client = mock.MagicMock()
-        client.hz.return_value = 2
-        client.measure_tot_stats = measure
-        client.port_stats.return_value = tuple(range(12))
-
-        helper = ProxResourceHelper(setup_helper)
-        helper.client = client
-        helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
+        helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
 
-        with self.assertRaises(AssertionError):
-            helper.run_test(980, 15, 45)
+        helper.remote_prox_file_name = 'remote'
+        sections_data = [
+            [
+                'lua',
+                [
+                    ['dofile("ipv4.lua")', ''],
+                ],
+            ],
+            [
+                'port 0',
+                [
+                    ['ip', ''],
+                    ['mac', 'foo'],
+                    ['dst mac', '@@1'],
+                    ['tx port', '1'],
+                ],
+            ],
+            [
+                'port 2',
+                [
+                    ['ip', ''],
+                    ['$sut_mac0', '@@dst_mac0'],
+                    ['tx port', '0'],
+                    ['single', '@'],
+                    ['user_table', 'dofile("ipv4.lua")'],
+                    ['missing_addtional_file', 'dofile("nosuch")'],
+                ],
+            ],
+        ]
 
-        setup_helper.vnfd_helper.interfaces = ['a', 'b', 'c', 'd']
-        helper._test_cores = [3, 4]
+        expected = [
+            [
+                'lua',
+                [
+                    ['dofile("/tmp/ipv4.lua")', ''],
+                ],
+            ],
+            [
+                'port 0',
+                [
+                    ['ip', ''],
+                    ['mac', 'hardware'],
+                    ['dst mac', '00:00:00:00:00:03'],
+                    ['tx port', '1'],
+                ],
+            ],
+            [
+                'port 2',
+                [
+                    ['ip', ''],
+                    ['$sut_mac0', '00 00 00 00 00 04'],
+                    ['tx port', '0'],
+                    ['single', '@'],
+                    ['user_table', 'dofile("/tmp/ipv4.lua")'],
+                    ['missing_addtional_file', 'dofile("nosuch")'],
+                ],
+            ],
+        ]
+        result = helper.generate_prox_config_file('/c/d/e')
+        self.assertEqual(result, expected, str(result))
 
-        expected = ProxTestDataTuple(0.0, 2.0, 6, 7, 8, [3.3, 3.6, 3.8], 6, 7, 1.3e7)
-        result = helper.run_test(230, 60, 65)
-        self.assertEqual(result, expected)
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
+    def test_generate_prox_config_file_negative(self, mock_parser_type):
+        def init(*args):
+            args[-1].update(sections_data)
+            return mock.MagicMock()
 
-    def test_generate_prox_lua_file(self):
-        setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
+        sections_data = {}
 
-        helper = ProxResourceHelper(setup_helper)
-        helper.LUA_PARAMETER_NAME = 'sut'
+        mock_parser_type.side_effect = init
 
-        expected = ''
-        result = helper.generate_prox_lua_file()
-        self.assertEqual(result, expected)
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.interfaces = []
+        ssh_helper = mock.MagicMock()
+        scenario_helper = mock.MagicMock()
 
-        setup_helper.vnfd_helper.interfaces = [
+        helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        helper.additional_files = {}
+        helper.remote_prox_file_name = 'remote'
+        vnfd_helper.interfaces = [
             {
-                'local_ip': '10.20.30.40',
-                'dst_ip': '10.11.12.13',
                 'virtual-interface': {
                     'dpdk_port_num': 3,
+                    'dst_mac': '00:00:00:de:ad:88',
+                },
+            },
+            {
+                'virtual-interface': {
+                    'dpdk_port_num': 5,
+                    'dst_mac': '00:00:00:de:ad:ff',
                 },
             },
             {
-                'local_ip': '10.20.30.45',
-                'dst_ip': '10.11.12.19',
                 'virtual-interface': {
                     'dpdk_port_num': 7,
+                    'dst_mac': '00:00:00:de:ad:ff',
                 },
             },
         ]
+        sections_data = {
+            'port 3': [
+                ['ip', ''],
+                ['mac', 'foo'],
+                ['dst mac', ''],
+            ],
+            'port 5': [
+                ['ip', ''],
+                ['dst mac', ''],
+                ['tx port', '0'],
+                ['???', 'dofile "here" 23'],
+            ],
+        }
 
-        expected = os.linesep.join([
-            'sut_hex_ip_port_3:"0a 14 1e 28"',
-            'sut_ip_port_3:"10.20.30.40"',
-            'gen_hex_ip_port_3:"0a 0b 0c 0d"',
-            'gen_ip_port_3:"10.11.12.13"',
-
-            'sut_hex_ip_port_7:"0a 14 1e 2d"',
-            'sut_ip_port_7:"10.20.30.45"',
-            'gen_hex_ip_port_7:"0a 0b 0c 13"',
-            'gen_ip_port_7:"10.11.12.19"',
-        ])
+        with self.assertRaises(Exception):
+            helper.generate_prox_config_file('a/b')
+
+    def test_generate_prox_lua_file(self):
+        vnfd_helper = VnfdHelper(self.VNFD0)
+        ssh_helper = mock.MagicMock()
+        scenario_helper = mock.MagicMock()
+
+        helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        helper.LUA_PARAMETER_NAME = 'sut'
+
+        expected = [
+            'sut_hex_ip_port_0:"98 10 64 13"',
+            'sut_ip_port_0:"152.16.100.19"',
+            'gen_hex_ip_port_0:"98 10 64 13"',
+            'gen_ip_port_0:"152.16.100.19"',
+
+            'sut_hex_ip_port_1:"98 10 28 13"',
+            'sut_ip_port_1:"152.16.40.19"',
+            'gen_hex_ip_port_1:"98 10 28 14"',
+            'gen_ip_port_1:"152.16.40.20"',
+        ]
         result = helper.generate_prox_lua_file()
-        self.assertEqual(result, expected)
+        self.assertListEqual(result.splitlines(), expected)
 
     def test_upload_prox_lua(self):
         def identity(*args):
             return args
 
-        setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.interfaces = []
+        ssh_helper = mock.MagicMock()
+        scenario_helper = mock.MagicMock()
 
-        helper = ProxResourceHelper(setup_helper)
+        helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
         helper.generate_prox_lua_file = mock.MagicMock(return_value=234)
         helper.put_string_to_file = identity
 
@@ -1165,176 +1193,632 @@ class TestProxResourceHelper(unittest.TestCase):
         self.assertEqual(result, expected)
 
     def test_put_string_to_file(self):
-        setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.interfaces = []
+        ssh_helper = mock.MagicMock()
+        scenario_helper = mock.MagicMock()
 
-        helper = ProxResourceHelper(setup_helper)
+        helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
 
         expected = 'a/b'
         result = helper.put_string_to_file('my long string', 'a/b')
         self.assertEqual(result, expected)
 
-    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
-    def test_generate_prox_config_file(self, mock_parser_type):
-        def init(*args):
-            args[-1].update(sections_data)
-            return mock.MagicMock()
+    def test__build_pipeline_kwarags(self):
+        vnfd_helper = mock.MagicMock()
+        ssh_helper = mock.MagicMock()
+        ssh_helper.provision_tool.return_value = "/tmp/nosuch"
+        scenario_helper = mock.MagicMock()
 
-        sections_data = {}
+        helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        helper._build_pipeline_kwargs()
+        self.assertEqual(helper.pipeline_kwargs, {'tool_path': '/tmp/nosuch', 'tool_dir': '/tmp'})
 
-        mock_parser_type.side_effect = init
+    def test_copy_to_target(self):
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.interfaces = []
+        ssh_helper = mock.MagicMock()
+        scenario_helper = mock.MagicMock()
 
-        setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
+        helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
+        expected = '/tmp/c'
+        result = helper.copy_to_target('a/b', 'c')
+        self.assertEqual(result, expected)
 
-        helper = ProxResourceHelper(setup_helper)
-        helper.additional_file = False
+    def test_upload_prox_config(self):
+        vnfd_helper = mock.MagicMock()
+        vnfd_helper.interfaces = []
+        ssh_helper = mock.MagicMock()
+        scenario_helper = mock.MagicMock()
 
-        expected = {}
-        result = helper.generate_prox_config_file('a/b')
+        helper = 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', {})
         self.assertEqual(result, expected)
 
-        helper.additional_file = True
-        helper.remote_prox_file_name = 'remote'
-        setup_helper.vnfd_helper.interfaces = [
-            {
-                'virtual-interface': {
-                    'dpdk_port_num': 3,
-                    'dst_mac': '00:00:00:de:ad:88',
-                },
-            },
-            {
-                'virtual-interface': {
-                    'dpdk_port_num': 5,
-                    'dst_mac': '00:00:00:de:ad:ff',
-                },
-            },
+
+class TestProxResourceHelper(unittest.TestCase):
+
+    VNFD0 = {
+        'short-name': 'ProxVnf',
+        'vdu': [
             {
-                'virtual-interface': {
-                    'dpdk_port_num': 7,
-                    'dst_mac': '00:00:00:de:ad:ff',
-                },
+                'routing_table': [
+                    {
+                        'network': '152.16.100.20',
+                        'netmask': '255.255.255.0',
+                        'gateway': '152.16.100.20',
+                        'if': 'xe0',
+                    },
+                    {
+                        'network': '152.16.40.20',
+                        'netmask': '255.255.255.0',
+                        'gateway': '152.16.40.20',
+                        'if': 'xe1',
+                    },
+                ],
+                'description': 'PROX approximation using DPDK',
+                'name': 'proxvnf-baremetal',
+                'nd_route_tbl': [
+                    {
+                        'network': '0064:ff9b:0:0:0:0:9810:6414',
+                        'netmask': '112',
+                        'gateway': '0064:ff9b:0:0:0:0:9810:6414',
+                        'if': 'xe0',
+                    },
+                    {
+                        'network': '0064:ff9b:0:0:0:0:9810:2814',
+                        'netmask': '112',
+                        'gateway': '0064:ff9b:0:0:0:0:9810:2814',
+                        'if': 'xe1',
+                    },
+                ],
+                'id': 'proxvnf-baremetal',
+                'external-interface': [
+                    {
+                        'virtual-interface': {
+                            'dst_mac': '00:00:00:00:00:04',
+                            'vpci': '0000:05:00.0',
+                            'local_ip': '152.16.100.19',
+                            'type': 'PCI-PASSTHROUGH',
+                            'vld_id': 'uplink_0',
+                            'netmask': '255.255.255.0',
+                            'dpdk_port_num': 0,
+                            'bandwidth': '10 Gbps',
+                            'driver': "i40e",
+                            'dst_ip': '152.16.100.19',
+                            'local_iface_name': 'xe0',
+                            'local_mac': '00:00:00:00:00:02',
+                            'ifname': 'xe0',
+                        },
+                        'vnfd-connection-point-ref': 'xe0',
+                        'name': 'xe0',
+                    },
+                    {
+                        'virtual-interface': {
+                            'dst_mac': '00:00:00:00:00:03',
+                            'vpci': '0000:05:00.1',
+                            'local_ip': '152.16.40.19',
+                            'type': 'PCI-PASSTHROUGH',
+                            'vld_id': 'downlink_0',
+                            'driver': "i40e",
+                            'netmask': '255.255.255.0',
+                            'dpdk_port_num': 1,
+                            'bandwidth': '10 Gbps',
+                            'dst_ip': '152.16.40.20',
+                            'local_iface_name': 'xe1',
+                            'local_mac': '00:00:00:00:00:01',
+                            'ifname': 'xe1',
+                        },
+                        'vnfd-connection-point-ref': 'xe1',
+                        'name': 'xe1',
+                    },
+                ],
             },
-        ]
-        sections_data = {
-            'port 3': [
-                ['ip', ''],
-                ['mac', 'foo'],
-                ['dst mac', ''],
-                ['tx port', '1'],
+        ],
+        'description': 'PROX approximation using DPDK',
+        'mgmt-interface': {
+            'vdu-id': 'proxvnf-baremetal',
+            'host': '1.2.1.1',
+            'password': 'r00t',
+            'user': 'root',
+            'ip': '1.2.1.1',
+        },
+        'benchmark': {
+            'kpi': [
+                'packets_in',
+                'packets_fwd',
+                'packets_dropped',
             ],
-            'port 5': [
-                ['ip', ''],
-                ['dst mac', ''],
-                ['tx port', '0'],
-                ['single'],
-                ['???', 'dofile "here" 23'],
+        },
+        'id': 'ProxApproxVnf',
+        'name': 'ProxVnf',
+    }
+
+    VNFD = {
+        'vnfd:vnfd-catalog': {
+            'vnfd': [
+                VNFD0,
             ],
-        }
+        },
+    }
 
-        expected = {
-            'port 3': [
-                ['ip', ''],
-                ['mac', 'hardware'],
-                ['dst mac', '00:00:00:de:ad:ff'],
-                ['tx port', '1'],
-            ],
-            'port 5': [
-                ['ip', ''],
-                ['dst mac', '00:00:00:de:ad:88'],
-                ['tx port', '0'],
-                ['single'],
-                ['???', 'dofile "remote" 23'],
-            ],
-        }
-        result = helper.generate_prox_config_file('a/b')
-        self.assertDictEqual(result, expected)
+    def test_line_rate_to_pps(self):
+        expected = 0.25 * 1e8
+        result = ProxResourceHelper.line_rate_to_pps(180, 4)
+        self.assertEqual(result, expected)
 
-    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
-    def test_generate_prox_config_file_negative(self, mock_parser_type):
-        def init(*args):
-            args[-1].update(sections_data)
-            return mock.MagicMock()
+    def test_find_pci(self):
+        input_str_list = [
+            'no target here',
+            'nor here',
+            'and still not',
+        ]
+        result = ProxResourceHelper.find_pci('target', input_str_list)
+        self.assertFalse(result)
 
-        sections_data = {}
+        input_str_list = [
+            'no target here',
+            'nor here',
+            'this is a target',
+            'did we miss it',
+        ]
+        result = ProxResourceHelper.find_pci('target', input_str_list)
+        self.assertTrue(result)
 
-        mock_parser_type.side_effect = init
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
+    def test_sut(self, mock_socket_helper):
+        helper = ProxResourceHelper(mock.MagicMock())
+        self.assertIsNone(helper.client)
+        result = helper.sut
+        self.assertIsNotNone(result)
+        self.assertIs(result, helper.client)
+        self.assertIs(result, helper.sut)
+
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
+    def test_cpu_topology(self, mock_socket_topology):
+        mock_socket_topology.parse_cpuinfo.return_value = 432
 
         setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
+        setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
 
         helper = ProxResourceHelper(setup_helper)
-        helper.additional_file = False
-        helper.remote_prox_file_name = 'remote'
-        setup_helper.vnfd_helper.interfaces = [
-            {
-                'virtual-interface': {
-                    'dpdk_port_num': 3,
-                    'dst_mac': '00:00:00:de:ad:88',
-                },
-            },
-            {
-                'virtual-interface': {
-                    'dpdk_port_num': 5,
-                    'dst_mac': '00:00:00:de:ad:ff',
+        self.assertIsNone(helper._cpu_topology)
+        result = helper.cpu_topology
+        self.assertEqual(result, 432)
+        self.assertIs(result, helper._cpu_topology)
+        self.assertIs(result, helper.cpu_topology)
+
+    def test_test_cores(self):
+        setup_helper = mock.MagicMock()
+        setup_helper.prox_config_data = []
+
+        helper = ProxResourceHelper(setup_helper)
+        helper._cpu_topology = []
+
+        expected = []
+        result = helper.test_cores
+        self.assertEqual(result, expected)
+
+        setup_helper.prox_config_data = [
+            ('section1', []),
+            ('section2', [
+                ('a', 'b'),
+                ('c', 'd'),
+            ]),
+            ('core 1s3', []),
+            ('core 2s5', [
+                ('index', 8),
+                ('mode', ''),
+            ]),
+            ('core 3s1', [
+                ('index', 5),
+                ('mode', 'gen'),
+            ]),
+            ('core 4s9h', [
+                ('index', 7),
+                ('mode', 'gen'),
+            ]),
+        ]
+
+        helper = ProxResourceHelper(setup_helper)
+        helper._cpu_topology = {
+            1: {
+                3: {
+                    'key1': (23, 32),
+                    'key2': (12, 21),
+                    'key3': (44, 33),
                 },
             },
-            {
-                'virtual-interface': {
-                    'dpdk_port_num': 7,
-                    'dst_mac': '00:00:00:de:ad:ff',
+            9: {
+                4: {
+                    'key1': (44, 32),
+                    'key2': (23, 21),
+                    'key3': (12, 33),
                 },
             },
+        }
+
+        self.assertIsNone(helper._test_cores)
+        expected = [12, 23]
+        result = helper.test_cores
+        self.assertEqual(result, expected)
+        self.assertIs(result, helper._test_cores)
+        self.assertIs(result, helper.test_cores)
+
+    def test_get_test_type(self):
+        setup_helper = mock.MagicMock()
+        helper = ProxResourceHelper(setup_helper)
+
+        setup_helper.prox_config_data = [
+            ('global', [
+                ('name', helper.PROX_CORE_MPLS_TEST)
+            ]),
+            ('section2', [
+                ('a', 'b'),
+                ('c', 'd'),
+            ]),
+            ('core 1', []),
+            ('core 2', [
+                ('index', 8),
+                ('mode', ''),
+            ]),
+            ('core 3', [
+                ('index', 5),
+                ('mode', 'gen'),
+            ]),
+            ('core 4', [
+                ('index', 7),
+                ('mode', 'gen'),
+            ]),
         ]
-        sections_data = {
-            'port 3': [
-                ['ip', ''],
-                ['mac', 'foo'],
-                ['dst mac', ''],
-            ],
-            'port 5': [
-                ['ip', ''],
-                ['dst mac', ''],
-                ['tx port', '0'],
-                ['???', 'dofile "here" 23'],
-            ],
+        test_type = helper.get_test_type()
+        self.assertEqual(test_type, helper.PROX_CORE_MPLS_TEST)
+
+    def test_get_cores(self):
+        setup_helper = mock.MagicMock()
+        setup_helper.prox_config_data = [
+            ('section1', []),
+            ('section2', [
+                ('a', 'b'),
+                ('c', 'd'),
+            ]),
+            ('core 1', []),
+            ('core 2', [
+                ('index', 8),
+                ('mode', ''),
+            ]),
+            ('core 3', [
+                ('index', 5),
+                ('mode', 'gen'),
+            ]),
+            ('core 4', [
+                ('index', 7),
+                ('mode', 'gen'),
+            ]),
+        ]
+
+        helper = ProxResourceHelper(setup_helper)
+        helper._cpu_topology = {
+            0: {
+                1: {
+                    5: (5, 1, 0)
+                },
+                2: {
+                    6: (6, 2, 0)
+                },
+                3: {
+                    7: (7, 3, 0)
+                },
+                4: {
+                    8: (8, 3, 0)
+                },
+            }
         }
 
-        with self.assertRaises(Exception):
-            helper.generate_prox_config_file('a/b')
+        expected = [7, 8]
+        result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
+        self.assertEqual(result, expected)
 
-    def test_get_latency(self):
+    def test_get_cores_mpls(self):
         setup_helper = mock.MagicMock()
-        setup_helper.vnfd_helper.interfaces = []
+        setup_helper.prox_config_data = [
+            ('section1', []),
+            ('section2', [
+                ('a', 'b'),
+                ('c', 'd'),
+            ]),
+            ('core 1', []),
+            ('core 2', [
+                ('index', 8),
+                ('mode', ''),
+            ]),
+            ('core 3', [
+                ('index', 5),
+                ('mode', 'gen'),
+                ('name', 'tagged'),
+            ]),
+            ('core 4', [
+                ('index', 7),
+                ('mode', 'gen'),
+                ('name', 'udp'),
+            ]),
+        ]
 
         helper = ProxResourceHelper(setup_helper)
-        helper._latency_cores = []
+        helper._cpu_topology = {
+            0: {
+                1: {
+                    5: (5, 1, 0)
+                },
+                2: {
+                    6: (6, 2, 0)
+                },
+                3: {
+                    7: (7, 3, 0)
+                },
+                4: {
+                    8: (8, 3, 0)
+                },
+            }
+        }
+
+        expected_tagged = [7]
+        expected_plain = [8]
+        result_tagged, result_plain = helper.get_cores_mpls(helper.PROX_CORE_GEN_MODE)
+        self.assertEqual(result_tagged, expected_tagged)
+        self.assertEqual(result_plain, expected_plain)
+
+    def test_latency_cores(self):
+        setup_helper = mock.MagicMock()
+        setup_helper.prox_config_data= []
+
+        helper = ProxResourceHelper(setup_helper)
+        helper._cpu_topology = []
 
         expected = []
-        result = helper.get_latency()
+        result = helper.latency_cores
         self.assertEqual(result, expected)
 
-        helper._latency_cores = [1, 2]
+        setup_helper.prox_config_data = [
+            ('section1', []),
+            ('section2', [
+                ('a', 'b'),
+                ('c', 'd'),
+            ]),
+            ('core 1s3', []),
+            ('core 2s5', [
+                ('index', 8),
+                ('mode', ''),
+            ]),
+            ('core 3s1', [
+                ('index', 5),
+                ('mode', 'lat'),
+            ]),
+            ('core 4s9h', [
+                ('index', 7),
+                ('mode', 'lat'),
+            ]),
+        ]
+
+        helper = ProxResourceHelper(setup_helper)
+        helper._cpu_topology = {
+            1: {
+                3: {
+                    'key1': (23, 32),
+                    'key2': (12, 21),
+                    'key3': (44, 33),
+                },
+            },
+            9: {
+                4: {
+                    'key1': (44, 32),
+                    'key2': (23, 21),
+                    'key3': (12, 33),
+                },
+            },
+        }
+
+        self.assertIsNone(helper._latency_cores)
+        expected = [12, 23]
+        result = helper.latency_cores
+        self.assertEqual(result, expected)
+        self.assertIs(result, helper._latency_cores)
+        self.assertIs(result, helper.latency_cores)
+
+    def test_run_traffic(self):
+        setup_helper = mock.MagicMock()
+        helper = ProxResourceHelper(setup_helper)
+        traffic_proifle = mock.MagicMock(**{"done": True})
+        helper.run_traffic(traffic_proifle)
+        self.assertEqual(helper._terminated.value, 1)
+
+    def test__run_traffic_once(self):
+        setup_helper = mock.MagicMock()
+        helper = ProxResourceHelper(setup_helper)
+        traffic_proifle = mock.MagicMock(**{"done": True})
+        helper._run_traffic_once(traffic_proifle)
+        self.assertEqual(helper._terminated.value, 1)
+
+    def test_start_collect(self):
+        setup_helper = mock.MagicMock()
+        helper = 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)
+        with self.assertRaises(NotImplementedError):
+            helper.terminate()
+
+    def test_up_post(self):
+        setup_helper = mock.MagicMock()
+        helper = 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.client = mock.MagicMock()
 
-        expected = helper.sut.lat_stats()
-        result = helper.get_latency()
-        self.assertIs(result, expected)
+        expected = helper.client.my_command()
+        result = helper.execute('my_command')
+        self.assertEqual(result, expected)
 
-    def test__get_logical_if_name(self):
+        helper.client = object()
+
+        result = helper.execute('my_command')
+        self.assertIsNone(result)
+
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
+    def test_traffic_context(self, mock_time):
         setup_helper = mock.MagicMock()
         setup_helper.vnfd_helper.interfaces = []
 
         helper = ProxResourceHelper(setup_helper)
-        helper._vpci_to_if_name_map = {
-            'key1': 234,
-            'key2': 432,
+        helper._cpu_topology = {
+            0: {
+                1: {
+                    5: (5, 1, 0)
+                },
+                2: {
+                    6: (6, 2, 0)
+                },
+                3: {
+                    7: (7, 3, 0)
+                },
+                4: {
+                    8: (8, 3, 0)
+                },
+            }
+        }
+
+        setup_helper.prox_config_data = [
+            ('global', [
+                ('name', helper.PROX_CORE_MPLS_TEST)
+            ]),
+            ('section1', []),
+            ('section2', [
+                ('a', 'b'),
+                ('c', 'd'),
+            ]),
+            ('core 1', []),
+            ('core 2', [
+                ('index', 8),
+                ('mode', ''),
+            ]),
+            ('core 3', [
+                ('index', 5),
+                ('mode', 'gen'),
+                ('name', 'tagged'),
+            ]),
+            ('core 4', [
+                ('index', 7),
+                ('mode', 'gen'),
+                ('name', 'udp'),
+            ]),
+        ]
+
+
+        client = mock.MagicMock()
+        client.hz.return_value = 2
+        client.port_stats.return_value = tuple(range(12))
+
+        helper.client = client
+        helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
+
+        helper._test_cores = [3, 4]
+
+        with helper.traffic_context(64, 1):
+            pass
+
+    @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
+    def test_run_test(self, mock_time):
+        @contextmanager
+        def measure(*args, **kwargs):
+            yield stats
+
+        bad_vnfd = copy.deepcopy(self.VNFD0)
+        bad_vnfd['vdu'][0]['external-interface'].append({
+            'virtual-interface': {
+                'dst_mac': '00:00:00:00:00:05',
+                'vpci': '0000:06:00.0',
+                'local_ip': '152.16.100.20',
+                'type': 'PCI-PASSTHROUGH',
+                'vld_id': 'uplink_1',
+                'netmask': '255.255.255.0',
+                'dpdk_port_num': 0,
+                'bandwidth': '10 Gbps',
+                'driver': "i40e",
+                'dst_ip': '152.16.100.20',
+                'local_iface_name': 'xe2',
+                'local_mac': '00:00:00:00:00:07',
+                'ifname': 'xe2',
+            },
+            'vnfd-connection-point-ref': 'xe2',
+            'name': 'xe2',
+        })
+
+        bad_vnfd_helper = VnfdHelper(bad_vnfd)
+        setup_helper = mock.MagicMock()
+        setup_helper.vnfd_helper = bad_vnfd_helper
+
+        stats = {
+            'delta': TotStatsTuple(6, 7, 8, 9),
+        }
+
+        client = mock.MagicMock()
+        client.hz.return_value = 2
+        client.measure_tot_stats = measure
+        client.port_stats.return_value = tuple(range(12))
+
+        helper = ProxResourceHelper(setup_helper)
+        helper.client = client
+        helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
+
+        with self.assertRaises(AssertionError):
+            helper.run_test(980, 15, 45)
+
+        vnfd_helper = VnfdHelper(self.VNFD0)
+        setup_helper.vnfd_helper = vnfd_helper
+        helper = ProxResourceHelper(setup_helper)
+        helper.client = client
+        helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
+        helper._test_cores = [3, 4]
+
+        expected_test_data = ProxTestDataTuple(0.0, 2.0, 6, 7, 8, [3.3, 3.6, 3.8], 6, 7, 6.5e6)
+        expected_port_samples = {
+            'xe0': {'in_packets': 6, 'out_packets': 7},
+            'xe1': {'in_packets': 6, 'out_packets': 7},
         }
+        test_data, port_samples = helper.run_test(230, 60, 65)
+        self.assertTupleEqual(test_data, expected_test_data)
+        self.assertDictEqual(port_samples, expected_port_samples)
+
+    def test_get_latency(self):
+        setup_helper = mock.MagicMock()
+        setup_helper.vnfd_helper.interfaces = []
+
+        helper = ProxResourceHelper(setup_helper)
+        helper._latency_cores = []
 
-        expected = 234
-        result = helper._get_logical_if_name('key1')
+        expected = []
+        result = helper.get_latency()
         self.assertEqual(result, expected)
 
+        helper._latency_cores = [1, 2]
+        helper.client = mock.MagicMock()
+
+        expected = helper.sut.lat_stats()
+        result = helper.get_latency()
+        self.assertIs(result, expected)
+
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
     @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
     def test__connect(self, mock_socket_helper_type, mock_time):