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
48 class TestCoreTuple(unittest.TestCase):
49 def test___init__(self):
50 core_tuple = CoreSocketTuple('core 5s6')
51 self.assertEqual(core_tuple.core_id, 5)
52 self.assertEqual(core_tuple.socket_id, 6)
53 self.assertFalse(core_tuple.is_hyperthread())
55 core_tuple = CoreSocketTuple('core 5s6h')
56 self.assertEqual(core_tuple.core_id, 5)
57 self.assertEqual(core_tuple.socket_id, 6)
58 self.assertTrue(core_tuple.is_hyperthread())
60 def test___init__negative(self):
81 for bad_input in bad_inputs:
82 with self.assertRaises(ValueError):
83 CoreSocketTuple(bad_input)
85 def test_find_in_topology(self):
95 core_tuple = CoreSocketTuple('core 5s6')
98 result = core_tuple.find_in_topology(topology_in)
99 self.assertEqual(result, expected)
101 core_tuple = CoreSocketTuple('core 5s6h')
104 result = core_tuple.find_in_topology(topology_in)
105 self.assertEqual(result, expected)
107 def test_find_in_topology_negative(self):
108 core_tuple = CoreSocketTuple('core 6s5')
109 with self.assertRaises(ValueError):
111 core_tuple.find_in_topology({})
113 with self.assertRaises(ValueError):
115 core_tuple.find_in_topology({5: {}})
117 with self.assertRaises(ValueError):
118 # no first value (as needed by non-hyperthread core)
119 core_tuple.find_in_topology({5: {6: {'key1': []}}})
121 core_tuple = CoreSocketTuple('core 6s5h')
122 with self.assertRaises(ValueError):
123 # no second value (as needed by hyperthread core)
124 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
127 class TestTotStatsTuple(unittest.TestCase):
128 def test___new___negative(self):
129 with self.assertRaises(TypeError):
133 with self.assertRaises(TypeError):
134 # one, non-integer value
137 with self.assertRaises(TypeError):
139 TotStatsTuple(3, 4, 5, 6, 7)
142 class TestProxTestDataTuple(unittest.TestCase):
143 def test___init__(self):
144 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
145 self.assertEqual(prox_test_data.tolerated, 1)
146 self.assertEqual(prox_test_data.tsc_hz, 2)
147 self.assertEqual(prox_test_data.delta_rx, 3)
148 self.assertEqual(prox_test_data.delta_tx, 4)
149 self.assertEqual(prox_test_data.delta_tsc, 5)
150 self.assertEqual(prox_test_data.latency, 6)
151 self.assertEqual(prox_test_data.rx_total, 7)
152 self.assertEqual(prox_test_data.tx_total, 8)
153 self.assertEqual(prox_test_data.pps, 9)
155 def test_properties(self):
156 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
157 self.assertEqual(prox_test_data.pkt_loss, 12.5)
158 self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
159 self.assertEqual(prox_test_data.can_be_lost, 0)
160 self.assertEqual(prox_test_data.drop_total, 1)
161 self.assertFalse(prox_test_data.success)
163 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
164 self.assertTrue(prox_test_data.success)
166 def test_pkt_loss_zero_division(self):
167 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
168 self.assertEqual(prox_test_data.pkt_loss, 100.0)
170 def test_get_samples(self):
171 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
174 "Throughput": 1.6 / 1e6,
176 "CurrentDropPackets": 12.5,
177 "TxThroughput": 9 / 1e6,
178 "RxThroughput": 1.6 / 1e6,
185 result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
186 self.assertDictEqual(result, expected)
189 "Throughput": 1.6 / 1e6,
190 "DropPackets": 0.123,
191 "CurrentDropPackets": 0.123,
192 "TxThroughput": 9 / 1e6,
193 "RxThroughput": 1.6 / 1e6,
199 result = prox_test_data.get_samples(64, 0.123)
200 self.assertDictEqual(result, expected)
202 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
203 def test_log_data(self, mock_logger):
204 my_mock_logger = mock.MagicMock()
205 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
206 prox_test_data.log_data()
207 self.assertEqual(my_mock_logger.debug.call_count, 0)
208 self.assertEqual(mock_logger.debug.call_count, 2)
210 mock_logger.debug.reset_mock()
211 prox_test_data.log_data(my_mock_logger)
212 self.assertEqual(my_mock_logger.debug.call_count, 2)
213 self.assertEqual(mock_logger.debug.call_count, 0)
216 class TestPacketDump(unittest.TestCase):
219 def test__init__(self):
220 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
222 def test___str__(self):
223 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
224 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
225 self.assertEqual(str(dump1), expected)
227 def test_port_id(self):
228 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
229 self.assertEqual(p.port_id, "port_id")
231 def test_data_len(self):
232 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
233 self.assertEqual(p.data_len, len(self.PAYLOAD))
235 def test_payload(self):
236 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
237 self.assertEqual(p.payload(), self.PAYLOAD)
239 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
241 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
243 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
255 brown fox jumped over
261 PACKET_DUMP_NON_1 = """\
266 PACKET_DUMP_MIXED_1 = """\
273 PACKET_DUMP_BAD_1 = """\
278 PACKET_DUMP_BAD_2 = """\
283 PACKET_DUMP_BAD_3 = """\
289 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
290 class TestProxSocketHelper(unittest.TestCase):
291 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
292 def test___init__(self, mock_socket, mock_time):
293 expected = mock_socket.socket()
294 prox = ProxSocketHelper()
296 self.assertEqual(result, expected)
298 def test_connect(self, mock_time):
299 mock_sock = mock.MagicMock()
300 prox = ProxSocketHelper(mock_sock)
301 prox.connect('10.20.30.40', 23456)
302 self.assertEqual(mock_sock.connect.call_count, 1)
304 def test_get_sock(self, mock_time):
305 mock_sock = mock.MagicMock()
306 prox = ProxSocketHelper(mock_sock)
307 result = prox.get_socket()
308 self.assertIs(result, mock_sock)
310 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
311 def test_get_data(self, mock_select, mock_time):
312 mock_select.select.side_effect = [[1], [0]]
313 mock_socket = mock.MagicMock()
314 mock_recv = mock_socket.recv()
315 mock_recv.decode.return_value = ""
316 prox = ProxSocketHelper(mock_socket)
317 ret = prox.get_data()
318 self.assertEqual(ret, "")
319 self.assertEqual(len(prox._pkt_dumps), 0)
321 mock_select.select.reset_mock()
322 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
323 mock_recv.decode.return_value = PACKET_DUMP_1
324 ret = prox.get_data()
325 self.assertEqual(mock_select.select.call_count, 2)
326 self.assertEqual(ret, 'pktdump,3,11')
327 self.assertEqual(len(prox._pkt_dumps), 1)
329 mock_select.select.reset_mock()
330 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
331 mock_recv.decode.return_value = PACKET_DUMP_2
332 ret = prox.get_data()
333 self.assertEqual(mock_select.select.call_count, 2)
334 self.assertEqual(ret, 'jumped over')
335 self.assertEqual(len(prox._pkt_dumps), 3)
337 def test__parse_socket_data_mixed_data(self, mock_time):
338 prox = ProxSocketHelper(mock.MagicMock())
339 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
340 self.assertEqual(ret, 'not_a_dump,1,2')
341 self.assertEqual(len(prox._pkt_dumps), 0)
343 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
344 self.assertEqual(ret, 'not_a_dump,1,2')
345 self.assertEqual(len(prox._pkt_dumps), 1)
347 def test__parse_socket_data_bad_data(self, mock_time):
348 prox = ProxSocketHelper(mock.MagicMock())
349 with self.assertRaises(ValueError):
350 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
352 with self.assertRaises(ValueError):
353 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
355 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
356 self.assertEqual(ret, 'pktdump,3')
358 def test__parse_socket_data_pkt_dump_only(self, mock_time):
359 prox = ProxSocketHelper(mock.MagicMock())
360 ret = prox._parse_socket_data('', True)
361 self.assertFalse(ret)
363 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
366 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
369 def test_put_command(self, mock_time):
370 mock_socket = mock.MagicMock()
371 prox = ProxSocketHelper(mock_socket)
372 prox.put_command("data")
373 mock_socket.sendall.assert_called_once()
375 def test_put_command_socket_error(self, mock_time):
376 mock_socket = mock.MagicMock()
377 mock_socket.sendall.side_effect = OSError
378 prox = ProxSocketHelper(mock_socket)
379 prox.put_command("data")
380 mock_socket.sendall.assert_called_once()
382 def test_get_packet_dump(self, mock_time):
383 mock_socket = mock.MagicMock()
384 prox = ProxSocketHelper(mock_socket)
386 self.assertIsNone(prox.get_packet_dump())
388 prox._pkt_dumps = [234]
389 self.assertEqual(prox.get_packet_dump(), 234)
390 self.assertEqual(prox._pkt_dumps, [])
392 def test_stop_all_reset(self, mock_time):
393 mock_socket = mock.MagicMock()
394 prox = ProxSocketHelper(mock_socket)
395 prox.stop_all_reset()
396 mock_socket.sendall.assert_called()
398 def test_stop_all(self, mock_time):
399 mock_socket = mock.MagicMock()
400 prox = ProxSocketHelper(mock_socket)
402 mock_socket.sendall.assert_called()
404 def test_stop(self, mock_time):
405 mock_socket = mock.MagicMock()
406 prox = ProxSocketHelper(mock_socket)
407 prox.stop([3, 4, 5], 16)
408 mock_socket.sendall.assert_called()
410 def test_start_all(self, mock_time):
411 mock_socket = mock.MagicMock()
412 prox = ProxSocketHelper(mock_socket)
414 mock_socket.sendall.assert_called()
416 def test_start(self, mock_time):
417 mock_socket = mock.MagicMock()
418 prox = ProxSocketHelper(mock_socket)
419 prox.start([3, 4, 5])
420 mock_socket.sendall.assert_called()
422 def test_reset_stats(self, mock_time):
423 mock_socket = mock.MagicMock()
424 prox = ProxSocketHelper(mock_socket)
426 mock_socket.sendall.assert_called()
428 def test_set_pkt_size(self, mock_time):
429 mock_socket = mock.MagicMock()
430 prox = ProxSocketHelper(mock_socket)
431 prox.set_pkt_size([3, 4, 5], 1024)
432 self.assertEqual(mock_socket.sendall.call_count, 3)
434 def test_set_value(self, mock_time):
435 mock_socket = mock.MagicMock()
436 prox = ProxSocketHelper(mock_socket)
437 prox.set_value([3, 4, 5], 10, 20, 30)
438 self.assertEqual(mock_socket.sendall.call_count, 3)
440 def test_reset_values(self, mock_time):
441 mock_socket = mock.MagicMock()
442 prox = ProxSocketHelper(mock_socket)
443 prox.reset_values([3, 4, 5])
444 self.assertEqual(mock_socket.sendall.call_count, 3)
446 def test_set_speed(self, mock_time):
447 mock_socket = mock.MagicMock()
448 prox = ProxSocketHelper(mock_socket)
449 prox.set_speed([3, 4, 5], 1000)
450 self.assertEqual(mock_socket.sendall.call_count, 3)
452 def test_slope_speed(self, mock_time):
459 'cores': [9, 10, 11],
464 mock_socket = mock.MagicMock()
465 prox = ProxSocketHelper(mock_socket)
466 prox.set_speed = set_speed = mock.MagicMock()
467 prox.slope_speed(core_data, 5)
468 self.assertEqual(set_speed.call_count, 20)
470 set_speed.reset_mock()
471 prox.slope_speed(core_data, 5, 5)
472 self.assertEqual(set_speed.call_count, 10)
474 def test_set_pps(self, mock_time):
475 mock_socket = mock.MagicMock()
476 prox = ProxSocketHelper(mock_socket)
477 prox.set_pps([3, 4, 5], 1000, 512)
478 self.assertEqual(mock_socket.sendall.call_count, 3)
480 def test_lat_stats(self, mock_time):
482 '1, 2 , 3', # has white space
484 '7,8,9,10.5,11', # too long with float, but float is in unused portion
485 'twelve,13,14', # value as English word
486 '15,16.2,17', # float in used portion
489 mock_socket = mock.MagicMock()
490 prox = ProxSocketHelper(mock_socket)
491 prox.get_data = mock.MagicMock(side_effect=latency_output)
507 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
508 self.assertEqual(mock_socket.sendall.call_count, 5)
509 self.assertEqual(result, expected)
511 def test_get_all_tot_stats_error(self, mock_time):
512 mock_socket = mock.MagicMock()
513 prox = ProxSocketHelper(mock_socket)
514 prox.get_data = mock.MagicMock(return_value='3,4,5')
515 expected = [0, 0, 0, 0]
516 result = prox.get_all_tot_stats()
517 self.assertEqual(result, expected)
519 def test_get_all_tot_stats(self, mock_time):
520 mock_socket = mock.MagicMock()
521 prox = ProxSocketHelper(mock_socket)
522 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
523 expected = 3, 4, 5, 6
524 result = prox.get_all_tot_stats()
525 self.assertEqual(result, expected)
527 def test_hz(self, mock_time):
528 mock_socket = mock.MagicMock()
529 prox = ProxSocketHelper(mock_socket)
530 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
533 self.assertEqual(result, expected)
535 def test_rx_stats(self, mock_time):
542 mock_socket = mock.MagicMock()
543 prox = ProxSocketHelper(mock_socket)
544 prox.get_data = mock.MagicMock(side_effect=core_stats)
545 expected = 21, 24, 27, 14
546 result = prox.rx_stats([3, 4, 5], 16)
547 self.assertEqual(result, expected)
549 def test_core_stats(self, mock_time):
556 mock_socket = mock.MagicMock()
557 prox = ProxSocketHelper(mock_socket)
558 prox.get_data = mock.MagicMock(side_effect=core_stats)
559 expected = 21, 24, 27, 14
560 result = prox.core_stats([3, 4, 5], 16)
561 self.assertEqual(result, expected)
563 def test_port_stats(self, mock_time):
565 ','.join(str(n) for n in range(3, 15)),
566 ','.join(str(n) for n in range(8, 32, 2)),
567 ','.join(str(n) for n in range(5, 89, 7)),
570 mock_socket = mock.MagicMock()
571 prox = ProxSocketHelper(mock_socket)
572 prox.get_data = mock.MagicMock(side_effect=port_stats)
573 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
574 result = prox.port_stats([3, 4, 5])
575 self.assertEqual(result, expected)
577 def test_measure_tot_stats(self, mock_time):
578 start_tot = 3, 4, 5, 6
579 end_tot = 7, 9, 11, 13
580 delta_tot = 4, 5, 6, 7
583 ','.join(str(n) for n in start_tot),
584 ','.join(str(n) for n in end_tot),
587 mock_socket = mock.MagicMock()
588 prox = ProxSocketHelper(mock_socket)
589 prox.get_data = mock.MagicMock(side_effect=get_data_output)
591 'start_tot': start_tot,
595 with prox.measure_tot_stats() as result:
597 self.assertEqual(result, expected)
599 def test_tot_stats(self, mock_time):
600 mock_socket = mock.MagicMock()
601 prox = ProxSocketHelper(mock_socket)
602 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
604 result = prox.tot_stats()
605 self.assertEqual(result, expected)
607 def test_tot_ierrors(self, mock_time):
608 mock_socket = mock.MagicMock()
609 prox = ProxSocketHelper(mock_socket)
610 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
612 result = prox.tot_ierrors()
613 self.assertEqual(result, expected)
615 def test_set_count(self, mock_time):
616 mock_socket = mock.MagicMock()
617 prox = ProxSocketHelper(mock_socket)
618 prox.set_count(432, [3, 4, 5])
619 self.assertEqual(mock_socket.sendall.call_count, 3)
621 def test_dump_rx(self, mock_time):
622 mock_socket = mock.MagicMock()
623 prox = ProxSocketHelper(mock_socket)
624 prox.dump_rx(3, 5, 8)
625 self.assertEqual(mock_socket.sendall.call_count, 1)
627 def test_quit(self, mock_time):
628 mock_socket = mock.MagicMock()
629 prox = ProxSocketHelper(mock_socket)
631 mock_socket.sendall.assert_called()
633 def test_force_quit(self, mock_time):
634 mock_socket = mock.MagicMock()
635 prox = ProxSocketHelper(mock_socket)
637 mock_socket.sendall.assert_called()
640 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
643 'short-name': 'ProxVnf',
648 'network': '152.16.100.20',
649 'netmask': '255.255.255.0',
650 'gateway': '152.16.100.20',
654 'network': '152.16.40.20',
655 'netmask': '255.255.255.0',
656 'gateway': '152.16.40.20',
660 'description': 'PROX approximation using DPDK',
661 'name': 'proxvnf-baremetal',
664 'network': '0064:ff9b:0:0:0:0:9810:6414',
666 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
670 'network': '0064:ff9b:0:0:0:0:9810:2814',
672 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
676 'id': 'proxvnf-baremetal',
677 'external-interface': [
679 'virtual-interface': {
680 'dst_mac': '00:00:00:00:00:04',
681 'vpci': '0000:05:00.0',
682 'local_ip': '152.16.100.19',
683 'type': 'PCI-PASSTHROUGH',
684 'vld_id': 'uplink_0',
685 'netmask': '255.255.255.0',
687 'bandwidth': '10 Gbps',
689 'dst_ip': '152.16.100.19',
690 'local_iface_name': 'xe0',
691 'local_mac': '00:00:00:00:00:02',
694 'vnfd-connection-point-ref': 'xe0',
698 'virtual-interface': {
699 'dst_mac': '00:00:00:00:00:03',
700 'vpci': '0000:05:00.1',
701 'local_ip': '152.16.40.19',
702 'type': 'PCI-PASSTHROUGH',
703 'vld_id': 'downlink_0',
705 'netmask': '255.255.255.0',
707 'bandwidth': '10 Gbps',
708 'dst_ip': '152.16.40.20',
709 'local_iface_name': 'xe1',
710 'local_mac': '00:00:00:00:00:01',
713 'vnfd-connection-point-ref': 'xe1',
719 'description': 'PROX approximation using DPDK',
721 'vdu-id': 'proxvnf-baremetal',
734 'id': 'ProxApproxVnf',
739 'vnfd:vnfd-catalog': {
746 def test_global_section(self):
747 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
750 setup_helper._prox_config_data = [('a', [])]
752 with self.assertRaises(KeyError):
753 _ = setup_helper.global_section
757 ('not_name', 'other data'),
758 ('name_not', 'more data'),
759 ('name', 'prox type'),
763 setup_helper._prox_config_data = [
792 result = setup_helper.global_section
793 self.assertEqual(result, global_section[1])
795 def test_find_in_section(self):
796 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
799 setup_helper._prox_config_data = [
801 ('not_name', 'other data'),
802 ('name_not', 'more data'),
803 ('name', 'prox type'),
833 result = setup_helper.find_in_section('section3', 'key3')
834 self.assertEqual(result, expected)
836 expected = 'default value'
837 result = setup_helper.find_in_section('section3', 'key4', 'default value')
838 self.assertEqual(result, expected)
840 with self.assertRaises(KeyError):
841 setup_helper.find_in_section('section4', 'key1')
843 with self.assertRaises(KeyError):
844 setup_helper.find_in_section('section1', 'key1')
846 def test__replace_quoted_with_value(self):
850 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
851 self.assertEqual(result, expected)
853 # no quoted substring
854 input_str = 'lion tiger bear'
855 expected = 'lion tiger bear'
856 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
857 self.assertEqual(result, expected)
859 # partially quoted substring
860 input_str = 'lion "tiger bear'
861 expected = 'lion "tiger bear'
862 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
863 self.assertEqual(result, expected)
865 # one quoted substring
866 input_str = 'lion "tiger" bear'
867 expected = 'lion "cat" bear'
868 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
869 self.assertEqual(result, expected)
871 # two quoted substrings
872 input_str = 'lion "tiger" bear "shark" whale'
873 expected = 'lion "cat" bear "shark" whale'
874 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
875 self.assertEqual(result, expected)
877 # two quoted substrings, both replaced
878 input_str = 'lion "tiger" bear "shark" whale'
879 expected = 'lion "cat" bear "cat" whale'
880 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
881 self.assertEqual(result, expected)
883 def test__get_tx_port(self):
885 input_data = {'section1': []}
887 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
888 self.assertEqual(result, expected)
890 # data for other section
899 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
900 self.assertEqual(result, expected)
903 input_data['section1'] = section1 = [
904 ('rx port', '4', 'more', 432),
908 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
909 self.assertEqual(result, expected)
911 # more data for section,
914 ('tx port', '1', 'and more', 234),
917 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
918 self.assertEqual(result, expected)
920 def test_write_prox_config(self):
923 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
924 self.assertEqual(result, expected)
932 expected = '[section1]'
933 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
934 self.assertEqual(result, expected)
945 ['__name__', 'not this one'],
948 ['key4', 'multi-line\nvalue'],
952 expected = os.linesep.join([
958 'key4=multi-line\n\tvalue',
960 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
961 self.assertEqual(result, expected)
963 def test_prox_config_data(self):
964 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
967 setup_helper.config_queue = config_queue = mock.MagicMock()
968 config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])]
970 result = setup_helper.prox_config_data
971 self.assertEqual(result, expected)
973 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
974 def test_build_config_file_no_additional_file(self, mock_find_path):
976 'prox_args': {'-c': ""},
978 'prox_config': 'e/f',
981 mock_find_path.side_effect = ['1', '2']
983 vnfd_helper = mock.MagicMock()
984 ssh_helper = mock.MagicMock()
985 scenario_helper = ScenarioHelper('vnf1')
986 scenario_helper.scenario_cfg = {
993 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
994 helper.copy_to_target = mock.MagicMock(return_value='3')
995 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
996 helper.upload_prox_config = mock.MagicMock(return_value='5')
998 self.assertEqual(helper.additional_files, {})
999 self.assertNotEqual(helper._prox_config_data, '4')
1000 self.assertNotEqual(helper.remote_path, '5')
1001 helper.build_config_file()
1002 self.assertEqual(helper.additional_files, {})
1003 self.assertEqual(helper._prox_config_data, '4')
1004 self.assertEqual(helper.remote_path, '5')
1006 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1007 def test_build_config_file_additional_file_string(self, mock_find_path):
1009 'prox_args': {'-c': ""},
1011 'prox_config': 'e/f',
1012 'prox_files': 'g/h.i',
1015 mock_find_path.side_effect = ['1', '2']
1016 vnfd_helper = mock.MagicMock()
1017 ssh_helper = mock.MagicMock()
1018 scenario_helper = ScenarioHelper('vnf1')
1019 scenario_helper.scenario_cfg = {
1026 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1027 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1028 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1029 helper.upload_prox_config = mock.MagicMock(return_value='55')
1031 self.assertEqual(helper.additional_files, {})
1032 expected = {'h.i': '33'}
1033 helper.build_config_file()
1034 self.assertDictEqual(helper.additional_files, expected)
1036 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1037 def test_build_config_file_additional_file(self, mock_find_path):
1039 'prox_args': {'-c': ""},
1041 'prox_config': 'e/f',
1049 mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))]
1050 vnfd_helper = mock.MagicMock()
1051 ssh_helper = mock.MagicMock()
1052 scenario_helper = ScenarioHelper('vnf1')
1053 scenario_helper.scenario_cfg = {
1060 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1061 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1062 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1063 helper.upload_prox_config = mock.MagicMock(return_value='55')
1065 self.assertEqual(helper.additional_files, {})
1066 self.assertNotEqual(helper._prox_config_data, '44')
1067 self.assertNotEqual(helper.remote_path, '55')
1068 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
1069 helper.build_config_file()
1070 self.assertDictEqual(helper.additional_files, expected)
1071 self.assertEqual(helper._prox_config_data, '44')
1072 self.assertEqual(helper.remote_path, '55')
1074 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1075 def test_build_config(self, mock_find_path):
1077 'prox_args': {'-f': ""},
1078 'prox_path': '/opt/nsb_bin/prox',
1079 'prox_config': 'configs/gen_l2fwd-2.cfg',
1087 mock_find_path.side_effect = ['1', '2']
1088 vnfd_helper = mock.MagicMock()
1089 ssh_helper = mock.MagicMock()
1090 ssh_helper.provision_tool.return_value = "/opt/nsb_bin/prox"
1091 scenario_helper = ScenarioHelper('vnf1')
1092 scenario_helper.scenario_cfg = {
1099 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1100 helper.remote_path = "/tmp/prox.cfg"
1101 expected = "sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli -f -f /tmp/prox.cfg '"
1102 with mock.patch.object(helper, "build_config_file") as mock_build_config:
1103 prox_cmd = helper.build_config()
1104 self.assertEqual(prox_cmd, expected)
1106 def test__insert_additional_file(self):
1107 vnfd_helper = mock.MagicMock()
1108 ssh_helper = mock.MagicMock()
1109 scenario_helper = mock.MagicMock()
1111 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1112 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1113 res = helper._insert_additional_file('dofile("ipv4.lua")')
1114 self.assertEqual(res, 'dofile("/tmp/ipv4.lua")')
1116 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1117 def test_generate_prox_config_file(self, mock_parser_type):
1120 args[-1].extend(sections_data)
1121 return mock.MagicMock()
1125 mock_parser_type.side_effect = init
1127 vnfd_helper = VnfdHelper(self.VNFD0)
1128 ssh_helper = mock.MagicMock()
1129 scenario_helper = mock.MagicMock()
1131 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1132 helper.additional_files = {}
1135 result = helper.generate_prox_config_file('a/b')
1136 self.assertEqual(result, expected)
1138 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1140 helper.remote_prox_file_name = 'remote'
1145 ['dofile("ipv4.lua")', ''],
1161 ['$sut_mac0', '@@dst_mac0'],
1164 ['user_table', 'dofile("ipv4.lua")'],
1165 ['missing_addtional_file', 'dofile("nosuch")'],
1174 ['dofile("/tmp/ipv4.lua")', ''],
1181 ['mac', 'hardware'],
1182 ['dst mac', '00:00:00:00:00:03'],
1190 ['$sut_mac0', '00 00 00 00 00 04'],
1193 ['user_table', 'dofile("/tmp/ipv4.lua")'],
1194 ['missing_addtional_file', 'dofile("nosuch")'],
1198 result = helper.generate_prox_config_file('/c/d/e')
1199 self.assertEqual(result, expected, str(result))
1201 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1202 def test_generate_prox_config_file_negative(self, mock_parser_type):
1204 args[-1].update(sections_data)
1205 return mock.MagicMock()
1209 mock_parser_type.side_effect = init
1211 vnfd_helper = mock.MagicMock()
1212 vnfd_helper.interfaces = []
1213 ssh_helper = mock.MagicMock()
1214 scenario_helper = mock.MagicMock()
1216 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1217 helper.additional_files = {}
1218 helper.remote_prox_file_name = 'remote'
1219 vnfd_helper.interfaces = [
1221 'virtual-interface': {
1223 'dst_mac': '00:00:00:de:ad:88',
1227 'virtual-interface': {
1229 'dst_mac': '00:00:00:de:ad:ff',
1233 'virtual-interface': {
1235 'dst_mac': '00:00:00:de:ad:ff',
1249 ['???', 'dofile "here" 23'],
1253 with self.assertRaises(Exception):
1254 helper.generate_prox_config_file('a/b')
1256 def test_generate_prox_lua_file(self):
1257 vnfd_helper = VnfdHelper(self.VNFD0)
1258 ssh_helper = mock.MagicMock()
1259 scenario_helper = mock.MagicMock()
1261 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1262 helper.LUA_PARAMETER_NAME = 'sut'
1265 'sut_hex_ip_port_0:"98 10 64 13"',
1266 'sut_ip_port_0:"152.16.100.19"',
1267 'gen_hex_ip_port_0:"98 10 64 13"',
1268 'gen_ip_port_0:"152.16.100.19"',
1270 'sut_hex_ip_port_1:"98 10 28 13"',
1271 'sut_ip_port_1:"152.16.40.19"',
1272 'gen_hex_ip_port_1:"98 10 28 14"',
1273 'gen_ip_port_1:"152.16.40.20"',
1275 result = helper.generate_prox_lua_file()
1276 self.assertListEqual(result.splitlines(), expected)
1278 def test_upload_prox_lua(self):
1279 def identity(*args):
1282 vnfd_helper = mock.MagicMock()
1283 vnfd_helper.interfaces = []
1284 ssh_helper = mock.MagicMock()
1285 scenario_helper = mock.MagicMock()
1287 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1288 helper.generate_prox_lua_file = mock.MagicMock(return_value=234)
1289 helper.put_string_to_file = identity
1292 result = helper.upload_prox_lua('my_dir', {})
1293 self.assertEqual(result, expected)
1297 'key1': 'value1 ("inside") tail',
1299 'key3 ("key_side") head': 'value3',
1303 expected = 234, 'my_dir/key_side'
1304 result = helper.upload_prox_lua('my_dir', input_data)
1305 self.assertEqual(result, expected)
1307 def test_put_string_to_file(self):
1308 vnfd_helper = mock.MagicMock()
1309 vnfd_helper.interfaces = []
1310 ssh_helper = mock.MagicMock()
1311 scenario_helper = mock.MagicMock()
1313 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1316 result = helper.put_string_to_file('my long string', 'a/b')
1317 self.assertEqual(result, expected)
1319 def test__build_pipeline_kwarags(self):
1320 vnfd_helper = mock.MagicMock()
1321 ssh_helper = mock.MagicMock()
1322 ssh_helper.provision_tool.return_value = "/tmp/nosuch"
1323 scenario_helper = mock.MagicMock()
1325 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1326 helper._build_pipeline_kwargs()
1327 self.assertEqual(helper.pipeline_kwargs, {'tool_path': '/tmp/nosuch', 'tool_dir': '/tmp'})
1329 def test_copy_to_target(self):
1330 vnfd_helper = mock.MagicMock()
1331 vnfd_helper.interfaces = []
1332 ssh_helper = mock.MagicMock()
1333 scenario_helper = mock.MagicMock()
1335 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1337 result = helper.copy_to_target('a/b', 'c')
1338 self.assertEqual(result, expected)
1340 def test_upload_prox_config(self):
1341 vnfd_helper = mock.MagicMock()
1342 vnfd_helper.interfaces = []
1343 ssh_helper = mock.MagicMock()
1344 scenario_helper = mock.MagicMock()
1346 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1347 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1349 result = helper.upload_prox_config('a', {})
1350 self.assertEqual(result, expected)
1353 class TestProxResourceHelper(unittest.TestCase):
1356 'short-name': 'ProxVnf',
1361 'network': '152.16.100.20',
1362 'netmask': '255.255.255.0',
1363 'gateway': '152.16.100.20',
1367 'network': '152.16.40.20',
1368 'netmask': '255.255.255.0',
1369 'gateway': '152.16.40.20',
1373 'description': 'PROX approximation using DPDK',
1374 'name': 'proxvnf-baremetal',
1377 'network': '0064:ff9b:0:0:0:0:9810:6414',
1379 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1383 'network': '0064:ff9b:0:0:0:0:9810:2814',
1385 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1389 'id': 'proxvnf-baremetal',
1390 'external-interface': [
1392 'virtual-interface': {
1393 'dst_mac': '00:00:00:00:00:04',
1394 'vpci': '0000:05:00.0',
1395 'local_ip': '152.16.100.19',
1396 'type': 'PCI-PASSTHROUGH',
1397 'vld_id': 'uplink_0',
1398 'netmask': '255.255.255.0',
1400 'bandwidth': '10 Gbps',
1402 'dst_ip': '152.16.100.19',
1403 'local_iface_name': 'xe0',
1404 'local_mac': '00:00:00:00:00:02',
1407 'vnfd-connection-point-ref': 'xe0',
1411 'virtual-interface': {
1412 'dst_mac': '00:00:00:00:00:03',
1413 'vpci': '0000:05:00.1',
1414 'local_ip': '152.16.40.19',
1415 'type': 'PCI-PASSTHROUGH',
1416 'vld_id': 'downlink_0',
1418 'netmask': '255.255.255.0',
1420 'bandwidth': '10 Gbps',
1421 'dst_ip': '152.16.40.20',
1422 'local_iface_name': 'xe1',
1423 'local_mac': '00:00:00:00:00:01',
1426 'vnfd-connection-point-ref': 'xe1',
1432 'description': 'PROX approximation using DPDK',
1434 'vdu-id': 'proxvnf-baremetal',
1447 'id': 'ProxApproxVnf',
1452 'vnfd:vnfd-catalog': {
1459 def test_find_pci(self):
1465 result = ProxResourceHelper.find_pci('target', input_str_list)
1466 self.assertFalse(result)
1474 result = ProxResourceHelper.find_pci('target', input_str_list)
1475 self.assertTrue(result)
1477 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1478 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1479 def test_sut(self, mock_socket_helper):
1480 helper = ProxResourceHelper(mock.MagicMock())
1481 self.assertIsNone(helper.client)
1483 self.assertIsNotNone(result)
1484 self.assertIs(result, helper.client)
1485 self.assertIs(result, helper.sut)
1487 def test_test_type(self):
1488 setup_helper = mock.MagicMock()
1489 setup_helper.find_in_section.return_value = expected = 'prox type'
1491 helper = ProxResourceHelper(setup_helper)
1493 self.assertIsNone(helper._test_type)
1494 self.assertEqual(helper.test_type, expected)
1495 self.assertEqual(helper._test_type, expected)
1496 self.assertEqual(helper.test_type, expected)
1498 def test_collect_collectd_kpi(self):
1499 helper = ProxResourceHelper(mock.MagicMock())
1500 helper.resource = resource = mock.MagicMock()
1502 resource.check_if_sa_running.return_value = 0, '1234'
1503 resource.amqp_collect_nfvi_kpi.return_value = 543
1504 resource.check_if_sa_running.return_value = (0, None)
1506 expected = {'core': 543}
1507 result = helper.collect_collectd_kpi()
1508 self.assertDictEqual(result, expected)
1510 def test_collect_kpi(self):
1511 helper = ProxResourceHelper(mock.MagicMock())
1512 helper._queue = queue = mock.MagicMock()
1513 helper._result = {'z': 123}
1514 helper.resource = resource = mock.MagicMock()
1516 resource.check_if_sa_running.return_value = 0, '1234'
1517 resource.amqp_collect_nfvi_kpi.return_value = 543
1518 resource.check_if_sa_running.return_value = (0, None)
1520 queue.empty.return_value = False
1521 queue.get.return_value = {'a': 789}
1523 expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
1524 result = helper.collect_kpi()
1525 self.assertDictEqual(result, expected)
1527 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1528 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1529 def test__connect(self, mock_socket_helper_type, mock_time):
1530 client = mock_socket_helper_type()
1531 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1533 setup_helper = mock.MagicMock()
1534 setup_helper.vnfd_helper.interfaces = []
1536 helper = ProxResourceHelper(setup_helper)
1538 result = helper._connect()
1539 self.assertIs(result, client)
1541 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1543 with self.assertRaises(Exception):
1546 def test_run_traffic(self):
1547 setup_helper = mock.MagicMock()
1548 helper = ProxResourceHelper(setup_helper)
1549 traffic_profile = mock.MagicMock(**{"done": True})
1550 helper.run_traffic(traffic_profile)
1551 self.assertEqual(helper._terminated.value, 1)
1553 def test__run_traffic_once(self):
1554 setup_helper = mock.MagicMock()
1555 helper = ProxResourceHelper(setup_helper)
1556 traffic_profile = mock.MagicMock(**{"done": True})
1557 helper._run_traffic_once(traffic_profile)
1558 self.assertEqual(helper._terminated.value, 1)
1560 def test_start_collect(self):
1561 setup_helper = mock.MagicMock()
1562 helper = ProxResourceHelper(setup_helper)
1563 helper.resource = resource = mock.MagicMock()
1564 self.assertIsNone(helper.start_collect())
1565 resource.start.assert_called_once()
1567 def test_terminate(self):
1568 setup_helper = mock.MagicMock()
1569 helper = ProxResourceHelper(setup_helper)
1570 with self.assertRaises(NotImplementedError):
1573 def test_up_post(self):
1574 setup_helper = mock.MagicMock()
1575 helper = ProxResourceHelper(setup_helper)
1576 helper.client = expected = mock.MagicMock()
1577 result = helper.up_post()
1578 self.assertEqual(result, expected)
1580 def test_execute(self):
1581 setup_helper = mock.MagicMock()
1582 helper = ProxResourceHelper(setup_helper)
1583 helper.client = mock.MagicMock()
1585 expected = helper.client.my_command()
1586 result = helper.execute('my_command')
1587 self.assertEqual(result, expected)
1589 helper.client = object()
1591 result = helper.execute('my_command')
1592 self.assertIsNone(result)
1595 class TestProxDataHelper(unittest.TestCase):
1597 def test_totals_and_pps(self):
1599 vnfd_helper = mock.MagicMock()
1600 vnfd_helper.port_pairs.all_ports = list(range(4))
1602 sut = mock.MagicMock()
1603 sut.port_stats.return_value = list(range(10))
1605 data_helper = ProxDataHelper(vnfd_helper, sut, pkt_size, 25, None)
1607 self.assertEqual(data_helper.rx_total, 6)
1608 self.assertEqual(data_helper.tx_total, 7)
1609 self.assertEqual(data_helper.pps, 6.25e6)
1611 def test_samples(self):
1612 vnfd_helper = mock.MagicMock()
1613 vnfd_helper.port_pairs.all_ports = list(range(4))
1614 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1616 sut = mock.MagicMock()
1617 sut.port_stats.return_value = list(range(10))
1619 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1631 result = data_helper.samples
1632 self.assertDictEqual(result, expected)
1634 def test___enter__(self):
1635 vnfd_helper = mock.MagicMock()
1636 vnfd_helper.port_pairs.all_ports = list(range(4))
1637 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1639 sut = mock.MagicMock()
1640 sut.port_stats.return_value = list(range(10))
1642 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1643 data_helper._totals_and_pps = 12, 32, 4.5
1644 data_helper.tsc_hz = 9.8
1645 data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)}
1646 data_helper.latency = 7
1648 self.assertIsNone(data_helper.result_tuple)
1650 expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5)
1654 result = data_helper.result_tuple
1655 self.assertEqual(result, expected)
1657 data_helper.make_tuple()
1658 self.assertIs(data_helper.result_tuple, result)
1660 def test___enter___negative(self):
1661 vnfd_helper = mock.MagicMock()
1663 data_helper = ProxDataHelper(vnfd_helper, None, None, None, None)
1665 vnfd_helper.port_pairs.all_ports = []
1666 with self.assertRaises(AssertionError):
1670 vnfd_helper.port_pairs.all_ports = [0, 1, 2]
1671 with self.assertRaises(AssertionError):
1675 def test_measure_tot_stats(self):
1676 vnfd_helper = mock.MagicMock()
1677 vnfd_helper.port_pairs.all_ports = list(range(4))
1679 start = (3, 4, 1, 2)
1682 sut = ProxSocketHelper(mock.MagicMock())
1683 sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end])
1685 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1687 self.assertIsNone(data_helper.measured_stats)
1692 'delta': TotStatsTuple(6, 3, 5, 6),
1694 with data_helper.measure_tot_stats():
1697 self.assertEqual(data_helper.measured_stats, expected)
1699 def test_capture_tsc_hz(self):
1700 vnfd_helper = mock.MagicMock()
1701 vnfd_helper.port_pairs.all_ports = list(range(4))
1703 sut = mock.MagicMock()
1704 sut.hz.return_value = '54.6'
1706 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1708 self.assertIsNone(data_helper.tsc_hz)
1711 data_helper.capture_tsc_hz()
1712 self.assertEqual(data_helper.tsc_hz, expected)
1715 class TestProxProfileHelper(unittest.TestCase):
1717 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1718 def test_get_cls(self, mock_utils):
1719 mock_type1 = mock.MagicMock()
1720 mock_type1.__prox_profile_type__ = 'another_type'
1721 mock_type2 = mock.MagicMock()
1722 mock_type2.__prox_profile_type__ = 'my_type'
1723 mock_utils.itersubclasses.return_value = [mock_type1, mock_type2]
1725 self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2)
1727 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1728 def test_get_cls_default(self, mock_utils):
1729 mock_utils.itersubclasses.return_value = []
1730 ProxProfileHelper.get_cls('my_type')
1732 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1733 def test_cpu_topology(self, mock_socket_topology):
1734 mock_socket_topology.parse_cpuinfo.return_value = 432
1736 resource_helper = mock.MagicMock()
1737 resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1739 helper = ProxProfileHelper(resource_helper)
1740 self.assertIsNone(helper._cpu_topology)
1741 result = helper.cpu_topology
1742 self.assertEqual(result, 432)
1743 self.assertIs(result, helper._cpu_topology)
1744 self.assertIs(result, helper.cpu_topology)
1746 def test_test_cores(self):
1747 resource_helper = mock.MagicMock()
1748 resource_helper.setup_helper.prox_config_data = []
1750 helper = ProxProfileHelper(resource_helper)
1751 helper._cpu_topology = []
1754 result = helper.test_cores
1755 self.assertEqual(result, expected)
1757 resource_helper.setup_helper.prox_config_data = [
1778 helper = ProxProfileHelper(resource_helper)
1779 helper._cpu_topology = {
1796 self.assertIsNone(helper._test_cores)
1798 result = helper.test_cores
1799 self.assertEqual(result, expected)
1800 self.assertIs(result, helper._test_cores)
1801 self.assertIs(result, helper.test_cores)
1803 def test_latency_cores(self):
1804 resource_helper = mock.MagicMock()
1805 resource_helper.setup_helper.prox_config_data = []
1807 helper = ProxProfileHelper(resource_helper)
1808 helper._cpu_topology = []
1811 result = helper.latency_cores
1812 self.assertEqual(result, expected)
1814 resource_helper.setup_helper.prox_config_data = [
1835 helper = ProxProfileHelper(resource_helper)
1836 helper._cpu_topology = {
1853 self.assertIsNone(helper._latency_cores)
1855 result = helper.latency_cores
1856 self.assertEqual(result, expected)
1857 self.assertIs(result, helper._latency_cores)
1858 self.assertIs(result, helper.latency_cores)
1860 def test_all_rx_cores(self):
1861 helper = ProxBngProfileHelper(mock.MagicMock())
1862 helper._latency_cores = expected = [3, 4, 6]
1863 helper._test_cores = [5, 2, 1]
1865 result = helper.all_rx_cores
1866 self.assertEqual(result, expected)
1868 def test_get_cores(self):
1869 resource_helper = mock.MagicMock()
1870 resource_helper.setup_helper.prox_config_data = [
1891 helper = ProxProfileHelper(resource_helper)
1892 helper._cpu_topology = {
1910 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1911 self.assertEqual(result, expected)
1913 def test_get_latency(self):
1914 resource_helper = mock.MagicMock()
1915 resource_helper.setup_helper.vnfd_helper.interfaces = []
1917 helper = ProxProfileHelper(resource_helper)
1918 helper._latency_cores = []
1921 result = helper.get_latency()
1922 self.assertEqual(result, expected)
1924 helper._latency_cores = [1, 2]
1925 helper.client = mock.MagicMock()
1927 expected = helper.sut.lat_stats()
1928 result = helper.get_latency()
1929 self.assertIs(result, expected)
1931 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1932 def test_traffic_context(self, mock_time):
1933 setup_helper = mock.MagicMock()
1934 setup_helper.vnfd_helper.interfaces = []
1936 helper = ProxProfileHelper(setup_helper)
1937 helper._cpu_topology = {
1954 setup_helper.prox_config_data = [
1956 ('not_name', 'other data'),
1957 ('name_not', 'more data'),
1958 ('name', helper.__prox_profile_type__),
1982 client = mock.MagicMock()
1983 client.hz.return_value = 2
1984 client.port_stats.return_value = tuple(range(12))
1986 helper.client = client
1987 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1989 helper._test_cores = [3, 4]
1991 with helper.traffic_context(64, 1):
1994 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1995 def test_run_test(self, _):
1996 resource_helper = mock.MagicMock()
1997 resource_helper.step_delta = 0.4
1998 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
1999 resource_helper.sut.port_stats.return_value = list(range(10))
2001 helper = ProxProfileHelper(resource_helper)
2003 helper.run_test(120, 5, 6.5)
2006 class TestProxMplsProfileHelper(unittest.TestCase):
2008 def test_mpls_cores(self):
2009 resource_helper = mock.MagicMock()
2010 resource_helper.setup_helper.prox_config_data = [
2033 helper = ProxMplsProfileHelper(resource_helper)
2034 helper._cpu_topology = {
2051 expected_tagged = [7]
2052 expected_plain = [8]
2053 self.assertIsNone(helper._cores_tuple)
2054 self.assertEqual(helper.tagged_cores, expected_tagged)
2055 self.assertEqual(helper.plain_cores, expected_plain)
2056 self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain))
2058 def test_traffic_context(self):
2059 setup_helper = mock.MagicMock()
2060 helper = ProxMplsProfileHelper(setup_helper)
2062 with helper.traffic_context(120, 5.4):
2066 class TestProxBngProfileHelper(unittest.TestCase):
2068 def test_bng_cores(self):
2069 resource_helper = mock.MagicMock()
2070 resource_helper.setup_helper.prox_config_data = [
2094 ('name', 'arp_task'),
2103 helper = ProxBngProfileHelper(resource_helper)
2104 helper._cpu_topology = {
2129 expected_arp = [4, 3]
2130 expected_arp_task = [0, 4]
2131 expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task)
2133 self.assertIsNone(helper._cores_tuple)
2134 self.assertEqual(helper.cpe_cores, expected_cpe)
2135 self.assertEqual(helper.inet_cores, expected_inet)
2136 self.assertEqual(helper.arp_cores, expected_arp)
2137 self.assertEqual(helper.arp_task_cores, expected_arp_task)
2138 self.assertEqual(helper._cores_tuple, expected_combined)
2140 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2141 def test_run_test(self, _):
2142 resource_helper = mock.MagicMock()
2143 resource_helper.step_delta = 0.4
2144 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2145 resource_helper.sut.port_stats.return_value = list(range(10))
2147 helper = ProxBngProfileHelper(resource_helper)
2149 helper.run_test(120, 5, 6.5)
2150 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1