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 __future__ import absolute_import
23 from itertools import repeat, chain
26 from tests.unit import STL_MOCKS
27 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
29 STLClient = mock.MagicMock()
30 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
34 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
35 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper
36 from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump
37 from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple
38 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple
39 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper
40 from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple
41 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDataHelper
42 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper
43 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper
44 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxMplsProfileHelper
45 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxBngProfileHelper
46 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxVpeProfileHelper
47 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxlwAFTRProfileHelper
50 class TestCoreTuple(unittest.TestCase):
51 def test___init__(self):
52 core_tuple = CoreSocketTuple('core 5s6')
53 self.assertEqual(core_tuple.core_id, 5)
54 self.assertEqual(core_tuple.socket_id, 6)
55 self.assertFalse(core_tuple.is_hyperthread())
57 core_tuple = CoreSocketTuple('core 5s6h')
58 self.assertEqual(core_tuple.core_id, 5)
59 self.assertEqual(core_tuple.socket_id, 6)
60 self.assertTrue(core_tuple.is_hyperthread())
62 def test___init__negative(self):
83 for bad_input in bad_inputs:
84 with self.assertRaises(ValueError):
85 CoreSocketTuple(bad_input)
87 def test_find_in_topology(self):
97 core_tuple = CoreSocketTuple('core 5s6')
100 result = core_tuple.find_in_topology(topology_in)
101 self.assertEqual(result, expected)
103 core_tuple = CoreSocketTuple('core 5s6h')
106 result = core_tuple.find_in_topology(topology_in)
107 self.assertEqual(result, expected)
109 def test_find_in_topology_negative(self):
110 core_tuple = CoreSocketTuple('core 6s5')
111 with self.assertRaises(ValueError):
113 core_tuple.find_in_topology({})
115 with self.assertRaises(ValueError):
117 core_tuple.find_in_topology({5: {}})
119 with self.assertRaises(ValueError):
120 # no first value (as needed by non-hyperthread core)
121 core_tuple.find_in_topology({5: {6: {'key1': []}}})
123 core_tuple = CoreSocketTuple('core 6s5h')
124 with self.assertRaises(ValueError):
125 # no second value (as needed by hyperthread core)
126 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
129 class TestTotStatsTuple(unittest.TestCase):
130 def test___new___negative(self):
131 with self.assertRaises(TypeError):
135 with self.assertRaises(TypeError):
136 # one, non-integer value
139 with self.assertRaises(TypeError):
141 TotStatsTuple(3, 4, 5, 6, 7)
144 class TestProxTestDataTuple(unittest.TestCase):
145 def test___init__(self):
146 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
147 self.assertEqual(prox_test_data.tolerated, 1)
148 self.assertEqual(prox_test_data.tsc_hz, 2)
149 self.assertEqual(prox_test_data.delta_rx, 3)
150 self.assertEqual(prox_test_data.delta_tx, 4)
151 self.assertEqual(prox_test_data.delta_tsc, 5)
152 self.assertEqual(prox_test_data.latency, 6)
153 self.assertEqual(prox_test_data.rx_total, 7)
154 self.assertEqual(prox_test_data.tx_total, 8)
155 self.assertEqual(prox_test_data.pps, 9)
157 def test_properties(self):
158 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
159 self.assertEqual(prox_test_data.pkt_loss, 12.5)
160 self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
161 self.assertEqual(prox_test_data.can_be_lost, 0)
162 self.assertEqual(prox_test_data.drop_total, 1)
163 self.assertFalse(prox_test_data.success)
165 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
166 self.assertTrue(prox_test_data.success)
168 def test_pkt_loss_zero_division(self):
169 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
170 self.assertEqual(prox_test_data.pkt_loss, 100.0)
172 def test_get_samples(self):
173 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
176 "Throughput": 1.6 / 1e6,
178 "CurrentDropPackets": 12.5,
179 "TxThroughput": 9 / 1e6,
180 "RxThroughput": 1.6 / 1e6,
187 result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
188 self.assertDictEqual(result, expected)
191 "Throughput": 1.6 / 1e6,
192 "DropPackets": 0.123,
193 "CurrentDropPackets": 0.123,
194 "TxThroughput": 9 / 1e6,
195 "RxThroughput": 1.6 / 1e6,
201 result = prox_test_data.get_samples(64, 0.123)
202 self.assertDictEqual(result, expected)
204 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
205 def test_log_data(self, mock_logger):
206 my_mock_logger = mock.MagicMock()
207 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
208 prox_test_data.log_data()
209 self.assertEqual(my_mock_logger.debug.call_count, 0)
210 self.assertEqual(mock_logger.debug.call_count, 2)
212 mock_logger.debug.reset_mock()
213 prox_test_data.log_data(my_mock_logger)
214 self.assertEqual(my_mock_logger.debug.call_count, 2)
215 self.assertEqual(mock_logger.debug.call_count, 0)
218 class TestPacketDump(unittest.TestCase):
221 def test__init__(self):
222 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
224 def test___str__(self):
225 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
226 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
227 self.assertEqual(str(dump1), expected)
229 def test_port_id(self):
230 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
231 self.assertEqual(p.port_id, "port_id")
233 def test_data_len(self):
234 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
235 self.assertEqual(p.data_len, len(self.PAYLOAD))
237 def test_payload(self):
238 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
239 self.assertEqual(p.payload(), self.PAYLOAD)
241 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
243 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
245 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
257 brown fox jumped over
263 PACKET_DUMP_NON_1 = """\
268 PACKET_DUMP_MIXED_1 = """\
275 PACKET_DUMP_BAD_1 = """\
280 PACKET_DUMP_BAD_2 = """\
285 PACKET_DUMP_BAD_3 = """\
291 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
292 class TestProxSocketHelper(unittest.TestCase):
293 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
294 def test___init__(self, mock_socket, mock_time):
295 expected = mock_socket.socket()
296 prox = ProxSocketHelper()
298 self.assertEqual(result, expected)
300 def test_connect(self, mock_time):
301 mock_sock = mock.MagicMock()
302 prox = ProxSocketHelper(mock_sock)
303 prox.connect('10.20.30.40', 23456)
304 self.assertEqual(mock_sock.connect.call_count, 1)
306 def test_get_sock(self, mock_time):
307 mock_sock = mock.MagicMock()
308 prox = ProxSocketHelper(mock_sock)
309 result = prox.get_socket()
310 self.assertIs(result, mock_sock)
312 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
313 def test_get_data(self, mock_select, mock_time):
314 mock_select.select.side_effect = [[1], [0]]
315 mock_socket = mock.MagicMock()
316 mock_recv = mock_socket.recv()
317 mock_recv.decode.return_value = ""
318 prox = ProxSocketHelper(mock_socket)
319 ret = prox.get_data()
320 self.assertEqual(ret, "")
321 self.assertEqual(len(prox._pkt_dumps), 0)
323 mock_select.select.reset_mock()
324 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
325 mock_recv.decode.return_value = PACKET_DUMP_1
326 ret = prox.get_data()
327 self.assertEqual(mock_select.select.call_count, 2)
328 self.assertEqual(ret, 'pktdump,3,11')
329 self.assertEqual(len(prox._pkt_dumps), 1)
331 mock_select.select.reset_mock()
332 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
333 mock_recv.decode.return_value = PACKET_DUMP_2
334 ret = prox.get_data()
335 self.assertEqual(mock_select.select.call_count, 2)
336 self.assertEqual(ret, 'jumped over')
337 self.assertEqual(len(prox._pkt_dumps), 3)
339 def test__parse_socket_data_mixed_data(self, mock_time):
340 prox = ProxSocketHelper(mock.MagicMock())
341 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
342 self.assertEqual(ret, 'not_a_dump,1,2')
343 self.assertEqual(len(prox._pkt_dumps), 0)
345 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
346 self.assertEqual(ret, 'not_a_dump,1,2')
347 self.assertEqual(len(prox._pkt_dumps), 1)
349 def test__parse_socket_data_bad_data(self, mock_time):
350 prox = ProxSocketHelper(mock.MagicMock())
351 with self.assertRaises(ValueError):
352 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
354 with self.assertRaises(ValueError):
355 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
357 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
358 self.assertEqual(ret, 'pktdump,3')
360 def test__parse_socket_data_pkt_dump_only(self, mock_time):
361 prox = ProxSocketHelper(mock.MagicMock())
362 ret = prox._parse_socket_data('', True)
363 self.assertFalse(ret)
365 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
368 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
371 def test_put_command(self, mock_time):
372 mock_socket = mock.MagicMock()
373 prox = ProxSocketHelper(mock_socket)
374 prox.put_command("data")
375 mock_socket.sendall.assert_called_once()
377 def test_put_command_socket_error(self, mock_time):
378 mock_socket = mock.MagicMock()
379 mock_socket.sendall.side_effect = OSError
380 prox = ProxSocketHelper(mock_socket)
381 prox.put_command("data")
382 mock_socket.sendall.assert_called_once()
384 def test_get_packet_dump(self, mock_time):
385 mock_socket = mock.MagicMock()
386 prox = ProxSocketHelper(mock_socket)
388 self.assertIsNone(prox.get_packet_dump())
390 prox._pkt_dumps = [234]
391 self.assertEqual(prox.get_packet_dump(), 234)
392 self.assertEqual(prox._pkt_dumps, [])
394 def test_stop_all_reset(self, mock_time):
395 mock_socket = mock.MagicMock()
396 prox = ProxSocketHelper(mock_socket)
397 prox.stop_all_reset()
398 mock_socket.sendall.assert_called()
400 def test_stop_all(self, mock_time):
401 mock_socket = mock.MagicMock()
402 prox = ProxSocketHelper(mock_socket)
404 mock_socket.sendall.assert_called()
406 def test_stop(self, mock_time):
407 mock_socket = mock.MagicMock()
408 prox = ProxSocketHelper(mock_socket)
409 prox.stop([3, 4, 5], 16)
410 mock_socket.sendall.assert_called()
412 def test_start_all(self, mock_time):
413 mock_socket = mock.MagicMock()
414 prox = ProxSocketHelper(mock_socket)
416 mock_socket.sendall.assert_called()
418 def test_start(self, mock_time):
419 mock_socket = mock.MagicMock()
420 prox = ProxSocketHelper(mock_socket)
421 prox.start([3, 4, 5])
422 mock_socket.sendall.assert_called()
424 def test_reset_stats(self, mock_time):
425 mock_socket = mock.MagicMock()
426 prox = ProxSocketHelper(mock_socket)
428 mock_socket.sendall.assert_called()
430 def test_set_pkt_size(self, mock_time):
431 mock_socket = mock.MagicMock()
432 prox = ProxSocketHelper(mock_socket)
433 prox.set_pkt_size([3, 4, 5], 1024)
434 self.assertEqual(mock_socket.sendall.call_count, 3)
436 def test_set_value(self, mock_time):
437 mock_socket = mock.MagicMock()
438 prox = ProxSocketHelper(mock_socket)
439 prox.set_value([3, 4, 5], 10, 20, 30)
440 self.assertEqual(mock_socket.sendall.call_count, 3)
442 def test_reset_values(self, mock_time):
443 mock_socket = mock.MagicMock()
444 prox = ProxSocketHelper(mock_socket)
445 prox.reset_values([3, 4, 5])
446 self.assertEqual(mock_socket.sendall.call_count, 3)
448 def test_set_speed(self, mock_time):
449 mock_socket = mock.MagicMock()
450 prox = ProxSocketHelper(mock_socket)
451 prox.set_speed([3, 4, 5], 1000)
452 self.assertEqual(mock_socket.sendall.call_count, 3)
454 def test_slope_speed(self, mock_time):
461 'cores': [9, 10, 11],
466 mock_socket = mock.MagicMock()
467 prox = ProxSocketHelper(mock_socket)
468 prox.set_speed = set_speed = mock.MagicMock()
469 prox.slope_speed(core_data, 5)
470 self.assertEqual(set_speed.call_count, 20)
472 set_speed.reset_mock()
473 prox.slope_speed(core_data, 5, 5)
474 self.assertEqual(set_speed.call_count, 10)
476 def test_set_pps(self, mock_time):
477 mock_socket = mock.MagicMock()
478 prox = ProxSocketHelper(mock_socket)
479 prox.set_pps([3, 4, 5], 1000, 512)
480 self.assertEqual(mock_socket.sendall.call_count, 3)
482 def test_lat_stats(self, mock_time):
484 '1, 2 , 3', # has white space
486 '7,8,9,10.5,11', # too long with float, but float is in unused portion
487 'twelve,13,14', # value as English word
488 '15,16.2,17', # float in used portion
491 mock_socket = mock.MagicMock()
492 prox = ProxSocketHelper(mock_socket)
493 prox.get_data = mock.MagicMock(side_effect=latency_output)
509 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
510 self.assertEqual(mock_socket.sendall.call_count, 5)
511 self.assertEqual(result, expected)
513 def test_get_all_tot_stats_error(self, mock_time):
514 mock_socket = mock.MagicMock()
515 prox = ProxSocketHelper(mock_socket)
516 prox.get_data = mock.MagicMock(return_value='3,4,5')
517 expected = [0, 0, 0, 0]
518 result = prox.get_all_tot_stats()
519 self.assertEqual(result, expected)
521 def test_get_all_tot_stats(self, mock_time):
522 mock_socket = mock.MagicMock()
523 prox = ProxSocketHelper(mock_socket)
524 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
525 expected = 3, 4, 5, 6
526 result = prox.get_all_tot_stats()
527 self.assertEqual(result, expected)
529 def test_hz(self, mock_time):
530 mock_socket = mock.MagicMock()
531 prox = ProxSocketHelper(mock_socket)
532 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
535 self.assertEqual(result, expected)
537 def test_rx_stats(self, mock_time):
544 mock_socket = mock.MagicMock()
545 prox = ProxSocketHelper(mock_socket)
546 prox.get_data = mock.MagicMock(side_effect=core_stats)
547 expected = 21, 24, 27, 14
548 result = prox.rx_stats([3, 4, 5], 16)
549 self.assertEqual(result, expected)
551 def test_core_stats(self, mock_time):
558 mock_socket = mock.MagicMock()
559 prox = ProxSocketHelper(mock_socket)
560 prox.get_data = mock.MagicMock(side_effect=core_stats)
561 expected = 21, 24, 27, 14
562 result = prox.core_stats([3, 4, 5], 16)
563 self.assertEqual(result, expected)
565 def test_port_stats(self, mock_time):
567 ','.join(str(n) for n in range(3, 15)),
568 ','.join(str(n) for n in range(8, 32, 2)),
569 ','.join(str(n) for n in range(5, 89, 7)),
572 mock_socket = mock.MagicMock()
573 prox = ProxSocketHelper(mock_socket)
574 prox.get_data = mock.MagicMock(side_effect=port_stats)
575 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
576 result = prox.port_stats([3, 4, 5])
577 self.assertEqual(result, expected)
579 def test_measure_tot_stats(self, mock_time):
580 start_tot = 3, 4, 5, 6
581 end_tot = 7, 9, 11, 13
582 delta_tot = 4, 5, 6, 7
585 ','.join(str(n) for n in start_tot),
586 ','.join(str(n) for n in end_tot),
589 mock_socket = mock.MagicMock()
590 prox = ProxSocketHelper(mock_socket)
591 prox.get_data = mock.MagicMock(side_effect=get_data_output)
593 'start_tot': start_tot,
597 with prox.measure_tot_stats() as result:
599 self.assertEqual(result, expected)
601 def test_tot_stats(self, mock_time):
602 mock_socket = mock.MagicMock()
603 prox = ProxSocketHelper(mock_socket)
604 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
606 result = prox.tot_stats()
607 self.assertEqual(result, expected)
609 def test_tot_ierrors(self, mock_time):
610 mock_socket = mock.MagicMock()
611 prox = ProxSocketHelper(mock_socket)
612 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
614 result = prox.tot_ierrors()
615 self.assertEqual(result, expected)
617 def test_set_count(self, mock_time):
618 mock_socket = mock.MagicMock()
619 prox = ProxSocketHelper(mock_socket)
620 prox.set_count(432, [3, 4, 5])
621 self.assertEqual(mock_socket.sendall.call_count, 3)
623 def test_dump_rx(self, mock_time):
624 mock_socket = mock.MagicMock()
625 prox = ProxSocketHelper(mock_socket)
626 prox.dump_rx(3, 5, 8)
627 self.assertEqual(mock_socket.sendall.call_count, 1)
629 def test_quit(self, mock_time):
630 mock_socket = mock.MagicMock()
631 prox = ProxSocketHelper(mock_socket)
633 mock_socket.sendall.assert_called()
635 def test_force_quit(self, mock_time):
636 mock_socket = mock.MagicMock()
637 prox = ProxSocketHelper(mock_socket)
639 mock_socket.sendall.assert_called()
642 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
645 'short-name': 'ProxVnf',
650 'network': '152.16.100.20',
651 'netmask': '255.255.255.0',
652 'gateway': '152.16.100.20',
656 'network': '152.16.40.20',
657 'netmask': '255.255.255.0',
658 'gateway': '152.16.40.20',
662 'description': 'PROX approximation using DPDK',
663 'name': 'proxvnf-baremetal',
666 'network': '0064:ff9b:0:0:0:0:9810:6414',
668 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
672 'network': '0064:ff9b:0:0:0:0:9810:2814',
674 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
678 'id': 'proxvnf-baremetal',
679 'external-interface': [
681 'virtual-interface': {
682 'dst_mac': '00:00:00:00:00:04',
683 'vpci': '0000:05:00.0',
684 'local_ip': '152.16.100.19',
685 'type': 'PCI-PASSTHROUGH',
686 'vld_id': 'uplink_0',
687 'netmask': '255.255.255.0',
689 'bandwidth': '10 Gbps',
691 'dst_ip': '152.16.100.19',
692 'local_iface_name': 'xe0',
693 'local_mac': '00:00:00:00:00:02',
696 'vnfd-connection-point-ref': 'xe0',
700 'virtual-interface': {
701 'dst_mac': '00:00:00:00:00:03',
702 'vpci': '0000:05:00.1',
703 'local_ip': '152.16.40.19',
704 'type': 'PCI-PASSTHROUGH',
705 'vld_id': 'downlink_0',
707 'netmask': '255.255.255.0',
709 'bandwidth': '10 Gbps',
710 'dst_ip': '152.16.40.20',
711 'local_iface_name': 'xe1',
712 'local_mac': '00:00:00:00:00:01',
715 'vnfd-connection-point-ref': 'xe1',
721 'description': 'PROX approximation using DPDK',
723 'vdu-id': 'proxvnf-baremetal',
736 'id': 'ProxApproxVnf',
741 'vnfd:vnfd-catalog': {
748 def test_global_section(self):
749 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
752 setup_helper._prox_config_data = [('a', [])]
754 with self.assertRaises(KeyError):
755 _ = setup_helper.global_section
759 ('not_name', 'other data'),
760 ('name_not', 'more data'),
761 ('name', 'prox type'),
765 setup_helper._prox_config_data = [
794 result = setup_helper.global_section
795 self.assertEqual(result, global_section[1])
797 def test_find_in_section(self):
798 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
801 setup_helper._prox_config_data = [
803 ('not_name', 'other data'),
804 ('name_not', 'more data'),
805 ('name', 'prox type'),
835 result = setup_helper.find_in_section('section3', 'key3')
836 self.assertEqual(result, expected)
838 expected = 'default value'
839 result = setup_helper.find_in_section('section3', 'key4', 'default value')
840 self.assertEqual(result, expected)
842 with self.assertRaises(KeyError):
843 setup_helper.find_in_section('section4', 'key1')
845 with self.assertRaises(KeyError):
846 setup_helper.find_in_section('section1', 'key1')
848 def test__replace_quoted_with_value(self):
852 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
853 self.assertEqual(result, expected)
855 # no quoted substring
856 input_str = 'lion tiger bear'
857 expected = 'lion tiger bear'
858 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
859 self.assertEqual(result, expected)
861 # partially quoted substring
862 input_str = 'lion "tiger bear'
863 expected = 'lion "tiger bear'
864 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
865 self.assertEqual(result, expected)
867 # one quoted substring
868 input_str = 'lion "tiger" bear'
869 expected = 'lion "cat" bear'
870 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
871 self.assertEqual(result, expected)
873 # two quoted substrings
874 input_str = 'lion "tiger" bear "shark" whale'
875 expected = 'lion "cat" bear "shark" whale'
876 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
877 self.assertEqual(result, expected)
879 # two quoted substrings, both replaced
880 input_str = 'lion "tiger" bear "shark" whale'
881 expected = 'lion "cat" bear "cat" whale'
882 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
883 self.assertEqual(result, expected)
885 def test__get_tx_port(self):
887 input_data = {'section1': []}
889 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
890 self.assertEqual(result, expected)
892 # data for other section
901 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
902 self.assertEqual(result, expected)
905 input_data['section1'] = section1 = [
906 ('rx port', '4', 'more', 432),
910 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
911 self.assertEqual(result, expected)
913 # more data for section,
916 ('tx port', '1', 'and more', 234),
919 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
920 self.assertEqual(result, expected)
922 def test_write_prox_config(self):
925 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
926 self.assertEqual(result, expected)
934 expected = '[section1]'
935 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
936 self.assertEqual(result, expected)
947 ['__name__', 'not this one'],
950 ['key4', 'multi-line\nvalue'],
954 expected = os.linesep.join([
960 'key4=multi-line\n\tvalue',
962 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
963 self.assertEqual(result, expected)
965 def test_prox_config_data(self):
966 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
969 setup_helper.config_queue = config_queue = mock.MagicMock()
970 config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])]
972 result = setup_helper.prox_config_data
973 self.assertEqual(result, expected)
975 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
976 def test_build_config_file_no_additional_file(self, mock_find_path):
978 'prox_args': {'-c': ""},
980 'prox_config': 'e/f',
981 'prox_generate_parameter': False,
984 mock_find_path.side_effect = ['1', '2']
986 vnfd_helper = mock.MagicMock()
987 ssh_helper = mock.MagicMock()
988 scenario_helper = ScenarioHelper('vnf1')
989 scenario_helper.scenario_cfg = {
996 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
997 helper.copy_to_target = mock.MagicMock(return_value='3')
998 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
999 helper.upload_prox_config = mock.MagicMock(return_value='5')
1001 self.assertEqual(helper.additional_files, {})
1002 self.assertNotEqual(helper._prox_config_data, '4')
1003 self.assertNotEqual(helper.remote_path, '5')
1004 helper.build_config_file()
1005 self.assertEqual(helper.additional_files, {})
1006 self.assertEqual(helper._prox_config_data, '4')
1007 self.assertEqual(helper.remote_path, '5')
1009 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1010 def test_build_config_file_additional_file_string(self, mock_find_path):
1012 'prox_args': {'-c': ""},
1014 'prox_config': 'e/f',
1015 'prox_files': 'g/h.i',
1016 'prox_generate_parameter': True,
1019 mock_find_path.side_effect = ['1', '2']
1020 vnfd_helper = mock.MagicMock()
1021 ssh_helper = mock.MagicMock()
1022 scenario_helper = ScenarioHelper('vnf1')
1023 scenario_helper.scenario_cfg = {
1030 vnfd_helper.port_pairs.all_ports = ['xe0', 'xe1', 'xe2', 'xe3']
1031 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1032 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1033 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1034 helper.upload_prox_config = mock.MagicMock(return_value='55')
1036 self.assertEqual(helper.additional_files, {})
1037 expected = {'h.i': '33'}
1038 helper.build_config_file()
1039 self.assertDictEqual(helper.additional_files, expected)
1041 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1042 def test_build_config_file_additional_file(self, mock_find_path):
1044 'prox_args': {'-c': ""},
1046 'prox_config': 'e/f',
1054 mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))]
1055 vnfd_helper = mock.MagicMock()
1056 ssh_helper = mock.MagicMock()
1057 scenario_helper = ScenarioHelper('vnf1')
1058 scenario_helper.scenario_cfg = {
1065 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1066 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1067 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1068 helper.upload_prox_config = mock.MagicMock(return_value='55')
1070 self.assertEqual(helper.additional_files, {})
1071 self.assertNotEqual(helper._prox_config_data, '44')
1072 self.assertNotEqual(helper.remote_path, '55')
1073 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
1074 helper.build_config_file()
1075 self.assertDictEqual(helper.additional_files, expected)
1076 self.assertEqual(helper._prox_config_data, '44')
1077 self.assertEqual(helper.remote_path, '55')
1079 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1080 def test_build_config(self, mock_find_path):
1082 'prox_args': {'-f': ""},
1083 'prox_path': '/opt/nsb_bin/prox',
1084 'prox_config': 'configs/gen_l2fwd-2.cfg',
1092 mock_find_path.side_effect = ['1', '2']
1093 vnfd_helper = mock.MagicMock()
1094 ssh_helper = mock.MagicMock()
1095 ssh_helper.provision_tool.return_value = "/opt/nsb_bin/prox"
1096 scenario_helper = ScenarioHelper('vnf1')
1097 scenario_helper.scenario_cfg = {
1104 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1105 helper.remote_path = "/tmp/prox.cfg"
1106 expected = "sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli -f -f /tmp/prox.cfg '"
1107 with mock.patch.object(helper, "build_config_file") as mock_build_config:
1108 prox_cmd = helper.build_config()
1109 self.assertEqual(prox_cmd, expected)
1111 def test__insert_additional_file(self):
1112 vnfd_helper = mock.MagicMock()
1113 ssh_helper = mock.MagicMock()
1114 scenario_helper = mock.MagicMock()
1116 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1117 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1118 res = helper._insert_additional_file('dofile("ipv4.lua")')
1119 self.assertEqual(res, 'dofile("/tmp/ipv4.lua")')
1121 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1122 def test_generate_prox_config_file(self, mock_parser_type):
1125 args[-1].extend(sections_data)
1126 return mock.MagicMock()
1130 mock_parser_type.side_effect = init
1132 vnfd_helper = VnfdHelper(self.VNFD0)
1133 ssh_helper = mock.MagicMock()
1134 scenario_helper = mock.MagicMock()
1136 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1137 helper.additional_files = {}
1140 result = helper.generate_prox_config_file('a/b')
1141 self.assertEqual(result, expected)
1143 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1145 helper.remote_prox_file_name = 'remote'
1150 ['dofile("ipv4.lua")', ''],
1166 ['$sut_mac0', '@@dst_mac0'],
1169 ['user_table', 'dofile("ipv4.lua")'],
1170 ['missing_addtional_file', 'dofile("nosuch")'],
1179 ['dofile("/tmp/ipv4.lua")', ''],
1186 ['mac', 'hardware'],
1187 ['dst mac', '00:00:00:00:00:03'],
1195 ['$sut_mac0', '00 00 00 00 00 04'],
1198 ['user_table', 'dofile("/tmp/ipv4.lua")'],
1199 ['missing_addtional_file', 'dofile("nosuch")'],
1203 result = helper.generate_prox_config_file('/c/d/e')
1204 self.assertEqual(result, expected, str(result))
1206 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1207 def test_generate_prox_config_file_negative(self, mock_parser_type):
1209 args[-1].update(sections_data)
1210 return mock.MagicMock()
1214 mock_parser_type.side_effect = init
1216 vnfd_helper = mock.MagicMock()
1217 vnfd_helper.interfaces = []
1218 ssh_helper = mock.MagicMock()
1219 scenario_helper = mock.MagicMock()
1221 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1222 helper.additional_files = {}
1223 helper.remote_prox_file_name = 'remote'
1224 vnfd_helper.interfaces = [
1226 'virtual-interface': {
1228 'dst_mac': '00:00:00:de:ad:88',
1232 'virtual-interface': {
1234 'dst_mac': '00:00:00:de:ad:ff',
1238 'virtual-interface': {
1240 'dst_mac': '00:00:00:de:ad:ff',
1254 ['???', 'dofile "here" 23'],
1258 with self.assertRaises(Exception):
1259 helper.generate_prox_config_file('a/b')
1261 def test_put_string_to_file(self):
1262 vnfd_helper = mock.MagicMock()
1263 vnfd_helper.interfaces = []
1264 ssh_helper = mock.MagicMock()
1265 scenario_helper = mock.MagicMock()
1267 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1270 result = helper.put_string_to_file('my long string', 'a/b')
1271 self.assertEqual(result, expected)
1273 def test__build_pipeline_kwarags(self):
1274 vnfd_helper = mock.MagicMock()
1275 ssh_helper = mock.MagicMock()
1276 ssh_helper.provision_tool.return_value = "/tmp/nosuch"
1277 scenario_helper = mock.MagicMock()
1279 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1280 helper._build_pipeline_kwargs()
1281 self.assertEqual(helper.pipeline_kwargs, {'tool_path': '/tmp/nosuch', 'tool_dir': '/tmp'})
1283 def test_copy_to_target(self):
1284 vnfd_helper = mock.MagicMock()
1285 vnfd_helper.interfaces = []
1286 ssh_helper = mock.MagicMock()
1287 scenario_helper = mock.MagicMock()
1289 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1291 result = helper.copy_to_target('a/b', 'c')
1292 self.assertEqual(result, expected)
1294 def test_upload_prox_config(self):
1295 vnfd_helper = mock.MagicMock()
1296 vnfd_helper.interfaces = []
1297 ssh_helper = mock.MagicMock()
1298 scenario_helper = mock.MagicMock()
1300 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1301 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1303 result = helper.upload_prox_config('a', {})
1304 self.assertEqual(result, expected)
1307 class TestProxResourceHelper(unittest.TestCase):
1310 'short-name': 'ProxVnf',
1315 'network': '152.16.100.20',
1316 'netmask': '255.255.255.0',
1317 'gateway': '152.16.100.20',
1321 'network': '152.16.40.20',
1322 'netmask': '255.255.255.0',
1323 'gateway': '152.16.40.20',
1327 'description': 'PROX approximation using DPDK',
1328 'name': 'proxvnf-baremetal',
1331 'network': '0064:ff9b:0:0:0:0:9810:6414',
1333 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1337 'network': '0064:ff9b:0:0:0:0:9810:2814',
1339 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1343 'id': 'proxvnf-baremetal',
1344 'external-interface': [
1346 'virtual-interface': {
1347 'dst_mac': '00:00:00:00:00:04',
1348 'vpci': '0000:05:00.0',
1349 'local_ip': '152.16.100.19',
1350 'type': 'PCI-PASSTHROUGH',
1351 'vld_id': 'uplink_0',
1352 'netmask': '255.255.255.0',
1354 'bandwidth': '10 Gbps',
1356 'dst_ip': '152.16.100.19',
1357 'local_iface_name': 'xe0',
1358 'local_mac': '00:00:00:00:00:02',
1361 'vnfd-connection-point-ref': 'xe0',
1365 'virtual-interface': {
1366 'dst_mac': '00:00:00:00:00:03',
1367 'vpci': '0000:05:00.1',
1368 'local_ip': '152.16.40.19',
1369 'type': 'PCI-PASSTHROUGH',
1370 'vld_id': 'downlink_0',
1372 'netmask': '255.255.255.0',
1374 'bandwidth': '10 Gbps',
1375 'dst_ip': '152.16.40.20',
1376 'local_iface_name': 'xe1',
1377 'local_mac': '00:00:00:00:00:01',
1380 'vnfd-connection-point-ref': 'xe1',
1386 'description': 'PROX approximation using DPDK',
1388 'vdu-id': 'proxvnf-baremetal',
1401 'id': 'ProxApproxVnf',
1406 'vnfd:vnfd-catalog': {
1413 def test_find_pci(self):
1419 result = ProxResourceHelper.find_pci('target', input_str_list)
1420 self.assertFalse(result)
1428 result = ProxResourceHelper.find_pci('target', input_str_list)
1429 self.assertTrue(result)
1431 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1432 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1433 def test_sut(self, mock_socket_helper):
1434 helper = ProxResourceHelper(mock.MagicMock())
1435 self.assertIsNone(helper.client)
1437 self.assertIsNotNone(result)
1438 self.assertIs(result, helper.client)
1439 self.assertIs(result, helper.sut)
1441 def test_test_type(self):
1442 setup_helper = mock.MagicMock()
1443 setup_helper.find_in_section.return_value = expected = 'prox type'
1445 helper = ProxResourceHelper(setup_helper)
1447 self.assertIsNone(helper._test_type)
1448 self.assertEqual(helper.test_type, expected)
1449 self.assertEqual(helper._test_type, expected)
1450 self.assertEqual(helper.test_type, expected)
1452 def test_collect_collectd_kpi(self):
1453 helper = ProxResourceHelper(mock.MagicMock())
1454 helper.resource = resource = mock.MagicMock()
1456 resource.check_if_sa_running.return_value = 0, '1234'
1457 resource.amqp_collect_nfvi_kpi.return_value = 543
1458 resource.check_if_sa_running.return_value = (0, None)
1460 expected = {'core': 543}
1461 result = helper.collect_collectd_kpi()
1462 self.assertDictEqual(result, expected)
1464 def test_collect_kpi(self):
1465 helper = ProxResourceHelper(mock.MagicMock())
1466 helper._queue = queue = mock.MagicMock()
1467 helper._result = {'z': 123}
1468 helper.resource = resource = mock.MagicMock()
1470 resource.check_if_sa_running.return_value = 0, '1234'
1471 resource.amqp_collect_nfvi_kpi.return_value = 543
1472 resource.check_if_sa_running.return_value = (0, None)
1474 queue.empty.return_value = False
1475 queue.get.return_value = {'a': 789}
1477 expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
1478 result = helper.collect_kpi()
1479 self.assertDictEqual(result, expected)
1481 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1482 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1483 def test__connect(self, mock_socket_helper_type, mock_time):
1484 client = mock_socket_helper_type()
1485 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1487 setup_helper = mock.MagicMock()
1488 setup_helper.vnfd_helper.interfaces = []
1490 helper = ProxResourceHelper(setup_helper)
1492 result = helper._connect()
1493 self.assertIs(result, client)
1495 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1497 with self.assertRaises(Exception):
1500 def test_run_traffic(self):
1501 setup_helper = mock.MagicMock()
1502 helper = ProxResourceHelper(setup_helper)
1503 traffic_profile = mock.MagicMock(**{"done": True})
1504 helper.run_traffic(traffic_profile)
1505 self.assertEqual(helper._terminated.value, 1)
1507 def test__run_traffic_once(self):
1508 setup_helper = mock.MagicMock()
1509 helper = ProxResourceHelper(setup_helper)
1510 traffic_profile = mock.MagicMock(**{"done": True})
1511 helper._run_traffic_once(traffic_profile)
1512 self.assertEqual(helper._terminated.value, 1)
1514 def test_start_collect(self):
1515 setup_helper = mock.MagicMock()
1516 helper = ProxResourceHelper(setup_helper)
1517 helper.resource = resource = mock.MagicMock()
1518 self.assertIsNone(helper.start_collect())
1519 resource.start.assert_called_once()
1521 def test_terminate(self):
1522 setup_helper = mock.MagicMock()
1523 helper = ProxResourceHelper(setup_helper)
1524 with self.assertRaises(NotImplementedError):
1527 def test_up_post(self):
1528 setup_helper = mock.MagicMock()
1529 helper = ProxResourceHelper(setup_helper)
1530 helper.client = expected = mock.MagicMock()
1531 result = helper.up_post()
1532 self.assertEqual(result, expected)
1534 def test_execute(self):
1535 setup_helper = mock.MagicMock()
1536 helper = ProxResourceHelper(setup_helper)
1537 helper.client = mock.MagicMock()
1539 expected = helper.client.my_command()
1540 result = helper.execute('my_command')
1541 self.assertEqual(result, expected)
1543 helper.client = object()
1545 result = helper.execute('my_command')
1546 self.assertIsNone(result)
1549 class TestProxDataHelper(unittest.TestCase):
1551 def test_totals_and_pps(self):
1553 vnfd_helper = mock.MagicMock()
1554 vnfd_helper.port_pairs.all_ports = list(range(4))
1556 sut = mock.MagicMock()
1557 sut.port_stats.return_value = list(range(10))
1559 data_helper = ProxDataHelper(vnfd_helper, sut, pkt_size, 25, None)
1561 self.assertEqual(data_helper.rx_total, 6)
1562 self.assertEqual(data_helper.tx_total, 7)
1563 self.assertEqual(data_helper.pps, 6.25e6)
1565 def test_samples(self):
1566 vnfd_helper = mock.MagicMock()
1567 vnfd_helper.port_pairs.all_ports = list(range(4))
1568 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1570 sut = mock.MagicMock()
1571 sut.port_stats.return_value = list(range(10))
1573 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1585 result = data_helper.samples
1586 self.assertDictEqual(result, expected)
1588 def test___enter__(self):
1589 vnfd_helper = mock.MagicMock()
1590 vnfd_helper.port_pairs.all_ports = list(range(4))
1591 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1593 sut = mock.MagicMock()
1594 sut.port_stats.return_value = list(range(10))
1596 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1597 data_helper._totals_and_pps = 12, 32, 4.5
1598 data_helper.tsc_hz = 9.8
1599 data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)}
1600 data_helper.latency = 7
1602 self.assertIsNone(data_helper.result_tuple)
1604 expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5)
1608 result = data_helper.result_tuple
1609 self.assertEqual(result, expected)
1611 data_helper.make_tuple()
1612 self.assertIs(data_helper.result_tuple, result)
1614 def test___enter___negative(self):
1615 vnfd_helper = mock.MagicMock()
1617 data_helper = ProxDataHelper(vnfd_helper, None, None, None, None)
1619 vnfd_helper.port_pairs.all_ports = []
1620 with self.assertRaises(AssertionError):
1624 vnfd_helper.port_pairs.all_ports = [0, 1, 2]
1625 with self.assertRaises(AssertionError):
1629 def test_measure_tot_stats(self):
1630 vnfd_helper = mock.MagicMock()
1631 vnfd_helper.port_pairs.all_ports = list(range(4))
1633 start = (3, 4, 1, 2)
1636 sut = ProxSocketHelper(mock.MagicMock())
1637 sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end])
1639 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1641 self.assertIsNone(data_helper.measured_stats)
1646 'delta': TotStatsTuple(6, 3, 5, 6),
1648 with data_helper.measure_tot_stats():
1651 self.assertEqual(data_helper.measured_stats, expected)
1653 def test_capture_tsc_hz(self):
1654 vnfd_helper = mock.MagicMock()
1655 vnfd_helper.port_pairs.all_ports = list(range(4))
1657 sut = mock.MagicMock()
1658 sut.hz.return_value = '54.6'
1660 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1662 self.assertIsNone(data_helper.tsc_hz)
1665 data_helper.capture_tsc_hz()
1666 self.assertEqual(data_helper.tsc_hz, expected)
1669 class TestProxProfileHelper(unittest.TestCase):
1671 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1672 def test_get_cls(self, mock_utils):
1673 mock_type1 = mock.MagicMock()
1674 mock_type1.__prox_profile_type__ = 'another_type'
1675 mock_type2 = mock.MagicMock()
1676 mock_type2.__prox_profile_type__ = 'my_type'
1677 mock_utils.itersubclasses.return_value = [mock_type1, mock_type2]
1679 self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2)
1681 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1682 def test_get_cls_default(self, mock_utils):
1683 mock_utils.itersubclasses.return_value = []
1684 ProxProfileHelper.get_cls('my_type')
1686 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1687 def test_cpu_topology(self, mock_socket_topology):
1688 mock_socket_topology.parse_cpuinfo.return_value = 432
1690 resource_helper = mock.MagicMock()
1691 resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1693 helper = ProxProfileHelper(resource_helper)
1694 self.assertIsNone(helper._cpu_topology)
1695 result = helper.cpu_topology
1696 self.assertEqual(result, 432)
1697 self.assertIs(result, helper._cpu_topology)
1698 self.assertIs(result, helper.cpu_topology)
1700 def test_test_cores(self):
1701 resource_helper = mock.MagicMock()
1702 resource_helper.setup_helper.prox_config_data = []
1704 helper = ProxProfileHelper(resource_helper)
1705 helper._cpu_topology = []
1708 result = helper.test_cores
1709 self.assertEqual(result, expected)
1711 resource_helper.setup_helper.prox_config_data = [
1732 helper = ProxProfileHelper(resource_helper)
1733 helper._cpu_topology = {
1750 self.assertIsNone(helper._test_cores)
1752 result = helper.test_cores
1753 self.assertEqual(result, expected)
1754 self.assertIs(result, helper._test_cores)
1755 self.assertIs(result, helper.test_cores)
1757 def test_latency_cores(self):
1758 resource_helper = mock.MagicMock()
1759 resource_helper.setup_helper.prox_config_data = []
1761 helper = ProxProfileHelper(resource_helper)
1762 helper._cpu_topology = []
1765 result = helper.latency_cores
1766 self.assertEqual(result, expected)
1768 resource_helper.setup_helper.prox_config_data = [
1789 helper = ProxProfileHelper(resource_helper)
1790 helper._cpu_topology = {
1807 self.assertIsNone(helper._latency_cores)
1809 result = helper.latency_cores
1810 self.assertEqual(result, expected)
1811 self.assertIs(result, helper._latency_cores)
1812 self.assertIs(result, helper.latency_cores)
1814 def test_all_rx_cores(self):
1815 helper = ProxBngProfileHelper(mock.MagicMock())
1816 helper._latency_cores = expected = [3, 4, 6]
1817 helper._test_cores = [5, 2, 1]
1819 result = helper.all_rx_cores
1820 self.assertEqual(result, expected)
1822 def test_get_cores(self):
1823 resource_helper = mock.MagicMock()
1824 resource_helper.setup_helper.prox_config_data = [
1845 helper = ProxProfileHelper(resource_helper)
1846 helper._cpu_topology = {
1864 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1865 self.assertEqual(result, expected)
1867 def test_get_latency(self):
1868 resource_helper = mock.MagicMock()
1869 resource_helper.setup_helper.vnfd_helper.interfaces = []
1871 helper = ProxProfileHelper(resource_helper)
1872 helper._latency_cores = []
1875 result = helper.get_latency()
1876 self.assertEqual(result, expected)
1878 helper._latency_cores = [1, 2]
1879 helper.client = mock.MagicMock()
1881 expected = helper.sut.lat_stats()
1882 result = helper.get_latency()
1883 self.assertIs(result, expected)
1885 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1886 def test_traffic_context(self, mock_time):
1887 setup_helper = mock.MagicMock()
1888 setup_helper.vnfd_helper.interfaces = []
1890 helper = ProxProfileHelper(setup_helper)
1891 helper._cpu_topology = {
1908 setup_helper.prox_config_data = [
1910 ('not_name', 'other data'),
1911 ('name_not', 'more data'),
1912 ('name', helper.__prox_profile_type__),
1936 client = mock.MagicMock()
1937 client.hz.return_value = 2
1938 client.port_stats.return_value = tuple(range(12))
1940 helper.client = client
1941 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1943 helper._test_cores = [3, 4]
1945 with helper.traffic_context(64, 1):
1948 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1949 def test_run_test(self, _):
1950 resource_helper = mock.MagicMock()
1951 resource_helper.step_delta = 0.4
1952 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
1953 resource_helper.sut.port_stats.return_value = list(range(10))
1955 helper = ProxProfileHelper(resource_helper)
1957 helper.run_test(120, 5, 6.5)
1960 class TestProxMplsProfileHelper(unittest.TestCase):
1962 def test_mpls_cores(self):
1963 resource_helper = mock.MagicMock()
1964 resource_helper.setup_helper.prox_config_data = [
1987 helper = ProxMplsProfileHelper(resource_helper)
1988 helper._cpu_topology = {
2005 expected_tagged = [7]
2006 expected_plain = [8]
2007 self.assertIsNone(helper._cores_tuple)
2008 self.assertEqual(helper.tagged_cores, expected_tagged)
2009 self.assertEqual(helper.plain_cores, expected_plain)
2010 self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain))
2012 def test_traffic_context(self):
2013 setup_helper = mock.MagicMock()
2014 helper = ProxMplsProfileHelper(setup_helper)
2016 with helper.traffic_context(120, 5.4):
2020 class TestProxBngProfileHelper(unittest.TestCase):
2022 def test_bng_cores(self):
2023 resource_helper = mock.MagicMock()
2024 resource_helper.setup_helper.prox_config_data = [
2048 ('name', 'arp_task'),
2057 helper = ProxBngProfileHelper(resource_helper)
2058 helper._cpu_topology = {
2083 expected_arp = [4, 3]
2084 expected_arp_task = [0, 4]
2085 expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task)
2087 self.assertIsNone(helper._cores_tuple)
2088 self.assertEqual(helper.cpe_cores, expected_cpe)
2089 self.assertEqual(helper.inet_cores, expected_inet)
2090 self.assertEqual(helper.arp_cores, expected_arp)
2091 self.assertEqual(helper.arp_task_cores, expected_arp_task)
2092 self.assertEqual(helper._cores_tuple, expected_combined)
2094 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2095 def test_run_test(self, _):
2096 resource_helper = mock.MagicMock()
2097 resource_helper.step_delta = 0.4
2098 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2099 resource_helper.sut.port_stats.return_value = list(range(10))
2101 helper = ProxBngProfileHelper(resource_helper)
2103 helper.run_test(120, 5, 6.5)
2104 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2107 class TestProxVpeProfileHelper(unittest.TestCase):
2109 def test_vpe_cores(self):
2110 resource_helper = mock.MagicMock()
2111 resource_helper.setup_helper.prox_config_data = [
2134 helper = ProxVpeProfileHelper(resource_helper)
2135 helper._cpu_topology = {
2154 expected_combined = (expected_cpe, expected_inet)
2156 self.assertIsNone(helper._cores_tuple)
2157 self.assertEqual(helper.cpe_cores, expected_cpe)
2158 self.assertEqual(helper.inet_cores, expected_inet)
2159 self.assertEqual(helper._cores_tuple, expected_combined)
2161 def test_vpe_ports(self):
2162 resource_helper = mock.MagicMock()
2163 resource_helper.setup_helper.prox_config_data = [
2172 ('mac', 'hardware'),
2177 ('mac', 'hardware'),
2181 helper = ProxVpeProfileHelper(resource_helper)
2182 helper._port_list = {
2201 expected_combined = (expected_cpe, expected_inet)
2203 self.assertIsNone(helper._ports_tuple)
2204 self.assertEqual(helper.cpe_ports, expected_cpe)
2205 self.assertEqual(helper.inet_ports, expected_inet)
2206 self.assertEqual(helper._ports_tuple, expected_combined)
2208 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2209 def test_run_test(self, _):
2210 resource_helper = mock.MagicMock()
2211 resource_helper.step_delta = 0.4
2212 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2213 resource_helper.sut.port_stats.return_value = list(range(10))
2215 helper = ProxVpeProfileHelper(resource_helper)
2217 helper.run_test(120, 5, 6.5)
2218 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2221 class TestProxlwAFTRProfileHelper(unittest.TestCase):
2223 def test_lwaftr_cores(self):
2224 resource_helper = mock.MagicMock()
2225 resource_helper.setup_helper.prox_config_data = [
2248 helper = ProxlwAFTRProfileHelper(resource_helper)
2249 helper._cpu_topology = {
2268 expected_combined = (expected_tun, expected_inet)
2270 self.assertIsNone(helper._cores_tuple)
2271 self.assertEqual(helper.tun_cores, expected_tun)
2272 self.assertEqual(helper.inet_cores, expected_inet)
2273 self.assertEqual(helper._cores_tuple, expected_combined)
2275 def test_tun_ports(self):
2276 resource_helper = mock.MagicMock()
2277 resource_helper.setup_helper.prox_config_data = [
2286 ('mac', 'hardware'),
2291 ('mac', 'hardware'),
2295 helper = ProxlwAFTRProfileHelper(resource_helper)
2296 helper._port_list = {
2315 expected_combined = (expected_tun, expected_inet)
2317 self.assertIsNone(helper._ports_tuple)
2318 self.assertEqual(helper.tun_ports, expected_tun)
2319 self.assertEqual(helper.inet_ports, expected_inet)
2320 self.assertEqual(helper._ports_tuple, expected_combined)
2322 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2323 def test_run_test(self, _):
2324 resource_helper = mock.MagicMock()
2325 resource_helper.step_delta = 0.4
2326 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2327 resource_helper.sut.port_stats.return_value = list(range(10))
2329 helper = ProxlwAFTRProfileHelper(resource_helper)
2331 helper.run_test(120, 5, 6.5)
2332 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1