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')
297 self.mock_time_sleep = self._mock_time_sleep.start()
298 self.addCleanup(self._stop_mocks)
300 def _stop_mocks(self):
301 self._mock_time_sleep.stop()
303 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
304 def test___init__(self, mock_socket):
305 expected = mock_socket.socket()
306 prox = ProxSocketHelper()
308 self.assertEqual(result, expected)
310 def test_connect(self):
311 mock_sock = mock.MagicMock()
312 prox = ProxSocketHelper(mock_sock)
313 prox.connect('10.20.30.40', 23456)
314 self.assertEqual(mock_sock.connect.call_count, 1)
316 def test_get_sock(self):
317 mock_sock = mock.MagicMock()
318 prox = ProxSocketHelper(mock_sock)
319 result = prox.get_socket()
320 self.assertIs(result, mock_sock)
322 # TODO(elfoley): Split this into three tests
323 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
324 def test_get_data(self, mock_select):
325 mock_select.select.side_effect = [[1], [0]]
326 mock_socket = mock.MagicMock()
327 mock_recv = mock_socket.recv()
328 mock_recv.decode.return_value = ""
329 prox = ProxSocketHelper(mock_socket)
330 ret = prox.get_data()
331 self.assertEqual(ret, "")
332 self.assertEqual(len(prox._pkt_dumps), 0)
334 mock_select.select.reset_mock()
335 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
336 mock_recv.decode.return_value = PACKET_DUMP_1
337 ret = prox.get_data()
338 self.assertEqual(mock_select.select.call_count, 2)
339 self.assertEqual(ret, 'pktdump,3,11')
340 self.assertEqual(len(prox._pkt_dumps), 1)
342 mock_select.select.reset_mock()
343 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
344 mock_recv.decode.return_value = PACKET_DUMP_2
345 ret = prox.get_data()
346 self.assertEqual(mock_select.select.call_count, 1)
347 self.assertEqual(ret, 'jumped over')
348 self.assertEqual(len(prox._pkt_dumps), 3)
350 def test__parse_socket_data_mixed_data(self):
351 prox = ProxSocketHelper(mock.MagicMock())
352 ret, _ = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
353 self.assertEqual(ret, 'not_a_dump,1,2')
354 self.assertEqual(len(prox._pkt_dumps), 0)
356 ret, _ = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
357 self.assertEqual(ret, 'not_a_dump,1,2')
358 self.assertEqual(len(prox._pkt_dumps), 1)
360 def test__parse_socket_data_bad_data(self):
361 prox = ProxSocketHelper(mock.MagicMock())
362 with self.assertRaises(ValueError):
363 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
365 with self.assertRaises(ValueError):
366 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
368 ret, _ = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
369 self.assertEqual(ret, 'pktdump,3')
371 def test__parse_socket_data_pkt_dump_only(self):
372 prox = ProxSocketHelper(mock.MagicMock())
373 ret, _ = prox._parse_socket_data('', True)
374 self.assertFalse(ret)
376 ret, _ = prox._parse_socket_data(PACKET_DUMP_1, True)
379 ret, _ = prox._parse_socket_data(PACKET_DUMP_2, True)
382 def test_put_command(self):
383 mock_socket = mock.MagicMock()
384 prox = ProxSocketHelper(mock_socket)
385 prox.put_command("data")
386 mock_socket.sendall.assert_called_once()
388 def test_put_command_socket_error(self):
389 mock_socket = mock.MagicMock()
390 mock_socket.sendall.side_effect = OSError
391 prox = ProxSocketHelper(mock_socket)
392 prox.put_command("data")
393 mock_socket.sendall.assert_called_once()
395 def test_get_packet_dump(self):
396 mock_socket = mock.MagicMock()
397 prox = ProxSocketHelper(mock_socket)
399 self.assertIsNone(prox.get_packet_dump())
401 prox._pkt_dumps = [234]
402 self.assertEqual(prox.get_packet_dump(), 234)
403 self.assertEqual(prox._pkt_dumps, [])
405 def test_stop_all_reset(self):
406 mock_socket = mock.MagicMock()
407 prox = ProxSocketHelper(mock_socket)
408 prox.stop_all_reset()
409 mock_socket.sendall.assert_called()
411 def test_stop_all(self):
412 mock_socket = mock.MagicMock()
413 prox = ProxSocketHelper(mock_socket)
415 mock_socket.sendall.assert_called()
418 mock_socket = mock.MagicMock()
419 prox = ProxSocketHelper(mock_socket)
420 prox.stop([3, 4, 5], 16)
421 mock_socket.sendall.assert_called()
423 def test_start_all(self):
424 mock_socket = mock.MagicMock()
425 prox = ProxSocketHelper(mock_socket)
427 mock_socket.sendall.assert_called()
429 def test_start(self):
430 mock_socket = mock.MagicMock()
431 prox = ProxSocketHelper(mock_socket)
432 prox.start([3, 4, 5])
433 mock_socket.sendall.assert_called()
435 def test_reset_stats(self):
436 mock_socket = mock.MagicMock()
437 prox = ProxSocketHelper(mock_socket)
439 mock_socket.sendall.assert_called()
441 def test_set_pkt_size(self):
442 mock_socket = mock.MagicMock()
443 prox = ProxSocketHelper(mock_socket)
444 prox.set_pkt_size([3, 4, 5], 1024)
445 self.assertEqual(mock_socket.sendall.call_count, 3)
447 def test_set_value(self):
448 mock_socket = mock.MagicMock()
449 prox = ProxSocketHelper(mock_socket)
450 prox.set_value([3, 4, 5], 10, 20, 30)
451 self.assertEqual(mock_socket.sendall.call_count, 3)
453 def test_reset_values(self):
454 mock_socket = mock.MagicMock()
455 prox = ProxSocketHelper(mock_socket)
456 prox.reset_values([3, 4, 5])
457 self.assertEqual(mock_socket.sendall.call_count, 3)
459 def test_set_speed(self):
460 mock_socket = mock.MagicMock()
461 prox = ProxSocketHelper(mock_socket)
462 prox.set_speed([3, 4, 5], 1000)
463 self.assertEqual(mock_socket.sendall.call_count, 3)
465 def test_slope_speed(self):
472 'cores': [9, 10, 11],
477 mock_socket = mock.MagicMock()
478 prox = ProxSocketHelper(mock_socket)
479 prox.set_speed = set_speed = mock.MagicMock()
480 prox.slope_speed(core_data, 5)
481 self.assertEqual(set_speed.call_count, 20)
483 set_speed.reset_mock()
484 prox.slope_speed(core_data, 5, 5)
485 self.assertEqual(set_speed.call_count, 10)
487 def test_set_pps(self):
488 mock_socket = mock.MagicMock()
489 prox = ProxSocketHelper(mock_socket)
490 prox.set_pps([3, 4, 5], 1000, 512)
491 self.assertEqual(mock_socket.sendall.call_count, 3)
493 def test_lat_stats(self):
495 '1, 2 , 3', # has white space
497 '7,8,9,10.5,11', # too long with float, but float is in unused portion
498 'twelve,13,14', # value as English word
499 '15,16.2,17', # float in used portion
502 mock_socket = mock.MagicMock()
503 prox = ProxSocketHelper(mock_socket)
504 prox.get_data = mock.MagicMock(side_effect=latency_output)
520 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
521 self.assertEqual(mock_socket.sendall.call_count, 5)
522 self.assertEqual(result, expected)
524 def test_get_all_tot_stats_error(self):
525 mock_socket = mock.MagicMock()
526 prox = ProxSocketHelper(mock_socket)
527 prox.get_data = mock.MagicMock(return_value='3,4,5')
528 expected = [0, 0, 0, 0]
529 result = prox.get_all_tot_stats()
530 self.assertEqual(result, expected)
532 def test_get_all_tot_stats(self):
533 mock_socket = mock.MagicMock()
534 prox = ProxSocketHelper(mock_socket)
535 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
536 expected = 3, 4, 5, 6
537 result = prox.get_all_tot_stats()
538 self.assertEqual(result, expected)
541 mock_socket = mock.MagicMock()
542 prox = ProxSocketHelper(mock_socket)
543 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
546 self.assertEqual(result, expected)
548 def test_core_stats(self):
555 mock_socket = mock.MagicMock()
556 prox = ProxSocketHelper(mock_socket)
557 prox.get_data = mock.MagicMock(side_effect=core_stats)
558 expected = 21, 24, 27, 14
559 result = prox.core_stats([3, 4, 5], 16)
560 self.assertEqual(result, expected)
562 def test_port_stats(self):
564 ','.join(str(n) for n in range(3, 15)),
565 ','.join(str(n) for n in range(8, 32, 2)),
566 ','.join(str(n) for n in range(5, 89, 7)),
569 mock_socket = mock.MagicMock()
570 prox = ProxSocketHelper(mock_socket)
571 prox.get_data = mock.MagicMock(side_effect=port_stats)
572 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
573 result = prox.port_stats([3, 4, 5])
574 self.assertEqual(result, expected)
576 def test_measure_tot_stats(self):
577 start_tot = 3, 4, 5, 6
578 end_tot = 7, 9, 11, 13
579 delta_tot = 4, 5, 6, 7
582 ','.join(str(n) for n in start_tot),
583 ','.join(str(n) for n in end_tot),
586 mock_socket = mock.MagicMock()
587 prox = ProxSocketHelper(mock_socket)
588 prox.get_data = mock.MagicMock(side_effect=get_data_output)
590 'start_tot': start_tot,
594 with prox.measure_tot_stats() as result:
596 self.assertEqual(result, expected)
598 def test_tot_stats(self):
599 mock_socket = mock.MagicMock()
600 prox = ProxSocketHelper(mock_socket)
601 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
603 result = prox.tot_stats()
604 self.assertEqual(result, expected)
606 def test_tot_ierrors(self):
607 mock_socket = mock.MagicMock()
608 prox = ProxSocketHelper(mock_socket)
609 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
611 result = prox.tot_ierrors()
612 self.assertEqual(result, expected)
614 def test_set_count(self):
615 mock_socket = mock.MagicMock()
616 prox = ProxSocketHelper(mock_socket)
617 prox.set_count(432, [3, 4, 5])
618 self.assertEqual(mock_socket.sendall.call_count, 3)
620 def test_dump_rx(self):
621 mock_socket = mock.MagicMock()
622 prox = ProxSocketHelper(mock_socket)
623 prox.dump_rx(3, 5, 8)
624 self.assertEqual(mock_socket.sendall.call_count, 1)
627 mock_socket = mock.MagicMock()
628 prox = ProxSocketHelper(mock_socket)
630 mock_socket.sendall.assert_called()
632 def test_force_quit(self):
633 mock_socket = mock.MagicMock()
634 prox = ProxSocketHelper(mock_socket)
636 mock_socket.sendall.assert_called()
639 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
642 'short-name': 'ProxVnf',
647 'network': '152.16.100.20',
648 'netmask': '255.255.255.0',
649 'gateway': '152.16.100.20',
653 'network': '152.16.40.20',
654 'netmask': '255.255.255.0',
655 'gateway': '152.16.40.20',
659 'description': 'PROX approximation using DPDK',
660 'name': 'proxvnf-baremetal',
663 'network': '0064:ff9b:0:0:0:0:9810:6414',
665 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
669 'network': '0064:ff9b:0:0:0:0:9810:2814',
671 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
675 'id': 'proxvnf-baremetal',
676 'external-interface': [
678 'virtual-interface': {
679 'dst_mac': '00:00:00:00:00:04',
680 'vpci': '0000:05:00.0',
681 'local_ip': '152.16.100.19',
682 'type': 'PCI-PASSTHROUGH',
683 'vld_id': 'uplink_0',
684 'netmask': '255.255.255.0',
686 'bandwidth': '10 Gbps',
688 'dst_ip': '152.16.100.19',
689 'local_iface_name': 'xe0',
690 'local_mac': '00:00:00:00:00:02',
693 'vnfd-connection-point-ref': 'xe0',
697 'virtual-interface': {
698 'dst_mac': '00:00:00:00:00:03',
699 'vpci': '0000:05:00.1',
700 'local_ip': '152.16.40.19',
701 'type': 'PCI-PASSTHROUGH',
702 'vld_id': 'downlink_0',
704 'netmask': '255.255.255.0',
706 'bandwidth': '10 Gbps',
707 'dst_ip': '152.16.40.20',
708 'local_iface_name': 'xe1',
709 'local_mac': '00:00:00:00:00:01',
712 'vnfd-connection-point-ref': 'xe1',
718 'description': 'PROX approximation using DPDK',
720 'vdu-id': 'proxvnf-baremetal',
733 'id': 'ProxApproxVnf',
738 'vnfd:vnfd-catalog': {
745 def test_global_section(self):
746 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
749 setup_helper._prox_config_data = [('a', [])]
751 with self.assertRaises(KeyError):
752 _ = setup_helper.global_section
756 ('not_name', 'other data'),
757 ('name_not', 'more data'),
758 ('name', 'prox type'),
762 setup_helper._prox_config_data = [
791 result = setup_helper.global_section
792 self.assertEqual(result, global_section[1])
794 def test_find_in_section(self):
795 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
798 setup_helper._prox_config_data = [
800 ('not_name', 'other data'),
801 ('name_not', 'more data'),
802 ('name', 'prox type'),
832 result = setup_helper.find_in_section('section3', 'key3')
833 self.assertEqual(result, expected)
835 expected = 'default value'
836 result = setup_helper.find_in_section('section3', 'key4', 'default value')
837 self.assertEqual(result, expected)
839 with self.assertRaises(KeyError):
840 setup_helper.find_in_section('section4', 'key1')
842 with self.assertRaises(KeyError):
843 setup_helper.find_in_section('section1', 'key1')
845 def test__replace_quoted_with_value(self):
849 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
850 self.assertEqual(result, expected)
852 # no quoted substring
853 input_str = 'lion tiger bear'
854 expected = 'lion tiger bear'
855 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
856 self.assertEqual(result, expected)
858 # partially quoted substring
859 input_str = 'lion "tiger bear'
860 expected = 'lion "tiger bear'
861 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
862 self.assertEqual(result, expected)
864 # one quoted substring
865 input_str = 'lion "tiger" bear'
866 expected = 'lion "cat" bear'
867 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
868 self.assertEqual(result, expected)
870 # two quoted substrings
871 input_str = 'lion "tiger" bear "shark" whale'
872 expected = 'lion "cat" bear "shark" whale'
873 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
874 self.assertEqual(result, expected)
876 # two quoted substrings, both replaced
877 input_str = 'lion "tiger" bear "shark" whale'
878 expected = 'lion "cat" bear "cat" whale'
879 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
880 self.assertEqual(result, expected)
882 def test__get_tx_port(self):
884 input_data = {'section1': []}
886 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
887 self.assertEqual(result, expected)
889 # data for other section
898 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
899 self.assertEqual(result, expected)
902 input_data['section1'] = section1 = [
903 ('rx port', '4', 'more', 432),
907 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
908 self.assertEqual(result, expected)
910 # more data for section,
913 ('tx port', '1', 'and more', 234),
916 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
917 self.assertEqual(result, expected)
919 # TODO(elfoley): Split this into several smaller tests
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.object(utils, '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',
979 'prox_generate_parameter': False,
982 mock_find_path.side_effect = ['1', '2']
984 vnfd_helper = mock.MagicMock()
985 ssh_helper = mock.MagicMock()
986 scenario_helper = ScenarioHelper('vnf1')
987 scenario_helper.scenario_cfg = {
994 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
995 helper.copy_to_target = mock.MagicMock(return_value='3')
996 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
997 helper.upload_prox_config = mock.MagicMock(return_value='5')
999 self.assertEqual(helper.additional_files, {})
1000 self.assertNotEqual(helper._prox_config_data, '4')
1001 self.assertNotEqual(helper.remote_path, '5')
1002 helper.build_config_file()
1003 self.assertEqual(helper.additional_files, {})
1004 self.assertEqual(helper._prox_config_data, '4')
1005 self.assertEqual(helper.remote_path, '5')
1007 @mock.patch.object(utils, 'find_relative_file')
1008 def test_build_config_file_additional_file_string(self, mock_find_path):
1010 'prox_args': {'-c': ""},
1012 'prox_config': 'e/f',
1013 'prox_files': 'g/h.i',
1014 'prox_generate_parameter': True,
1017 mock_find_path.side_effect = ['1', '2']
1018 vnfd_helper = mock.MagicMock()
1019 ssh_helper = mock.MagicMock()
1020 scenario_helper = ScenarioHelper('vnf1')
1021 scenario_helper.scenario_cfg = {
1028 vnfd_helper.port_pairs.all_ports = ['xe0', 'xe1', 'xe2', 'xe3']
1029 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1030 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1031 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1032 helper.upload_prox_config = mock.MagicMock(return_value='55')
1034 self.assertEqual(helper.additional_files, {})
1035 expected = {'h.i': '33'}
1036 helper.build_config_file()
1037 self.assertDictEqual(helper.additional_files, expected)
1039 @mock.patch.object(utils, 'find_relative_file')
1040 def test_build_config_file_additional_file(self, mock_find_path):
1042 'prox_args': {'-c': ""},
1044 'prox_config': 'e/f',
1052 mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))]
1053 vnfd_helper = mock.MagicMock()
1054 ssh_helper = mock.MagicMock()
1055 scenario_helper = ScenarioHelper('vnf1')
1056 scenario_helper.scenario_cfg = {
1063 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1064 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1065 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1066 helper.upload_prox_config = mock.MagicMock(return_value='55')
1068 self.assertEqual(helper.additional_files, {})
1069 self.assertNotEqual(helper._prox_config_data, '44')
1070 self.assertNotEqual(helper.remote_path, '55')
1071 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
1072 helper.build_config_file()
1073 self.assertDictEqual(helper.additional_files, expected)
1074 self.assertEqual(helper._prox_config_data, '44')
1075 self.assertEqual(helper.remote_path, '55')
1077 def test_build_config(self):
1079 'prox_args': {'-f': ""},
1080 'prox_path': '/opt/nsb_bin/prox',
1081 'prox_config': 'configs/gen_l2fwd-2.cfg',
1089 vnfd_helper = mock.Mock()
1090 ssh_helper = mock.Mock()
1091 ssh_helper.join_bin_path.return_value = '/opt/nsb_bin/prox'
1092 scenario_helper = ScenarioHelper('vnf1')
1093 scenario_helper.scenario_cfg = {
1100 expected = ("sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli "
1101 "-f -f /tmp/prox.cfg '")
1103 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper,
1105 with mock.patch.object(helper, 'build_config_file') as mock_cfg_file:
1106 helper.remote_path = '/tmp/prox.cfg'
1107 prox_cmd = helper.build_config()
1108 self.assertEqual(prox_cmd, expected)
1109 mock_cfg_file.assert_called_once()
1111 def test__insert_additional_file(self):
1112 vnfd_helper = mock.MagicMock()
1113 ssh_helper = mock.MagicMock()
1114 scenario_helper = mock.MagicMock()
1116 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1117 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1118 res = helper._insert_additional_file('dofile("ipv4.lua")')
1119 self.assertEqual(res, 'dofile("/tmp/ipv4.lua")')
1121 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1122 def test_generate_prox_config_file(self, mock_parser_type):
1125 args[-1].extend(sections_data)
1126 return mock.MagicMock()
1130 mock_parser_type.side_effect = init
1132 vnfd_helper = VnfdHelper(self.VNFD0)
1133 ssh_helper = mock.MagicMock()
1134 scenario_helper = mock.MagicMock()
1136 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1137 helper.additional_files = {}
1140 result = helper.generate_prox_config_file('a/b')
1141 self.assertEqual(result, expected)
1143 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1145 helper.remote_prox_file_name = 'remote'
1150 ['dofile("ipv4.lua")', ''],
1166 ['$sut_mac0', '@@dst_mac0'],
1169 ['user_table', 'dofile("ipv4.lua")'],
1170 ['missing_addtional_file', 'dofile("nosuch")'],
1179 ['dofile("/tmp/ipv4.lua")', ''],
1186 ['mac', 'hardware'],
1187 ['dst mac', '00:00:00:00:00:03'],
1195 ['$sut_mac0', '00 00 00 00 00 04'],
1198 ['user_table', 'dofile("/tmp/ipv4.lua")'],
1199 ['missing_addtional_file', 'dofile("nosuch")'],
1203 result = helper.generate_prox_config_file('/c/d/e')
1204 self.assertEqual(result, expected, str(result))
1206 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1207 def test_generate_prox_config_file_negative(self, mock_parser_type):
1209 args[-1].update(sections_data)
1210 return mock.MagicMock()
1214 mock_parser_type.side_effect = init
1216 vnfd_helper = mock.MagicMock()
1217 vnfd_helper.interfaces = []
1218 ssh_helper = mock.MagicMock()
1219 scenario_helper = mock.MagicMock()
1221 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1222 helper.additional_files = {}
1223 helper.remote_prox_file_name = 'remote'
1224 vnfd_helper.interfaces = [
1226 'virtual-interface': {
1228 'dst_mac': '00:00:00:de:ad:88',
1232 'virtual-interface': {
1234 'dst_mac': '00:00:00:de:ad:ff',
1238 'virtual-interface': {
1240 'dst_mac': '00:00:00:de:ad:ff',
1254 ['???', 'dofile "here" 23'],
1258 with self.assertRaises(Exception):
1259 helper.generate_prox_config_file('a/b')
1261 def test_put_string_to_file(self):
1262 vnfd_helper = mock.MagicMock()
1263 vnfd_helper.interfaces = []
1264 ssh_helper = mock.MagicMock()
1265 scenario_helper = mock.MagicMock()
1267 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1270 result = helper.put_string_to_file('my long string', 'a/b')
1271 self.assertEqual(result, expected)
1273 def test_copy_to_target(self):
1274 vnfd_helper = mock.MagicMock()
1275 vnfd_helper.interfaces = []
1276 ssh_helper = mock.MagicMock()
1277 scenario_helper = mock.MagicMock()
1279 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1281 result = helper.copy_to_target('a/b', 'c')
1282 self.assertEqual(result, expected)
1284 def test_upload_prox_config(self):
1285 vnfd_helper = mock.MagicMock()
1286 vnfd_helper.interfaces = []
1287 ssh_helper = mock.MagicMock()
1288 scenario_helper = mock.MagicMock()
1290 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1291 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1293 result = helper.upload_prox_config('a', {})
1294 self.assertEqual(result, expected)
1297 class TestProxResourceHelper(unittest.TestCase):
1300 'short-name': 'ProxVnf',
1305 'network': '152.16.100.20',
1306 'netmask': '255.255.255.0',
1307 'gateway': '152.16.100.20',
1311 'network': '152.16.40.20',
1312 'netmask': '255.255.255.0',
1313 'gateway': '152.16.40.20',
1317 'description': 'PROX approximation using DPDK',
1318 'name': 'proxvnf-baremetal',
1321 'network': '0064:ff9b:0:0:0:0:9810:6414',
1323 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1327 'network': '0064:ff9b:0:0:0:0:9810:2814',
1329 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1333 'id': 'proxvnf-baremetal',
1334 'external-interface': [
1336 'virtual-interface': {
1337 'dst_mac': '00:00:00:00:00:04',
1338 'vpci': '0000:05:00.0',
1339 'local_ip': '152.16.100.19',
1340 'type': 'PCI-PASSTHROUGH',
1341 'vld_id': 'uplink_0',
1342 'netmask': '255.255.255.0',
1344 'bandwidth': '10 Gbps',
1346 'dst_ip': '152.16.100.19',
1347 'local_iface_name': 'xe0',
1348 'local_mac': '00:00:00:00:00:02',
1351 'vnfd-connection-point-ref': 'xe0',
1355 'virtual-interface': {
1356 'dst_mac': '00:00:00:00:00:03',
1357 'vpci': '0000:05:00.1',
1358 'local_ip': '152.16.40.19',
1359 'type': 'PCI-PASSTHROUGH',
1360 'vld_id': 'downlink_0',
1362 'netmask': '255.255.255.0',
1364 'bandwidth': '10 Gbps',
1365 'dst_ip': '152.16.40.20',
1366 'local_iface_name': 'xe1',
1367 'local_mac': '00:00:00:00:00:01',
1370 'vnfd-connection-point-ref': 'xe1',
1376 'description': 'PROX approximation using DPDK',
1378 'vdu-id': 'proxvnf-baremetal',
1391 'id': 'ProxApproxVnf',
1396 'vnfd:vnfd-catalog': {
1403 def test_find_pci(self):
1409 result = ProxResourceHelper.find_pci('target', input_str_list)
1410 self.assertFalse(result)
1418 result = ProxResourceHelper.find_pci('target', input_str_list)
1419 self.assertTrue(result)
1421 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1422 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1423 def test_sut(self, *args):
1424 helper = ProxResourceHelper(mock.MagicMock())
1425 self.assertIsNone(helper.client)
1427 self.assertIsNotNone(result)
1428 self.assertIs(result, helper.client)
1429 self.assertIs(result, helper.sut)
1431 def test_test_type(self):
1432 setup_helper = mock.MagicMock()
1433 setup_helper.find_in_section.return_value = expected = 'prox type'
1435 helper = ProxResourceHelper(setup_helper)
1437 self.assertIsNone(helper._test_type)
1438 self.assertEqual(helper.test_type, expected)
1439 self.assertEqual(helper._test_type, expected)
1440 self.assertEqual(helper.test_type, expected)
1442 def test_collect_collectd_kpi(self):
1443 helper = ProxResourceHelper(mock.MagicMock())
1444 helper.resource = resource = mock.MagicMock()
1446 resource.check_if_system_agent_running.return_value = 0, '1234'
1447 resource.amqp_collect_nfvi_kpi.return_value = 543
1448 resource.check_if_system_agent_running.return_value = (0, None)
1450 expected = {'core': 543}
1451 result = helper.collect_collectd_kpi()
1452 self.assertDictEqual(result, expected)
1454 def test_collect_kpi(self):
1455 helper = ProxResourceHelper(mock.MagicMock())
1456 helper._queue = queue = mock.MagicMock()
1457 helper._result = {'z': 123}
1458 helper.resource = resource = mock.MagicMock()
1460 resource.check_if_system_agent_running.return_value = 0, '1234'
1461 resource.amqp_collect_nfvi_kpi.return_value = 543
1462 resource.check_if_system_agent_running.return_value = (0, None)
1464 queue.empty.return_value = False
1465 queue.get.return_value = {'a': 789}
1467 expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
1468 result = helper.collect_kpi()
1469 self.assertDictEqual(result, expected)
1471 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1472 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1473 def test__connect(self, mock_socket_helper_type, *args):
1474 client = mock_socket_helper_type()
1475 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1477 setup_helper = mock.MagicMock()
1478 setup_helper.vnfd_helper.interfaces = []
1480 helper = ProxResourceHelper(setup_helper)
1482 result = helper._connect()
1483 self.assertIs(result, client)
1485 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1487 with self.assertRaises(Exception):
1490 def test_run_traffic(self):
1491 setup_helper = mock.MagicMock()
1492 helper = ProxResourceHelper(setup_helper)
1493 traffic_profile = mock.MagicMock(**{"done": True})
1494 helper.run_traffic(traffic_profile)
1495 self.assertEqual(helper._terminated.value, 1)
1497 def test__run_traffic_once(self):
1498 setup_helper = mock.MagicMock()
1499 helper = ProxResourceHelper(setup_helper)
1500 traffic_profile = mock.MagicMock(**{"done": True})
1501 helper._run_traffic_once(traffic_profile)
1502 self.assertEqual(helper._terminated.value, 1)
1504 def test_start_collect(self):
1505 setup_helper = mock.MagicMock()
1506 helper = ProxResourceHelper(setup_helper)
1507 helper.resource = resource = mock.MagicMock()
1508 self.assertIsNone(helper.start_collect())
1509 resource.start.assert_called_once()
1511 def test_terminate(self):
1512 setup_helper = mock.MagicMock()
1513 helper = ProxResourceHelper(setup_helper)
1514 with self.assertRaises(NotImplementedError):
1517 def test_up_post(self):
1518 setup_helper = mock.MagicMock()
1519 helper = ProxResourceHelper(setup_helper)
1520 helper.client = expected = mock.MagicMock()
1521 result = helper.up_post()
1522 self.assertEqual(result, expected)
1524 def test_execute(self):
1525 setup_helper = mock.MagicMock()
1526 helper = ProxResourceHelper(setup_helper)
1527 helper.client = mock.MagicMock()
1529 expected = helper.client.my_command()
1530 result = helper.execute('my_command')
1531 self.assertEqual(result, expected)
1533 # TODO(elfoley): Make this a separate test: test_execute_no_client
1534 helper.client = object()
1536 result = helper.execute('my_command')
1537 self.assertIsNone(result)
1540 class TestProxDataHelper(unittest.TestCase):
1542 def test_totals_and_pps(self):
1544 vnfd_helper = mock.MagicMock()
1545 vnfd_helper.port_pairs.all_ports = list(range(4))
1547 sut = mock.MagicMock()
1548 sut.port_stats.return_value = list(range(10))
1550 data_helper = ProxDataHelper(
1551 vnfd_helper, sut, pkt_size, 25, None,
1552 constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
1554 self.assertEqual(data_helper.rx_total, 6)
1555 self.assertEqual(data_helper.tx_total, 7)
1556 self.assertEqual(data_helper.requested_pps, 6.25e6)
1558 def test_samples(self):
1559 vnfd_helper = mock.MagicMock()
1560 vnfd_helper.port_pairs.all_ports = list(range(4))
1561 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1563 sut = mock.MagicMock()
1564 sut.port_stats.return_value = list(range(10))
1566 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None, None)
1578 result = data_helper.samples
1579 self.assertDictEqual(result, expected)
1581 def test___enter__(self):
1582 vnfd_helper = mock.MagicMock()
1583 vnfd_helper.port_pairs.all_ports = list(range(4))
1584 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1586 sut = mock.MagicMock()
1587 sut.port_stats.return_value = list(range(10))
1589 data_helper = ProxDataHelper(vnfd_helper, sut, None, None,
1590 5.4, constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
1591 data_helper._totals_and_pps = 12, 32, 4.5
1592 data_helper.tsc_hz = 9.8
1593 data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)}
1594 data_helper.latency = 7
1596 self.assertIsNone(data_helper.result_tuple)
1597 self.assertEqual(data_helper.line_speed, 10000000000)
1599 expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5)
1603 result = data_helper.result_tuple
1604 self.assertEqual(result, expected)
1606 data_helper.make_tuple()
1607 self.assertIs(data_helper.result_tuple, result)
1609 def test___enter___negative(self):
1610 vnfd_helper = mock.MagicMock()
1612 data_helper = ProxDataHelper(vnfd_helper, None, None, None, None, None)
1614 vnfd_helper.port_pairs.all_ports = []
1615 with self.assertRaises(AssertionError):
1619 vnfd_helper.port_pairs.all_ports = [0, 1, 2]
1620 with self.assertRaises(AssertionError):
1624 def test_measure_tot_stats(self):
1625 vnfd_helper = mock.MagicMock()
1626 vnfd_helper.port_pairs.all_ports = list(range(4))
1628 start = (3, 4, 1, 2)
1631 sut = ProxSocketHelper(mock.MagicMock())
1632 sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end])
1634 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4, None)
1636 self.assertIsNone(data_helper.measured_stats)
1641 'delta': TotStatsTuple(6, 3, 5, 6),
1643 with data_helper.measure_tot_stats():
1646 self.assertEqual(data_helper.measured_stats, expected)
1648 def test_capture_tsc_hz(self):
1649 vnfd_helper = mock.MagicMock()
1650 vnfd_helper.port_pairs.all_ports = list(range(4))
1652 sut = mock.MagicMock()
1653 sut.hz.return_value = '54.6'
1655 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None, None)
1657 self.assertIsNone(data_helper.tsc_hz)
1660 data_helper.capture_tsc_hz()
1661 self.assertEqual(data_helper.tsc_hz, expected)
1664 class TestProxProfileHelper(unittest.TestCase):
1666 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1667 def test_get_cls(self, mock_utils):
1668 mock_type1 = mock.MagicMock()
1669 mock_type1.__prox_profile_type__ = 'another_type'
1670 mock_type2 = mock.MagicMock()
1671 mock_type2.__prox_profile_type__ = 'my_type'
1672 mock_utils.itersubclasses.return_value = [mock_type1, mock_type2]
1674 self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2)
1676 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1677 def test_get_cls_default(self, mock_utils):
1678 mock_utils.itersubclasses.return_value = []
1679 ProxProfileHelper.get_cls('my_type')
1681 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1682 def test_cpu_topology(self, mock_socket_topology):
1683 mock_socket_topology.parse_cpuinfo.return_value = 432
1685 resource_helper = mock.MagicMock()
1686 resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1688 helper = ProxProfileHelper(resource_helper)
1689 self.assertIsNone(helper._cpu_topology)
1690 result = helper.cpu_topology
1691 self.assertEqual(result, 432)
1692 self.assertIs(result, helper._cpu_topology)
1693 self.assertIs(result, helper.cpu_topology)
1695 # TODO(elfoley): Split this test; there are two sets of inputs/outputs
1696 def test_test_cores(self):
1697 resource_helper = mock.MagicMock()
1698 resource_helper.setup_helper.prox_config_data = []
1700 helper = ProxProfileHelper(resource_helper)
1701 helper._cpu_topology = []
1704 result = helper.test_cores
1705 self.assertEqual(result, expected)
1707 resource_helper.setup_helper.prox_config_data = [
1728 helper = ProxProfileHelper(resource_helper)
1729 helper._cpu_topology = {
1746 self.assertIsNone(helper._test_cores)
1748 result = helper.test_cores
1749 self.assertEqual(result, expected)
1750 self.assertIs(result, helper._test_cores)
1751 self.assertIs(result, helper.test_cores)
1753 # TODO(elfoley): Split this test; there are two sets of inputs/outputs
1754 def test_latency_cores(self):
1755 resource_helper = mock.MagicMock()
1756 resource_helper.setup_helper.prox_config_data = []
1758 helper = ProxProfileHelper(resource_helper)
1759 helper._cpu_topology = []
1762 result = helper.latency_cores
1763 self.assertEqual(result, expected)
1765 resource_helper.setup_helper.prox_config_data = [
1786 helper = ProxProfileHelper(resource_helper)
1787 helper._cpu_topology = {
1804 self.assertIsNone(helper._latency_cores)
1806 result = helper.latency_cores
1807 self.assertEqual(result, expected)
1808 self.assertIs(result, helper._latency_cores)
1809 self.assertIs(result, helper.latency_cores)
1811 def test_all_rx_cores(self):
1812 helper = ProxBngProfileHelper(mock.MagicMock())
1813 helper._latency_cores = expected = [3, 4, 6]
1814 helper._test_cores = [5, 2, 1]
1816 result = helper.all_rx_cores
1817 self.assertEqual(result, expected)
1819 def test_get_cores(self):
1820 resource_helper = mock.MagicMock()
1821 resource_helper.setup_helper.prox_config_data = [
1842 helper = ProxProfileHelper(resource_helper)
1843 helper._cpu_topology = {
1861 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1862 self.assertEqual(result, expected)
1864 def test_get_latency(self):
1865 resource_helper = mock.MagicMock()
1866 resource_helper.setup_helper.vnfd_helper.interfaces = []
1868 helper = ProxProfileHelper(resource_helper)
1869 helper._latency_cores = []
1872 result = helper.get_latency()
1873 self.assertEqual(result, expected)
1875 helper._latency_cores = [1, 2]
1876 helper.client = mock.MagicMock()
1878 expected = helper.sut.lat_stats()
1879 result = helper.get_latency()
1880 self.assertIs(result, expected)
1882 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1883 def test_traffic_context(self, *args):
1884 setup_helper = mock.MagicMock()
1885 setup_helper.vnfd_helper.interfaces = []
1887 helper = ProxProfileHelper(setup_helper)
1888 helper._cpu_topology = {
1905 setup_helper.prox_config_data = [
1907 ('not_name', 'other data'),
1908 ('name_not', 'more data'),
1909 ('name', helper.__prox_profile_type__),
1933 client = mock.MagicMock()
1934 client.hz.return_value = 2
1935 client.port_stats.return_value = tuple(range(12))
1937 helper.client = client
1938 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1940 helper._test_cores = [3, 4]
1942 with helper.traffic_context(64, 1):
1945 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1946 def test_run_test(self, _):
1947 resource_helper = mock.MagicMock()
1948 resource_helper.step_delta = 0.4
1949 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
1950 resource_helper.sut.port_stats.return_value = list(range(10))
1952 helper = ProxProfileHelper(resource_helper)
1954 helper.run_test(120, 5, 6.5,
1955 constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
1958 class TestProxMplsProfileHelper(unittest.TestCase):
1960 def test_mpls_cores(self):
1961 resource_helper = mock.MagicMock()
1962 resource_helper.setup_helper.prox_config_data = [
1985 helper = ProxMplsProfileHelper(resource_helper)
1986 helper._cpu_topology = {
2003 expected_tagged = [3]
2004 expected_plain = [4]
2005 self.assertIsNone(helper._cores_tuple)
2006 self.assertEqual(helper.tagged_cores, expected_tagged)
2007 self.assertEqual(helper.plain_cores, expected_plain)
2008 self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain))
2010 def test_traffic_context(self):
2011 setup_helper = mock.MagicMock()
2012 helper = ProxMplsProfileHelper(setup_helper)
2014 with helper.traffic_context(120, 5.4):
2018 class TestProxBngProfileHelper(unittest.TestCase):
2020 def test_bng_cores(self):
2021 resource_helper = mock.MagicMock()
2022 resource_helper.setup_helper.prox_config_data = [
2046 ('name', 'arp_task'),
2055 helper = ProxBngProfileHelper(resource_helper)
2056 helper._cpu_topology = {
2081 expected_arp = [6, 9]
2082 expected_arp_task = [0, 6]
2083 expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task)
2085 self.assertIsNone(helper._cores_tuple)
2086 self.assertEqual(helper.cpe_cores, expected_cpe)
2087 self.assertEqual(helper.inet_cores, expected_inet)
2088 self.assertEqual(helper.arp_cores, expected_arp)
2089 self.assertEqual(helper.arp_task_cores, expected_arp_task)
2090 self.assertEqual(helper._cores_tuple, expected_combined)
2092 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2093 def test_run_test(self, _):
2094 resource_helper = mock.MagicMock()
2095 resource_helper.step_delta = 0.4
2096 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2097 resource_helper.sut.port_stats.return_value = list(range(10))
2099 helper = ProxBngProfileHelper(resource_helper)
2101 helper.run_test(120, 5, 6.5,
2102 constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
2104 # negative pkt_size is the only way to make ratio > 1
2105 helper.run_test(-1000, 5, 6.5,
2106 constants.NIC_GBPS_DEFAULT * constants.ONE_GIGABIT_IN_BITS)
2109 class TestProxVpeProfileHelper(unittest.TestCase):
2111 def test_vpe_cores(self):
2112 resource_helper = mock.MagicMock()
2113 resource_helper.setup_helper.prox_config_data = [
2136 helper = ProxVpeProfileHelper(resource_helper)
2137 helper._cpu_topology = {
2156 expected_combined = (expected_cpe, expected_inet)
2158 self.assertIsNone(helper._cores_tuple)
2159 self.assertEqual(helper.cpe_cores, expected_cpe)
2160 self.assertEqual(helper.inet_cores, expected_inet)
2161 self.assertEqual(helper._cores_tuple, expected_combined)
2163 def test_vpe_ports(self):
2164 resource_helper = mock.MagicMock()
2165 resource_helper.setup_helper.prox_config_data = [
2174 ('mac', 'hardware'),
2179 ('mac', 'hardware'),
2183 helper = ProxVpeProfileHelper(resource_helper)
2184 helper._port_list = {
2203 expected_combined = (expected_cpe, expected_inet)
2205 self.assertIsNone(helper._ports_tuple)
2206 self.assertEqual(helper.cpe_ports, expected_cpe)
2207 self.assertEqual(helper.inet_ports, expected_inet)
2208 self.assertEqual(helper._ports_tuple, expected_combined)
2210 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2211 def test_run_test(self, _):
2212 resource_helper = mock.MagicMock()
2213 resource_helper.step_delta = 0.4
2214 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2215 resource_helper.sut.port_stats.return_value = list(range(10))
2217 helper = ProxVpeProfileHelper(resource_helper)
2219 helper.run_test(120, 5, 6.5)
2220 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1
2223 class TestProxlwAFTRProfileHelper(unittest.TestCase):
2225 def test_lwaftr_cores(self):
2226 resource_helper = mock.MagicMock()
2227 resource_helper.setup_helper.prox_config_data = [
2250 helper = ProxlwAFTRProfileHelper(resource_helper)
2251 helper._cpu_topology = {
2270 expected_combined = (expected_tun, expected_inet)
2272 self.assertIsNone(helper._cores_tuple)
2273 self.assertEqual(helper.tun_cores, expected_tun)
2274 self.assertEqual(helper.inet_cores, expected_inet)
2275 self.assertEqual(helper._cores_tuple, expected_combined)
2277 def test_tun_ports(self):
2278 resource_helper = mock.MagicMock()
2279 resource_helper.setup_helper.prox_config_data = [
2288 ('mac', 'hardware'),
2293 ('mac', 'hardware'),
2297 helper = ProxlwAFTRProfileHelper(resource_helper)
2298 helper._port_list = {
2317 expected_combined = (expected_tun, expected_inet)
2319 self.assertIsNone(helper._ports_tuple)
2320 self.assertEqual(helper.tun_ports, expected_tun)
2321 self.assertEqual(helper.inet_ports, expected_inet)
2322 self.assertEqual(helper._ports_tuple, expected_combined)
2324 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2325 def test_run_test(self, _):
2326 resource_helper = mock.MagicMock()
2327 resource_helper.step_delta = 0.4
2328 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2329 resource_helper.sut.port_stats.return_value = list(range(10))
2331 helper = ProxlwAFTRProfileHelper(resource_helper)
2333 helper.run_test(120, 5, 6.5)
2334 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1