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
26 from tests.unit import STL_MOCKS
27 from yardstick.common import utils
28 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
31 STLClient = mock.MagicMock()
32 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
36 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
37 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper
38 from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump
39 from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple
40 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple
41 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper
42 from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple
43 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDataHelper
44 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper
45 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper
46 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxMplsProfileHelper
47 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxBngProfileHelper
48 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxVpeProfileHelper
49 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxlwAFTRProfileHelper
52 class TestCoreTuple(unittest.TestCase):
53 def test___init__(self):
54 core_tuple = CoreSocketTuple('core 5s6')
55 self.assertEqual(core_tuple.core_id, 5)
56 self.assertEqual(core_tuple.socket_id, 6)
57 self.assertFalse(core_tuple.is_hyperthread())
59 core_tuple = CoreSocketTuple('core 5s6h')
60 self.assertEqual(core_tuple.core_id, 5)
61 self.assertEqual(core_tuple.socket_id, 6)
62 self.assertTrue(core_tuple.is_hyperthread())
64 def test___init__negative(self):
85 for bad_input in bad_inputs:
86 with self.assertRaises(ValueError):
87 CoreSocketTuple(bad_input)
89 def test_find_in_topology(self):
99 core_tuple = CoreSocketTuple('core 5s6')
102 result = core_tuple.find_in_topology(topology_in)
103 self.assertEqual(result, expected)
105 core_tuple = CoreSocketTuple('core 5s6h')
108 result = core_tuple.find_in_topology(topology_in)
109 self.assertEqual(result, expected)
111 def test_find_in_topology_negative(self):
112 core_tuple = CoreSocketTuple('core 6s5')
113 with self.assertRaises(ValueError):
115 core_tuple.find_in_topology({})
117 with self.assertRaises(ValueError):
119 core_tuple.find_in_topology({5: {}})
121 with self.assertRaises(ValueError):
122 # no first value (as needed by non-hyperthread core)
123 core_tuple.find_in_topology({5: {6: {'key1': []}}})
125 core_tuple = CoreSocketTuple('core 6s5h')
126 with self.assertRaises(ValueError):
127 # no second value (as needed by hyperthread core)
128 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
131 class TestTotStatsTuple(unittest.TestCase):
132 def test___new___negative(self):
133 with self.assertRaises(TypeError):
137 with self.assertRaises(TypeError):
138 # one, non-integer value
141 with self.assertRaises(TypeError):
143 TotStatsTuple(3, 4, 5, 6, 7)
146 class TestProxTestDataTuple(unittest.TestCase):
147 def test___init__(self):
148 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
149 self.assertEqual(prox_test_data.tolerated, 1)
150 self.assertEqual(prox_test_data.tsc_hz, 2)
151 self.assertEqual(prox_test_data.delta_rx, 3)
152 self.assertEqual(prox_test_data.delta_tx, 4)
153 self.assertEqual(prox_test_data.delta_tsc, 5)
154 self.assertEqual(prox_test_data.latency, 6)
155 self.assertEqual(prox_test_data.rx_total, 7)
156 self.assertEqual(prox_test_data.tx_total, 8)
157 self.assertEqual(prox_test_data.pps, 9)
159 def test_properties(self):
160 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
161 self.assertEqual(prox_test_data.pkt_loss, 12.5)
162 self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
163 self.assertEqual(prox_test_data.can_be_lost, 0)
164 self.assertEqual(prox_test_data.drop_total, 1)
165 self.assertFalse(prox_test_data.success)
167 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
168 self.assertTrue(prox_test_data.success)
170 def test_pkt_loss_zero_division(self):
171 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
172 self.assertEqual(prox_test_data.pkt_loss, 100.0)
174 def test_get_samples(self):
175 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
178 "Throughput": 1.6 / 1e6,
180 "CurrentDropPackets": 12.5,
181 "TxThroughput": 9 / 1e6,
182 "RxThroughput": 1.6 / 1e6,
189 result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
190 self.assertDictEqual(result, expected)
193 "Throughput": 1.6 / 1e6,
194 "DropPackets": 0.123,
195 "CurrentDropPackets": 0.123,
196 "TxThroughput": 9 / 1e6,
197 "RxThroughput": 1.6 / 1e6,
203 result = prox_test_data.get_samples(64, 0.123)
204 self.assertDictEqual(result, expected)
206 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
207 def test_log_data(self, mock_logger):
208 my_mock_logger = mock.MagicMock()
209 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
210 prox_test_data.log_data()
211 self.assertEqual(my_mock_logger.debug.call_count, 0)
212 self.assertEqual(mock_logger.debug.call_count, 2)
214 mock_logger.debug.reset_mock()
215 prox_test_data.log_data(my_mock_logger)
216 self.assertEqual(my_mock_logger.debug.call_count, 2)
217 self.assertEqual(mock_logger.debug.call_count, 0)
220 class TestPacketDump(unittest.TestCase):
223 def test__init__(self):
224 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
226 def test___str__(self):
227 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
228 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
229 self.assertEqual(str(dump1), expected)
231 def test_port_id(self):
232 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
233 self.assertEqual(p.port_id, "port_id")
235 def test_data_len(self):
236 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
237 self.assertEqual(p.data_len, len(self.PAYLOAD))
239 def test_payload(self):
240 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
241 self.assertEqual(p.payload(), self.PAYLOAD)
243 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
245 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
247 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
259 brown fox jumped over
265 PACKET_DUMP_NON_1 = """\
270 PACKET_DUMP_MIXED_1 = """\
277 PACKET_DUMP_BAD_1 = """\
282 PACKET_DUMP_BAD_2 = """\
287 PACKET_DUMP_BAD_3 = """\
293 class TestProxSocketHelper(unittest.TestCase):
296 self.mock_time_sleep = mock.patch.object(time, 'sleep').start()
298 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
299 def test___init__(self, mock_socket):
300 expected = mock_socket.socket()
301 prox = ProxSocketHelper()
303 self.assertEqual(result, expected)
305 def test_connect(self):
306 mock_sock = mock.MagicMock()
307 prox = ProxSocketHelper(mock_sock)
308 prox.connect('10.20.30.40', 23456)
309 self.assertEqual(mock_sock.connect.call_count, 1)
311 def test_get_sock(self):
312 mock_sock = mock.MagicMock()
313 prox = ProxSocketHelper(mock_sock)
314 result = prox.get_socket()
315 self.assertIs(result, mock_sock)
317 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
318 def test_get_data(self, mock_select):
319 mock_select.select.side_effect = [[1], [0]]
320 mock_socket = mock.MagicMock()
321 mock_recv = mock_socket.recv()
322 mock_recv.decode.return_value = ""
323 prox = ProxSocketHelper(mock_socket)
324 ret = prox.get_data()
325 self.assertEqual(ret, "")
326 self.assertEqual(len(prox._pkt_dumps), 0)
328 mock_select.select.reset_mock()
329 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
330 mock_recv.decode.return_value = PACKET_DUMP_1
331 ret = prox.get_data()
332 self.assertEqual(mock_select.select.call_count, 2)
333 self.assertEqual(ret, 'pktdump,3,11')
334 self.assertEqual(len(prox._pkt_dumps), 1)
336 mock_select.select.reset_mock()
337 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
338 mock_recv.decode.return_value = PACKET_DUMP_2
339 ret = prox.get_data()
340 self.assertEqual(mock_select.select.call_count, 2)
341 self.assertEqual(ret, 'jumped over')
342 self.assertEqual(len(prox._pkt_dumps), 3)
344 def test__parse_socket_data_mixed_data(self):
345 prox = ProxSocketHelper(mock.MagicMock())
346 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
347 self.assertEqual(ret, 'not_a_dump,1,2')
348 self.assertEqual(len(prox._pkt_dumps), 0)
350 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
351 self.assertEqual(ret, 'not_a_dump,1,2')
352 self.assertEqual(len(prox._pkt_dumps), 1)
354 def test__parse_socket_data_bad_data(self):
355 prox = ProxSocketHelper(mock.MagicMock())
356 with self.assertRaises(ValueError):
357 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
359 with self.assertRaises(ValueError):
360 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
362 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
363 self.assertEqual(ret, 'pktdump,3')
365 def test__parse_socket_data_pkt_dump_only(self):
366 prox = ProxSocketHelper(mock.MagicMock())
367 ret = prox._parse_socket_data('', True)
368 self.assertFalse(ret)
370 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
373 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
376 def test_put_command(self):
377 mock_socket = mock.MagicMock()
378 prox = ProxSocketHelper(mock_socket)
379 prox.put_command("data")
380 mock_socket.sendall.assert_called_once()
382 def test_put_command_socket_error(self):
383 mock_socket = mock.MagicMock()
384 mock_socket.sendall.side_effect = OSError
385 prox = ProxSocketHelper(mock_socket)
386 prox.put_command("data")
387 mock_socket.sendall.assert_called_once()
389 def test_get_packet_dump(self):
390 mock_socket = mock.MagicMock()
391 prox = ProxSocketHelper(mock_socket)
393 self.assertIsNone(prox.get_packet_dump())
395 prox._pkt_dumps = [234]
396 self.assertEqual(prox.get_packet_dump(), 234)
397 self.assertEqual(prox._pkt_dumps, [])
399 def test_stop_all_reset(self):
400 mock_socket = mock.MagicMock()
401 prox = ProxSocketHelper(mock_socket)
402 prox.stop_all_reset()
403 mock_socket.sendall.assert_called()
405 def test_stop_all(self):
406 mock_socket = mock.MagicMock()
407 prox = ProxSocketHelper(mock_socket)
409 mock_socket.sendall.assert_called()
412 mock_socket = mock.MagicMock()
413 prox = ProxSocketHelper(mock_socket)
414 prox.stop([3, 4, 5], 16)
415 mock_socket.sendall.assert_called()
417 def test_start_all(self):
418 mock_socket = mock.MagicMock()
419 prox = ProxSocketHelper(mock_socket)
421 mock_socket.sendall.assert_called()
423 def test_start(self):
424 mock_socket = mock.MagicMock()
425 prox = ProxSocketHelper(mock_socket)
426 prox.start([3, 4, 5])
427 mock_socket.sendall.assert_called()
429 def test_reset_stats(self):
430 mock_socket = mock.MagicMock()
431 prox = ProxSocketHelper(mock_socket)
433 mock_socket.sendall.assert_called()
435 def test_set_pkt_size(self):
436 mock_socket = mock.MagicMock()
437 prox = ProxSocketHelper(mock_socket)
438 prox.set_pkt_size([3, 4, 5], 1024)
439 self.assertEqual(mock_socket.sendall.call_count, 3)
441 def test_set_value(self):
442 mock_socket = mock.MagicMock()
443 prox = ProxSocketHelper(mock_socket)
444 prox.set_value([3, 4, 5], 10, 20, 30)
445 self.assertEqual(mock_socket.sendall.call_count, 3)
447 def test_reset_values(self):
448 mock_socket = mock.MagicMock()
449 prox = ProxSocketHelper(mock_socket)
450 prox.reset_values([3, 4, 5])
451 self.assertEqual(mock_socket.sendall.call_count, 3)
453 def test_set_speed(self):
454 mock_socket = mock.MagicMock()
455 prox = ProxSocketHelper(mock_socket)
456 prox.set_speed([3, 4, 5], 1000)
457 self.assertEqual(mock_socket.sendall.call_count, 3)
459 def test_slope_speed(self):
466 'cores': [9, 10, 11],
471 mock_socket = mock.MagicMock()
472 prox = ProxSocketHelper(mock_socket)
473 prox.set_speed = set_speed = mock.MagicMock()
474 prox.slope_speed(core_data, 5)
475 self.assertEqual(set_speed.call_count, 20)
477 set_speed.reset_mock()
478 prox.slope_speed(core_data, 5, 5)
479 self.assertEqual(set_speed.call_count, 10)
481 def test_set_pps(self):
482 mock_socket = mock.MagicMock()
483 prox = ProxSocketHelper(mock_socket)
484 prox.set_pps([3, 4, 5], 1000, 512)
485 self.assertEqual(mock_socket.sendall.call_count, 3)
487 def test_lat_stats(self):
489 '1, 2 , 3', # has white space
491 '7,8,9,10.5,11', # too long with float, but float is in unused portion
492 'twelve,13,14', # value as English word
493 '15,16.2,17', # float in used portion
496 mock_socket = mock.MagicMock()
497 prox = ProxSocketHelper(mock_socket)
498 prox.get_data = mock.MagicMock(side_effect=latency_output)
514 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
515 self.assertEqual(mock_socket.sendall.call_count, 5)
516 self.assertEqual(result, expected)
518 def test_get_all_tot_stats_error(self):
519 mock_socket = mock.MagicMock()
520 prox = ProxSocketHelper(mock_socket)
521 prox.get_data = mock.MagicMock(return_value='3,4,5')
522 expected = [0, 0, 0, 0]
523 result = prox.get_all_tot_stats()
524 self.assertEqual(result, expected)
526 def test_get_all_tot_stats(self):
527 mock_socket = mock.MagicMock()
528 prox = ProxSocketHelper(mock_socket)
529 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
530 expected = 3, 4, 5, 6
531 result = prox.get_all_tot_stats()
532 self.assertEqual(result, expected)
535 mock_socket = mock.MagicMock()
536 prox = ProxSocketHelper(mock_socket)
537 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
540 self.assertEqual(result, expected)
542 def test_core_stats(self):
549 mock_socket = mock.MagicMock()
550 prox = ProxSocketHelper(mock_socket)
551 prox.get_data = mock.MagicMock(side_effect=core_stats)
552 expected = 21, 24, 27, 14
553 result = prox.core_stats([3, 4, 5], 16)
554 self.assertEqual(result, expected)
556 def test_port_stats(self):
558 ','.join(str(n) for n in range(3, 15)),
559 ','.join(str(n) for n in range(8, 32, 2)),
560 ','.join(str(n) for n in range(5, 89, 7)),
563 mock_socket = mock.MagicMock()
564 prox = ProxSocketHelper(mock_socket)
565 prox.get_data = mock.MagicMock(side_effect=port_stats)
566 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
567 result = prox.port_stats([3, 4, 5])
568 self.assertEqual(result, expected)
570 def test_measure_tot_stats(self):
571 start_tot = 3, 4, 5, 6
572 end_tot = 7, 9, 11, 13
573 delta_tot = 4, 5, 6, 7
576 ','.join(str(n) for n in start_tot),
577 ','.join(str(n) for n in end_tot),
580 mock_socket = mock.MagicMock()
581 prox = ProxSocketHelper(mock_socket)
582 prox.get_data = mock.MagicMock(side_effect=get_data_output)
584 'start_tot': start_tot,
588 with prox.measure_tot_stats() as result:
590 self.assertEqual(result, expected)
592 def test_tot_stats(self):
593 mock_socket = mock.MagicMock()
594 prox = ProxSocketHelper(mock_socket)
595 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
597 result = prox.tot_stats()
598 self.assertEqual(result, expected)
600 def test_tot_ierrors(self):
601 mock_socket = mock.MagicMock()
602 prox = ProxSocketHelper(mock_socket)
603 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
605 result = prox.tot_ierrors()
606 self.assertEqual(result, expected)
608 def test_set_count(self):
609 mock_socket = mock.MagicMock()
610 prox = ProxSocketHelper(mock_socket)
611 prox.set_count(432, [3, 4, 5])
612 self.assertEqual(mock_socket.sendall.call_count, 3)
614 def test_dump_rx(self):
615 mock_socket = mock.MagicMock()
616 prox = ProxSocketHelper(mock_socket)
617 prox.dump_rx(3, 5, 8)
618 self.assertEqual(mock_socket.sendall.call_count, 1)
621 mock_socket = mock.MagicMock()
622 prox = ProxSocketHelper(mock_socket)
624 mock_socket.sendall.assert_called()
626 def test_force_quit(self):
627 mock_socket = mock.MagicMock()
628 prox = ProxSocketHelper(mock_socket)
630 mock_socket.sendall.assert_called()
633 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
636 'short-name': 'ProxVnf',
641 'network': '152.16.100.20',
642 'netmask': '255.255.255.0',
643 'gateway': '152.16.100.20',
647 'network': '152.16.40.20',
648 'netmask': '255.255.255.0',
649 'gateway': '152.16.40.20',
653 'description': 'PROX approximation using DPDK',
654 'name': 'proxvnf-baremetal',
657 'network': '0064:ff9b:0:0:0:0:9810:6414',
659 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
663 'network': '0064:ff9b:0:0:0:0:9810:2814',
665 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
669 'id': 'proxvnf-baremetal',
670 'external-interface': [
672 'virtual-interface': {
673 'dst_mac': '00:00:00:00:00:04',
674 'vpci': '0000:05:00.0',
675 'local_ip': '152.16.100.19',
676 'type': 'PCI-PASSTHROUGH',
677 'vld_id': 'uplink_0',
678 'netmask': '255.255.255.0',
680 'bandwidth': '10 Gbps',
682 'dst_ip': '152.16.100.19',
683 'local_iface_name': 'xe0',
684 'local_mac': '00:00:00:00:00:02',
687 'vnfd-connection-point-ref': 'xe0',
691 'virtual-interface': {
692 'dst_mac': '00:00:00:00:00:03',
693 'vpci': '0000:05:00.1',
694 'local_ip': '152.16.40.19',
695 'type': 'PCI-PASSTHROUGH',
696 'vld_id': 'downlink_0',
698 'netmask': '255.255.255.0',
700 'bandwidth': '10 Gbps',
701 'dst_ip': '152.16.40.20',
702 'local_iface_name': 'xe1',
703 'local_mac': '00:00:00:00:00:01',
706 'vnfd-connection-point-ref': 'xe1',
712 'description': 'PROX approximation using DPDK',
714 'vdu-id': 'proxvnf-baremetal',
727 'id': 'ProxApproxVnf',
732 'vnfd:vnfd-catalog': {
739 def test_global_section(self):
740 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
743 setup_helper._prox_config_data = [('a', [])]
745 with self.assertRaises(KeyError):
746 _ = setup_helper.global_section
750 ('not_name', 'other data'),
751 ('name_not', 'more data'),
752 ('name', 'prox type'),
756 setup_helper._prox_config_data = [
785 result = setup_helper.global_section
786 self.assertEqual(result, global_section[1])
788 def test_find_in_section(self):
789 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
792 setup_helper._prox_config_data = [
794 ('not_name', 'other data'),
795 ('name_not', 'more data'),
796 ('name', 'prox type'),
826 result = setup_helper.find_in_section('section3', 'key3')
827 self.assertEqual(result, expected)
829 expected = 'default value'
830 result = setup_helper.find_in_section('section3', 'key4', 'default value')
831 self.assertEqual(result, expected)
833 with self.assertRaises(KeyError):
834 setup_helper.find_in_section('section4', 'key1')
836 with self.assertRaises(KeyError):
837 setup_helper.find_in_section('section1', 'key1')
839 def test__replace_quoted_with_value(self):
843 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
844 self.assertEqual(result, expected)
846 # no quoted substring
847 input_str = 'lion tiger bear'
848 expected = 'lion tiger bear'
849 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
850 self.assertEqual(result, expected)
852 # partially quoted substring
853 input_str = 'lion "tiger bear'
854 expected = 'lion "tiger bear'
855 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
856 self.assertEqual(result, expected)
858 # one quoted substring
859 input_str = 'lion "tiger" bear'
860 expected = 'lion "cat" bear'
861 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
862 self.assertEqual(result, expected)
864 # two quoted substrings
865 input_str = 'lion "tiger" bear "shark" whale'
866 expected = 'lion "cat" bear "shark" whale'
867 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
868 self.assertEqual(result, expected)
870 # two quoted substrings, both replaced
871 input_str = 'lion "tiger" bear "shark" whale'
872 expected = 'lion "cat" bear "cat" whale'
873 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
874 self.assertEqual(result, expected)
876 def test__get_tx_port(self):
878 input_data = {'section1': []}
880 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
881 self.assertEqual(result, expected)
883 # data for other section
892 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
893 self.assertEqual(result, expected)
896 input_data['section1'] = section1 = [
897 ('rx port', '4', 'more', 432),
901 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
902 self.assertEqual(result, expected)
904 # more data for section,
907 ('tx port', '1', 'and more', 234),
910 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
911 self.assertEqual(result, expected)
913 def test_write_prox_config(self):
916 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
917 self.assertEqual(result, expected)
925 expected = '[section1]'
926 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
927 self.assertEqual(result, expected)
938 ['__name__', 'not this one'],
941 ['key4', 'multi-line\nvalue'],
945 expected = os.linesep.join([
951 'key4=multi-line\n\tvalue',
953 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
954 self.assertEqual(result, expected)
956 def test_prox_config_data(self):
957 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
960 setup_helper.config_queue = config_queue = mock.MagicMock()
961 config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])]
963 result = setup_helper.prox_config_data
964 self.assertEqual(result, expected)
966 @mock.patch.object(utils, 'find_relative_file')
967 def test_build_config_file_no_additional_file(self, mock_find_path):
969 'prox_args': {'-c': ""},
971 'prox_config': 'e/f',
972 'prox_generate_parameter': False,
975 mock_find_path.side_effect = ['1', '2']
977 vnfd_helper = mock.MagicMock()
978 ssh_helper = mock.MagicMock()
979 scenario_helper = ScenarioHelper('vnf1')
980 scenario_helper.scenario_cfg = {
987 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
988 helper.copy_to_target = mock.MagicMock(return_value='3')
989 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
990 helper.upload_prox_config = mock.MagicMock(return_value='5')
992 self.assertEqual(helper.additional_files, {})
993 self.assertNotEqual(helper._prox_config_data, '4')
994 self.assertNotEqual(helper.remote_path, '5')
995 helper.build_config_file()
996 self.assertEqual(helper.additional_files, {})
997 self.assertEqual(helper._prox_config_data, '4')
998 self.assertEqual(helper.remote_path, '5')
1000 @mock.patch.object(utils, 'find_relative_file')
1001 def test_build_config_file_additional_file_string(self, mock_find_path):
1003 'prox_args': {'-c': ""},
1005 'prox_config': 'e/f',
1006 'prox_files': 'g/h.i',
1007 'prox_generate_parameter': True,
1010 mock_find_path.side_effect = ['1', '2']
1011 vnfd_helper = mock.MagicMock()
1012 ssh_helper = mock.MagicMock()
1013 scenario_helper = ScenarioHelper('vnf1')
1014 scenario_helper.scenario_cfg = {
1021 vnfd_helper.port_pairs.all_ports = ['xe0', 'xe1', 'xe2', 'xe3']
1022 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1023 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1024 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1025 helper.upload_prox_config = mock.MagicMock(return_value='55')
1027 self.assertEqual(helper.additional_files, {})
1028 expected = {'h.i': '33'}
1029 helper.build_config_file()
1030 self.assertDictEqual(helper.additional_files, expected)
1032 @mock.patch.object(utils, 'find_relative_file')
1033 def test_build_config_file_additional_file(self, mock_find_path):
1035 'prox_args': {'-c': ""},
1037 'prox_config': 'e/f',
1045 mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))]
1046 vnfd_helper = mock.MagicMock()
1047 ssh_helper = mock.MagicMock()
1048 scenario_helper = ScenarioHelper('vnf1')
1049 scenario_helper.scenario_cfg = {
1056 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1057 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1058 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1059 helper.upload_prox_config = mock.MagicMock(return_value='55')
1061 self.assertEqual(helper.additional_files, {})
1062 self.assertNotEqual(helper._prox_config_data, '44')
1063 self.assertNotEqual(helper.remote_path, '55')
1064 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
1065 helper.build_config_file()
1066 self.assertDictEqual(helper.additional_files, expected)
1067 self.assertEqual(helper._prox_config_data, '44')
1068 self.assertEqual(helper.remote_path, '55')
1070 def test_build_config(self):
1072 'prox_args': {'-f': ""},
1073 'prox_path': '/opt/nsb_bin/prox',
1074 'prox_config': 'configs/gen_l2fwd-2.cfg',
1082 vnfd_helper = mock.Mock()
1083 ssh_helper = mock.Mock()
1084 ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/prox'
1085 scenario_helper = ScenarioHelper('vnf1')
1086 scenario_helper.scenario_cfg = {
1093 expected = ("sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli "
1094 "-f -f /tmp/prox.cfg '")
1096 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper,
1098 with mock.patch.object(helper, 'build_config_file') as mock_cfg_file:
1099 helper.remote_path = '/tmp/prox.cfg'
1100 prox_cmd = helper.build_config()
1101 self.assertEqual(prox_cmd, expected)
1102 mock_cfg_file.assert_called_once()
1104 def test__insert_additional_file(self):
1105 vnfd_helper = mock.MagicMock()
1106 ssh_helper = mock.MagicMock()
1107 scenario_helper = mock.MagicMock()
1109 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1110 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1111 res = helper._insert_additional_file('dofile("ipv4.lua")')
1112 self.assertEqual(res, 'dofile("/tmp/ipv4.lua")')
1114 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1115 def test_generate_prox_config_file(self, mock_parser_type):
1118 args[-1].extend(sections_data)
1119 return mock.MagicMock()
1123 mock_parser_type.side_effect = init
1125 vnfd_helper = VnfdHelper(self.VNFD0)
1126 ssh_helper = mock.MagicMock()
1127 scenario_helper = mock.MagicMock()
1129 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1130 helper.additional_files = {}
1133 result = helper.generate_prox_config_file('a/b')
1134 self.assertEqual(result, expected)
1136 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1138 helper.remote_prox_file_name = 'remote'
1143 ['dofile("ipv4.lua")', ''],
1159 ['$sut_mac0', '@@dst_mac0'],
1162 ['user_table', 'dofile("ipv4.lua")'],
1163 ['missing_addtional_file', 'dofile("nosuch")'],
1172 ['dofile("/tmp/ipv4.lua")', ''],
1179 ['mac', 'hardware'],
1180 ['dst mac', '00:00:00:00:00:03'],
1188 ['$sut_mac0', '00 00 00 00 00 04'],
1191 ['user_table', 'dofile("/tmp/ipv4.lua")'],
1192 ['missing_addtional_file', 'dofile("nosuch")'],
1196 result = helper.generate_prox_config_file('/c/d/e')
1197 self.assertEqual(result, expected, str(result))
1199 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1200 def test_generate_prox_config_file_negative(self, mock_parser_type):
1202 args[-1].update(sections_data)
1203 return mock.MagicMock()
1207 mock_parser_type.side_effect = init
1209 vnfd_helper = mock.MagicMock()
1210 vnfd_helper.interfaces = []
1211 ssh_helper = mock.MagicMock()
1212 scenario_helper = mock.MagicMock()
1214 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1215 helper.additional_files = {}
1216 helper.remote_prox_file_name = 'remote'
1217 vnfd_helper.interfaces = [
1219 'virtual-interface': {
1221 'dst_mac': '00:00:00:de:ad:88',
1225 'virtual-interface': {
1227 'dst_mac': '00:00:00:de:ad:ff',
1231 'virtual-interface': {
1233 'dst_mac': '00:00:00:de:ad:ff',
1247 ['???', 'dofile "here" 23'],
1251 with self.assertRaises(Exception):
1252 helper.generate_prox_config_file('a/b')
1254 def test_put_string_to_file(self):
1255 vnfd_helper = mock.MagicMock()
1256 vnfd_helper.interfaces = []
1257 ssh_helper = mock.MagicMock()
1258 scenario_helper = mock.MagicMock()
1260 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1263 result = helper.put_string_to_file('my long string', 'a/b')
1264 self.assertEqual(result, expected)
1266 def test_copy_to_target(self):
1267 vnfd_helper = mock.MagicMock()
1268 vnfd_helper.interfaces = []
1269 ssh_helper = mock.MagicMock()
1270 scenario_helper = mock.MagicMock()
1272 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1274 result = helper.copy_to_target('a/b', 'c')
1275 self.assertEqual(result, expected)
1277 def test_upload_prox_config(self):
1278 vnfd_helper = mock.MagicMock()
1279 vnfd_helper.interfaces = []
1280 ssh_helper = mock.MagicMock()
1281 scenario_helper = mock.MagicMock()
1283 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1284 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1286 result = helper.upload_prox_config('a', {})
1287 self.assertEqual(result, expected)
1290 class TestProxResourceHelper(unittest.TestCase):
1293 'short-name': 'ProxVnf',
1298 'network': '152.16.100.20',
1299 'netmask': '255.255.255.0',
1300 'gateway': '152.16.100.20',
1304 'network': '152.16.40.20',
1305 'netmask': '255.255.255.0',
1306 'gateway': '152.16.40.20',
1310 'description': 'PROX approximation using DPDK',
1311 'name': 'proxvnf-baremetal',
1314 'network': '0064:ff9b:0:0:0:0:9810:6414',
1316 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1320 'network': '0064:ff9b:0:0:0:0:9810:2814',
1322 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1326 'id': 'proxvnf-baremetal',
1327 'external-interface': [
1329 'virtual-interface': {
1330 'dst_mac': '00:00:00:00:00:04',
1331 'vpci': '0000:05:00.0',
1332 'local_ip': '152.16.100.19',
1333 'type': 'PCI-PASSTHROUGH',
1334 'vld_id': 'uplink_0',
1335 'netmask': '255.255.255.0',
1337 'bandwidth': '10 Gbps',
1339 'dst_ip': '152.16.100.19',
1340 'local_iface_name': 'xe0',
1341 'local_mac': '00:00:00:00:00:02',
1344 'vnfd-connection-point-ref': 'xe0',
1348 'virtual-interface': {
1349 'dst_mac': '00:00:00:00:00:03',
1350 'vpci': '0000:05:00.1',
1351 'local_ip': '152.16.40.19',
1352 'type': 'PCI-PASSTHROUGH',
1353 'vld_id': 'downlink_0',
1355 'netmask': '255.255.255.0',
1357 'bandwidth': '10 Gbps',
1358 'dst_ip': '152.16.40.20',
1359 'local_iface_name': 'xe1',
1360 'local_mac': '00:00:00:00:00:01',
1363 'vnfd-connection-point-ref': 'xe1',
1369 'description': 'PROX approximation using DPDK',
1371 'vdu-id': 'proxvnf-baremetal',
1384 'id': 'ProxApproxVnf',
1389 'vnfd:vnfd-catalog': {
1396 def test_find_pci(self):
1402 result = ProxResourceHelper.find_pci('target', input_str_list)
1403 self.assertFalse(result)
1411 result = ProxResourceHelper.find_pci('target', input_str_list)
1412 self.assertTrue(result)
1414 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1415 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1416 def test_sut(self, *args):
1417 helper = ProxResourceHelper(mock.MagicMock())
1418 self.assertIsNone(helper.client)
1420 self.assertIsNotNone(result)
1421 self.assertIs(result, helper.client)
1422 self.assertIs(result, helper.sut)
1424 def test_test_type(self):
1425 setup_helper = mock.MagicMock()
1426 setup_helper.find_in_section.return_value = expected = 'prox type'
1428 helper = ProxResourceHelper(setup_helper)
1430 self.assertIsNone(helper._test_type)
1431 self.assertEqual(helper.test_type, expected)
1432 self.assertEqual(helper._test_type, expected)
1433 self.assertEqual(helper.test_type, expected)
1435 def test_collect_collectd_kpi(self):
1436 helper = ProxResourceHelper(mock.MagicMock())
1437 helper.resource = resource = mock.MagicMock()
1439 resource.check_if_system_agent_running.return_value = 0, '1234'
1440 resource.amqp_collect_nfvi_kpi.return_value = 543
1441 resource.check_if_system_agent_running.return_value = (0, None)
1443 expected = {'core': 543}
1444 result = helper.collect_collectd_kpi()
1445 self.assertDictEqual(result, expected)
1447 def test_collect_kpi(self):
1448 helper = ProxResourceHelper(mock.MagicMock())
1449 helper._queue = queue = mock.MagicMock()
1450 helper._result = {'z': 123}
1451 helper.resource = resource = mock.MagicMock()
1453 resource.check_if_system_agent_running.return_value = 0, '1234'
1454 resource.amqp_collect_nfvi_kpi.return_value = 543
1455 resource.check_if_system_agent_running.return_value = (0, None)
1457 queue.empty.return_value = False
1458 queue.get.return_value = {'a': 789}
1460 expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
1461 result = helper.collect_kpi()
1462 self.assertDictEqual(result, expected)
1464 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1465 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1466 def test__connect(self, mock_socket_helper_type, *args):
1467 client = mock_socket_helper_type()
1468 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1470 setup_helper = mock.MagicMock()
1471 setup_helper.vnfd_helper.interfaces = []
1473 helper = ProxResourceHelper(setup_helper)
1475 result = helper._connect()
1476 self.assertIs(result, client)
1478 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1480 with self.assertRaises(Exception):
1483 def test_run_traffic(self):
1484 setup_helper = mock.MagicMock()
1485 helper = ProxResourceHelper(setup_helper)
1486 traffic_profile = mock.MagicMock(**{"done": True})
1487 helper.run_traffic(traffic_profile)
1488 self.assertEqual(helper._terminated.value, 1)
1490 def test__run_traffic_once(self):
1491 setup_helper = mock.MagicMock()
1492 helper = ProxResourceHelper(setup_helper)
1493 traffic_profile = mock.MagicMock(**{"done": True})
1494 helper._run_traffic_once(traffic_profile)
1495 self.assertEqual(helper._terminated.value, 1)
1497 def test_start_collect(self):
1498 setup_helper = mock.MagicMock()
1499 helper = ProxResourceHelper(setup_helper)
1500 helper.resource = resource = mock.MagicMock()
1501 self.assertIsNone(helper.start_collect())
1502 resource.start.assert_called_once()
1504 def test_terminate(self):
1505 setup_helper = mock.MagicMock()
1506 helper = ProxResourceHelper(setup_helper)
1507 with self.assertRaises(NotImplementedError):
1510 def test_up_post(self):
1511 setup_helper = mock.MagicMock()
1512 helper = ProxResourceHelper(setup_helper)
1513 helper.client = expected = mock.MagicMock()
1514 result = helper.up_post()
1515 self.assertEqual(result, expected)
1517 def test_execute(self):
1518 setup_helper = mock.MagicMock()
1519 helper = ProxResourceHelper(setup_helper)
1520 helper.client = mock.MagicMock()
1522 expected = helper.client.my_command()
1523 result = helper.execute('my_command')
1524 self.assertEqual(result, expected)
1526 helper.client = object()
1528 result = helper.execute('my_command')
1529 self.assertIsNone(result)
1532 class TestProxDataHelper(unittest.TestCase):
1534 def test_totals_and_pps(self):
1536 vnfd_helper = mock.MagicMock()
1537 vnfd_helper.port_pairs.all_ports = list(range(4))
1539 sut = mock.MagicMock()
1540 sut.port_stats.return_value = list(range(10))
1542 data_helper = ProxDataHelper(vnfd_helper, sut, pkt_size, 25, None)
1544 self.assertEqual(data_helper.rx_total, 6)
1545 self.assertEqual(data_helper.tx_total, 7)
1546 self.assertEqual(data_helper.pps, 6.25e6)
1548 def test_samples(self):
1549 vnfd_helper = mock.MagicMock()
1550 vnfd_helper.port_pairs.all_ports = list(range(4))
1551 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1553 sut = mock.MagicMock()
1554 sut.port_stats.return_value = list(range(10))
1556 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1568 result = data_helper.samples
1569 self.assertDictEqual(result, expected)
1571 def test___enter__(self):
1572 vnfd_helper = mock.MagicMock()
1573 vnfd_helper.port_pairs.all_ports = list(range(4))
1574 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1576 sut = mock.MagicMock()
1577 sut.port_stats.return_value = list(range(10))
1579 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1580 data_helper._totals_and_pps = 12, 32, 4.5
1581 data_helper.tsc_hz = 9.8
1582 data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)}
1583 data_helper.latency = 7
1585 self.assertIsNone(data_helper.result_tuple)
1587 expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5)
1591 result = data_helper.result_tuple
1592 self.assertEqual(result, expected)
1594 data_helper.make_tuple()
1595 self.assertIs(data_helper.result_tuple, result)
1597 def test___enter___negative(self):
1598 vnfd_helper = mock.MagicMock()
1600 data_helper = ProxDataHelper(vnfd_helper, None, None, None, None)
1602 vnfd_helper.port_pairs.all_ports = []
1603 with self.assertRaises(AssertionError):
1607 vnfd_helper.port_pairs.all_ports = [0, 1, 2]
1608 with self.assertRaises(AssertionError):
1612 def test_measure_tot_stats(self):
1613 vnfd_helper = mock.MagicMock()
1614 vnfd_helper.port_pairs.all_ports = list(range(4))
1616 start = (3, 4, 1, 2)
1619 sut = ProxSocketHelper(mock.MagicMock())
1620 sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end])
1622 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1624 self.assertIsNone(data_helper.measured_stats)
1629 'delta': TotStatsTuple(6, 3, 5, 6),
1631 with data_helper.measure_tot_stats():
1634 self.assertEqual(data_helper.measured_stats, expected)
1636 def test_capture_tsc_hz(self):
1637 vnfd_helper = mock.MagicMock()
1638 vnfd_helper.port_pairs.all_ports = list(range(4))
1640 sut = mock.MagicMock()
1641 sut.hz.return_value = '54.6'
1643 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1645 self.assertIsNone(data_helper.tsc_hz)
1648 data_helper.capture_tsc_hz()
1649 self.assertEqual(data_helper.tsc_hz, expected)
1652 class TestProxProfileHelper(unittest.TestCase):
1654 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1655 def test_get_cls(self, mock_utils):
1656 mock_type1 = mock.MagicMock()
1657 mock_type1.__prox_profile_type__ = 'another_type'
1658 mock_type2 = mock.MagicMock()
1659 mock_type2.__prox_profile_type__ = 'my_type'
1660 mock_utils.itersubclasses.return_value = [mock_type1, mock_type2]
1662 self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2)
1664 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1665 def test_get_cls_default(self, mock_utils):
1666 mock_utils.itersubclasses.return_value = []
1667 ProxProfileHelper.get_cls('my_type')
1669 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1670 def test_cpu_topology(self, mock_socket_topology):
1671 mock_socket_topology.parse_cpuinfo.return_value = 432
1673 resource_helper = mock.MagicMock()
1674 resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1676 helper = ProxProfileHelper(resource_helper)
1677 self.assertIsNone(helper._cpu_topology)
1678 result = helper.cpu_topology
1679 self.assertEqual(result, 432)
1680 self.assertIs(result, helper._cpu_topology)
1681 self.assertIs(result, helper.cpu_topology)
1683 def test_test_cores(self):
1684 resource_helper = mock.MagicMock()
1685 resource_helper.setup_helper.prox_config_data = []
1687 helper = ProxProfileHelper(resource_helper)
1688 helper._cpu_topology = []
1691 result = helper.test_cores
1692 self.assertEqual(result, expected)
1694 resource_helper.setup_helper.prox_config_data = [
1715 helper = ProxProfileHelper(resource_helper)
1716 helper._cpu_topology = {
1733 self.assertIsNone(helper._test_cores)
1735 result = helper.test_cores
1736 self.assertEqual(result, expected)
1737 self.assertIs(result, helper._test_cores)
1738 self.assertIs(result, helper.test_cores)
1740 def test_latency_cores(self):
1741 resource_helper = mock.MagicMock()
1742 resource_helper.setup_helper.prox_config_data = []
1744 helper = ProxProfileHelper(resource_helper)
1745 helper._cpu_topology = []
1748 result = helper.latency_cores
1749 self.assertEqual(result, expected)
1751 resource_helper.setup_helper.prox_config_data = [
1772 helper = ProxProfileHelper(resource_helper)
1773 helper._cpu_topology = {
1790 self.assertIsNone(helper._latency_cores)
1792 result = helper.latency_cores
1793 self.assertEqual(result, expected)
1794 self.assertIs(result, helper._latency_cores)
1795 self.assertIs(result, helper.latency_cores)
1797 def test_all_rx_cores(self):
1798 helper = ProxBngProfileHelper(mock.MagicMock())
1799 helper._latency_cores = expected = [3, 4, 6]
1800 helper._test_cores = [5, 2, 1]
1802 result = helper.all_rx_cores
1803 self.assertEqual(result, expected)
1805 def test_get_cores(self):
1806 resource_helper = mock.MagicMock()
1807 resource_helper.setup_helper.prox_config_data = [
1828 helper = ProxProfileHelper(resource_helper)
1829 helper._cpu_topology = {
1847 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1848 self.assertEqual(result, expected)
1850 def test_get_latency(self):
1851 resource_helper = mock.MagicMock()
1852 resource_helper.setup_helper.vnfd_helper.interfaces = []
1854 helper = ProxProfileHelper(resource_helper)
1855 helper._latency_cores = []
1858 result = helper.get_latency()
1859 self.assertEqual(result, expected)
1861 helper._latency_cores = [1, 2]
1862 helper.client = mock.MagicMock()
1864 expected = helper.sut.lat_stats()
1865 result = helper.get_latency()
1866 self.assertIs(result, expected)
1868 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1869 def test_traffic_context(self, *args):
1870 setup_helper = mock.MagicMock()
1871 setup_helper.vnfd_helper.interfaces = []
1873 helper = ProxProfileHelper(setup_helper)
1874 helper._cpu_topology = {
1891 setup_helper.prox_config_data = [
1893 ('not_name', 'other data'),
1894 ('name_not', 'more data'),
1895 ('name', helper.__prox_profile_type__),
1919 client = mock.MagicMock()
1920 client.hz.return_value = 2
1921 client.port_stats.return_value = tuple(range(12))
1923 helper.client = client
1924 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1926 helper._test_cores = [3, 4]
1928 with helper.traffic_context(64, 1):
1931 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1932 def test_run_test(self, _):
1933 resource_helper = mock.MagicMock()
1934 resource_helper.step_delta = 0.4
1935 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
1936 resource_helper.sut.port_stats.return_value = list(range(10))
1938 helper = ProxProfileHelper(resource_helper)
1940 helper.run_test(120, 5, 6.5)
1943 class TestProxMplsProfileHelper(unittest.TestCase):
1945 def test_mpls_cores(self):
1946 resource_helper = mock.MagicMock()
1947 resource_helper.setup_helper.prox_config_data = [
1970 helper = ProxMplsProfileHelper(resource_helper)
1971 helper._cpu_topology = {
1988 expected_tagged = [3]
1989 expected_plain = [4]
1990 self.assertIsNone(helper._cores_tuple)
1991 self.assertEqual(helper.tagged_cores, expected_tagged)
1992 self.assertEqual(helper.plain_cores, expected_plain)
1993 self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain))
1995 def test_traffic_context(self):
1996 setup_helper = mock.MagicMock()
1997 helper = ProxMplsProfileHelper(setup_helper)
1999 with helper.traffic_context(120, 5.4):
2003 class TestProxBngProfileHelper(unittest.TestCase):
2005 def test_bng_cores(self):
2006 resource_helper = mock.MagicMock()
2007 resource_helper.setup_helper.prox_config_data = [
2031 ('name', 'arp_task'),
2040 helper = ProxBngProfileHelper(resource_helper)
2041 helper._cpu_topology = {
2066 expected_arp = [6, 9]
2067 expected_arp_task = [0, 6]
2068 expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task)
2070 self.assertIsNone(helper._cores_tuple)
2071 self.assertEqual(helper.cpe_cores, expected_cpe)
2072 self.assertEqual(helper.inet_cores, expected_inet)
2073 self.assertEqual(helper.arp_cores, expected_arp)
2074 self.assertEqual(helper.arp_task_cores, expected_arp_task)
2075 self.assertEqual(helper._cores_tuple, expected_combined)
2077 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2078 def test_run_test(self, _):
2079 resource_helper = mock.MagicMock()
2080 resource_helper.step_delta = 0.4
2081 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2082 resource_helper.sut.port_stats.return_value = list(range(10))
2084 helper = ProxBngProfileHelper(resource_helper)
2086 helper.run_test(120, 5, 6.5)
2087 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2090 class TestProxVpeProfileHelper(unittest.TestCase):
2092 def test_vpe_cores(self):
2093 resource_helper = mock.MagicMock()
2094 resource_helper.setup_helper.prox_config_data = [
2117 helper = ProxVpeProfileHelper(resource_helper)
2118 helper._cpu_topology = {
2137 expected_combined = (expected_cpe, expected_inet)
2139 self.assertIsNone(helper._cores_tuple)
2140 self.assertEqual(helper.cpe_cores, expected_cpe)
2141 self.assertEqual(helper.inet_cores, expected_inet)
2142 self.assertEqual(helper._cores_tuple, expected_combined)
2144 def test_vpe_ports(self):
2145 resource_helper = mock.MagicMock()
2146 resource_helper.setup_helper.prox_config_data = [
2155 ('mac', 'hardware'),
2160 ('mac', 'hardware'),
2164 helper = ProxVpeProfileHelper(resource_helper)
2165 helper._port_list = {
2184 expected_combined = (expected_cpe, expected_inet)
2186 self.assertIsNone(helper._ports_tuple)
2187 self.assertEqual(helper.cpe_ports, expected_cpe)
2188 self.assertEqual(helper.inet_ports, expected_inet)
2189 self.assertEqual(helper._ports_tuple, expected_combined)
2191 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2192 def test_run_test(self, _):
2193 resource_helper = mock.MagicMock()
2194 resource_helper.step_delta = 0.4
2195 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2196 resource_helper.sut.port_stats.return_value = list(range(10))
2198 helper = ProxVpeProfileHelper(resource_helper)
2200 helper.run_test(120, 5, 6.5)
2201 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2204 class TestProxlwAFTRProfileHelper(unittest.TestCase):
2206 def test_lwaftr_cores(self):
2207 resource_helper = mock.MagicMock()
2208 resource_helper.setup_helper.prox_config_data = [
2231 helper = ProxlwAFTRProfileHelper(resource_helper)
2232 helper._cpu_topology = {
2251 expected_combined = (expected_tun, expected_inet)
2253 self.assertIsNone(helper._cores_tuple)
2254 self.assertEqual(helper.tun_cores, expected_tun)
2255 self.assertEqual(helper.inet_cores, expected_inet)
2256 self.assertEqual(helper._cores_tuple, expected_combined)
2258 def test_tun_ports(self):
2259 resource_helper = mock.MagicMock()
2260 resource_helper.setup_helper.prox_config_data = [
2269 ('mac', 'hardware'),
2274 ('mac', 'hardware'),
2278 helper = ProxlwAFTRProfileHelper(resource_helper)
2279 helper._port_list = {
2298 expected_combined = (expected_tun, expected_inet)
2300 self.assertIsNone(helper._ports_tuple)
2301 self.assertEqual(helper.tun_ports, expected_tun)
2302 self.assertEqual(helper.inet_ports, expected_inet)
2303 self.assertEqual(helper._ports_tuple, expected_combined)
2305 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2306 def test_run_test(self, _):
2307 resource_helper = mock.MagicMock()
2308 resource_helper.step_delta = 0.4
2309 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2310 resource_helper.sut.port_stats.return_value = list(range(10))
2312 helper = ProxlwAFTRProfileHelper(resource_helper)
2314 helper.run_test(120, 5, 6.5)
2315 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1