3 # Copyright (c) 2016-2017 Intel Corporation
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
18 from itertools import repeat, chain
25 from tests.unit import STL_MOCKS
26 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
28 STLClient = mock.MagicMock()
29 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
33 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
34 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper
35 from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump
36 from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple
37 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple
38 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper
39 from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple
40 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDataHelper
41 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper
42 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper
43 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxMplsProfileHelper
44 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxBngProfileHelper
45 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxVpeProfileHelper
46 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxlwAFTRProfileHelper
49 class TestCoreTuple(unittest.TestCase):
50 def test___init__(self):
51 core_tuple = CoreSocketTuple('core 5s6')
52 self.assertEqual(core_tuple.core_id, 5)
53 self.assertEqual(core_tuple.socket_id, 6)
54 self.assertFalse(core_tuple.is_hyperthread())
56 core_tuple = CoreSocketTuple('core 5s6h')
57 self.assertEqual(core_tuple.core_id, 5)
58 self.assertEqual(core_tuple.socket_id, 6)
59 self.assertTrue(core_tuple.is_hyperthread())
61 def test___init__negative(self):
82 for bad_input in bad_inputs:
83 with self.assertRaises(ValueError):
84 CoreSocketTuple(bad_input)
86 def test_find_in_topology(self):
96 core_tuple = CoreSocketTuple('core 5s6')
99 result = core_tuple.find_in_topology(topology_in)
100 self.assertEqual(result, expected)
102 core_tuple = CoreSocketTuple('core 5s6h')
105 result = core_tuple.find_in_topology(topology_in)
106 self.assertEqual(result, expected)
108 def test_find_in_topology_negative(self):
109 core_tuple = CoreSocketTuple('core 6s5')
110 with self.assertRaises(ValueError):
112 core_tuple.find_in_topology({})
114 with self.assertRaises(ValueError):
116 core_tuple.find_in_topology({5: {}})
118 with self.assertRaises(ValueError):
119 # no first value (as needed by non-hyperthread core)
120 core_tuple.find_in_topology({5: {6: {'key1': []}}})
122 core_tuple = CoreSocketTuple('core 6s5h')
123 with self.assertRaises(ValueError):
124 # no second value (as needed by hyperthread core)
125 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
128 class TestTotStatsTuple(unittest.TestCase):
129 def test___new___negative(self):
130 with self.assertRaises(TypeError):
134 with self.assertRaises(TypeError):
135 # one, non-integer value
138 with self.assertRaises(TypeError):
140 TotStatsTuple(3, 4, 5, 6, 7)
143 class TestProxTestDataTuple(unittest.TestCase):
144 def test___init__(self):
145 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
146 self.assertEqual(prox_test_data.tolerated, 1)
147 self.assertEqual(prox_test_data.tsc_hz, 2)
148 self.assertEqual(prox_test_data.delta_rx, 3)
149 self.assertEqual(prox_test_data.delta_tx, 4)
150 self.assertEqual(prox_test_data.delta_tsc, 5)
151 self.assertEqual(prox_test_data.latency, 6)
152 self.assertEqual(prox_test_data.rx_total, 7)
153 self.assertEqual(prox_test_data.tx_total, 8)
154 self.assertEqual(prox_test_data.pps, 9)
156 def test_properties(self):
157 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
158 self.assertEqual(prox_test_data.pkt_loss, 12.5)
159 self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
160 self.assertEqual(prox_test_data.can_be_lost, 0)
161 self.assertEqual(prox_test_data.drop_total, 1)
162 self.assertFalse(prox_test_data.success)
164 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
165 self.assertTrue(prox_test_data.success)
167 def test_pkt_loss_zero_division(self):
168 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
169 self.assertEqual(prox_test_data.pkt_loss, 100.0)
171 def test_get_samples(self):
172 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
175 "Throughput": 1.6 / 1e6,
177 "CurrentDropPackets": 12.5,
178 "TxThroughput": 9 / 1e6,
179 "RxThroughput": 1.6 / 1e6,
186 result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
187 self.assertDictEqual(result, expected)
190 "Throughput": 1.6 / 1e6,
191 "DropPackets": 0.123,
192 "CurrentDropPackets": 0.123,
193 "TxThroughput": 9 / 1e6,
194 "RxThroughput": 1.6 / 1e6,
200 result = prox_test_data.get_samples(64, 0.123)
201 self.assertDictEqual(result, expected)
203 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
204 def test_log_data(self, mock_logger):
205 my_mock_logger = mock.MagicMock()
206 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
207 prox_test_data.log_data()
208 self.assertEqual(my_mock_logger.debug.call_count, 0)
209 self.assertEqual(mock_logger.debug.call_count, 2)
211 mock_logger.debug.reset_mock()
212 prox_test_data.log_data(my_mock_logger)
213 self.assertEqual(my_mock_logger.debug.call_count, 2)
214 self.assertEqual(mock_logger.debug.call_count, 0)
217 class TestPacketDump(unittest.TestCase):
220 def test__init__(self):
221 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
223 def test___str__(self):
224 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
225 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
226 self.assertEqual(str(dump1), expected)
228 def test_port_id(self):
229 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
230 self.assertEqual(p.port_id, "port_id")
232 def test_data_len(self):
233 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
234 self.assertEqual(p.data_len, len(self.PAYLOAD))
236 def test_payload(self):
237 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
238 self.assertEqual(p.payload(), self.PAYLOAD)
240 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
242 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
244 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
256 brown fox jumped over
262 PACKET_DUMP_NON_1 = """\
267 PACKET_DUMP_MIXED_1 = """\
274 PACKET_DUMP_BAD_1 = """\
279 PACKET_DUMP_BAD_2 = """\
284 PACKET_DUMP_BAD_3 = """\
290 class TestProxSocketHelper(unittest.TestCase):
293 self.mock_time_sleep = mock.patch.object(time, 'sleep').start()
295 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
296 def test___init__(self, mock_socket):
297 expected = mock_socket.socket()
298 prox = ProxSocketHelper()
300 self.assertEqual(result, expected)
302 def test_connect(self):
303 mock_sock = mock.MagicMock()
304 prox = ProxSocketHelper(mock_sock)
305 prox.connect('10.20.30.40', 23456)
306 self.assertEqual(mock_sock.connect.call_count, 1)
308 def test_get_sock(self):
309 mock_sock = mock.MagicMock()
310 prox = ProxSocketHelper(mock_sock)
311 result = prox.get_socket()
312 self.assertIs(result, mock_sock)
314 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
315 def test_get_data(self, mock_select):
316 mock_select.select.side_effect = [[1], [0]]
317 mock_socket = mock.MagicMock()
318 mock_recv = mock_socket.recv()
319 mock_recv.decode.return_value = ""
320 prox = ProxSocketHelper(mock_socket)
321 ret = prox.get_data()
322 self.assertEqual(ret, "")
323 self.assertEqual(len(prox._pkt_dumps), 0)
325 mock_select.select.reset_mock()
326 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
327 mock_recv.decode.return_value = PACKET_DUMP_1
328 ret = prox.get_data()
329 self.assertEqual(mock_select.select.call_count, 2)
330 self.assertEqual(ret, 'pktdump,3,11')
331 self.assertEqual(len(prox._pkt_dumps), 1)
333 mock_select.select.reset_mock()
334 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
335 mock_recv.decode.return_value = PACKET_DUMP_2
336 ret = prox.get_data()
337 self.assertEqual(mock_select.select.call_count, 2)
338 self.assertEqual(ret, 'jumped over')
339 self.assertEqual(len(prox._pkt_dumps), 3)
341 def test__parse_socket_data_mixed_data(self):
342 prox = ProxSocketHelper(mock.MagicMock())
343 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
344 self.assertEqual(ret, 'not_a_dump,1,2')
345 self.assertEqual(len(prox._pkt_dumps), 0)
347 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
348 self.assertEqual(ret, 'not_a_dump,1,2')
349 self.assertEqual(len(prox._pkt_dumps), 1)
351 def test__parse_socket_data_bad_data(self):
352 prox = ProxSocketHelper(mock.MagicMock())
353 with self.assertRaises(ValueError):
354 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
356 with self.assertRaises(ValueError):
357 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
359 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
360 self.assertEqual(ret, 'pktdump,3')
362 def test__parse_socket_data_pkt_dump_only(self):
363 prox = ProxSocketHelper(mock.MagicMock())
364 ret = prox._parse_socket_data('', True)
365 self.assertFalse(ret)
367 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
370 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
373 def test_put_command(self):
374 mock_socket = mock.MagicMock()
375 prox = ProxSocketHelper(mock_socket)
376 prox.put_command("data")
377 mock_socket.sendall.assert_called_once()
379 def test_put_command_socket_error(self):
380 mock_socket = mock.MagicMock()
381 mock_socket.sendall.side_effect = OSError
382 prox = ProxSocketHelper(mock_socket)
383 prox.put_command("data")
384 mock_socket.sendall.assert_called_once()
386 def test_get_packet_dump(self):
387 mock_socket = mock.MagicMock()
388 prox = ProxSocketHelper(mock_socket)
390 self.assertIsNone(prox.get_packet_dump())
392 prox._pkt_dumps = [234]
393 self.assertEqual(prox.get_packet_dump(), 234)
394 self.assertEqual(prox._pkt_dumps, [])
396 def test_stop_all_reset(self):
397 mock_socket = mock.MagicMock()
398 prox = ProxSocketHelper(mock_socket)
399 prox.stop_all_reset()
400 mock_socket.sendall.assert_called()
402 def test_stop_all(self):
403 mock_socket = mock.MagicMock()
404 prox = ProxSocketHelper(mock_socket)
406 mock_socket.sendall.assert_called()
409 mock_socket = mock.MagicMock()
410 prox = ProxSocketHelper(mock_socket)
411 prox.stop([3, 4, 5], 16)
412 mock_socket.sendall.assert_called()
414 def test_start_all(self):
415 mock_socket = mock.MagicMock()
416 prox = ProxSocketHelper(mock_socket)
418 mock_socket.sendall.assert_called()
420 def test_start(self):
421 mock_socket = mock.MagicMock()
422 prox = ProxSocketHelper(mock_socket)
423 prox.start([3, 4, 5])
424 mock_socket.sendall.assert_called()
426 def test_reset_stats(self):
427 mock_socket = mock.MagicMock()
428 prox = ProxSocketHelper(mock_socket)
430 mock_socket.sendall.assert_called()
432 def test_set_pkt_size(self):
433 mock_socket = mock.MagicMock()
434 prox = ProxSocketHelper(mock_socket)
435 prox.set_pkt_size([3, 4, 5], 1024)
436 self.assertEqual(mock_socket.sendall.call_count, 3)
438 def test_set_value(self):
439 mock_socket = mock.MagicMock()
440 prox = ProxSocketHelper(mock_socket)
441 prox.set_value([3, 4, 5], 10, 20, 30)
442 self.assertEqual(mock_socket.sendall.call_count, 3)
444 def test_reset_values(self):
445 mock_socket = mock.MagicMock()
446 prox = ProxSocketHelper(mock_socket)
447 prox.reset_values([3, 4, 5])
448 self.assertEqual(mock_socket.sendall.call_count, 3)
450 def test_set_speed(self):
451 mock_socket = mock.MagicMock()
452 prox = ProxSocketHelper(mock_socket)
453 prox.set_speed([3, 4, 5], 1000)
454 self.assertEqual(mock_socket.sendall.call_count, 3)
456 def test_slope_speed(self):
463 'cores': [9, 10, 11],
468 mock_socket = mock.MagicMock()
469 prox = ProxSocketHelper(mock_socket)
470 prox.set_speed = set_speed = mock.MagicMock()
471 prox.slope_speed(core_data, 5)
472 self.assertEqual(set_speed.call_count, 20)
474 set_speed.reset_mock()
475 prox.slope_speed(core_data, 5, 5)
476 self.assertEqual(set_speed.call_count, 10)
478 def test_set_pps(self):
479 mock_socket = mock.MagicMock()
480 prox = ProxSocketHelper(mock_socket)
481 prox.set_pps([3, 4, 5], 1000, 512)
482 self.assertEqual(mock_socket.sendall.call_count, 3)
484 def test_lat_stats(self):
486 '1, 2 , 3', # has white space
488 '7,8,9,10.5,11', # too long with float, but float is in unused portion
489 'twelve,13,14', # value as English word
490 '15,16.2,17', # float in used portion
493 mock_socket = mock.MagicMock()
494 prox = ProxSocketHelper(mock_socket)
495 prox.get_data = mock.MagicMock(side_effect=latency_output)
511 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
512 self.assertEqual(mock_socket.sendall.call_count, 5)
513 self.assertEqual(result, expected)
515 def test_get_all_tot_stats_error(self):
516 mock_socket = mock.MagicMock()
517 prox = ProxSocketHelper(mock_socket)
518 prox.get_data = mock.MagicMock(return_value='3,4,5')
519 expected = [0, 0, 0, 0]
520 result = prox.get_all_tot_stats()
521 self.assertEqual(result, expected)
523 def test_get_all_tot_stats(self):
524 mock_socket = mock.MagicMock()
525 prox = ProxSocketHelper(mock_socket)
526 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
527 expected = 3, 4, 5, 6
528 result = prox.get_all_tot_stats()
529 self.assertEqual(result, expected)
532 mock_socket = mock.MagicMock()
533 prox = ProxSocketHelper(mock_socket)
534 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
537 self.assertEqual(result, expected)
539 def test_core_stats(self):
546 mock_socket = mock.MagicMock()
547 prox = ProxSocketHelper(mock_socket)
548 prox.get_data = mock.MagicMock(side_effect=core_stats)
549 expected = 21, 24, 27, 14
550 result = prox.core_stats([3, 4, 5], 16)
551 self.assertEqual(result, expected)
553 def test_port_stats(self):
555 ','.join(str(n) for n in range(3, 15)),
556 ','.join(str(n) for n in range(8, 32, 2)),
557 ','.join(str(n) for n in range(5, 89, 7)),
560 mock_socket = mock.MagicMock()
561 prox = ProxSocketHelper(mock_socket)
562 prox.get_data = mock.MagicMock(side_effect=port_stats)
563 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
564 result = prox.port_stats([3, 4, 5])
565 self.assertEqual(result, expected)
567 def test_measure_tot_stats(self):
568 start_tot = 3, 4, 5, 6
569 end_tot = 7, 9, 11, 13
570 delta_tot = 4, 5, 6, 7
573 ','.join(str(n) for n in start_tot),
574 ','.join(str(n) for n in end_tot),
577 mock_socket = mock.MagicMock()
578 prox = ProxSocketHelper(mock_socket)
579 prox.get_data = mock.MagicMock(side_effect=get_data_output)
581 'start_tot': start_tot,
585 with prox.measure_tot_stats() as result:
587 self.assertEqual(result, expected)
589 def test_tot_stats(self):
590 mock_socket = mock.MagicMock()
591 prox = ProxSocketHelper(mock_socket)
592 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
594 result = prox.tot_stats()
595 self.assertEqual(result, expected)
597 def test_tot_ierrors(self):
598 mock_socket = mock.MagicMock()
599 prox = ProxSocketHelper(mock_socket)
600 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
602 result = prox.tot_ierrors()
603 self.assertEqual(result, expected)
605 def test_set_count(self):
606 mock_socket = mock.MagicMock()
607 prox = ProxSocketHelper(mock_socket)
608 prox.set_count(432, [3, 4, 5])
609 self.assertEqual(mock_socket.sendall.call_count, 3)
611 def test_dump_rx(self):
612 mock_socket = mock.MagicMock()
613 prox = ProxSocketHelper(mock_socket)
614 prox.dump_rx(3, 5, 8)
615 self.assertEqual(mock_socket.sendall.call_count, 1)
618 mock_socket = mock.MagicMock()
619 prox = ProxSocketHelper(mock_socket)
621 mock_socket.sendall.assert_called()
623 def test_force_quit(self):
624 mock_socket = mock.MagicMock()
625 prox = ProxSocketHelper(mock_socket)
627 mock_socket.sendall.assert_called()
630 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
633 'short-name': 'ProxVnf',
638 'network': '152.16.100.20',
639 'netmask': '255.255.255.0',
640 'gateway': '152.16.100.20',
644 'network': '152.16.40.20',
645 'netmask': '255.255.255.0',
646 'gateway': '152.16.40.20',
650 'description': 'PROX approximation using DPDK',
651 'name': 'proxvnf-baremetal',
654 'network': '0064:ff9b:0:0:0:0:9810:6414',
656 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
660 'network': '0064:ff9b:0:0:0:0:9810:2814',
662 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
666 'id': 'proxvnf-baremetal',
667 'external-interface': [
669 'virtual-interface': {
670 'dst_mac': '00:00:00:00:00:04',
671 'vpci': '0000:05:00.0',
672 'local_ip': '152.16.100.19',
673 'type': 'PCI-PASSTHROUGH',
674 'vld_id': 'uplink_0',
675 'netmask': '255.255.255.0',
677 'bandwidth': '10 Gbps',
679 'dst_ip': '152.16.100.19',
680 'local_iface_name': 'xe0',
681 'local_mac': '00:00:00:00:00:02',
684 'vnfd-connection-point-ref': 'xe0',
688 'virtual-interface': {
689 'dst_mac': '00:00:00:00:00:03',
690 'vpci': '0000:05:00.1',
691 'local_ip': '152.16.40.19',
692 'type': 'PCI-PASSTHROUGH',
693 'vld_id': 'downlink_0',
695 'netmask': '255.255.255.0',
697 'bandwidth': '10 Gbps',
698 'dst_ip': '152.16.40.20',
699 'local_iface_name': 'xe1',
700 'local_mac': '00:00:00:00:00:01',
703 'vnfd-connection-point-ref': 'xe1',
709 'description': 'PROX approximation using DPDK',
711 'vdu-id': 'proxvnf-baremetal',
724 'id': 'ProxApproxVnf',
729 'vnfd:vnfd-catalog': {
736 def test_global_section(self):
737 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
740 setup_helper._prox_config_data = [('a', [])]
742 with self.assertRaises(KeyError):
743 _ = setup_helper.global_section
747 ('not_name', 'other data'),
748 ('name_not', 'more data'),
749 ('name', 'prox type'),
753 setup_helper._prox_config_data = [
782 result = setup_helper.global_section
783 self.assertEqual(result, global_section[1])
785 def test_find_in_section(self):
786 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
789 setup_helper._prox_config_data = [
791 ('not_name', 'other data'),
792 ('name_not', 'more data'),
793 ('name', 'prox type'),
823 result = setup_helper.find_in_section('section3', 'key3')
824 self.assertEqual(result, expected)
826 expected = 'default value'
827 result = setup_helper.find_in_section('section3', 'key4', 'default value')
828 self.assertEqual(result, expected)
830 with self.assertRaises(KeyError):
831 setup_helper.find_in_section('section4', 'key1')
833 with self.assertRaises(KeyError):
834 setup_helper.find_in_section('section1', 'key1')
836 def test__replace_quoted_with_value(self):
840 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
841 self.assertEqual(result, expected)
843 # no quoted substring
844 input_str = 'lion tiger bear'
845 expected = 'lion tiger bear'
846 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
847 self.assertEqual(result, expected)
849 # partially quoted substring
850 input_str = 'lion "tiger bear'
851 expected = 'lion "tiger bear'
852 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
853 self.assertEqual(result, expected)
855 # one quoted substring
856 input_str = 'lion "tiger" bear'
857 expected = 'lion "cat" bear'
858 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
859 self.assertEqual(result, expected)
861 # two quoted substrings
862 input_str = 'lion "tiger" bear "shark" whale'
863 expected = 'lion "cat" bear "shark" whale'
864 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
865 self.assertEqual(result, expected)
867 # two quoted substrings, both replaced
868 input_str = 'lion "tiger" bear "shark" whale'
869 expected = 'lion "cat" bear "cat" whale'
870 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
871 self.assertEqual(result, expected)
873 def test__get_tx_port(self):
875 input_data = {'section1': []}
877 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
878 self.assertEqual(result, expected)
880 # data for other section
889 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
890 self.assertEqual(result, expected)
893 input_data['section1'] = section1 = [
894 ('rx port', '4', 'more', 432),
898 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
899 self.assertEqual(result, expected)
901 # more data for section,
904 ('tx port', '1', 'and more', 234),
907 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
908 self.assertEqual(result, expected)
910 def test_write_prox_config(self):
913 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
914 self.assertEqual(result, expected)
922 expected = '[section1]'
923 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
924 self.assertEqual(result, expected)
935 ['__name__', 'not this one'],
938 ['key4', 'multi-line\nvalue'],
942 expected = os.linesep.join([
948 'key4=multi-line\n\tvalue',
950 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
951 self.assertEqual(result, expected)
953 def test_prox_config_data(self):
954 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
957 setup_helper.config_queue = config_queue = mock.MagicMock()
958 config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])]
960 result = setup_helper.prox_config_data
961 self.assertEqual(result, expected)
963 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
964 def test_build_config_file_no_additional_file(self, mock_find_path):
966 'prox_args': {'-c': ""},
968 'prox_config': 'e/f',
969 'prox_generate_parameter': False,
972 mock_find_path.side_effect = ['1', '2']
974 vnfd_helper = mock.MagicMock()
975 ssh_helper = mock.MagicMock()
976 scenario_helper = ScenarioHelper('vnf1')
977 scenario_helper.scenario_cfg = {
984 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
985 helper.copy_to_target = mock.MagicMock(return_value='3')
986 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
987 helper.upload_prox_config = mock.MagicMock(return_value='5')
989 self.assertEqual(helper.additional_files, {})
990 self.assertNotEqual(helper._prox_config_data, '4')
991 self.assertNotEqual(helper.remote_path, '5')
992 helper.build_config_file()
993 self.assertEqual(helper.additional_files, {})
994 self.assertEqual(helper._prox_config_data, '4')
995 self.assertEqual(helper.remote_path, '5')
997 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
998 def test_build_config_file_additional_file_string(self, mock_find_path):
1000 'prox_args': {'-c': ""},
1002 'prox_config': 'e/f',
1003 'prox_files': 'g/h.i',
1004 'prox_generate_parameter': True,
1007 mock_find_path.side_effect = ['1', '2']
1008 vnfd_helper = mock.MagicMock()
1009 ssh_helper = mock.MagicMock()
1010 scenario_helper = ScenarioHelper('vnf1')
1011 scenario_helper.scenario_cfg = {
1018 vnfd_helper.port_pairs.all_ports = ['xe0', 'xe1', 'xe2', 'xe3']
1019 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1020 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1021 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1022 helper.upload_prox_config = mock.MagicMock(return_value='55')
1024 self.assertEqual(helper.additional_files, {})
1025 expected = {'h.i': '33'}
1026 helper.build_config_file()
1027 self.assertDictEqual(helper.additional_files, expected)
1029 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1030 def test_build_config_file_additional_file(self, mock_find_path):
1032 'prox_args': {'-c': ""},
1034 'prox_config': 'e/f',
1042 mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))]
1043 vnfd_helper = mock.MagicMock()
1044 ssh_helper = mock.MagicMock()
1045 scenario_helper = ScenarioHelper('vnf1')
1046 scenario_helper.scenario_cfg = {
1053 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1054 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1055 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1056 helper.upload_prox_config = mock.MagicMock(return_value='55')
1058 self.assertEqual(helper.additional_files, {})
1059 self.assertNotEqual(helper._prox_config_data, '44')
1060 self.assertNotEqual(helper.remote_path, '55')
1061 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
1062 helper.build_config_file()
1063 self.assertDictEqual(helper.additional_files, expected)
1064 self.assertEqual(helper._prox_config_data, '44')
1065 self.assertEqual(helper.remote_path, '55')
1067 def test_build_config(self):
1069 'prox_args': {'-f': ""},
1070 'prox_path': '/opt/nsb_bin/prox',
1071 'prox_config': 'configs/gen_l2fwd-2.cfg',
1079 vnfd_helper = mock.Mock()
1080 ssh_helper = mock.Mock()
1081 ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/prox'
1082 scenario_helper = ScenarioHelper('vnf1')
1083 scenario_helper.scenario_cfg = {
1090 expected = ("sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli "
1091 "-f -f /tmp/prox.cfg '")
1093 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper,
1095 with mock.patch.object(helper, 'build_config_file') as mock_cfg_file:
1096 helper.remote_path = '/tmp/prox.cfg'
1097 prox_cmd = helper.build_config()
1098 self.assertEqual(prox_cmd, expected)
1099 mock_cfg_file.assert_called_once()
1101 def test__insert_additional_file(self):
1102 vnfd_helper = mock.MagicMock()
1103 ssh_helper = mock.MagicMock()
1104 scenario_helper = mock.MagicMock()
1106 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1107 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1108 res = helper._insert_additional_file('dofile("ipv4.lua")')
1109 self.assertEqual(res, 'dofile("/tmp/ipv4.lua")')
1111 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1112 def test_generate_prox_config_file(self, mock_parser_type):
1115 args[-1].extend(sections_data)
1116 return mock.MagicMock()
1120 mock_parser_type.side_effect = init
1122 vnfd_helper = VnfdHelper(self.VNFD0)
1123 ssh_helper = mock.MagicMock()
1124 scenario_helper = mock.MagicMock()
1126 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1127 helper.additional_files = {}
1130 result = helper.generate_prox_config_file('a/b')
1131 self.assertEqual(result, expected)
1133 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1135 helper.remote_prox_file_name = 'remote'
1140 ['dofile("ipv4.lua")', ''],
1156 ['$sut_mac0', '@@dst_mac0'],
1159 ['user_table', 'dofile("ipv4.lua")'],
1160 ['missing_addtional_file', 'dofile("nosuch")'],
1169 ['dofile("/tmp/ipv4.lua")', ''],
1176 ['mac', 'hardware'],
1177 ['dst mac', '00:00:00:00:00:03'],
1185 ['$sut_mac0', '00 00 00 00 00 04'],
1188 ['user_table', 'dofile("/tmp/ipv4.lua")'],
1189 ['missing_addtional_file', 'dofile("nosuch")'],
1193 result = helper.generate_prox_config_file('/c/d/e')
1194 self.assertEqual(result, expected, str(result))
1196 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1197 def test_generate_prox_config_file_negative(self, mock_parser_type):
1199 args[-1].update(sections_data)
1200 return mock.MagicMock()
1204 mock_parser_type.side_effect = init
1206 vnfd_helper = mock.MagicMock()
1207 vnfd_helper.interfaces = []
1208 ssh_helper = mock.MagicMock()
1209 scenario_helper = mock.MagicMock()
1211 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1212 helper.additional_files = {}
1213 helper.remote_prox_file_name = 'remote'
1214 vnfd_helper.interfaces = [
1216 'virtual-interface': {
1218 'dst_mac': '00:00:00:de:ad:88',
1222 'virtual-interface': {
1224 'dst_mac': '00:00:00:de:ad:ff',
1228 'virtual-interface': {
1230 'dst_mac': '00:00:00:de:ad:ff',
1244 ['???', 'dofile "here" 23'],
1248 with self.assertRaises(Exception):
1249 helper.generate_prox_config_file('a/b')
1251 def test_put_string_to_file(self):
1252 vnfd_helper = mock.MagicMock()
1253 vnfd_helper.interfaces = []
1254 ssh_helper = mock.MagicMock()
1255 scenario_helper = mock.MagicMock()
1257 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1260 result = helper.put_string_to_file('my long string', 'a/b')
1261 self.assertEqual(result, expected)
1263 def test_copy_to_target(self):
1264 vnfd_helper = mock.MagicMock()
1265 vnfd_helper.interfaces = []
1266 ssh_helper = mock.MagicMock()
1267 scenario_helper = mock.MagicMock()
1269 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1271 result = helper.copy_to_target('a/b', 'c')
1272 self.assertEqual(result, expected)
1274 def test_upload_prox_config(self):
1275 vnfd_helper = mock.MagicMock()
1276 vnfd_helper.interfaces = []
1277 ssh_helper = mock.MagicMock()
1278 scenario_helper = mock.MagicMock()
1280 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1281 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1283 result = helper.upload_prox_config('a', {})
1284 self.assertEqual(result, expected)
1287 class TestProxResourceHelper(unittest.TestCase):
1290 'short-name': 'ProxVnf',
1295 'network': '152.16.100.20',
1296 'netmask': '255.255.255.0',
1297 'gateway': '152.16.100.20',
1301 'network': '152.16.40.20',
1302 'netmask': '255.255.255.0',
1303 'gateway': '152.16.40.20',
1307 'description': 'PROX approximation using DPDK',
1308 'name': 'proxvnf-baremetal',
1311 'network': '0064:ff9b:0:0:0:0:9810:6414',
1313 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1317 'network': '0064:ff9b:0:0:0:0:9810:2814',
1319 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1323 'id': 'proxvnf-baremetal',
1324 'external-interface': [
1326 'virtual-interface': {
1327 'dst_mac': '00:00:00:00:00:04',
1328 'vpci': '0000:05:00.0',
1329 'local_ip': '152.16.100.19',
1330 'type': 'PCI-PASSTHROUGH',
1331 'vld_id': 'uplink_0',
1332 'netmask': '255.255.255.0',
1334 'bandwidth': '10 Gbps',
1336 'dst_ip': '152.16.100.19',
1337 'local_iface_name': 'xe0',
1338 'local_mac': '00:00:00:00:00:02',
1341 'vnfd-connection-point-ref': 'xe0',
1345 'virtual-interface': {
1346 'dst_mac': '00:00:00:00:00:03',
1347 'vpci': '0000:05:00.1',
1348 'local_ip': '152.16.40.19',
1349 'type': 'PCI-PASSTHROUGH',
1350 'vld_id': 'downlink_0',
1352 'netmask': '255.255.255.0',
1354 'bandwidth': '10 Gbps',
1355 'dst_ip': '152.16.40.20',
1356 'local_iface_name': 'xe1',
1357 'local_mac': '00:00:00:00:00:01',
1360 'vnfd-connection-point-ref': 'xe1',
1366 'description': 'PROX approximation using DPDK',
1368 'vdu-id': 'proxvnf-baremetal',
1381 'id': 'ProxApproxVnf',
1386 'vnfd:vnfd-catalog': {
1393 def test_find_pci(self):
1399 result = ProxResourceHelper.find_pci('target', input_str_list)
1400 self.assertFalse(result)
1408 result = ProxResourceHelper.find_pci('target', input_str_list)
1409 self.assertTrue(result)
1411 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1412 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1413 def test_sut(self, *args):
1414 helper = ProxResourceHelper(mock.MagicMock())
1415 self.assertIsNone(helper.client)
1417 self.assertIsNotNone(result)
1418 self.assertIs(result, helper.client)
1419 self.assertIs(result, helper.sut)
1421 def test_test_type(self):
1422 setup_helper = mock.MagicMock()
1423 setup_helper.find_in_section.return_value = expected = 'prox type'
1425 helper = ProxResourceHelper(setup_helper)
1427 self.assertIsNone(helper._test_type)
1428 self.assertEqual(helper.test_type, expected)
1429 self.assertEqual(helper._test_type, expected)
1430 self.assertEqual(helper.test_type, expected)
1432 def test_collect_collectd_kpi(self):
1433 helper = ProxResourceHelper(mock.MagicMock())
1434 helper.resource = resource = mock.MagicMock()
1436 resource.check_if_sa_running.return_value = 0, '1234'
1437 resource.amqp_collect_nfvi_kpi.return_value = 543
1438 resource.check_if_sa_running.return_value = (0, None)
1440 expected = {'core': 543}
1441 result = helper.collect_collectd_kpi()
1442 self.assertDictEqual(result, expected)
1444 def test_collect_kpi(self):
1445 helper = ProxResourceHelper(mock.MagicMock())
1446 helper._queue = queue = mock.MagicMock()
1447 helper._result = {'z': 123}
1448 helper.resource = resource = mock.MagicMock()
1450 resource.check_if_sa_running.return_value = 0, '1234'
1451 resource.amqp_collect_nfvi_kpi.return_value = 543
1452 resource.check_if_sa_running.return_value = (0, None)
1454 queue.empty.return_value = False
1455 queue.get.return_value = {'a': 789}
1457 expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
1458 result = helper.collect_kpi()
1459 self.assertDictEqual(result, expected)
1461 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1462 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1463 def test__connect(self, mock_socket_helper_type, *args):
1464 client = mock_socket_helper_type()
1465 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1467 setup_helper = mock.MagicMock()
1468 setup_helper.vnfd_helper.interfaces = []
1470 helper = ProxResourceHelper(setup_helper)
1472 result = helper._connect()
1473 self.assertIs(result, client)
1475 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1477 with self.assertRaises(Exception):
1480 def test_run_traffic(self):
1481 setup_helper = mock.MagicMock()
1482 helper = ProxResourceHelper(setup_helper)
1483 traffic_profile = mock.MagicMock(**{"done": True})
1484 helper.run_traffic(traffic_profile)
1485 self.assertEqual(helper._terminated.value, 1)
1487 def test__run_traffic_once(self):
1488 setup_helper = mock.MagicMock()
1489 helper = ProxResourceHelper(setup_helper)
1490 traffic_profile = mock.MagicMock(**{"done": True})
1491 helper._run_traffic_once(traffic_profile)
1492 self.assertEqual(helper._terminated.value, 1)
1494 def test_start_collect(self):
1495 setup_helper = mock.MagicMock()
1496 helper = ProxResourceHelper(setup_helper)
1497 helper.resource = resource = mock.MagicMock()
1498 self.assertIsNone(helper.start_collect())
1499 resource.start.assert_called_once()
1501 def test_terminate(self):
1502 setup_helper = mock.MagicMock()
1503 helper = ProxResourceHelper(setup_helper)
1504 with self.assertRaises(NotImplementedError):
1507 def test_up_post(self):
1508 setup_helper = mock.MagicMock()
1509 helper = ProxResourceHelper(setup_helper)
1510 helper.client = expected = mock.MagicMock()
1511 result = helper.up_post()
1512 self.assertEqual(result, expected)
1514 def test_execute(self):
1515 setup_helper = mock.MagicMock()
1516 helper = ProxResourceHelper(setup_helper)
1517 helper.client = mock.MagicMock()
1519 expected = helper.client.my_command()
1520 result = helper.execute('my_command')
1521 self.assertEqual(result, expected)
1523 helper.client = object()
1525 result = helper.execute('my_command')
1526 self.assertIsNone(result)
1529 class TestProxDataHelper(unittest.TestCase):
1531 def test_totals_and_pps(self):
1533 vnfd_helper = mock.MagicMock()
1534 vnfd_helper.port_pairs.all_ports = list(range(4))
1536 sut = mock.MagicMock()
1537 sut.port_stats.return_value = list(range(10))
1539 data_helper = ProxDataHelper(vnfd_helper, sut, pkt_size, 25, None)
1541 self.assertEqual(data_helper.rx_total, 6)
1542 self.assertEqual(data_helper.tx_total, 7)
1543 self.assertEqual(data_helper.pps, 6.25e6)
1545 def test_samples(self):
1546 vnfd_helper = mock.MagicMock()
1547 vnfd_helper.port_pairs.all_ports = list(range(4))
1548 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1550 sut = mock.MagicMock()
1551 sut.port_stats.return_value = list(range(10))
1553 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1565 result = data_helper.samples
1566 self.assertDictEqual(result, expected)
1568 def test___enter__(self):
1569 vnfd_helper = mock.MagicMock()
1570 vnfd_helper.port_pairs.all_ports = list(range(4))
1571 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1573 sut = mock.MagicMock()
1574 sut.port_stats.return_value = list(range(10))
1576 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1577 data_helper._totals_and_pps = 12, 32, 4.5
1578 data_helper.tsc_hz = 9.8
1579 data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)}
1580 data_helper.latency = 7
1582 self.assertIsNone(data_helper.result_tuple)
1584 expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5)
1588 result = data_helper.result_tuple
1589 self.assertEqual(result, expected)
1591 data_helper.make_tuple()
1592 self.assertIs(data_helper.result_tuple, result)
1594 def test___enter___negative(self):
1595 vnfd_helper = mock.MagicMock()
1597 data_helper = ProxDataHelper(vnfd_helper, None, None, None, None)
1599 vnfd_helper.port_pairs.all_ports = []
1600 with self.assertRaises(AssertionError):
1604 vnfd_helper.port_pairs.all_ports = [0, 1, 2]
1605 with self.assertRaises(AssertionError):
1609 def test_measure_tot_stats(self):
1610 vnfd_helper = mock.MagicMock()
1611 vnfd_helper.port_pairs.all_ports = list(range(4))
1613 start = (3, 4, 1, 2)
1616 sut = ProxSocketHelper(mock.MagicMock())
1617 sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end])
1619 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1621 self.assertIsNone(data_helper.measured_stats)
1626 'delta': TotStatsTuple(6, 3, 5, 6),
1628 with data_helper.measure_tot_stats():
1631 self.assertEqual(data_helper.measured_stats, expected)
1633 def test_capture_tsc_hz(self):
1634 vnfd_helper = mock.MagicMock()
1635 vnfd_helper.port_pairs.all_ports = list(range(4))
1637 sut = mock.MagicMock()
1638 sut.hz.return_value = '54.6'
1640 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1642 self.assertIsNone(data_helper.tsc_hz)
1645 data_helper.capture_tsc_hz()
1646 self.assertEqual(data_helper.tsc_hz, expected)
1649 class TestProxProfileHelper(unittest.TestCase):
1651 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1652 def test_get_cls(self, mock_utils):
1653 mock_type1 = mock.MagicMock()
1654 mock_type1.__prox_profile_type__ = 'another_type'
1655 mock_type2 = mock.MagicMock()
1656 mock_type2.__prox_profile_type__ = 'my_type'
1657 mock_utils.itersubclasses.return_value = [mock_type1, mock_type2]
1659 self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2)
1661 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1662 def test_get_cls_default(self, mock_utils):
1663 mock_utils.itersubclasses.return_value = []
1664 ProxProfileHelper.get_cls('my_type')
1666 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1667 def test_cpu_topology(self, mock_socket_topology):
1668 mock_socket_topology.parse_cpuinfo.return_value = 432
1670 resource_helper = mock.MagicMock()
1671 resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1673 helper = ProxProfileHelper(resource_helper)
1674 self.assertIsNone(helper._cpu_topology)
1675 result = helper.cpu_topology
1676 self.assertEqual(result, 432)
1677 self.assertIs(result, helper._cpu_topology)
1678 self.assertIs(result, helper.cpu_topology)
1680 def test_test_cores(self):
1681 resource_helper = mock.MagicMock()
1682 resource_helper.setup_helper.prox_config_data = []
1684 helper = ProxProfileHelper(resource_helper)
1685 helper._cpu_topology = []
1688 result = helper.test_cores
1689 self.assertEqual(result, expected)
1691 resource_helper.setup_helper.prox_config_data = [
1712 helper = ProxProfileHelper(resource_helper)
1713 helper._cpu_topology = {
1730 self.assertIsNone(helper._test_cores)
1732 result = helper.test_cores
1733 self.assertEqual(result, expected)
1734 self.assertIs(result, helper._test_cores)
1735 self.assertIs(result, helper.test_cores)
1737 def test_latency_cores(self):
1738 resource_helper = mock.MagicMock()
1739 resource_helper.setup_helper.prox_config_data = []
1741 helper = ProxProfileHelper(resource_helper)
1742 helper._cpu_topology = []
1745 result = helper.latency_cores
1746 self.assertEqual(result, expected)
1748 resource_helper.setup_helper.prox_config_data = [
1769 helper = ProxProfileHelper(resource_helper)
1770 helper._cpu_topology = {
1787 self.assertIsNone(helper._latency_cores)
1789 result = helper.latency_cores
1790 self.assertEqual(result, expected)
1791 self.assertIs(result, helper._latency_cores)
1792 self.assertIs(result, helper.latency_cores)
1794 def test_all_rx_cores(self):
1795 helper = ProxBngProfileHelper(mock.MagicMock())
1796 helper._latency_cores = expected = [3, 4, 6]
1797 helper._test_cores = [5, 2, 1]
1799 result = helper.all_rx_cores
1800 self.assertEqual(result, expected)
1802 def test_get_cores(self):
1803 resource_helper = mock.MagicMock()
1804 resource_helper.setup_helper.prox_config_data = [
1825 helper = ProxProfileHelper(resource_helper)
1826 helper._cpu_topology = {
1844 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1845 self.assertEqual(result, expected)
1847 def test_get_latency(self):
1848 resource_helper = mock.MagicMock()
1849 resource_helper.setup_helper.vnfd_helper.interfaces = []
1851 helper = ProxProfileHelper(resource_helper)
1852 helper._latency_cores = []
1855 result = helper.get_latency()
1856 self.assertEqual(result, expected)
1858 helper._latency_cores = [1, 2]
1859 helper.client = mock.MagicMock()
1861 expected = helper.sut.lat_stats()
1862 result = helper.get_latency()
1863 self.assertIs(result, expected)
1865 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1866 def test_traffic_context(self, *args):
1867 setup_helper = mock.MagicMock()
1868 setup_helper.vnfd_helper.interfaces = []
1870 helper = ProxProfileHelper(setup_helper)
1871 helper._cpu_topology = {
1888 setup_helper.prox_config_data = [
1890 ('not_name', 'other data'),
1891 ('name_not', 'more data'),
1892 ('name', helper.__prox_profile_type__),
1916 client = mock.MagicMock()
1917 client.hz.return_value = 2
1918 client.port_stats.return_value = tuple(range(12))
1920 helper.client = client
1921 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1923 helper._test_cores = [3, 4]
1925 with helper.traffic_context(64, 1):
1928 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1929 def test_run_test(self, _):
1930 resource_helper = mock.MagicMock()
1931 resource_helper.step_delta = 0.4
1932 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
1933 resource_helper.sut.port_stats.return_value = list(range(10))
1935 helper = ProxProfileHelper(resource_helper)
1937 helper.run_test(120, 5, 6.5)
1940 class TestProxMplsProfileHelper(unittest.TestCase):
1942 def test_mpls_cores(self):
1943 resource_helper = mock.MagicMock()
1944 resource_helper.setup_helper.prox_config_data = [
1967 helper = ProxMplsProfileHelper(resource_helper)
1968 helper._cpu_topology = {
1985 expected_tagged = [7]
1986 expected_plain = [8]
1987 self.assertIsNone(helper._cores_tuple)
1988 self.assertEqual(helper.tagged_cores, expected_tagged)
1989 self.assertEqual(helper.plain_cores, expected_plain)
1990 self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain))
1992 def test_traffic_context(self):
1993 setup_helper = mock.MagicMock()
1994 helper = ProxMplsProfileHelper(setup_helper)
1996 with helper.traffic_context(120, 5.4):
2000 class TestProxBngProfileHelper(unittest.TestCase):
2002 def test_bng_cores(self):
2003 resource_helper = mock.MagicMock()
2004 resource_helper.setup_helper.prox_config_data = [
2028 ('name', 'arp_task'),
2037 helper = ProxBngProfileHelper(resource_helper)
2038 helper._cpu_topology = {
2063 expected_arp = [4, 3]
2064 expected_arp_task = [0, 4]
2065 expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task)
2067 self.assertIsNone(helper._cores_tuple)
2068 self.assertEqual(helper.cpe_cores, expected_cpe)
2069 self.assertEqual(helper.inet_cores, expected_inet)
2070 self.assertEqual(helper.arp_cores, expected_arp)
2071 self.assertEqual(helper.arp_task_cores, expected_arp_task)
2072 self.assertEqual(helper._cores_tuple, expected_combined)
2074 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2075 def test_run_test(self, _):
2076 resource_helper = mock.MagicMock()
2077 resource_helper.step_delta = 0.4
2078 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2079 resource_helper.sut.port_stats.return_value = list(range(10))
2081 helper = ProxBngProfileHelper(resource_helper)
2083 helper.run_test(120, 5, 6.5)
2084 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2087 class TestProxVpeProfileHelper(unittest.TestCase):
2089 def test_vpe_cores(self):
2090 resource_helper = mock.MagicMock()
2091 resource_helper.setup_helper.prox_config_data = [
2114 helper = ProxVpeProfileHelper(resource_helper)
2115 helper._cpu_topology = {
2134 expected_combined = (expected_cpe, expected_inet)
2136 self.assertIsNone(helper._cores_tuple)
2137 self.assertEqual(helper.cpe_cores, expected_cpe)
2138 self.assertEqual(helper.inet_cores, expected_inet)
2139 self.assertEqual(helper._cores_tuple, expected_combined)
2141 def test_vpe_ports(self):
2142 resource_helper = mock.MagicMock()
2143 resource_helper.setup_helper.prox_config_data = [
2152 ('mac', 'hardware'),
2157 ('mac', 'hardware'),
2161 helper = ProxVpeProfileHelper(resource_helper)
2162 helper._port_list = {
2181 expected_combined = (expected_cpe, expected_inet)
2183 self.assertIsNone(helper._ports_tuple)
2184 self.assertEqual(helper.cpe_ports, expected_cpe)
2185 self.assertEqual(helper.inet_ports, expected_inet)
2186 self.assertEqual(helper._ports_tuple, expected_combined)
2188 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2189 def test_run_test(self, _):
2190 resource_helper = mock.MagicMock()
2191 resource_helper.step_delta = 0.4
2192 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2193 resource_helper.sut.port_stats.return_value = list(range(10))
2195 helper = ProxVpeProfileHelper(resource_helper)
2197 helper.run_test(120, 5, 6.5)
2198 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2201 class TestProxlwAFTRProfileHelper(unittest.TestCase):
2203 def test_lwaftr_cores(self):
2204 resource_helper = mock.MagicMock()
2205 resource_helper.setup_helper.prox_config_data = [
2228 helper = ProxlwAFTRProfileHelper(resource_helper)
2229 helper._cpu_topology = {
2248 expected_combined = (expected_tun, expected_inet)
2250 self.assertIsNone(helper._cores_tuple)
2251 self.assertEqual(helper.tun_cores, expected_tun)
2252 self.assertEqual(helper.inet_cores, expected_inet)
2253 self.assertEqual(helper._cores_tuple, expected_combined)
2255 def test_tun_ports(self):
2256 resource_helper = mock.MagicMock()
2257 resource_helper.setup_helper.prox_config_data = [
2266 ('mac', 'hardware'),
2271 ('mac', 'hardware'),
2275 helper = ProxlwAFTRProfileHelper(resource_helper)
2276 helper._port_list = {
2295 expected_combined = (expected_tun, expected_inet)
2297 self.assertIsNone(helper._ports_tuple)
2298 self.assertEqual(helper.tun_ports, expected_tun)
2299 self.assertEqual(helper.inet_ports, expected_inet)
2300 self.assertEqual(helper._ports_tuple, expected_combined)
2302 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2303 def test_run_test(self, _):
2304 resource_helper = mock.MagicMock()
2305 resource_helper.step_delta = 0.4
2306 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2307 resource_helper.sut.port_stats.return_value = list(range(10))
2309 helper = ProxlwAFTRProfileHelper(resource_helper)
2311 helper.run_test(120, 5, 6.5)
2312 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1