2 # Copyright (c) 2016-2017 Intel Corporation
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
17 from itertools import repeat, chain
25 from yardstick.tests import STL_MOCKS
26 from yardstick.common import utils
27 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
28 from yardstick.network_services import constants
30 STLClient = mock.MagicMock()
31 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
35 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
36 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper
37 from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump
38 from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple
39 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple
40 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper
41 from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple
42 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDataHelper
43 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper
44 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper
45 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxMplsProfileHelper
46 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxBngProfileHelper
47 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxVpeProfileHelper
48 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxlwAFTRProfileHelper
50 class TestCoreTuple(unittest.TestCase):
51 def test___init__(self):
52 core_tuple = CoreSocketTuple('core 5s6')
53 self.assertEqual(core_tuple.core_id, 5)
54 self.assertEqual(core_tuple.socket_id, 6)
55 self.assertFalse(core_tuple.is_hyperthread())
57 core_tuple = CoreSocketTuple('core 5s6h')
58 self.assertEqual(core_tuple.core_id, 5)
59 self.assertEqual(core_tuple.socket_id, 6)
60 self.assertTrue(core_tuple.is_hyperthread())
62 def test___init__negative(self):
83 for bad_input in bad_inputs:
84 with self.assertRaises(ValueError):
85 CoreSocketTuple(bad_input)
87 def test_find_in_topology(self):
97 core_tuple = CoreSocketTuple('core 5s6')
100 result = core_tuple.find_in_topology(topology_in)
101 self.assertEqual(result, expected)
103 core_tuple = CoreSocketTuple('core 5s6h')
106 result = core_tuple.find_in_topology(topology_in)
107 self.assertEqual(result, expected)
109 def test_find_in_topology_negative(self):
110 core_tuple = CoreSocketTuple('core 6s5')
111 with self.assertRaises(ValueError):
113 core_tuple.find_in_topology({})
115 with self.assertRaises(ValueError):
117 core_tuple.find_in_topology({5: {}})
119 with self.assertRaises(ValueError):
120 # no first value (as needed by non-hyperthread core)
121 core_tuple.find_in_topology({5: {6: {'key1': []}}})
123 core_tuple = CoreSocketTuple('core 6s5h')
124 with self.assertRaises(ValueError):
125 # no second value (as needed by hyperthread core)
126 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
129 class TestTotStatsTuple(unittest.TestCase):
130 def test___new___negative(self):
131 with self.assertRaises(TypeError):
135 with self.assertRaises(TypeError):
136 # one, non-integer value
139 with self.assertRaises(TypeError):
141 TotStatsTuple(3, 4, 5, 6, 7)
144 class TestProxTestDataTuple(unittest.TestCase):
145 def test___init__(self):
146 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
147 self.assertEqual(prox_test_data.tolerated, 1)
148 self.assertEqual(prox_test_data.tsc_hz, 2)
149 self.assertEqual(prox_test_data.delta_rx, 3)
150 self.assertEqual(prox_test_data.delta_tx, 4)
151 self.assertEqual(prox_test_data.delta_tsc, 5)
152 self.assertEqual(prox_test_data.latency, 6)
153 self.assertEqual(prox_test_data.rx_total, 7)
154 self.assertEqual(prox_test_data.tx_total, 8)
155 self.assertEqual(prox_test_data.requested_pps, 9)
157 def test_properties(self):
158 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
159 self.assertEqual(prox_test_data.pkt_loss, 12.5)
160 self.assertEqual(prox_test_data.tx_mpps, 1.6 / 1e6)
161 self.assertEqual(prox_test_data.can_be_lost, 0)
162 self.assertEqual(prox_test_data.drop_total, 1)
163 self.assertFalse(prox_test_data.success)
165 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
166 self.assertTrue(prox_test_data.success)
168 def test_pkt_loss_zero_division(self):
169 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
170 self.assertEqual(prox_test_data.pkt_loss, 100.0)
172 def test_get_samples(self):
173 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
176 "Throughput": 1.2 / 1e6,
178 "CurrentDropPackets": 12.5,
179 "RequestedTxThroughput": 9 / 1e6,
180 "TxThroughput": 1.6 / 1e6,
181 "RxThroughput": 1.2 / 1e6,
188 result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
189 self.assertDictEqual(result, expected)
192 "Throughput": 1.2 / 1e6,
193 "DropPackets": 0.123,
194 "CurrentDropPackets": 0.123,
195 "RequestedTxThroughput": 9 / 1e6,
196 "TxThroughput": 1.6 / 1e6,
197 "RxThroughput": 1.2 / 1e6,
203 result = prox_test_data.get_samples(64, 0.123)
204 self.assertDictEqual(result, expected)
206 @mock.patch('yardstick.LOG_RESULT', create=True)
207 def test_log_data(self, mock_logger):
208 my_mock_logger = mock.MagicMock()
209 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
210 prox_test_data.log_data()
211 self.assertEqual(my_mock_logger.debug.call_count, 0)
212 self.assertEqual(mock_logger.debug.call_count, 0)
214 mock_logger.debug.reset_mock()
215 prox_test_data.log_data(my_mock_logger)
216 self.assertEqual(my_mock_logger.debug.call_count, 0)
217 self.assertEqual(mock_logger.debug.call_count, 0)
220 class TestPacketDump(unittest.TestCase):
223 def test__init__(self):
224 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
226 def test___str__(self):
227 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
228 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
229 self.assertEqual(str(dump1), expected)
231 def test_port_id(self):
232 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
233 self.assertEqual(p.port_id, "port_id")
235 def test_data_len(self):
236 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
237 self.assertEqual(p.data_len, len(self.PAYLOAD))
239 def test_payload(self):
240 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
241 self.assertEqual(p.payload(), self.PAYLOAD)
243 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
245 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
247 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
259 brown fox jumped over
265 PACKET_DUMP_NON_1 = """\
270 PACKET_DUMP_MIXED_1 = """\
277 PACKET_DUMP_BAD_1 = """\
282 PACKET_DUMP_BAD_2 = """\
287 PACKET_DUMP_BAD_3 = """\
293 class TestProxSocketHelper(unittest.TestCase):
296 self.mock_time_sleep = mock.patch.object(time, 'sleep').start()
298 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
299 def test___init__(self, mock_socket):
300 expected = mock_socket.socket()
301 prox = ProxSocketHelper()
303 self.assertEqual(result, expected)
305 def test_connect(self):
306 mock_sock = mock.MagicMock()
307 prox = ProxSocketHelper(mock_sock)
308 prox.connect('10.20.30.40', 23456)
309 self.assertEqual(mock_sock.connect.call_count, 1)
311 def test_get_sock(self):
312 mock_sock = mock.MagicMock()
313 prox = ProxSocketHelper(mock_sock)
314 result = prox.get_socket()
315 self.assertIs(result, mock_sock)
317 # TODO(elfoley): Split this into three tests
318 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
319 def test_get_data(self, mock_select):
320 mock_select.select.side_effect = [[1], [0]]
321 mock_socket = mock.MagicMock()
322 mock_recv = mock_socket.recv()
323 mock_recv.decode.return_value = ""
324 prox = ProxSocketHelper(mock_socket)
325 ret = prox.get_data()
326 self.assertEqual(ret, "")
327 self.assertEqual(len(prox._pkt_dumps), 0)
329 mock_select.select.reset_mock()
330 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
331 mock_recv.decode.return_value = PACKET_DUMP_1
332 ret = prox.get_data()
333 self.assertEqual(mock_select.select.call_count, 2)
334 self.assertEqual(ret, 'pktdump,3,11')
335 self.assertEqual(len(prox._pkt_dumps), 1)
337 mock_select.select.reset_mock()
338 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
339 mock_recv.decode.return_value = PACKET_DUMP_2
340 ret = prox.get_data()
341 self.assertEqual(mock_select.select.call_count, 1)
342 self.assertEqual(ret, 'jumped over')
343 self.assertEqual(len(prox._pkt_dumps), 3)
345 def test__parse_socket_data_mixed_data(self):
346 prox = ProxSocketHelper(mock.MagicMock())
347 ret, _ = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
348 self.assertEqual(ret, 'not_a_dump,1,2')
349 self.assertEqual(len(prox._pkt_dumps), 0)
351 ret, _ = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
352 self.assertEqual(ret, 'not_a_dump,1,2')
353 self.assertEqual(len(prox._pkt_dumps), 1)
355 def test__parse_socket_data_bad_data(self):
356 prox = ProxSocketHelper(mock.MagicMock())
357 with self.assertRaises(ValueError):
358 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
360 with self.assertRaises(ValueError):
361 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
363 ret, _ = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
364 self.assertEqual(ret, 'pktdump,3')
366 def test__parse_socket_data_pkt_dump_only(self):
367 prox = ProxSocketHelper(mock.MagicMock())
368 ret, _ = prox._parse_socket_data('', True)
369 self.assertFalse(ret)
371 ret, _ = prox._parse_socket_data(PACKET_DUMP_1, True)
374 ret, _ = prox._parse_socket_data(PACKET_DUMP_2, True)
377 def test_put_command(self):
378 mock_socket = mock.MagicMock()
379 prox = ProxSocketHelper(mock_socket)
380 prox.put_command("data")
381 mock_socket.sendall.assert_called_once()
383 def test_put_command_socket_error(self):
384 mock_socket = mock.MagicMock()
385 mock_socket.sendall.side_effect = OSError
386 prox = ProxSocketHelper(mock_socket)
387 prox.put_command("data")
388 mock_socket.sendall.assert_called_once()
390 def test_get_packet_dump(self):
391 mock_socket = mock.MagicMock()
392 prox = ProxSocketHelper(mock_socket)
394 self.assertIsNone(prox.get_packet_dump())
396 prox._pkt_dumps = [234]
397 self.assertEqual(prox.get_packet_dump(), 234)
398 self.assertEqual(prox._pkt_dumps, [])
400 def test_stop_all_reset(self):
401 mock_socket = mock.MagicMock()
402 prox = ProxSocketHelper(mock_socket)
403 prox.stop_all_reset()
404 mock_socket.sendall.assert_called()
406 def test_stop_all(self):
407 mock_socket = mock.MagicMock()
408 prox = ProxSocketHelper(mock_socket)
410 mock_socket.sendall.assert_called()
413 mock_socket = mock.MagicMock()
414 prox = ProxSocketHelper(mock_socket)
415 prox.stop([3, 4, 5], 16)
416 mock_socket.sendall.assert_called()
418 def test_start_all(self):
419 mock_socket = mock.MagicMock()
420 prox = ProxSocketHelper(mock_socket)
422 mock_socket.sendall.assert_called()
424 def test_start(self):
425 mock_socket = mock.MagicMock()
426 prox = ProxSocketHelper(mock_socket)
427 prox.start([3, 4, 5])
428 mock_socket.sendall.assert_called()
430 def test_reset_stats(self):
431 mock_socket = mock.MagicMock()
432 prox = ProxSocketHelper(mock_socket)
434 mock_socket.sendall.assert_called()
436 def test_set_pkt_size(self):
437 mock_socket = mock.MagicMock()
438 prox = ProxSocketHelper(mock_socket)
439 prox.set_pkt_size([3, 4, 5], 1024)
440 self.assertEqual(mock_socket.sendall.call_count, 3)
442 def test_set_value(self):
443 mock_socket = mock.MagicMock()
444 prox = ProxSocketHelper(mock_socket)
445 prox.set_value([3, 4, 5], 10, 20, 30)
446 self.assertEqual(mock_socket.sendall.call_count, 3)
448 def test_reset_values(self):
449 mock_socket = mock.MagicMock()
450 prox = ProxSocketHelper(mock_socket)
451 prox.reset_values([3, 4, 5])
452 self.assertEqual(mock_socket.sendall.call_count, 3)
454 def test_set_speed(self):
455 mock_socket = mock.MagicMock()
456 prox = ProxSocketHelper(mock_socket)
457 prox.set_speed([3, 4, 5], 1000)
458 self.assertEqual(mock_socket.sendall.call_count, 3)
460 def test_slope_speed(self):
467 'cores': [9, 10, 11],
472 mock_socket = mock.MagicMock()
473 prox = ProxSocketHelper(mock_socket)
474 prox.set_speed = set_speed = mock.MagicMock()
475 prox.slope_speed(core_data, 5)
476 self.assertEqual(set_speed.call_count, 20)
478 set_speed.reset_mock()
479 prox.slope_speed(core_data, 5, 5)
480 self.assertEqual(set_speed.call_count, 10)
482 def test_set_pps(self):
483 mock_socket = mock.MagicMock()
484 prox = ProxSocketHelper(mock_socket)
485 prox.set_pps([3, 4, 5], 1000, 512)
486 self.assertEqual(mock_socket.sendall.call_count, 3)
488 def test_lat_stats(self):
490 '1, 2 , 3', # has white space
492 '7,8,9,10.5,11', # too long with float, but float is in unused portion
493 'twelve,13,14', # value as English word
494 '15,16.2,17', # float in used portion
497 mock_socket = mock.MagicMock()
498 prox = ProxSocketHelper(mock_socket)
499 prox.get_data = mock.MagicMock(side_effect=latency_output)
515 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
516 self.assertEqual(mock_socket.sendall.call_count, 5)
517 self.assertEqual(result, expected)
519 def test_get_all_tot_stats_error(self):
520 mock_socket = mock.MagicMock()
521 prox = ProxSocketHelper(mock_socket)
522 prox.get_data = mock.MagicMock(return_value='3,4,5')
523 expected = [0, 0, 0, 0]
524 result = prox.get_all_tot_stats()
525 self.assertEqual(result, expected)
527 def test_get_all_tot_stats(self):
528 mock_socket = mock.MagicMock()
529 prox = ProxSocketHelper(mock_socket)
530 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
531 expected = 3, 4, 5, 6
532 result = prox.get_all_tot_stats()
533 self.assertEqual(result, expected)
536 mock_socket = mock.MagicMock()
537 prox = ProxSocketHelper(mock_socket)
538 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
541 self.assertEqual(result, expected)
543 def test_core_stats(self):
550 mock_socket = mock.MagicMock()
551 prox = ProxSocketHelper(mock_socket)
552 prox.get_data = mock.MagicMock(side_effect=core_stats)
553 expected = 21, 24, 27, 14
554 result = prox.core_stats([3, 4, 5], 16)
555 self.assertEqual(result, expected)
557 def test_port_stats(self):
559 ','.join(str(n) for n in range(3, 15)),
560 ','.join(str(n) for n in range(8, 32, 2)),
561 ','.join(str(n) for n in range(5, 89, 7)),
564 mock_socket = mock.MagicMock()
565 prox = ProxSocketHelper(mock_socket)
566 prox.get_data = mock.MagicMock(side_effect=port_stats)
567 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
568 result = prox.port_stats([3, 4, 5])
569 self.assertEqual(result, expected)
571 def test_measure_tot_stats(self):
572 start_tot = 3, 4, 5, 6
573 end_tot = 7, 9, 11, 13
574 delta_tot = 4, 5, 6, 7
577 ','.join(str(n) for n in start_tot),
578 ','.join(str(n) for n in end_tot),
581 mock_socket = mock.MagicMock()
582 prox = ProxSocketHelper(mock_socket)
583 prox.get_data = mock.MagicMock(side_effect=get_data_output)
585 'start_tot': start_tot,
589 with prox.measure_tot_stats() as result:
591 self.assertEqual(result, expected)
593 def test_tot_stats(self):
594 mock_socket = mock.MagicMock()
595 prox = ProxSocketHelper(mock_socket)
596 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
598 result = prox.tot_stats()
599 self.assertEqual(result, expected)
601 def test_tot_ierrors(self):
602 mock_socket = mock.MagicMock()
603 prox = ProxSocketHelper(mock_socket)
604 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
606 result = prox.tot_ierrors()
607 self.assertEqual(result, expected)
609 def test_set_count(self):
610 mock_socket = mock.MagicMock()
611 prox = ProxSocketHelper(mock_socket)
612 prox.set_count(432, [3, 4, 5])
613 self.assertEqual(mock_socket.sendall.call_count, 3)
615 def test_dump_rx(self):
616 mock_socket = mock.MagicMock()
617 prox = ProxSocketHelper(mock_socket)
618 prox.dump_rx(3, 5, 8)
619 self.assertEqual(mock_socket.sendall.call_count, 1)
622 mock_socket = mock.MagicMock()
623 prox = ProxSocketHelper(mock_socket)
625 mock_socket.sendall.assert_called()
627 def test_force_quit(self):
628 mock_socket = mock.MagicMock()
629 prox = ProxSocketHelper(mock_socket)
631 mock_socket.sendall.assert_called()
634 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
637 'short-name': 'ProxVnf',
642 'network': '152.16.100.20',
643 'netmask': '255.255.255.0',
644 'gateway': '152.16.100.20',
648 'network': '152.16.40.20',
649 'netmask': '255.255.255.0',
650 'gateway': '152.16.40.20',
654 'description': 'PROX approximation using DPDK',
655 'name': 'proxvnf-baremetal',
658 'network': '0064:ff9b:0:0:0:0:9810:6414',
660 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
664 'network': '0064:ff9b:0:0:0:0:9810:2814',
666 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
670 'id': 'proxvnf-baremetal',
671 'external-interface': [
673 'virtual-interface': {
674 'dst_mac': '00:00:00:00:00:04',
675 'vpci': '0000:05:00.0',
676 'local_ip': '152.16.100.19',
677 'type': 'PCI-PASSTHROUGH',
678 'vld_id': 'uplink_0',
679 'netmask': '255.255.255.0',
681 'bandwidth': '10 Gbps',
683 'dst_ip': '152.16.100.19',
684 'local_iface_name': 'xe0',
685 'local_mac': '00:00:00:00:00:02',
688 'vnfd-connection-point-ref': 'xe0',
692 'virtual-interface': {
693 'dst_mac': '00:00:00:00:00:03',
694 'vpci': '0000:05:00.1',
695 'local_ip': '152.16.40.19',
696 'type': 'PCI-PASSTHROUGH',
697 'vld_id': 'downlink_0',
699 'netmask': '255.255.255.0',
701 'bandwidth': '10 Gbps',
702 'dst_ip': '152.16.40.20',
703 'local_iface_name': 'xe1',
704 'local_mac': '00:00:00:00:00:01',
707 'vnfd-connection-point-ref': 'xe1',
713 'description': 'PROX approximation using DPDK',
715 'vdu-id': 'proxvnf-baremetal',
728 'id': 'ProxApproxVnf',
733 'vnfd:vnfd-catalog': {
740 def test_global_section(self):
741 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
744 setup_helper._prox_config_data = [('a', [])]
746 with self.assertRaises(KeyError):
747 _ = setup_helper.global_section
751 ('not_name', 'other data'),
752 ('name_not', 'more data'),
753 ('name', 'prox type'),
757 setup_helper._prox_config_data = [
786 result = setup_helper.global_section
787 self.assertEqual(result, global_section[1])
789 def test_find_in_section(self):
790 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
793 setup_helper._prox_config_data = [
795 ('not_name', 'other data'),
796 ('name_not', 'more data'),
797 ('name', 'prox type'),
827 result = setup_helper.find_in_section('section3', 'key3')
828 self.assertEqual(result, expected)
830 expected = 'default value'
831 result = setup_helper.find_in_section('section3', 'key4', 'default value')
832 self.assertEqual(result, expected)
834 with self.assertRaises(KeyError):
835 setup_helper.find_in_section('section4', 'key1')
837 with self.assertRaises(KeyError):
838 setup_helper.find_in_section('section1', 'key1')
840 def test__replace_quoted_with_value(self):
844 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
845 self.assertEqual(result, expected)
847 # no quoted substring
848 input_str = 'lion tiger bear'
849 expected = 'lion tiger bear'
850 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
851 self.assertEqual(result, expected)
853 # partially 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 # one quoted substring
860 input_str = 'lion "tiger" bear'
861 expected = 'lion "cat" bear'
862 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
863 self.assertEqual(result, expected)
865 # two quoted substrings
866 input_str = 'lion "tiger" bear "shark" whale'
867 expected = 'lion "cat" bear "shark" whale'
868 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
869 self.assertEqual(result, expected)
871 # two quoted substrings, both replaced
872 input_str = 'lion "tiger" bear "shark" whale'
873 expected = 'lion "cat" bear "cat" whale'
874 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
875 self.assertEqual(result, expected)
877 def test__get_tx_port(self):
879 input_data = {'section1': []}
881 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
882 self.assertEqual(result, expected)
884 # data for other section
893 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
894 self.assertEqual(result, expected)
897 input_data['section1'] = section1 = [
898 ('rx port', '4', 'more', 432),
902 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
903 self.assertEqual(result, expected)
905 # more data for section,
908 ('tx port', '1', 'and more', 234),
911 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
912 self.assertEqual(result, expected)
914 # TODO(elfoley): Split this into several smaller tests
915 def test_write_prox_config(self):
918 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
919 self.assertEqual(result, expected)
927 expected = '[section1]'
928 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
929 self.assertEqual(result, expected)
940 ['__name__', 'not this one'],
943 ['key4', 'multi-line\nvalue'],
947 expected = os.linesep.join([
953 'key4=multi-line\n\tvalue',
955 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
956 self.assertEqual(result, expected)
958 def test_prox_config_data(self):
959 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
962 setup_helper.config_queue = config_queue = mock.MagicMock()
963 config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])]
965 result = setup_helper.prox_config_data
966 self.assertEqual(result, expected)
968 @mock.patch.object(utils, 'find_relative_file')
969 def test_build_config_file_no_additional_file(self, mock_find_path):
971 'prox_args': {'-c': ""},
973 'prox_config': 'e/f',
974 'prox_generate_parameter': False,
977 mock_find_path.side_effect = ['1', '2']
979 vnfd_helper = mock.MagicMock()
980 ssh_helper = mock.MagicMock()
981 scenario_helper = ScenarioHelper('vnf1')
982 scenario_helper.scenario_cfg = {
989 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
990 helper.copy_to_target = mock.MagicMock(return_value='3')
991 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
992 helper.upload_prox_config = mock.MagicMock(return_value='5')
994 self.assertEqual(helper.additional_files, {})
995 self.assertNotEqual(helper._prox_config_data, '4')
996 self.assertNotEqual(helper.remote_path, '5')
997 helper.build_config_file()
998 self.assertEqual(helper.additional_files, {})
999 self.assertEqual(helper._prox_config_data, '4')
1000 self.assertEqual(helper.remote_path, '5')
1002 @mock.patch.object(utils, 'find_relative_file')
1003 def test_build_config_file_additional_file_string(self, mock_find_path):
1005 'prox_args': {'-c': ""},
1007 'prox_config': 'e/f',
1008 'prox_files': 'g/h.i',
1009 'prox_generate_parameter': True,
1012 mock_find_path.side_effect = ['1', '2']
1013 vnfd_helper = mock.MagicMock()
1014 ssh_helper = mock.MagicMock()
1015 scenario_helper = ScenarioHelper('vnf1')
1016 scenario_helper.scenario_cfg = {
1023 vnfd_helper.port_pairs.all_ports = ['xe0', 'xe1', 'xe2', 'xe3']
1024 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1025 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1026 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1027 helper.upload_prox_config = mock.MagicMock(return_value='55')
1029 self.assertEqual(helper.additional_files, {})
1030 expected = {'h.i': '33'}
1031 helper.build_config_file()
1032 self.assertDictEqual(helper.additional_files, expected)
1034 @mock.patch.object(utils, 'find_relative_file')
1035 def test_build_config_file_additional_file(self, mock_find_path):
1037 'prox_args': {'-c': ""},
1039 'prox_config': 'e/f',
1047 mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))]
1048 vnfd_helper = mock.MagicMock()
1049 ssh_helper = mock.MagicMock()
1050 scenario_helper = ScenarioHelper('vnf1')
1051 scenario_helper.scenario_cfg = {
1058 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1059 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1060 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1061 helper.upload_prox_config = mock.MagicMock(return_value='55')
1063 self.assertEqual(helper.additional_files, {})
1064 self.assertNotEqual(helper._prox_config_data, '44')
1065 self.assertNotEqual(helper.remote_path, '55')
1066 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
1067 helper.build_config_file()
1068 self.assertDictEqual(helper.additional_files, expected)
1069 self.assertEqual(helper._prox_config_data, '44')
1070 self.assertEqual(helper.remote_path, '55')
1072 def test_build_config(self):
1074 'prox_args': {'-f': ""},
1075 'prox_path': '/opt/nsb_bin/prox',
1076 'prox_config': 'configs/gen_l2fwd-2.cfg',
1084 vnfd_helper = mock.Mock()
1085 ssh_helper = mock.Mock()
1086 ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/prox'
1087 scenario_helper = ScenarioHelper('vnf1')
1088 scenario_helper.scenario_cfg = {
1095 expected = ("sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli "
1096 "-f -f /tmp/prox.cfg '")
1098 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper,
1100 with mock.patch.object(helper, 'build_config_file') as mock_cfg_file:
1101 helper.remote_path = '/tmp/prox.cfg'
1102 prox_cmd = helper.build_config()
1103 self.assertEqual(prox_cmd, expected)
1104 mock_cfg_file.assert_called_once()
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_put_string_to_file(self):
1257 vnfd_helper = mock.MagicMock()
1258 vnfd_helper.interfaces = []
1259 ssh_helper = mock.MagicMock()
1260 scenario_helper = mock.MagicMock()
1262 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1265 result = helper.put_string_to_file('my long string', 'a/b')
1266 self.assertEqual(result, expected)
1268 def test_copy_to_target(self):
1269 vnfd_helper = mock.MagicMock()
1270 vnfd_helper.interfaces = []
1271 ssh_helper = mock.MagicMock()
1272 scenario_helper = mock.MagicMock()
1274 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1276 result = helper.copy_to_target('a/b', 'c')
1277 self.assertEqual(result, expected)
1279 def test_upload_prox_config(self):
1280 vnfd_helper = mock.MagicMock()
1281 vnfd_helper.interfaces = []
1282 ssh_helper = mock.MagicMock()
1283 scenario_helper = mock.MagicMock()
1285 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1286 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1288 result = helper.upload_prox_config('a', {})
1289 self.assertEqual(result, expected)
1292 class TestProxResourceHelper(unittest.TestCase):
1295 'short-name': 'ProxVnf',
1300 'network': '152.16.100.20',
1301 'netmask': '255.255.255.0',
1302 'gateway': '152.16.100.20',
1306 'network': '152.16.40.20',
1307 'netmask': '255.255.255.0',
1308 'gateway': '152.16.40.20',
1312 'description': 'PROX approximation using DPDK',
1313 'name': 'proxvnf-baremetal',
1316 'network': '0064:ff9b:0:0:0:0:9810:6414',
1318 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1322 'network': '0064:ff9b:0:0:0:0:9810:2814',
1324 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1328 'id': 'proxvnf-baremetal',
1329 'external-interface': [
1331 'virtual-interface': {
1332 'dst_mac': '00:00:00:00:00:04',
1333 'vpci': '0000:05:00.0',
1334 'local_ip': '152.16.100.19',
1335 'type': 'PCI-PASSTHROUGH',
1336 'vld_id': 'uplink_0',
1337 'netmask': '255.255.255.0',
1339 'bandwidth': '10 Gbps',
1341 'dst_ip': '152.16.100.19',
1342 'local_iface_name': 'xe0',
1343 'local_mac': '00:00:00:00:00:02',
1346 'vnfd-connection-point-ref': 'xe0',
1350 'virtual-interface': {
1351 'dst_mac': '00:00:00:00:00:03',
1352 'vpci': '0000:05:00.1',
1353 'local_ip': '152.16.40.19',
1354 'type': 'PCI-PASSTHROUGH',
1355 'vld_id': 'downlink_0',
1357 'netmask': '255.255.255.0',
1359 'bandwidth': '10 Gbps',
1360 'dst_ip': '152.16.40.20',
1361 'local_iface_name': 'xe1',
1362 'local_mac': '00:00:00:00:00:01',
1365 'vnfd-connection-point-ref': 'xe1',
1371 'description': 'PROX approximation using DPDK',
1373 'vdu-id': 'proxvnf-baremetal',
1386 'id': 'ProxApproxVnf',
1391 'vnfd:vnfd-catalog': {
1398 def test_find_pci(self):
1404 result = ProxResourceHelper.find_pci('target', input_str_list)
1405 self.assertFalse(result)
1413 result = ProxResourceHelper.find_pci('target', input_str_list)
1414 self.assertTrue(result)
1416 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1417 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1418 def test_sut(self, *args):
1419 helper = ProxResourceHelper(mock.MagicMock())
1420 self.assertIsNone(helper.client)
1422 self.assertIsNotNone(result)
1423 self.assertIs(result, helper.client)
1424 self.assertIs(result, helper.sut)
1426 def test_test_type(self):
1427 setup_helper = mock.MagicMock()
1428 setup_helper.find_in_section.return_value = expected = 'prox type'
1430 helper = ProxResourceHelper(setup_helper)
1432 self.assertIsNone(helper._test_type)
1433 self.assertEqual(helper.test_type, expected)
1434 self.assertEqual(helper._test_type, expected)
1435 self.assertEqual(helper.test_type, expected)
1437 def test_collect_collectd_kpi(self):
1438 helper = ProxResourceHelper(mock.MagicMock())
1439 helper.resource = resource = mock.MagicMock()
1441 resource.check_if_system_agent_running.return_value = 0, '1234'
1442 resource.amqp_collect_nfvi_kpi.return_value = 543
1443 resource.check_if_system_agent_running.return_value = (0, None)
1445 expected = {'core': 543}
1446 result = helper.collect_collectd_kpi()
1447 self.assertDictEqual(result, expected)
1449 def test_collect_kpi(self):
1450 helper = ProxResourceHelper(mock.MagicMock())
1451 helper._queue = queue = mock.MagicMock()
1452 helper._result = {'z': 123}
1453 helper.resource = resource = mock.MagicMock()
1455 resource.check_if_system_agent_running.return_value = 0, '1234'
1456 resource.amqp_collect_nfvi_kpi.return_value = 543
1457 resource.check_if_system_agent_running.return_value = (0, None)
1459 queue.empty.return_value = False
1460 queue.get.return_value = {'a': 789}
1462 expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
1463 result = helper.collect_kpi()
1464 self.assertDictEqual(result, expected)
1466 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1467 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1468 def test__connect(self, mock_socket_helper_type, *args):
1469 client = mock_socket_helper_type()
1470 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1472 setup_helper = mock.MagicMock()
1473 setup_helper.vnfd_helper.interfaces = []
1475 helper = ProxResourceHelper(setup_helper)
1477 result = helper._connect()
1478 self.assertIs(result, client)
1480 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1482 with self.assertRaises(Exception):
1485 def test_run_traffic(self):
1486 setup_helper = mock.MagicMock()
1487 helper = ProxResourceHelper(setup_helper)
1488 traffic_profile = mock.MagicMock(**{"done": True})
1489 helper.run_traffic(traffic_profile)
1490 self.assertEqual(helper._terminated.value, 1)
1492 def test__run_traffic_once(self):
1493 setup_helper = mock.MagicMock()
1494 helper = ProxResourceHelper(setup_helper)
1495 traffic_profile = mock.MagicMock(**{"done": True})
1496 helper._run_traffic_once(traffic_profile)
1497 self.assertEqual(helper._terminated.value, 1)
1499 def test_start_collect(self):
1500 setup_helper = mock.MagicMock()
1501 helper = ProxResourceHelper(setup_helper)
1502 helper.resource = resource = mock.MagicMock()
1503 self.assertIsNone(helper.start_collect())
1504 resource.start.assert_called_once()
1506 def test_terminate(self):
1507 setup_helper = mock.MagicMock()
1508 helper = ProxResourceHelper(setup_helper)
1509 with self.assertRaises(NotImplementedError):
1512 def test_up_post(self):
1513 setup_helper = mock.MagicMock()
1514 helper = ProxResourceHelper(setup_helper)
1515 helper.client = expected = mock.MagicMock()
1516 result = helper.up_post()
1517 self.assertEqual(result, expected)
1519 def test_execute(self):
1520 setup_helper = mock.MagicMock()
1521 helper = ProxResourceHelper(setup_helper)
1522 helper.client = mock.MagicMock()
1524 expected = helper.client.my_command()
1525 result = helper.execute('my_command')
1526 self.assertEqual(result, expected)
1528 # TODO(elfoley): Make this a separate test: test_execute_no_client
1529 helper.client = object()
1531 result = helper.execute('my_command')
1532 self.assertIsNone(result)
1535 class TestProxDataHelper(unittest.TestCase):
1537 def test_totals_and_pps(self):
1539 vnfd_helper = mock.MagicMock()
1540 vnfd_helper.port_pairs.all_ports = list(range(4))
1542 sut = mock.MagicMock()
1543 sut.port_stats.return_value = list(range(10))
1545 data_helper = ProxDataHelper(
1546 vnfd_helper, sut, pkt_size, 25, None,
1547 constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
1549 self.assertEqual(data_helper.rx_total, 6)
1550 self.assertEqual(data_helper.tx_total, 7)
1551 self.assertEqual(data_helper.requested_pps, 6.25e6)
1553 def test_samples(self):
1554 vnfd_helper = mock.MagicMock()
1555 vnfd_helper.port_pairs.all_ports = list(range(4))
1556 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1558 sut = mock.MagicMock()
1559 sut.port_stats.return_value = list(range(10))
1561 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None, None)
1573 result = data_helper.samples
1574 self.assertDictEqual(result, expected)
1576 def test___enter__(self):
1577 vnfd_helper = mock.MagicMock()
1578 vnfd_helper.port_pairs.all_ports = list(range(4))
1579 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1581 sut = mock.MagicMock()
1582 sut.port_stats.return_value = list(range(10))
1584 data_helper = ProxDataHelper(vnfd_helper, sut, None, None,
1585 5.4, constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
1586 data_helper._totals_and_pps = 12, 32, 4.5
1587 data_helper.tsc_hz = 9.8
1588 data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)}
1589 data_helper.latency = 7
1591 self.assertIsNone(data_helper.result_tuple)
1592 self.assertEqual(data_helper.line_speed, 10000000000)
1594 expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5)
1598 result = data_helper.result_tuple
1599 self.assertEqual(result, expected)
1601 data_helper.make_tuple()
1602 self.assertIs(data_helper.result_tuple, result)
1604 def test___enter___negative(self):
1605 vnfd_helper = mock.MagicMock()
1607 data_helper = ProxDataHelper(vnfd_helper, None, None, None, None, None)
1609 vnfd_helper.port_pairs.all_ports = []
1610 with self.assertRaises(AssertionError):
1614 vnfd_helper.port_pairs.all_ports = [0, 1, 2]
1615 with self.assertRaises(AssertionError):
1619 def test_measure_tot_stats(self):
1620 vnfd_helper = mock.MagicMock()
1621 vnfd_helper.port_pairs.all_ports = list(range(4))
1623 start = (3, 4, 1, 2)
1626 sut = ProxSocketHelper(mock.MagicMock())
1627 sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end])
1629 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4, None)
1631 self.assertIsNone(data_helper.measured_stats)
1636 'delta': TotStatsTuple(6, 3, 5, 6),
1638 with data_helper.measure_tot_stats():
1641 self.assertEqual(data_helper.measured_stats, expected)
1643 def test_capture_tsc_hz(self):
1644 vnfd_helper = mock.MagicMock()
1645 vnfd_helper.port_pairs.all_ports = list(range(4))
1647 sut = mock.MagicMock()
1648 sut.hz.return_value = '54.6'
1650 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None, None)
1652 self.assertIsNone(data_helper.tsc_hz)
1655 data_helper.capture_tsc_hz()
1656 self.assertEqual(data_helper.tsc_hz, expected)
1659 class TestProxProfileHelper(unittest.TestCase):
1661 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1662 def test_get_cls(self, mock_utils):
1663 mock_type1 = mock.MagicMock()
1664 mock_type1.__prox_profile_type__ = 'another_type'
1665 mock_type2 = mock.MagicMock()
1666 mock_type2.__prox_profile_type__ = 'my_type'
1667 mock_utils.itersubclasses.return_value = [mock_type1, mock_type2]
1669 self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2)
1671 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1672 def test_get_cls_default(self, mock_utils):
1673 mock_utils.itersubclasses.return_value = []
1674 ProxProfileHelper.get_cls('my_type')
1676 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1677 def test_cpu_topology(self, mock_socket_topology):
1678 mock_socket_topology.parse_cpuinfo.return_value = 432
1680 resource_helper = mock.MagicMock()
1681 resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1683 helper = ProxProfileHelper(resource_helper)
1684 self.assertIsNone(helper._cpu_topology)
1685 result = helper.cpu_topology
1686 self.assertEqual(result, 432)
1687 self.assertIs(result, helper._cpu_topology)
1688 self.assertIs(result, helper.cpu_topology)
1690 # TODO(elfoley): Split this test; there are two sets of inputs/outputs
1691 def test_test_cores(self):
1692 resource_helper = mock.MagicMock()
1693 resource_helper.setup_helper.prox_config_data = []
1695 helper = ProxProfileHelper(resource_helper)
1696 helper._cpu_topology = []
1699 result = helper.test_cores
1700 self.assertEqual(result, expected)
1702 resource_helper.setup_helper.prox_config_data = [
1723 helper = ProxProfileHelper(resource_helper)
1724 helper._cpu_topology = {
1741 self.assertIsNone(helper._test_cores)
1743 result = helper.test_cores
1744 self.assertEqual(result, expected)
1745 self.assertIs(result, helper._test_cores)
1746 self.assertIs(result, helper.test_cores)
1748 # TODO(elfoley): Split this test; there are two sets of inputs/outputs
1749 def test_latency_cores(self):
1750 resource_helper = mock.MagicMock()
1751 resource_helper.setup_helper.prox_config_data = []
1753 helper = ProxProfileHelper(resource_helper)
1754 helper._cpu_topology = []
1757 result = helper.latency_cores
1758 self.assertEqual(result, expected)
1760 resource_helper.setup_helper.prox_config_data = [
1781 helper = ProxProfileHelper(resource_helper)
1782 helper._cpu_topology = {
1799 self.assertIsNone(helper._latency_cores)
1801 result = helper.latency_cores
1802 self.assertEqual(result, expected)
1803 self.assertIs(result, helper._latency_cores)
1804 self.assertIs(result, helper.latency_cores)
1806 def test_all_rx_cores(self):
1807 helper = ProxBngProfileHelper(mock.MagicMock())
1808 helper._latency_cores = expected = [3, 4, 6]
1809 helper._test_cores = [5, 2, 1]
1811 result = helper.all_rx_cores
1812 self.assertEqual(result, expected)
1814 def test_get_cores(self):
1815 resource_helper = mock.MagicMock()
1816 resource_helper.setup_helper.prox_config_data = [
1837 helper = ProxProfileHelper(resource_helper)
1838 helper._cpu_topology = {
1856 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1857 self.assertEqual(result, expected)
1859 def test_get_latency(self):
1860 resource_helper = mock.MagicMock()
1861 resource_helper.setup_helper.vnfd_helper.interfaces = []
1863 helper = ProxProfileHelper(resource_helper)
1864 helper._latency_cores = []
1867 result = helper.get_latency()
1868 self.assertEqual(result, expected)
1870 helper._latency_cores = [1, 2]
1871 helper.client = mock.MagicMock()
1873 expected = helper.sut.lat_stats()
1874 result = helper.get_latency()
1875 self.assertIs(result, expected)
1877 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1878 def test_traffic_context(self, *args):
1879 setup_helper = mock.MagicMock()
1880 setup_helper.vnfd_helper.interfaces = []
1882 helper = ProxProfileHelper(setup_helper)
1883 helper._cpu_topology = {
1900 setup_helper.prox_config_data = [
1902 ('not_name', 'other data'),
1903 ('name_not', 'more data'),
1904 ('name', helper.__prox_profile_type__),
1928 client = mock.MagicMock()
1929 client.hz.return_value = 2
1930 client.port_stats.return_value = tuple(range(12))
1932 helper.client = client
1933 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1935 helper._test_cores = [3, 4]
1937 with helper.traffic_context(64, 1):
1940 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1941 def test_run_test(self, _):
1942 resource_helper = mock.MagicMock()
1943 resource_helper.step_delta = 0.4
1944 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
1945 resource_helper.sut.port_stats.return_value = list(range(10))
1947 helper = ProxProfileHelper(resource_helper)
1949 helper.run_test(120, 5, 6.5,
1950 constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
1953 class TestProxMplsProfileHelper(unittest.TestCase):
1955 def test_mpls_cores(self):
1956 resource_helper = mock.MagicMock()
1957 resource_helper.setup_helper.prox_config_data = [
1980 helper = ProxMplsProfileHelper(resource_helper)
1981 helper._cpu_topology = {
1998 expected_tagged = [3]
1999 expected_plain = [4]
2000 self.assertIsNone(helper._cores_tuple)
2001 self.assertEqual(helper.tagged_cores, expected_tagged)
2002 self.assertEqual(helper.plain_cores, expected_plain)
2003 self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain))
2005 def test_traffic_context(self):
2006 setup_helper = mock.MagicMock()
2007 helper = ProxMplsProfileHelper(setup_helper)
2009 with helper.traffic_context(120, 5.4):
2013 class TestProxBngProfileHelper(unittest.TestCase):
2015 def test_bng_cores(self):
2016 resource_helper = mock.MagicMock()
2017 resource_helper.setup_helper.prox_config_data = [
2041 ('name', 'arp_task'),
2050 helper = ProxBngProfileHelper(resource_helper)
2051 helper._cpu_topology = {
2076 expected_arp = [6, 9]
2077 expected_arp_task = [0, 6]
2078 expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task)
2080 self.assertIsNone(helper._cores_tuple)
2081 self.assertEqual(helper.cpe_cores, expected_cpe)
2082 self.assertEqual(helper.inet_cores, expected_inet)
2083 self.assertEqual(helper.arp_cores, expected_arp)
2084 self.assertEqual(helper.arp_task_cores, expected_arp_task)
2085 self.assertEqual(helper._cores_tuple, expected_combined)
2087 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2088 def test_run_test(self, _):
2089 resource_helper = mock.MagicMock()
2090 resource_helper.step_delta = 0.4
2091 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2092 resource_helper.sut.port_stats.return_value = list(range(10))
2094 helper = ProxBngProfileHelper(resource_helper)
2096 helper.run_test(120, 5, 6.5,
2097 constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
2099 # negative pkt_size is the only way to make ratio > 1
2100 helper.run_test(-1000, 5, 6.5,
2101 constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
2104 class TestProxVpeProfileHelper(unittest.TestCase):
2106 def test_vpe_cores(self):
2107 resource_helper = mock.MagicMock()
2108 resource_helper.setup_helper.prox_config_data = [
2131 helper = ProxVpeProfileHelper(resource_helper)
2132 helper._cpu_topology = {
2151 expected_combined = (expected_cpe, expected_inet)
2153 self.assertIsNone(helper._cores_tuple)
2154 self.assertEqual(helper.cpe_cores, expected_cpe)
2155 self.assertEqual(helper.inet_cores, expected_inet)
2156 self.assertEqual(helper._cores_tuple, expected_combined)
2158 def test_vpe_ports(self):
2159 resource_helper = mock.MagicMock()
2160 resource_helper.setup_helper.prox_config_data = [
2169 ('mac', 'hardware'),
2174 ('mac', 'hardware'),
2178 helper = ProxVpeProfileHelper(resource_helper)
2179 helper._port_list = {
2198 expected_combined = (expected_cpe, expected_inet)
2200 self.assertIsNone(helper._ports_tuple)
2201 self.assertEqual(helper.cpe_ports, expected_cpe)
2202 self.assertEqual(helper.inet_ports, expected_inet)
2203 self.assertEqual(helper._ports_tuple, expected_combined)
2205 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2206 def test_run_test(self, _):
2207 resource_helper = mock.MagicMock()
2208 resource_helper.step_delta = 0.4
2209 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2210 resource_helper.sut.port_stats.return_value = list(range(10))
2212 helper = ProxVpeProfileHelper(resource_helper)
2214 helper.run_test(120, 5, 6.5)
2215 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2218 class TestProxlwAFTRProfileHelper(unittest.TestCase):
2220 def test_lwaftr_cores(self):
2221 resource_helper = mock.MagicMock()
2222 resource_helper.setup_helper.prox_config_data = [
2245 helper = ProxlwAFTRProfileHelper(resource_helper)
2246 helper._cpu_topology = {
2265 expected_combined = (expected_tun, expected_inet)
2267 self.assertIsNone(helper._cores_tuple)
2268 self.assertEqual(helper.tun_cores, expected_tun)
2269 self.assertEqual(helper.inet_cores, expected_inet)
2270 self.assertEqual(helper._cores_tuple, expected_combined)
2272 def test_tun_ports(self):
2273 resource_helper = mock.MagicMock()
2274 resource_helper.setup_helper.prox_config_data = [
2283 ('mac', 'hardware'),
2288 ('mac', 'hardware'),
2292 helper = ProxlwAFTRProfileHelper(resource_helper)
2293 helper._port_list = {
2312 expected_combined = (expected_tun, expected_inet)
2314 self.assertIsNone(helper._ports_tuple)
2315 self.assertEqual(helper.tun_ports, expected_tun)
2316 self.assertEqual(helper.inet_ports, expected_inet)
2317 self.assertEqual(helper._ports_tuple, expected_combined)
2319 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2320 def test_run_test(self, _):
2321 resource_helper = mock.MagicMock()
2322 resource_helper.step_delta = 0.4
2323 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2324 resource_helper.sut.port_stats.return_value = list(range(10))
2326 helper = ProxlwAFTRProfileHelper(resource_helper)
2328 helper.run_test(120, 5, 6.5)
2329 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1