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
49 class TestCoreTuple(unittest.TestCase):
50 def test___init__(self):
51 core_tuple = CoreSocketTuple('core 5s6')
52 self.assertEqual(core_tuple.core_id, 5)
53 self.assertEqual(core_tuple.socket_id, 6)
54 self.assertFalse(core_tuple.is_hyperthread())
56 core_tuple = CoreSocketTuple('core 5s6h')
57 self.assertEqual(core_tuple.core_id, 5)
58 self.assertEqual(core_tuple.socket_id, 6)
59 self.assertTrue(core_tuple.is_hyperthread())
61 def test___init__negative(self):
82 for bad_input in bad_inputs:
83 with self.assertRaises(ValueError):
84 CoreSocketTuple(bad_input)
86 def test_find_in_topology(self):
96 core_tuple = CoreSocketTuple('core 5s6')
99 result = core_tuple.find_in_topology(topology_in)
100 self.assertEqual(result, expected)
102 core_tuple = CoreSocketTuple('core 5s6h')
105 result = core_tuple.find_in_topology(topology_in)
106 self.assertEqual(result, expected)
108 def test_find_in_topology_negative(self):
109 core_tuple = CoreSocketTuple('core 6s5')
110 with self.assertRaises(ValueError):
112 core_tuple.find_in_topology({})
114 with self.assertRaises(ValueError):
116 core_tuple.find_in_topology({5: {}})
118 with self.assertRaises(ValueError):
119 # no first value (as needed by non-hyperthread core)
120 core_tuple.find_in_topology({5: {6: {'key1': []}}})
122 core_tuple = CoreSocketTuple('core 6s5h')
123 with self.assertRaises(ValueError):
124 # no second value (as needed by hyperthread core)
125 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
128 class TestTotStatsTuple(unittest.TestCase):
129 def test___new___negative(self):
130 with self.assertRaises(TypeError):
134 with self.assertRaises(TypeError):
135 # one, non-integer value
138 with self.assertRaises(TypeError):
140 TotStatsTuple(3, 4, 5, 6, 7)
143 class TestProxTestDataTuple(unittest.TestCase):
144 def test___init__(self):
145 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
146 self.assertEqual(prox_test_data.tolerated, 1)
147 self.assertEqual(prox_test_data.tsc_hz, 2)
148 self.assertEqual(prox_test_data.delta_rx, 3)
149 self.assertEqual(prox_test_data.delta_tx, 4)
150 self.assertEqual(prox_test_data.delta_tsc, 5)
151 self.assertEqual(prox_test_data.latency, 6)
152 self.assertEqual(prox_test_data.rx_total, 7)
153 self.assertEqual(prox_test_data.tx_total, 8)
154 self.assertEqual(prox_test_data.pps, 9)
156 def test_properties(self):
157 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
158 self.assertEqual(prox_test_data.pkt_loss, 12.5)
159 self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
160 self.assertEqual(prox_test_data.can_be_lost, 0)
161 self.assertEqual(prox_test_data.drop_total, 1)
162 self.assertFalse(prox_test_data.success)
164 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
165 self.assertTrue(prox_test_data.success)
167 def test_pkt_loss_zero_division(self):
168 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
169 self.assertEqual(prox_test_data.pkt_loss, 100.0)
171 def test_get_samples(self):
172 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
175 "Throughput": 1.6 / 1e6,
177 "CurrentDropPackets": 12.5,
178 "TxThroughput": 9 / 1e6,
179 "RxThroughput": 1.6 / 1e6,
186 result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
187 self.assertDictEqual(result, expected)
190 "Throughput": 1.6 / 1e6,
191 "DropPackets": 0.123,
192 "CurrentDropPackets": 0.123,
193 "TxThroughput": 9 / 1e6,
194 "RxThroughput": 1.6 / 1e6,
200 result = prox_test_data.get_samples(64, 0.123)
201 self.assertDictEqual(result, expected)
203 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
204 def test_log_data(self, mock_logger):
205 my_mock_logger = mock.MagicMock()
206 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
207 prox_test_data.log_data()
208 self.assertEqual(my_mock_logger.debug.call_count, 0)
209 self.assertEqual(mock_logger.debug.call_count, 2)
211 mock_logger.debug.reset_mock()
212 prox_test_data.log_data(my_mock_logger)
213 self.assertEqual(my_mock_logger.debug.call_count, 2)
214 self.assertEqual(mock_logger.debug.call_count, 0)
217 class TestPacketDump(unittest.TestCase):
220 def test__init__(self):
221 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
223 def test___str__(self):
224 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
225 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
226 self.assertEqual(str(dump1), expected)
228 def test_port_id(self):
229 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
230 self.assertEqual(p.port_id, "port_id")
232 def test_data_len(self):
233 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
234 self.assertEqual(p.data_len, len(self.PAYLOAD))
236 def test_payload(self):
237 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
238 self.assertEqual(p.payload(), self.PAYLOAD)
240 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
242 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
244 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
256 brown fox jumped over
262 PACKET_DUMP_NON_1 = """\
267 PACKET_DUMP_MIXED_1 = """\
274 PACKET_DUMP_BAD_1 = """\
279 PACKET_DUMP_BAD_2 = """\
284 PACKET_DUMP_BAD_3 = """\
290 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
291 class TestProxSocketHelper(unittest.TestCase):
292 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
293 def test___init__(self, mock_socket, mock_time):
294 expected = mock_socket.socket()
295 prox = ProxSocketHelper()
297 self.assertEqual(result, expected)
299 def test_connect(self, mock_time):
300 mock_sock = mock.MagicMock()
301 prox = ProxSocketHelper(mock_sock)
302 prox.connect('10.20.30.40', 23456)
303 self.assertEqual(mock_sock.connect.call_count, 1)
305 def test_get_sock(self, mock_time):
306 mock_sock = mock.MagicMock()
307 prox = ProxSocketHelper(mock_sock)
308 result = prox.get_socket()
309 self.assertIs(result, mock_sock)
311 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
312 def test_get_data(self, mock_select, mock_time):
313 mock_select.select.side_effect = [[1], [0]]
314 mock_socket = mock.MagicMock()
315 mock_recv = mock_socket.recv()
316 mock_recv.decode.return_value = ""
317 prox = ProxSocketHelper(mock_socket)
318 ret = prox.get_data()
319 self.assertEqual(ret, "")
320 self.assertEqual(len(prox._pkt_dumps), 0)
322 mock_select.select.reset_mock()
323 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
324 mock_recv.decode.return_value = PACKET_DUMP_1
325 ret = prox.get_data()
326 self.assertEqual(mock_select.select.call_count, 2)
327 self.assertEqual(ret, 'pktdump,3,11')
328 self.assertEqual(len(prox._pkt_dumps), 1)
330 mock_select.select.reset_mock()
331 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
332 mock_recv.decode.return_value = PACKET_DUMP_2
333 ret = prox.get_data()
334 self.assertEqual(mock_select.select.call_count, 2)
335 self.assertEqual(ret, 'jumped over')
336 self.assertEqual(len(prox._pkt_dumps), 3)
338 def test__parse_socket_data_mixed_data(self, mock_time):
339 prox = ProxSocketHelper(mock.MagicMock())
340 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
341 self.assertEqual(ret, 'not_a_dump,1,2')
342 self.assertEqual(len(prox._pkt_dumps), 0)
344 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
345 self.assertEqual(ret, 'not_a_dump,1,2')
346 self.assertEqual(len(prox._pkt_dumps), 1)
348 def test__parse_socket_data_bad_data(self, mock_time):
349 prox = ProxSocketHelper(mock.MagicMock())
350 with self.assertRaises(ValueError):
351 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
353 with self.assertRaises(ValueError):
354 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
356 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
357 self.assertEqual(ret, 'pktdump,3')
359 def test__parse_socket_data_pkt_dump_only(self, mock_time):
360 prox = ProxSocketHelper(mock.MagicMock())
361 ret = prox._parse_socket_data('', True)
362 self.assertFalse(ret)
364 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
367 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
370 def test_put_command(self, mock_time):
371 mock_socket = mock.MagicMock()
372 prox = ProxSocketHelper(mock_socket)
373 prox.put_command("data")
374 mock_socket.sendall.assert_called_once()
376 def test_put_command_socket_error(self, mock_time):
377 mock_socket = mock.MagicMock()
378 mock_socket.sendall.side_effect = OSError
379 prox = ProxSocketHelper(mock_socket)
380 prox.put_command("data")
381 mock_socket.sendall.assert_called_once()
383 def test_get_packet_dump(self, mock_time):
384 mock_socket = mock.MagicMock()
385 prox = ProxSocketHelper(mock_socket)
387 self.assertIsNone(prox.get_packet_dump())
389 prox._pkt_dumps = [234]
390 self.assertEqual(prox.get_packet_dump(), 234)
391 self.assertEqual(prox._pkt_dumps, [])
393 def test_stop_all_reset(self, mock_time):
394 mock_socket = mock.MagicMock()
395 prox = ProxSocketHelper(mock_socket)
396 prox.stop_all_reset()
397 mock_socket.sendall.assert_called()
399 def test_stop_all(self, mock_time):
400 mock_socket = mock.MagicMock()
401 prox = ProxSocketHelper(mock_socket)
403 mock_socket.sendall.assert_called()
405 def test_stop(self, mock_time):
406 mock_socket = mock.MagicMock()
407 prox = ProxSocketHelper(mock_socket)
408 prox.stop([3, 4, 5], 16)
409 mock_socket.sendall.assert_called()
411 def test_start_all(self, mock_time):
412 mock_socket = mock.MagicMock()
413 prox = ProxSocketHelper(mock_socket)
415 mock_socket.sendall.assert_called()
417 def test_start(self, mock_time):
418 mock_socket = mock.MagicMock()
419 prox = ProxSocketHelper(mock_socket)
420 prox.start([3, 4, 5])
421 mock_socket.sendall.assert_called()
423 def test_reset_stats(self, mock_time):
424 mock_socket = mock.MagicMock()
425 prox = ProxSocketHelper(mock_socket)
427 mock_socket.sendall.assert_called()
429 def test_set_pkt_size(self, mock_time):
430 mock_socket = mock.MagicMock()
431 prox = ProxSocketHelper(mock_socket)
432 prox.set_pkt_size([3, 4, 5], 1024)
433 self.assertEqual(mock_socket.sendall.call_count, 3)
435 def test_set_value(self, mock_time):
436 mock_socket = mock.MagicMock()
437 prox = ProxSocketHelper(mock_socket)
438 prox.set_value([3, 4, 5], 10, 20, 30)
439 self.assertEqual(mock_socket.sendall.call_count, 3)
441 def test_reset_values(self, mock_time):
442 mock_socket = mock.MagicMock()
443 prox = ProxSocketHelper(mock_socket)
444 prox.reset_values([3, 4, 5])
445 self.assertEqual(mock_socket.sendall.call_count, 3)
447 def test_set_speed(self, mock_time):
448 mock_socket = mock.MagicMock()
449 prox = ProxSocketHelper(mock_socket)
450 prox.set_speed([3, 4, 5], 1000)
451 self.assertEqual(mock_socket.sendall.call_count, 3)
453 def test_slope_speed(self, mock_time):
460 'cores': [9, 10, 11],
465 mock_socket = mock.MagicMock()
466 prox = ProxSocketHelper(mock_socket)
467 prox.set_speed = set_speed = mock.MagicMock()
468 prox.slope_speed(core_data, 5)
469 self.assertEqual(set_speed.call_count, 20)
471 set_speed.reset_mock()
472 prox.slope_speed(core_data, 5, 5)
473 self.assertEqual(set_speed.call_count, 10)
475 def test_set_pps(self, mock_time):
476 mock_socket = mock.MagicMock()
477 prox = ProxSocketHelper(mock_socket)
478 prox.set_pps([3, 4, 5], 1000, 512)
479 self.assertEqual(mock_socket.sendall.call_count, 3)
481 def test_lat_stats(self, mock_time):
483 '1, 2 , 3', # has white space
485 '7,8,9,10.5,11', # too long with float, but float is in unused portion
486 'twelve,13,14', # value as English word
487 '15,16.2,17', # float in used portion
490 mock_socket = mock.MagicMock()
491 prox = ProxSocketHelper(mock_socket)
492 prox.get_data = mock.MagicMock(side_effect=latency_output)
508 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
509 self.assertEqual(mock_socket.sendall.call_count, 5)
510 self.assertEqual(result, expected)
512 def test_get_all_tot_stats_error(self, mock_time):
513 mock_socket = mock.MagicMock()
514 prox = ProxSocketHelper(mock_socket)
515 prox.get_data = mock.MagicMock(return_value='3,4,5')
516 expected = [0, 0, 0, 0]
517 result = prox.get_all_tot_stats()
518 self.assertEqual(result, expected)
520 def test_get_all_tot_stats(self, mock_time):
521 mock_socket = mock.MagicMock()
522 prox = ProxSocketHelper(mock_socket)
523 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
524 expected = 3, 4, 5, 6
525 result = prox.get_all_tot_stats()
526 self.assertEqual(result, expected)
528 def test_hz(self, mock_time):
529 mock_socket = mock.MagicMock()
530 prox = ProxSocketHelper(mock_socket)
531 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
534 self.assertEqual(result, expected)
536 def test_rx_stats(self, mock_time):
543 mock_socket = mock.MagicMock()
544 prox = ProxSocketHelper(mock_socket)
545 prox.get_data = mock.MagicMock(side_effect=core_stats)
546 expected = 21, 24, 27, 14
547 result = prox.rx_stats([3, 4, 5], 16)
548 self.assertEqual(result, expected)
550 def test_core_stats(self, mock_time):
557 mock_socket = mock.MagicMock()
558 prox = ProxSocketHelper(mock_socket)
559 prox.get_data = mock.MagicMock(side_effect=core_stats)
560 expected = 21, 24, 27, 14
561 result = prox.core_stats([3, 4, 5], 16)
562 self.assertEqual(result, expected)
564 def test_port_stats(self, mock_time):
566 ','.join(str(n) for n in range(3, 15)),
567 ','.join(str(n) for n in range(8, 32, 2)),
568 ','.join(str(n) for n in range(5, 89, 7)),
571 mock_socket = mock.MagicMock()
572 prox = ProxSocketHelper(mock_socket)
573 prox.get_data = mock.MagicMock(side_effect=port_stats)
574 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
575 result = prox.port_stats([3, 4, 5])
576 self.assertEqual(result, expected)
578 def test_measure_tot_stats(self, mock_time):
579 start_tot = 3, 4, 5, 6
580 end_tot = 7, 9, 11, 13
581 delta_tot = 4, 5, 6, 7
584 ','.join(str(n) for n in start_tot),
585 ','.join(str(n) for n in end_tot),
588 mock_socket = mock.MagicMock()
589 prox = ProxSocketHelper(mock_socket)
590 prox.get_data = mock.MagicMock(side_effect=get_data_output)
592 'start_tot': start_tot,
596 with prox.measure_tot_stats() as result:
598 self.assertEqual(result, expected)
600 def test_tot_stats(self, mock_time):
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_stats()
606 self.assertEqual(result, expected)
608 def test_tot_ierrors(self, mock_time):
609 mock_socket = mock.MagicMock()
610 prox = ProxSocketHelper(mock_socket)
611 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
613 result = prox.tot_ierrors()
614 self.assertEqual(result, expected)
616 def test_set_count(self, mock_time):
617 mock_socket = mock.MagicMock()
618 prox = ProxSocketHelper(mock_socket)
619 prox.set_count(432, [3, 4, 5])
620 self.assertEqual(mock_socket.sendall.call_count, 3)
622 def test_dump_rx(self, mock_time):
623 mock_socket = mock.MagicMock()
624 prox = ProxSocketHelper(mock_socket)
625 prox.dump_rx(3, 5, 8)
626 self.assertEqual(mock_socket.sendall.call_count, 1)
628 def test_quit(self, mock_time):
629 mock_socket = mock.MagicMock()
630 prox = ProxSocketHelper(mock_socket)
632 mock_socket.sendall.assert_called()
634 def test_force_quit(self, mock_time):
635 mock_socket = mock.MagicMock()
636 prox = ProxSocketHelper(mock_socket)
638 mock_socket.sendall.assert_called()
641 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
644 'short-name': 'ProxVnf',
649 'network': '152.16.100.20',
650 'netmask': '255.255.255.0',
651 'gateway': '152.16.100.20',
655 'network': '152.16.40.20',
656 'netmask': '255.255.255.0',
657 'gateway': '152.16.40.20',
661 'description': 'PROX approximation using DPDK',
662 'name': 'proxvnf-baremetal',
665 'network': '0064:ff9b:0:0:0:0:9810:6414',
667 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
671 'network': '0064:ff9b:0:0:0:0:9810:2814',
673 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
677 'id': 'proxvnf-baremetal',
678 'external-interface': [
680 'virtual-interface': {
681 'dst_mac': '00:00:00:00:00:04',
682 'vpci': '0000:05:00.0',
683 'local_ip': '152.16.100.19',
684 'type': 'PCI-PASSTHROUGH',
685 'vld_id': 'uplink_0',
686 'netmask': '255.255.255.0',
688 'bandwidth': '10 Gbps',
690 'dst_ip': '152.16.100.19',
691 'local_iface_name': 'xe0',
692 'local_mac': '00:00:00:00:00:02',
695 'vnfd-connection-point-ref': 'xe0',
699 'virtual-interface': {
700 'dst_mac': '00:00:00:00:00:03',
701 'vpci': '0000:05:00.1',
702 'local_ip': '152.16.40.19',
703 'type': 'PCI-PASSTHROUGH',
704 'vld_id': 'downlink_0',
706 'netmask': '255.255.255.0',
708 'bandwidth': '10 Gbps',
709 'dst_ip': '152.16.40.20',
710 'local_iface_name': 'xe1',
711 'local_mac': '00:00:00:00:00:01',
714 'vnfd-connection-point-ref': 'xe1',
720 'description': 'PROX approximation using DPDK',
722 'vdu-id': 'proxvnf-baremetal',
735 'id': 'ProxApproxVnf',
740 'vnfd:vnfd-catalog': {
747 def test_global_section(self):
748 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
751 setup_helper._prox_config_data = [('a', [])]
753 with self.assertRaises(KeyError):
754 _ = setup_helper.global_section
758 ('not_name', 'other data'),
759 ('name_not', 'more data'),
760 ('name', 'prox type'),
764 setup_helper._prox_config_data = [
793 result = setup_helper.global_section
794 self.assertEqual(result, global_section[1])
796 def test_find_in_section(self):
797 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
800 setup_helper._prox_config_data = [
802 ('not_name', 'other data'),
803 ('name_not', 'more data'),
804 ('name', 'prox type'),
834 result = setup_helper.find_in_section('section3', 'key3')
835 self.assertEqual(result, expected)
837 expected = 'default value'
838 result = setup_helper.find_in_section('section3', 'key4', 'default value')
839 self.assertEqual(result, expected)
841 with self.assertRaises(KeyError):
842 setup_helper.find_in_section('section4', 'key1')
844 with self.assertRaises(KeyError):
845 setup_helper.find_in_section('section1', 'key1')
847 def test__replace_quoted_with_value(self):
851 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
852 self.assertEqual(result, expected)
854 # no quoted substring
855 input_str = 'lion tiger bear'
856 expected = 'lion tiger bear'
857 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
858 self.assertEqual(result, expected)
860 # partially quoted substring
861 input_str = 'lion "tiger bear'
862 expected = 'lion "tiger bear'
863 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
864 self.assertEqual(result, expected)
866 # one quoted substring
867 input_str = 'lion "tiger" bear'
868 expected = 'lion "cat" bear'
869 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
870 self.assertEqual(result, expected)
872 # two quoted substrings
873 input_str = 'lion "tiger" bear "shark" whale'
874 expected = 'lion "cat" bear "shark" whale'
875 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
876 self.assertEqual(result, expected)
878 # two quoted substrings, both replaced
879 input_str = 'lion "tiger" bear "shark" whale'
880 expected = 'lion "cat" bear "cat" whale'
881 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
882 self.assertEqual(result, expected)
884 def test__get_tx_port(self):
886 input_data = {'section1': []}
888 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
889 self.assertEqual(result, expected)
891 # data for other section
900 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
901 self.assertEqual(result, expected)
904 input_data['section1'] = section1 = [
905 ('rx port', '4', 'more', 432),
909 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
910 self.assertEqual(result, expected)
912 # more data for section,
915 ('tx port', '1', 'and more', 234),
918 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
919 self.assertEqual(result, expected)
921 def test_write_prox_config(self):
924 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
925 self.assertEqual(result, expected)
933 expected = '[section1]'
934 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
935 self.assertEqual(result, expected)
946 ['__name__', 'not this one'],
949 ['key4', 'multi-line\nvalue'],
953 expected = os.linesep.join([
959 'key4=multi-line\n\tvalue',
961 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
962 self.assertEqual(result, expected)
964 def test_prox_config_data(self):
965 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
968 setup_helper.config_queue = config_queue = mock.MagicMock()
969 config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])]
971 result = setup_helper.prox_config_data
972 self.assertEqual(result, expected)
974 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
975 def test_build_config_file_no_additional_file(self, mock_find_path):
977 'prox_args': {'-c': ""},
979 'prox_config': 'e/f',
980 'prox_generate_parameter': False,
983 mock_find_path.side_effect = ['1', '2']
985 vnfd_helper = mock.MagicMock()
986 ssh_helper = mock.MagicMock()
987 scenario_helper = ScenarioHelper('vnf1')
988 scenario_helper.scenario_cfg = {
995 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
996 helper.copy_to_target = mock.MagicMock(return_value='3')
997 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
998 helper.upload_prox_config = mock.MagicMock(return_value='5')
1000 self.assertEqual(helper.additional_files, {})
1001 self.assertNotEqual(helper._prox_config_data, '4')
1002 self.assertNotEqual(helper.remote_path, '5')
1003 helper.build_config_file()
1004 self.assertEqual(helper.additional_files, {})
1005 self.assertEqual(helper._prox_config_data, '4')
1006 self.assertEqual(helper.remote_path, '5')
1008 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1009 def test_build_config_file_additional_file_string(self, mock_find_path):
1011 'prox_args': {'-c': ""},
1013 'prox_config': 'e/f',
1014 'prox_files': 'g/h.i',
1015 'prox_generate_parameter': True,
1018 mock_find_path.side_effect = ['1', '2']
1019 vnfd_helper = mock.MagicMock()
1020 ssh_helper = mock.MagicMock()
1021 scenario_helper = ScenarioHelper('vnf1')
1022 scenario_helper.scenario_cfg = {
1029 vnfd_helper.port_pairs.all_ports = ['xe0', 'xe1', 'xe2', 'xe3']
1030 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1031 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1032 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1033 helper.upload_prox_config = mock.MagicMock(return_value='55')
1035 self.assertEqual(helper.additional_files, {})
1036 expected = {'h.i': '33'}
1037 helper.build_config_file()
1038 self.assertDictEqual(helper.additional_files, expected)
1040 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1041 def test_build_config_file_additional_file(self, mock_find_path):
1043 'prox_args': {'-c': ""},
1045 'prox_config': 'e/f',
1053 mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))]
1054 vnfd_helper = mock.MagicMock()
1055 ssh_helper = mock.MagicMock()
1056 scenario_helper = ScenarioHelper('vnf1')
1057 scenario_helper.scenario_cfg = {
1064 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1065 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1066 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1067 helper.upload_prox_config = mock.MagicMock(return_value='55')
1069 self.assertEqual(helper.additional_files, {})
1070 self.assertNotEqual(helper._prox_config_data, '44')
1071 self.assertNotEqual(helper.remote_path, '55')
1072 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
1073 helper.build_config_file()
1074 self.assertDictEqual(helper.additional_files, expected)
1075 self.assertEqual(helper._prox_config_data, '44')
1076 self.assertEqual(helper.remote_path, '55')
1078 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1079 def test_build_config(self, mock_find_path):
1081 'prox_args': {'-f': ""},
1082 'prox_path': '/opt/nsb_bin/prox',
1083 'prox_config': 'configs/gen_l2fwd-2.cfg',
1091 mock_find_path.side_effect = ['1', '2']
1092 vnfd_helper = mock.MagicMock()
1093 ssh_helper = mock.MagicMock()
1094 ssh_helper.provision_tool.return_value = "/opt/nsb_bin/prox"
1095 scenario_helper = ScenarioHelper('vnf1')
1096 scenario_helper.scenario_cfg = {
1103 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1104 helper.remote_path = "/tmp/prox.cfg"
1105 expected = "sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli -f -f /tmp/prox.cfg '"
1106 with mock.patch.object(helper, "build_config_file") as mock_build_config:
1107 prox_cmd = helper.build_config()
1108 self.assertEqual(prox_cmd, expected)
1110 def test__insert_additional_file(self):
1111 vnfd_helper = mock.MagicMock()
1112 ssh_helper = mock.MagicMock()
1113 scenario_helper = mock.MagicMock()
1115 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1116 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1117 res = helper._insert_additional_file('dofile("ipv4.lua")')
1118 self.assertEqual(res, 'dofile("/tmp/ipv4.lua")')
1120 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1121 def test_generate_prox_config_file(self, mock_parser_type):
1124 args[-1].extend(sections_data)
1125 return mock.MagicMock()
1129 mock_parser_type.side_effect = init
1131 vnfd_helper = VnfdHelper(self.VNFD0)
1132 ssh_helper = mock.MagicMock()
1133 scenario_helper = mock.MagicMock()
1135 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1136 helper.additional_files = {}
1139 result = helper.generate_prox_config_file('a/b')
1140 self.assertEqual(result, expected)
1142 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1144 helper.remote_prox_file_name = 'remote'
1149 ['dofile("ipv4.lua")', ''],
1165 ['$sut_mac0', '@@dst_mac0'],
1168 ['user_table', 'dofile("ipv4.lua")'],
1169 ['missing_addtional_file', 'dofile("nosuch")'],
1178 ['dofile("/tmp/ipv4.lua")', ''],
1185 ['mac', 'hardware'],
1186 ['dst mac', '00:00:00:00:00:03'],
1194 ['$sut_mac0', '00 00 00 00 00 04'],
1197 ['user_table', 'dofile("/tmp/ipv4.lua")'],
1198 ['missing_addtional_file', 'dofile("nosuch")'],
1202 result = helper.generate_prox_config_file('/c/d/e')
1203 self.assertEqual(result, expected, str(result))
1205 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1206 def test_generate_prox_config_file_negative(self, mock_parser_type):
1208 args[-1].update(sections_data)
1209 return mock.MagicMock()
1213 mock_parser_type.side_effect = init
1215 vnfd_helper = mock.MagicMock()
1216 vnfd_helper.interfaces = []
1217 ssh_helper = mock.MagicMock()
1218 scenario_helper = mock.MagicMock()
1220 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1221 helper.additional_files = {}
1222 helper.remote_prox_file_name = 'remote'
1223 vnfd_helper.interfaces = [
1225 'virtual-interface': {
1227 'dst_mac': '00:00:00:de:ad:88',
1231 'virtual-interface': {
1233 'dst_mac': '00:00:00:de:ad:ff',
1237 'virtual-interface': {
1239 'dst_mac': '00:00:00:de:ad:ff',
1253 ['???', 'dofile "here" 23'],
1257 with self.assertRaises(Exception):
1258 helper.generate_prox_config_file('a/b')
1260 def test_put_string_to_file(self):
1261 vnfd_helper = mock.MagicMock()
1262 vnfd_helper.interfaces = []
1263 ssh_helper = mock.MagicMock()
1264 scenario_helper = mock.MagicMock()
1266 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1269 result = helper.put_string_to_file('my long string', 'a/b')
1270 self.assertEqual(result, expected)
1272 def test__build_pipeline_kwarags(self):
1273 vnfd_helper = mock.MagicMock()
1274 ssh_helper = mock.MagicMock()
1275 ssh_helper.provision_tool.return_value = "/tmp/nosuch"
1276 scenario_helper = mock.MagicMock()
1278 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1279 helper._build_pipeline_kwargs()
1280 self.assertEqual(helper.pipeline_kwargs, {'tool_path': '/tmp/nosuch', 'tool_dir': '/tmp'})
1282 def test_copy_to_target(self):
1283 vnfd_helper = mock.MagicMock()
1284 vnfd_helper.interfaces = []
1285 ssh_helper = mock.MagicMock()
1286 scenario_helper = mock.MagicMock()
1288 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1290 result = helper.copy_to_target('a/b', 'c')
1291 self.assertEqual(result, expected)
1293 def test_upload_prox_config(self):
1294 vnfd_helper = mock.MagicMock()
1295 vnfd_helper.interfaces = []
1296 ssh_helper = mock.MagicMock()
1297 scenario_helper = mock.MagicMock()
1299 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1300 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1302 result = helper.upload_prox_config('a', {})
1303 self.assertEqual(result, expected)
1306 class TestProxResourceHelper(unittest.TestCase):
1309 'short-name': 'ProxVnf',
1314 'network': '152.16.100.20',
1315 'netmask': '255.255.255.0',
1316 'gateway': '152.16.100.20',
1320 'network': '152.16.40.20',
1321 'netmask': '255.255.255.0',
1322 'gateway': '152.16.40.20',
1326 'description': 'PROX approximation using DPDK',
1327 'name': 'proxvnf-baremetal',
1330 'network': '0064:ff9b:0:0:0:0:9810:6414',
1332 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1336 'network': '0064:ff9b:0:0:0:0:9810:2814',
1338 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1342 'id': 'proxvnf-baremetal',
1343 'external-interface': [
1345 'virtual-interface': {
1346 'dst_mac': '00:00:00:00:00:04',
1347 'vpci': '0000:05:00.0',
1348 'local_ip': '152.16.100.19',
1349 'type': 'PCI-PASSTHROUGH',
1350 'vld_id': 'uplink_0',
1351 'netmask': '255.255.255.0',
1353 'bandwidth': '10 Gbps',
1355 'dst_ip': '152.16.100.19',
1356 'local_iface_name': 'xe0',
1357 'local_mac': '00:00:00:00:00:02',
1360 'vnfd-connection-point-ref': 'xe0',
1364 'virtual-interface': {
1365 'dst_mac': '00:00:00:00:00:03',
1366 'vpci': '0000:05:00.1',
1367 'local_ip': '152.16.40.19',
1368 'type': 'PCI-PASSTHROUGH',
1369 'vld_id': 'downlink_0',
1371 'netmask': '255.255.255.0',
1373 'bandwidth': '10 Gbps',
1374 'dst_ip': '152.16.40.20',
1375 'local_iface_name': 'xe1',
1376 'local_mac': '00:00:00:00:00:01',
1379 'vnfd-connection-point-ref': 'xe1',
1385 'description': 'PROX approximation using DPDK',
1387 'vdu-id': 'proxvnf-baremetal',
1400 'id': 'ProxApproxVnf',
1405 'vnfd:vnfd-catalog': {
1412 def test_find_pci(self):
1418 result = ProxResourceHelper.find_pci('target', input_str_list)
1419 self.assertFalse(result)
1427 result = ProxResourceHelper.find_pci('target', input_str_list)
1428 self.assertTrue(result)
1430 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1431 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1432 def test_sut(self, mock_socket_helper):
1433 helper = ProxResourceHelper(mock.MagicMock())
1434 self.assertIsNone(helper.client)
1436 self.assertIsNotNone(result)
1437 self.assertIs(result, helper.client)
1438 self.assertIs(result, helper.sut)
1440 def test_test_type(self):
1441 setup_helper = mock.MagicMock()
1442 setup_helper.find_in_section.return_value = expected = 'prox type'
1444 helper = ProxResourceHelper(setup_helper)
1446 self.assertIsNone(helper._test_type)
1447 self.assertEqual(helper.test_type, expected)
1448 self.assertEqual(helper._test_type, expected)
1449 self.assertEqual(helper.test_type, expected)
1451 def test_collect_collectd_kpi(self):
1452 helper = ProxResourceHelper(mock.MagicMock())
1453 helper.resource = resource = mock.MagicMock()
1455 resource.check_if_sa_running.return_value = 0, '1234'
1456 resource.amqp_collect_nfvi_kpi.return_value = 543
1457 resource.check_if_sa_running.return_value = (0, None)
1459 expected = {'core': 543}
1460 result = helper.collect_collectd_kpi()
1461 self.assertDictEqual(result, expected)
1463 def test_collect_kpi(self):
1464 helper = ProxResourceHelper(mock.MagicMock())
1465 helper._queue = queue = mock.MagicMock()
1466 helper._result = {'z': 123}
1467 helper.resource = resource = mock.MagicMock()
1469 resource.check_if_sa_running.return_value = 0, '1234'
1470 resource.amqp_collect_nfvi_kpi.return_value = 543
1471 resource.check_if_sa_running.return_value = (0, None)
1473 queue.empty.return_value = False
1474 queue.get.return_value = {'a': 789}
1476 expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
1477 result = helper.collect_kpi()
1478 self.assertDictEqual(result, expected)
1480 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1481 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1482 def test__connect(self, mock_socket_helper_type, mock_time):
1483 client = mock_socket_helper_type()
1484 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1486 setup_helper = mock.MagicMock()
1487 setup_helper.vnfd_helper.interfaces = []
1489 helper = ProxResourceHelper(setup_helper)
1491 result = helper._connect()
1492 self.assertIs(result, client)
1494 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1496 with self.assertRaises(Exception):
1499 def test_run_traffic(self):
1500 setup_helper = mock.MagicMock()
1501 helper = ProxResourceHelper(setup_helper)
1502 traffic_profile = mock.MagicMock(**{"done": True})
1503 helper.run_traffic(traffic_profile)
1504 self.assertEqual(helper._terminated.value, 1)
1506 def test__run_traffic_once(self):
1507 setup_helper = mock.MagicMock()
1508 helper = ProxResourceHelper(setup_helper)
1509 traffic_profile = mock.MagicMock(**{"done": True})
1510 helper._run_traffic_once(traffic_profile)
1511 self.assertEqual(helper._terminated.value, 1)
1513 def test_start_collect(self):
1514 setup_helper = mock.MagicMock()
1515 helper = ProxResourceHelper(setup_helper)
1516 helper.resource = resource = mock.MagicMock()
1517 self.assertIsNone(helper.start_collect())
1518 resource.start.assert_called_once()
1520 def test_terminate(self):
1521 setup_helper = mock.MagicMock()
1522 helper = ProxResourceHelper(setup_helper)
1523 with self.assertRaises(NotImplementedError):
1526 def test_up_post(self):
1527 setup_helper = mock.MagicMock()
1528 helper = ProxResourceHelper(setup_helper)
1529 helper.client = expected = mock.MagicMock()
1530 result = helper.up_post()
1531 self.assertEqual(result, expected)
1533 def test_execute(self):
1534 setup_helper = mock.MagicMock()
1535 helper = ProxResourceHelper(setup_helper)
1536 helper.client = mock.MagicMock()
1538 expected = helper.client.my_command()
1539 result = helper.execute('my_command')
1540 self.assertEqual(result, expected)
1542 helper.client = object()
1544 result = helper.execute('my_command')
1545 self.assertIsNone(result)
1548 class TestProxDataHelper(unittest.TestCase):
1550 def test_totals_and_pps(self):
1552 vnfd_helper = mock.MagicMock()
1553 vnfd_helper.port_pairs.all_ports = list(range(4))
1555 sut = mock.MagicMock()
1556 sut.port_stats.return_value = list(range(10))
1558 data_helper = ProxDataHelper(vnfd_helper, sut, pkt_size, 25, None)
1560 self.assertEqual(data_helper.rx_total, 6)
1561 self.assertEqual(data_helper.tx_total, 7)
1562 self.assertEqual(data_helper.pps, 6.25e6)
1564 def test_samples(self):
1565 vnfd_helper = mock.MagicMock()
1566 vnfd_helper.port_pairs.all_ports = list(range(4))
1567 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1569 sut = mock.MagicMock()
1570 sut.port_stats.return_value = list(range(10))
1572 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1584 result = data_helper.samples
1585 self.assertDictEqual(result, expected)
1587 def test___enter__(self):
1588 vnfd_helper = mock.MagicMock()
1589 vnfd_helper.port_pairs.all_ports = list(range(4))
1590 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1592 sut = mock.MagicMock()
1593 sut.port_stats.return_value = list(range(10))
1595 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1596 data_helper._totals_and_pps = 12, 32, 4.5
1597 data_helper.tsc_hz = 9.8
1598 data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)}
1599 data_helper.latency = 7
1601 self.assertIsNone(data_helper.result_tuple)
1603 expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5)
1607 result = data_helper.result_tuple
1608 self.assertEqual(result, expected)
1610 data_helper.make_tuple()
1611 self.assertIs(data_helper.result_tuple, result)
1613 def test___enter___negative(self):
1614 vnfd_helper = mock.MagicMock()
1616 data_helper = ProxDataHelper(vnfd_helper, None, None, None, None)
1618 vnfd_helper.port_pairs.all_ports = []
1619 with self.assertRaises(AssertionError):
1623 vnfd_helper.port_pairs.all_ports = [0, 1, 2]
1624 with self.assertRaises(AssertionError):
1628 def test_measure_tot_stats(self):
1629 vnfd_helper = mock.MagicMock()
1630 vnfd_helper.port_pairs.all_ports = list(range(4))
1632 start = (3, 4, 1, 2)
1635 sut = ProxSocketHelper(mock.MagicMock())
1636 sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end])
1638 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1640 self.assertIsNone(data_helper.measured_stats)
1645 'delta': TotStatsTuple(6, 3, 5, 6),
1647 with data_helper.measure_tot_stats():
1650 self.assertEqual(data_helper.measured_stats, expected)
1652 def test_capture_tsc_hz(self):
1653 vnfd_helper = mock.MagicMock()
1654 vnfd_helper.port_pairs.all_ports = list(range(4))
1656 sut = mock.MagicMock()
1657 sut.hz.return_value = '54.6'
1659 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1661 self.assertIsNone(data_helper.tsc_hz)
1664 data_helper.capture_tsc_hz()
1665 self.assertEqual(data_helper.tsc_hz, expected)
1668 class TestProxProfileHelper(unittest.TestCase):
1670 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1671 def test_get_cls(self, mock_utils):
1672 mock_type1 = mock.MagicMock()
1673 mock_type1.__prox_profile_type__ = 'another_type'
1674 mock_type2 = mock.MagicMock()
1675 mock_type2.__prox_profile_type__ = 'my_type'
1676 mock_utils.itersubclasses.return_value = [mock_type1, mock_type2]
1678 self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2)
1680 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1681 def test_get_cls_default(self, mock_utils):
1682 mock_utils.itersubclasses.return_value = []
1683 ProxProfileHelper.get_cls('my_type')
1685 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1686 def test_cpu_topology(self, mock_socket_topology):
1687 mock_socket_topology.parse_cpuinfo.return_value = 432
1689 resource_helper = mock.MagicMock()
1690 resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1692 helper = ProxProfileHelper(resource_helper)
1693 self.assertIsNone(helper._cpu_topology)
1694 result = helper.cpu_topology
1695 self.assertEqual(result, 432)
1696 self.assertIs(result, helper._cpu_topology)
1697 self.assertIs(result, helper.cpu_topology)
1699 def test_test_cores(self):
1700 resource_helper = mock.MagicMock()
1701 resource_helper.setup_helper.prox_config_data = []
1703 helper = ProxProfileHelper(resource_helper)
1704 helper._cpu_topology = []
1707 result = helper.test_cores
1708 self.assertEqual(result, expected)
1710 resource_helper.setup_helper.prox_config_data = [
1731 helper = ProxProfileHelper(resource_helper)
1732 helper._cpu_topology = {
1749 self.assertIsNone(helper._test_cores)
1751 result = helper.test_cores
1752 self.assertEqual(result, expected)
1753 self.assertIs(result, helper._test_cores)
1754 self.assertIs(result, helper.test_cores)
1756 def test_latency_cores(self):
1757 resource_helper = mock.MagicMock()
1758 resource_helper.setup_helper.prox_config_data = []
1760 helper = ProxProfileHelper(resource_helper)
1761 helper._cpu_topology = []
1764 result = helper.latency_cores
1765 self.assertEqual(result, expected)
1767 resource_helper.setup_helper.prox_config_data = [
1788 helper = ProxProfileHelper(resource_helper)
1789 helper._cpu_topology = {
1806 self.assertIsNone(helper._latency_cores)
1808 result = helper.latency_cores
1809 self.assertEqual(result, expected)
1810 self.assertIs(result, helper._latency_cores)
1811 self.assertIs(result, helper.latency_cores)
1813 def test_all_rx_cores(self):
1814 helper = ProxBngProfileHelper(mock.MagicMock())
1815 helper._latency_cores = expected = [3, 4, 6]
1816 helper._test_cores = [5, 2, 1]
1818 result = helper.all_rx_cores
1819 self.assertEqual(result, expected)
1821 def test_get_cores(self):
1822 resource_helper = mock.MagicMock()
1823 resource_helper.setup_helper.prox_config_data = [
1844 helper = ProxProfileHelper(resource_helper)
1845 helper._cpu_topology = {
1863 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1864 self.assertEqual(result, expected)
1866 def test_get_latency(self):
1867 resource_helper = mock.MagicMock()
1868 resource_helper.setup_helper.vnfd_helper.interfaces = []
1870 helper = ProxProfileHelper(resource_helper)
1871 helper._latency_cores = []
1874 result = helper.get_latency()
1875 self.assertEqual(result, expected)
1877 helper._latency_cores = [1, 2]
1878 helper.client = mock.MagicMock()
1880 expected = helper.sut.lat_stats()
1881 result = helper.get_latency()
1882 self.assertIs(result, expected)
1884 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1885 def test_traffic_context(self, mock_time):
1886 setup_helper = mock.MagicMock()
1887 setup_helper.vnfd_helper.interfaces = []
1889 helper = ProxProfileHelper(setup_helper)
1890 helper._cpu_topology = {
1907 setup_helper.prox_config_data = [
1909 ('not_name', 'other data'),
1910 ('name_not', 'more data'),
1911 ('name', helper.__prox_profile_type__),
1935 client = mock.MagicMock()
1936 client.hz.return_value = 2
1937 client.port_stats.return_value = tuple(range(12))
1939 helper.client = client
1940 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1942 helper._test_cores = [3, 4]
1944 with helper.traffic_context(64, 1):
1947 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1948 def test_run_test(self, _):
1949 resource_helper = mock.MagicMock()
1950 resource_helper.step_delta = 0.4
1951 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
1952 resource_helper.sut.port_stats.return_value = list(range(10))
1954 helper = ProxProfileHelper(resource_helper)
1956 helper.run_test(120, 5, 6.5)
1959 class TestProxMplsProfileHelper(unittest.TestCase):
1961 def test_mpls_cores(self):
1962 resource_helper = mock.MagicMock()
1963 resource_helper.setup_helper.prox_config_data = [
1986 helper = ProxMplsProfileHelper(resource_helper)
1987 helper._cpu_topology = {
2004 expected_tagged = [7]
2005 expected_plain = [8]
2006 self.assertIsNone(helper._cores_tuple)
2007 self.assertEqual(helper.tagged_cores, expected_tagged)
2008 self.assertEqual(helper.plain_cores, expected_plain)
2009 self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain))
2011 def test_traffic_context(self):
2012 setup_helper = mock.MagicMock()
2013 helper = ProxMplsProfileHelper(setup_helper)
2015 with helper.traffic_context(120, 5.4):
2019 class TestProxBngProfileHelper(unittest.TestCase):
2021 def test_bng_cores(self):
2022 resource_helper = mock.MagicMock()
2023 resource_helper.setup_helper.prox_config_data = [
2047 ('name', 'arp_task'),
2056 helper = ProxBngProfileHelper(resource_helper)
2057 helper._cpu_topology = {
2082 expected_arp = [4, 3]
2083 expected_arp_task = [0, 4]
2084 expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task)
2086 self.assertIsNone(helper._cores_tuple)
2087 self.assertEqual(helper.cpe_cores, expected_cpe)
2088 self.assertEqual(helper.inet_cores, expected_inet)
2089 self.assertEqual(helper.arp_cores, expected_arp)
2090 self.assertEqual(helper.arp_task_cores, expected_arp_task)
2091 self.assertEqual(helper._cores_tuple, expected_combined)
2093 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2094 def test_run_test(self, _):
2095 resource_helper = mock.MagicMock()
2096 resource_helper.step_delta = 0.4
2097 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2098 resource_helper.sut.port_stats.return_value = list(range(10))
2100 helper = ProxBngProfileHelper(resource_helper)
2102 helper.run_test(120, 5, 6.5)
2103 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2106 class TestProxVpeProfileHelper(unittest.TestCase):
2108 def test_vpe_cores(self):
2109 resource_helper = mock.MagicMock()
2110 resource_helper.setup_helper.prox_config_data = [
2133 helper = ProxVpeProfileHelper(resource_helper)
2134 helper._cpu_topology = {
2153 expected_combined = (expected_cpe, expected_inet)
2155 self.assertIsNone(helper._cores_tuple)
2156 self.assertEqual(helper.cpe_cores, expected_cpe)
2157 self.assertEqual(helper.inet_cores, expected_inet)
2158 self.assertEqual(helper._cores_tuple, expected_combined)
2160 def test_vpe_ports(self):
2161 resource_helper = mock.MagicMock()
2162 resource_helper.setup_helper.prox_config_data = [
2171 ('mac', 'hardware'),
2176 ('mac', 'hardware'),
2180 helper = ProxVpeProfileHelper(resource_helper)
2181 helper._port_list = {
2200 expected_combined = (expected_cpe, expected_inet)
2202 self.assertIsNone(helper._ports_tuple)
2203 self.assertEqual(helper.cpe_ports, expected_cpe)
2204 self.assertEqual(helper.inet_ports, expected_inet)
2205 self.assertEqual(helper._ports_tuple, expected_combined)
2207 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2208 def test_run_test(self, _):
2209 resource_helper = mock.MagicMock()
2210 resource_helper.step_delta = 0.4
2211 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2212 resource_helper.sut.port_stats.return_value = list(range(10))
2214 helper = ProxVpeProfileHelper(resource_helper)
2216 helper.run_test(120, 5, 6.5)
2217 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1