3 # Copyright (c) 2016-2017 Intel Corporation
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
18 from __future__ import absolute_import
24 from itertools import repeat, chain
25 from contextlib import contextmanager
28 from tests.unit import STL_MOCKS
29 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
31 STLClient = mock.MagicMock()
32 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
36 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
37 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper
38 from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump
39 from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple
40 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple
41 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper
42 from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple
43 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDataHelper
44 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper
45 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxProfileHelper
46 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxMplsProfileHelper
47 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxBngProfileHelper
50 class TestCoreTuple(unittest.TestCase):
51 def test___init__(self):
52 core_tuple = CoreSocketTuple('core 5s6')
53 self.assertEqual(core_tuple.core_id, 5)
54 self.assertEqual(core_tuple.socket_id, 6)
55 self.assertFalse(core_tuple.is_hyperthread())
57 core_tuple = CoreSocketTuple('core 5s6h')
58 self.assertEqual(core_tuple.core_id, 5)
59 self.assertEqual(core_tuple.socket_id, 6)
60 self.assertTrue(core_tuple.is_hyperthread())
62 def test___init__negative(self):
83 for bad_input in bad_inputs:
84 with self.assertRaises(ValueError):
85 CoreSocketTuple(bad_input)
87 def test_find_in_topology(self):
97 core_tuple = CoreSocketTuple('core 5s6')
100 result = core_tuple.find_in_topology(topology_in)
101 self.assertEqual(result, expected)
103 core_tuple = CoreSocketTuple('core 5s6h')
106 result = core_tuple.find_in_topology(topology_in)
107 self.assertEqual(result, expected)
109 def test_find_in_topology_negative(self):
110 core_tuple = CoreSocketTuple('core 6s5')
111 with self.assertRaises(ValueError):
113 core_tuple.find_in_topology({})
115 with self.assertRaises(ValueError):
117 core_tuple.find_in_topology({5: {}})
119 with self.assertRaises(ValueError):
120 # no first value (as needed by non-hyperthread core)
121 core_tuple.find_in_topology({5: {6: {'key1': []}}})
123 core_tuple = CoreSocketTuple('core 6s5h')
124 with self.assertRaises(ValueError):
125 # no second value (as needed by hyperthread core)
126 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
129 class TestTotStatsTuple(unittest.TestCase):
130 def test___new___negative(self):
131 with self.assertRaises(TypeError):
135 with self.assertRaises(TypeError):
136 # one, non-integer value
139 with self.assertRaises(TypeError):
141 TotStatsTuple(3, 4, 5, 6, 7)
144 class TestProxTestDataTuple(unittest.TestCase):
145 def test___init__(self):
146 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
147 self.assertEqual(prox_test_data.tolerated, 1)
148 self.assertEqual(prox_test_data.tsc_hz, 2)
149 self.assertEqual(prox_test_data.delta_rx, 3)
150 self.assertEqual(prox_test_data.delta_tx, 4)
151 self.assertEqual(prox_test_data.delta_tsc, 5)
152 self.assertEqual(prox_test_data.latency, 6)
153 self.assertEqual(prox_test_data.rx_total, 7)
154 self.assertEqual(prox_test_data.tx_total, 8)
155 self.assertEqual(prox_test_data.pps, 9)
157 def test_properties(self):
158 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
159 self.assertEqual(prox_test_data.pkt_loss, 12.5)
160 self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
161 self.assertEqual(prox_test_data.can_be_lost, 0)
162 self.assertEqual(prox_test_data.drop_total, 1)
163 self.assertFalse(prox_test_data.success)
165 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
166 self.assertTrue(prox_test_data.success)
168 def test_pkt_loss_zero_division(self):
169 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
170 self.assertEqual(prox_test_data.pkt_loss, 100.0)
172 def test_get_samples(self):
173 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
176 "Throughput": 1.6 / 1e6,
178 "CurrentDropPackets": 12.5,
179 "TxThroughput": 9 / 1e6,
180 "RxThroughput": 1.6 / 1e6,
187 result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
188 self.assertDictEqual(result, expected)
191 "Throughput": 1.6 / 1e6,
192 "DropPackets": 0.123,
193 "CurrentDropPackets": 0.123,
194 "TxThroughput": 9 / 1e6,
195 "RxThroughput": 1.6 / 1e6,
201 result = prox_test_data.get_samples(64, 0.123)
202 self.assertDictEqual(result, expected)
204 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
205 def test_log_data(self, mock_logger):
206 my_mock_logger = mock.MagicMock()
207 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
208 prox_test_data.log_data()
209 self.assertEqual(my_mock_logger.debug.call_count, 0)
210 self.assertEqual(mock_logger.debug.call_count, 2)
212 mock_logger.debug.reset_mock()
213 prox_test_data.log_data(my_mock_logger)
214 self.assertEqual(my_mock_logger.debug.call_count, 2)
215 self.assertEqual(mock_logger.debug.call_count, 0)
218 class TestPacketDump(unittest.TestCase):
221 def test__init__(self):
222 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
224 def test___str__(self):
225 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
226 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
227 self.assertEqual(str(dump1), expected)
229 def test_port_id(self):
230 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
231 self.assertEqual(p.port_id, "port_id")
233 def test_data_len(self):
234 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
235 self.assertEqual(p.data_len, len(self.PAYLOAD))
237 def test_payload(self):
238 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
239 self.assertEqual(p.payload(), self.PAYLOAD)
241 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
243 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
245 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
257 brown fox jumped over
263 PACKET_DUMP_NON_1 = """\
268 PACKET_DUMP_MIXED_1 = """\
275 PACKET_DUMP_BAD_1 = """\
280 PACKET_DUMP_BAD_2 = """\
285 PACKET_DUMP_BAD_3 = """\
291 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
292 class TestProxSocketHelper(unittest.TestCase):
293 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
294 def test___init__(self, mock_socket, mock_time):
295 expected = mock_socket.socket()
296 prox = ProxSocketHelper()
298 self.assertEqual(result, expected)
300 def test_connect(self, mock_time):
301 mock_sock = mock.MagicMock()
302 prox = ProxSocketHelper(mock_sock)
303 prox.connect('10.20.30.40', 23456)
304 self.assertEqual(mock_sock.connect.call_count, 1)
306 def test_get_sock(self, mock_time):
307 mock_sock = mock.MagicMock()
308 prox = ProxSocketHelper(mock_sock)
309 result = prox.get_socket()
310 self.assertIs(result, mock_sock)
312 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
313 def test_get_data(self, mock_select, mock_time):
314 mock_select.select.side_effect = [[1], [0]]
315 mock_socket = mock.MagicMock()
316 mock_recv = mock_socket.recv()
317 mock_recv.decode.return_value = ""
318 prox = ProxSocketHelper(mock_socket)
319 ret = prox.get_data()
320 self.assertEqual(ret, "")
321 self.assertEqual(len(prox._pkt_dumps), 0)
323 mock_select.select.reset_mock()
324 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
325 mock_recv.decode.return_value = PACKET_DUMP_1
326 ret = prox.get_data()
327 self.assertEqual(mock_select.select.call_count, 2)
328 self.assertEqual(ret, 'pktdump,3,11')
329 self.assertEqual(len(prox._pkt_dumps), 1)
331 mock_select.select.reset_mock()
332 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
333 mock_recv.decode.return_value = PACKET_DUMP_2
334 ret = prox.get_data()
335 self.assertEqual(mock_select.select.call_count, 2)
336 self.assertEqual(ret, 'jumped over')
337 self.assertEqual(len(prox._pkt_dumps), 3)
339 def test__parse_socket_data_mixed_data(self, mock_time):
340 prox = ProxSocketHelper(mock.MagicMock())
341 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
342 self.assertEqual(ret, 'not_a_dump,1,2')
343 self.assertEqual(len(prox._pkt_dumps), 0)
345 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
346 self.assertEqual(ret, 'not_a_dump,1,2')
347 self.assertEqual(len(prox._pkt_dumps), 1)
349 def test__parse_socket_data_bad_data(self, mock_time):
350 prox = ProxSocketHelper(mock.MagicMock())
351 with self.assertRaises(ValueError):
352 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
354 with self.assertRaises(ValueError):
355 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
357 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
358 self.assertEqual(ret, 'pktdump,3')
360 def test__parse_socket_data_pkt_dump_only(self, mock_time):
361 prox = ProxSocketHelper(mock.MagicMock())
362 ret = prox._parse_socket_data('', True)
363 self.assertFalse(ret)
365 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
368 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
371 def test_put_command(self, mock_time):
372 mock_socket = mock.MagicMock()
373 prox = ProxSocketHelper(mock_socket)
374 prox.put_command("data")
375 mock_socket.sendall.assert_called_once()
377 def test_put_command_socket_error(self, mock_time):
378 mock_socket = mock.MagicMock()
379 mock_socket.sendall.side_effect = OSError
380 prox = ProxSocketHelper(mock_socket)
381 prox.put_command("data")
382 mock_socket.sendall.assert_called_once()
384 def test_get_packet_dump(self, mock_time):
385 mock_socket = mock.MagicMock()
386 prox = ProxSocketHelper(mock_socket)
388 self.assertIsNone(prox.get_packet_dump())
390 prox._pkt_dumps = [234]
391 self.assertEqual(prox.get_packet_dump(), 234)
392 self.assertEqual(prox._pkt_dumps, [])
394 def test_stop_all_reset(self, mock_time):
395 mock_socket = mock.MagicMock()
396 prox = ProxSocketHelper(mock_socket)
397 prox.stop_all_reset()
398 mock_socket.sendall.assert_called()
400 def test_stop_all(self, mock_time):
401 mock_socket = mock.MagicMock()
402 prox = ProxSocketHelper(mock_socket)
404 mock_socket.sendall.assert_called()
406 def test_stop(self, mock_time):
407 mock_socket = mock.MagicMock()
408 prox = ProxSocketHelper(mock_socket)
409 prox.stop([3, 4, 5], 16)
410 mock_socket.sendall.assert_called()
412 def test_start_all(self, mock_time):
413 mock_socket = mock.MagicMock()
414 prox = ProxSocketHelper(mock_socket)
416 mock_socket.sendall.assert_called()
418 def test_start(self, mock_time):
419 mock_socket = mock.MagicMock()
420 prox = ProxSocketHelper(mock_socket)
421 prox.start([3, 4, 5])
422 mock_socket.sendall.assert_called()
424 def test_reset_stats(self, mock_time):
425 mock_socket = mock.MagicMock()
426 prox = ProxSocketHelper(mock_socket)
428 mock_socket.sendall.assert_called()
430 def test_set_pkt_size(self, mock_time):
431 mock_socket = mock.MagicMock()
432 prox = ProxSocketHelper(mock_socket)
433 prox.set_pkt_size([3, 4, 5], 1024)
434 self.assertEqual(mock_socket.sendall.call_count, 3)
436 def test_set_value(self, mock_time):
437 mock_socket = mock.MagicMock()
438 prox = ProxSocketHelper(mock_socket)
439 prox.set_value([3, 4, 5], 10, 20, 30)
440 self.assertEqual(mock_socket.sendall.call_count, 3)
442 def test_reset_values(self, mock_time):
443 mock_socket = mock.MagicMock()
444 prox = ProxSocketHelper(mock_socket)
445 prox.reset_values([3, 4, 5])
446 self.assertEqual(mock_socket.sendall.call_count, 3)
448 def test_set_speed(self, mock_time):
449 mock_socket = mock.MagicMock()
450 prox = ProxSocketHelper(mock_socket)
451 prox.set_speed([3, 4, 5], 1000)
452 self.assertEqual(mock_socket.sendall.call_count, 3)
454 def test_slope_speed(self, mock_time):
461 'cores': [9, 10, 11],
466 mock_socket = mock.MagicMock()
467 prox = ProxSocketHelper(mock_socket)
468 prox.set_speed = set_speed = mock.MagicMock()
469 prox.slope_speed(core_data, 5)
470 self.assertEqual(set_speed.call_count, 20)
472 set_speed.reset_mock()
473 prox.slope_speed(core_data, 5, 5)
474 self.assertEqual(set_speed.call_count, 10)
476 def test_set_pps(self, mock_time):
477 mock_socket = mock.MagicMock()
478 prox = ProxSocketHelper(mock_socket)
479 prox.set_pps([3, 4, 5], 1000, 512)
480 self.assertEqual(mock_socket.sendall.call_count, 3)
482 def test_lat_stats(self, mock_time):
484 '1, 2 , 3', # has white space
486 '7,8,9,10.5,11', # too long with float, but float is in unused portion
487 'twelve,13,14', # value as English word
488 '15,16.2,17', # float in used portion
491 mock_socket = mock.MagicMock()
492 prox = ProxSocketHelper(mock_socket)
493 prox.get_data = mock.MagicMock(side_effect=latency_output)
509 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
510 self.assertEqual(mock_socket.sendall.call_count, 5)
511 self.assertEqual(result, expected)
513 def test_get_all_tot_stats_error(self, mock_time):
514 mock_socket = mock.MagicMock()
515 prox = ProxSocketHelper(mock_socket)
516 prox.get_data = mock.MagicMock(return_value='3,4,5')
517 expected = [0, 0, 0, 0]
518 result = prox.get_all_tot_stats()
519 self.assertEqual(result, expected)
521 def test_get_all_tot_stats(self, mock_time):
522 mock_socket = mock.MagicMock()
523 prox = ProxSocketHelper(mock_socket)
524 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
525 expected = 3, 4, 5, 6
526 result = prox.get_all_tot_stats()
527 self.assertEqual(result, expected)
529 def test_hz(self, mock_time):
530 mock_socket = mock.MagicMock()
531 prox = ProxSocketHelper(mock_socket)
532 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
535 self.assertEqual(result, expected)
537 def test_rx_stats(self, mock_time):
544 mock_socket = mock.MagicMock()
545 prox = ProxSocketHelper(mock_socket)
546 prox.get_data = mock.MagicMock(side_effect=core_stats)
547 expected = 21, 24, 27, 14
548 result = prox.rx_stats([3, 4, 5], 16)
549 self.assertEqual(result, expected)
551 def test_core_stats(self, mock_time):
558 mock_socket = mock.MagicMock()
559 prox = ProxSocketHelper(mock_socket)
560 prox.get_data = mock.MagicMock(side_effect=core_stats)
561 expected = 21, 24, 27, 14
562 result = prox.core_stats([3, 4, 5], 16)
563 self.assertEqual(result, expected)
565 def test_port_stats(self, mock_time):
567 ','.join(str(n) for n in range(3, 15)),
568 ','.join(str(n) for n in range(8, 32, 2)),
569 ','.join(str(n) for n in range(5, 89, 7)),
572 mock_socket = mock.MagicMock()
573 prox = ProxSocketHelper(mock_socket)
574 prox.get_data = mock.MagicMock(side_effect=port_stats)
575 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
576 result = prox.port_stats([3, 4, 5])
577 self.assertEqual(result, expected)
579 def test_measure_tot_stats(self, mock_time):
580 start_tot = 3, 4, 5, 6
581 end_tot = 7, 9, 11, 13
582 delta_tot = 4, 5, 6, 7
585 ','.join(str(n) for n in start_tot),
586 ','.join(str(n) for n in end_tot),
589 mock_socket = mock.MagicMock()
590 prox = ProxSocketHelper(mock_socket)
591 prox.get_data = mock.MagicMock(side_effect=get_data_output)
593 'start_tot': start_tot,
597 with prox.measure_tot_stats() as result:
599 self.assertEqual(result, expected)
601 def test_tot_stats(self, mock_time):
602 mock_socket = mock.MagicMock()
603 prox = ProxSocketHelper(mock_socket)
604 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
606 result = prox.tot_stats()
607 self.assertEqual(result, expected)
609 def test_tot_ierrors(self, mock_time):
610 mock_socket = mock.MagicMock()
611 prox = ProxSocketHelper(mock_socket)
612 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
614 result = prox.tot_ierrors()
615 self.assertEqual(result, expected)
617 def test_set_count(self, mock_time):
618 mock_socket = mock.MagicMock()
619 prox = ProxSocketHelper(mock_socket)
620 prox.set_count(432, [3, 4, 5])
621 self.assertEqual(mock_socket.sendall.call_count, 3)
623 def test_dump_rx(self, mock_time):
624 mock_socket = mock.MagicMock()
625 prox = ProxSocketHelper(mock_socket)
626 prox.dump_rx(3, 5, 8)
627 self.assertEqual(mock_socket.sendall.call_count, 1)
629 def test_quit(self, mock_time):
630 mock_socket = mock.MagicMock()
631 prox = ProxSocketHelper(mock_socket)
633 mock_socket.sendall.assert_called()
635 def test_force_quit(self, mock_time):
636 mock_socket = mock.MagicMock()
637 prox = ProxSocketHelper(mock_socket)
639 mock_socket.sendall.assert_called()
642 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
645 'short-name': 'ProxVnf',
650 'network': '152.16.100.20',
651 'netmask': '255.255.255.0',
652 'gateway': '152.16.100.20',
656 'network': '152.16.40.20',
657 'netmask': '255.255.255.0',
658 'gateway': '152.16.40.20',
662 'description': 'PROX approximation using DPDK',
663 'name': 'proxvnf-baremetal',
666 'network': '0064:ff9b:0:0:0:0:9810:6414',
668 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
672 'network': '0064:ff9b:0:0:0:0:9810:2814',
674 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
678 'id': 'proxvnf-baremetal',
679 'external-interface': [
681 'virtual-interface': {
682 'dst_mac': '00:00:00:00:00:04',
683 'vpci': '0000:05:00.0',
684 'local_ip': '152.16.100.19',
685 'type': 'PCI-PASSTHROUGH',
686 'vld_id': 'uplink_0',
687 'netmask': '255.255.255.0',
689 'bandwidth': '10 Gbps',
691 'dst_ip': '152.16.100.19',
692 'local_iface_name': 'xe0',
693 'local_mac': '00:00:00:00:00:02',
696 'vnfd-connection-point-ref': 'xe0',
700 'virtual-interface': {
701 'dst_mac': '00:00:00:00:00:03',
702 'vpci': '0000:05:00.1',
703 'local_ip': '152.16.40.19',
704 'type': 'PCI-PASSTHROUGH',
705 'vld_id': 'downlink_0',
707 'netmask': '255.255.255.0',
709 'bandwidth': '10 Gbps',
710 'dst_ip': '152.16.40.20',
711 'local_iface_name': 'xe1',
712 'local_mac': '00:00:00:00:00:01',
715 'vnfd-connection-point-ref': 'xe1',
721 'description': 'PROX approximation using DPDK',
723 'vdu-id': 'proxvnf-baremetal',
736 'id': 'ProxApproxVnf',
741 'vnfd:vnfd-catalog': {
748 def test_global_section(self):
749 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
752 setup_helper._prox_config_data = [('a', [])]
754 with self.assertRaises(KeyError):
755 _ = setup_helper.global_section
759 ('not_name', 'other data'),
760 ('name_not', 'more data'),
761 ('name', 'prox type'),
765 setup_helper._prox_config_data = [
794 result = setup_helper.global_section
795 self.assertEqual(result, global_section[1])
797 def test_find_in_section(self):
798 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
801 setup_helper._prox_config_data = [
803 ('not_name', 'other data'),
804 ('name_not', 'more data'),
805 ('name', 'prox type'),
835 result = setup_helper.find_in_section('section3', 'key3')
836 self.assertEqual(result, expected)
838 expected = 'default value'
839 result = setup_helper.find_in_section('section3', 'key4', 'default value')
840 self.assertEqual(result, expected)
842 with self.assertRaises(KeyError):
843 setup_helper.find_in_section('section4', 'key1')
845 with self.assertRaises(KeyError):
846 setup_helper.find_in_section('section1', 'key1')
848 def test__replace_quoted_with_value(self):
852 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
853 self.assertEqual(result, expected)
855 # no quoted substring
856 input_str = 'lion tiger bear'
857 expected = 'lion tiger bear'
858 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
859 self.assertEqual(result, expected)
861 # partially quoted substring
862 input_str = 'lion "tiger bear'
863 expected = 'lion "tiger bear'
864 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
865 self.assertEqual(result, expected)
867 # one quoted substring
868 input_str = 'lion "tiger" bear'
869 expected = 'lion "cat" bear'
870 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
871 self.assertEqual(result, expected)
873 # two quoted substrings
874 input_str = 'lion "tiger" bear "shark" whale'
875 expected = 'lion "cat" bear "shark" whale'
876 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
877 self.assertEqual(result, expected)
879 # two quoted substrings, both replaced
880 input_str = 'lion "tiger" bear "shark" whale'
881 expected = 'lion "cat" bear "cat" whale'
882 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
883 self.assertEqual(result, expected)
885 def test__get_tx_port(self):
887 input_data = {'section1': []}
889 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
890 self.assertEqual(result, expected)
892 # data for other section
901 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
902 self.assertEqual(result, expected)
905 input_data['section1'] = section1 = [
906 ('rx port', '4', 'more', 432),
910 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
911 self.assertEqual(result, expected)
913 # more data for section,
916 ('tx port', '1', 'and more', 234),
919 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
920 self.assertEqual(result, expected)
922 def test_write_prox_config(self):
925 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
926 self.assertEqual(result, expected)
934 expected = '[section1]'
935 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
936 self.assertEqual(result, expected)
947 ['__name__', 'not this one'],
950 ['key4', 'multi-line\nvalue'],
954 expected = os.linesep.join([
960 'key4=multi-line\n\tvalue',
962 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
963 self.assertEqual(result, expected)
965 def test_prox_config_data(self):
966 setup_helper = ProxDpdkVnfSetupEnvHelper(mock.MagicMock(), mock.MagicMock(),
969 setup_helper.config_queue = config_queue = mock.MagicMock()
970 config_queue.get.return_value = expected = [('s', [('a', 3), ('b', 45)])]
972 result = setup_helper.prox_config_data
973 self.assertEqual(result, expected)
975 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
976 def test_build_config_file_no_additional_file(self, mock_find_path):
978 'prox_args': {'-c': ""},
980 'prox_config': 'e/f',
983 mock_find_path.side_effect = ['1', '2']
985 vnfd_helper = mock.MagicMock()
986 ssh_helper = mock.MagicMock()
987 scenario_helper = ScenarioHelper('vnf1')
988 scenario_helper.scenario_cfg = {
995 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
996 helper.copy_to_target = mock.MagicMock(return_value='3')
997 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
998 helper.upload_prox_config = mock.MagicMock(return_value='5')
1000 self.assertEqual(helper.additional_files, {})
1001 self.assertNotEqual(helper._prox_config_data, '4')
1002 self.assertNotEqual(helper.remote_path, '5')
1003 helper.build_config_file()
1004 self.assertEqual(helper.additional_files, {})
1005 self.assertEqual(helper._prox_config_data, '4')
1006 self.assertEqual(helper.remote_path, '5')
1008 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1009 def test_build_config_file_additional_file_string(self, mock_find_path):
1011 'prox_args': {'-c': ""},
1013 'prox_config': 'e/f',
1014 'prox_files': 'g/h.i',
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 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1029 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1030 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1031 helper.upload_prox_config = mock.MagicMock(return_value='55')
1033 self.assertEqual(helper.additional_files, {})
1034 expected = {'h.i': '33'}
1035 helper.build_config_file()
1036 self.assertDictEqual(helper.additional_files, expected)
1038 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1039 def test_build_config_file_additional_file(self, mock_find_path):
1041 'prox_args': {'-c': ""},
1043 'prox_config': 'e/f',
1051 mock_find_path.side_effect = ['1', '2'] + [str(i) for i in range(len(vnf1['prox_files']))]
1052 vnfd_helper = mock.MagicMock()
1053 ssh_helper = mock.MagicMock()
1054 scenario_helper = ScenarioHelper('vnf1')
1055 scenario_helper.scenario_cfg = {
1062 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1063 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
1064 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1065 helper.upload_prox_config = mock.MagicMock(return_value='55')
1067 self.assertEqual(helper.additional_files, {})
1068 self.assertNotEqual(helper._prox_config_data, '44')
1069 self.assertNotEqual(helper.remote_path, '55')
1070 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
1071 helper.build_config_file()
1072 self.assertDictEqual(helper.additional_files, expected)
1073 self.assertEqual(helper._prox_config_data, '44')
1074 self.assertEqual(helper.remote_path, '55')
1076 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1077 def test_build_config(self, mock_find_path):
1079 'prox_args': {'-f': ""},
1080 'prox_path': '/opt/nsb_bin/prox',
1081 'prox_config': 'configs/gen_l2fwd-2.cfg',
1089 mock_find_path.side_effect = ['1', '2']
1090 vnfd_helper = mock.MagicMock()
1091 ssh_helper = mock.MagicMock()
1092 ssh_helper.provision_tool.return_value = "/opt/nsb_bin/prox"
1093 scenario_helper = ScenarioHelper('vnf1')
1094 scenario_helper.scenario_cfg = {
1101 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1102 helper.remote_path = "/tmp/prox.cfg"
1103 expected = "sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli -f -f /tmp/prox.cfg '"
1104 with mock.patch.object(helper, "build_config_file") as mock_build_config:
1105 prox_cmd = helper.build_config()
1106 self.assertEqual(prox_cmd, expected)
1108 def test__insert_additional_file(self):
1109 vnfd_helper = mock.MagicMock()
1110 ssh_helper = mock.MagicMock()
1111 scenario_helper = mock.MagicMock()
1113 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1114 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1115 res = helper._insert_additional_file('dofile("ipv4.lua")')
1116 self.assertEqual(res, 'dofile("/tmp/ipv4.lua")')
1118 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1119 def test_generate_prox_config_file(self, mock_parser_type):
1122 args[-1].extend(sections_data)
1123 return mock.MagicMock()
1127 mock_parser_type.side_effect = init
1129 vnfd_helper = VnfdHelper(self.VNFD0)
1130 ssh_helper = mock.MagicMock()
1131 scenario_helper = mock.MagicMock()
1133 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1134 helper.additional_files = {}
1137 result = helper.generate_prox_config_file('a/b')
1138 self.assertEqual(result, expected)
1140 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
1142 helper.remote_prox_file_name = 'remote'
1147 ['dofile("ipv4.lua")', ''],
1163 ['$sut_mac0', '@@dst_mac0'],
1166 ['user_table', 'dofile("ipv4.lua")'],
1167 ['missing_addtional_file', 'dofile("nosuch")'],
1176 ['dofile("/tmp/ipv4.lua")', ''],
1183 ['mac', 'hardware'],
1184 ['dst mac', '00:00:00:00:00:03'],
1192 ['$sut_mac0', '00 00 00 00 00 04'],
1195 ['user_table', 'dofile("/tmp/ipv4.lua")'],
1196 ['missing_addtional_file', 'dofile("nosuch")'],
1200 result = helper.generate_prox_config_file('/c/d/e')
1201 self.assertEqual(result, expected, str(result))
1203 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1204 def test_generate_prox_config_file_negative(self, mock_parser_type):
1206 args[-1].update(sections_data)
1207 return mock.MagicMock()
1211 mock_parser_type.side_effect = init
1213 vnfd_helper = mock.MagicMock()
1214 vnfd_helper.interfaces = []
1215 ssh_helper = mock.MagicMock()
1216 scenario_helper = mock.MagicMock()
1218 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1219 helper.additional_files = {}
1220 helper.remote_prox_file_name = 'remote'
1221 vnfd_helper.interfaces = [
1223 'virtual-interface': {
1225 'dst_mac': '00:00:00:de:ad:88',
1229 'virtual-interface': {
1231 'dst_mac': '00:00:00:de:ad:ff',
1235 'virtual-interface': {
1237 'dst_mac': '00:00:00:de:ad:ff',
1251 ['???', 'dofile "here" 23'],
1255 with self.assertRaises(Exception):
1256 helper.generate_prox_config_file('a/b')
1258 def test_generate_prox_lua_file(self):
1259 vnfd_helper = VnfdHelper(self.VNFD0)
1260 ssh_helper = mock.MagicMock()
1261 scenario_helper = mock.MagicMock()
1263 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1264 helper.LUA_PARAMETER_NAME = 'sut'
1267 'sut_hex_ip_port_0:"98 10 64 13"',
1268 'sut_ip_port_0:"152.16.100.19"',
1269 'gen_hex_ip_port_0:"98 10 64 13"',
1270 'gen_ip_port_0:"152.16.100.19"',
1272 'sut_hex_ip_port_1:"98 10 28 13"',
1273 'sut_ip_port_1:"152.16.40.19"',
1274 'gen_hex_ip_port_1:"98 10 28 14"',
1275 'gen_ip_port_1:"152.16.40.20"',
1277 result = helper.generate_prox_lua_file()
1278 self.assertListEqual(result.splitlines(), expected)
1280 def test_upload_prox_lua(self):
1281 def identity(*args):
1284 vnfd_helper = mock.MagicMock()
1285 vnfd_helper.interfaces = []
1286 ssh_helper = mock.MagicMock()
1287 scenario_helper = mock.MagicMock()
1289 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1290 helper.generate_prox_lua_file = mock.MagicMock(return_value=234)
1291 helper.put_string_to_file = identity
1294 result = helper.upload_prox_lua('my_dir', {})
1295 self.assertEqual(result, expected)
1299 'key1': 'value1 ("inside") tail',
1301 'key3 ("key_side") head': 'value3',
1305 expected = 234, 'my_dir/key_side'
1306 result = helper.upload_prox_lua('my_dir', input_data)
1307 self.assertEqual(result, expected)
1309 def test_put_string_to_file(self):
1310 vnfd_helper = mock.MagicMock()
1311 vnfd_helper.interfaces = []
1312 ssh_helper = mock.MagicMock()
1313 scenario_helper = mock.MagicMock()
1315 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1318 result = helper.put_string_to_file('my long string', 'a/b')
1319 self.assertEqual(result, expected)
1321 def test__build_pipeline_kwarags(self):
1322 vnfd_helper = mock.MagicMock()
1323 ssh_helper = mock.MagicMock()
1324 ssh_helper.provision_tool.return_value = "/tmp/nosuch"
1325 scenario_helper = mock.MagicMock()
1327 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1328 helper._build_pipeline_kwargs()
1329 self.assertEqual(helper.pipeline_kwargs, {'tool_path': '/tmp/nosuch', 'tool_dir': '/tmp'})
1331 def test_copy_to_target(self):
1332 vnfd_helper = mock.MagicMock()
1333 vnfd_helper.interfaces = []
1334 ssh_helper = mock.MagicMock()
1335 scenario_helper = mock.MagicMock()
1337 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1339 result = helper.copy_to_target('a/b', 'c')
1340 self.assertEqual(result, expected)
1342 def test_upload_prox_config(self):
1343 vnfd_helper = mock.MagicMock()
1344 vnfd_helper.interfaces = []
1345 ssh_helper = mock.MagicMock()
1346 scenario_helper = mock.MagicMock()
1348 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1349 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1351 result = helper.upload_prox_config('a', {})
1352 self.assertEqual(result, expected)
1355 class TestProxResourceHelper(unittest.TestCase):
1358 'short-name': 'ProxVnf',
1363 'network': '152.16.100.20',
1364 'netmask': '255.255.255.0',
1365 'gateway': '152.16.100.20',
1369 'network': '152.16.40.20',
1370 'netmask': '255.255.255.0',
1371 'gateway': '152.16.40.20',
1375 'description': 'PROX approximation using DPDK',
1376 'name': 'proxvnf-baremetal',
1379 'network': '0064:ff9b:0:0:0:0:9810:6414',
1381 'gateway': '0064:ff9b:0:0:0:0:9810:6414',
1385 'network': '0064:ff9b:0:0:0:0:9810:2814',
1387 'gateway': '0064:ff9b:0:0:0:0:9810:2814',
1391 'id': 'proxvnf-baremetal',
1392 'external-interface': [
1394 'virtual-interface': {
1395 'dst_mac': '00:00:00:00:00:04',
1396 'vpci': '0000:05:00.0',
1397 'local_ip': '152.16.100.19',
1398 'type': 'PCI-PASSTHROUGH',
1399 'vld_id': 'uplink_0',
1400 'netmask': '255.255.255.0',
1402 'bandwidth': '10 Gbps',
1404 'dst_ip': '152.16.100.19',
1405 'local_iface_name': 'xe0',
1406 'local_mac': '00:00:00:00:00:02',
1409 'vnfd-connection-point-ref': 'xe0',
1413 'virtual-interface': {
1414 'dst_mac': '00:00:00:00:00:03',
1415 'vpci': '0000:05:00.1',
1416 'local_ip': '152.16.40.19',
1417 'type': 'PCI-PASSTHROUGH',
1418 'vld_id': 'downlink_0',
1420 'netmask': '255.255.255.0',
1422 'bandwidth': '10 Gbps',
1423 'dst_ip': '152.16.40.20',
1424 'local_iface_name': 'xe1',
1425 'local_mac': '00:00:00:00:00:01',
1428 'vnfd-connection-point-ref': 'xe1',
1434 'description': 'PROX approximation using DPDK',
1436 'vdu-id': 'proxvnf-baremetal',
1449 'id': 'ProxApproxVnf',
1454 'vnfd:vnfd-catalog': {
1461 def test_find_pci(self):
1467 result = ProxResourceHelper.find_pci('target', input_str_list)
1468 self.assertFalse(result)
1476 result = ProxResourceHelper.find_pci('target', input_str_list)
1477 self.assertTrue(result)
1479 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1480 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1481 def test_sut(self, mock_socket_helper):
1482 helper = ProxResourceHelper(mock.MagicMock())
1483 self.assertIsNone(helper.client)
1485 self.assertIsNotNone(result)
1486 self.assertIs(result, helper.client)
1487 self.assertIs(result, helper.sut)
1489 def test_test_type(self):
1490 setup_helper = mock.MagicMock()
1491 setup_helper.find_in_section.return_value = expected = 'prox type'
1493 helper = ProxResourceHelper(setup_helper)
1495 self.assertIsNone(helper._test_type)
1496 self.assertEqual(helper.test_type, expected)
1497 self.assertEqual(helper._test_type, expected)
1498 self.assertEqual(helper.test_type, expected)
1500 def test_collect_collectd_kpi(self):
1501 helper = ProxResourceHelper(mock.MagicMock())
1502 helper.resource = resource = mock.MagicMock()
1504 resource.amqp_collect_nfvi_kpi.return_value = 543
1506 expected = {'core': 543}
1507 result = helper.collect_collectd_kpi()
1508 self.assertDictEqual(result, expected)
1510 def test_collect_kpi(self):
1511 helper = ProxResourceHelper(mock.MagicMock())
1512 helper._queue = queue = mock.MagicMock()
1513 helper._result = {'z': 123}
1514 helper.resource = resource = mock.MagicMock()
1516 resource.amqp_collect_nfvi_kpi.return_value = 543
1518 queue.empty.return_value = False
1519 queue.get.return_value = {'a': 789}
1521 expected = {'z': 123, 'a': 789, 'collect_stats': {'core': 543}}
1522 result = helper.collect_kpi()
1523 self.assertDictEqual(result, expected)
1525 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1526 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1527 def test__connect(self, mock_socket_helper_type, mock_time):
1528 client = mock_socket_helper_type()
1529 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1531 setup_helper = mock.MagicMock()
1532 setup_helper.vnfd_helper.interfaces = []
1534 helper = ProxResourceHelper(setup_helper)
1536 result = helper._connect()
1537 self.assertIs(result, client)
1539 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1541 with self.assertRaises(Exception):
1544 def test_run_traffic(self):
1545 setup_helper = mock.MagicMock()
1546 helper = ProxResourceHelper(setup_helper)
1547 traffic_profile = mock.MagicMock(**{"done": True})
1548 helper.run_traffic(traffic_profile)
1549 self.assertEqual(helper._terminated.value, 1)
1551 def test__run_traffic_once(self):
1552 setup_helper = mock.MagicMock()
1553 helper = ProxResourceHelper(setup_helper)
1554 traffic_profile = mock.MagicMock(**{"done": True})
1555 helper._run_traffic_once(traffic_profile)
1556 self.assertEqual(helper._terminated.value, 1)
1558 def test_start_collect(self):
1559 setup_helper = mock.MagicMock()
1560 helper = ProxResourceHelper(setup_helper)
1561 helper.resource = resource = mock.MagicMock()
1562 self.assertIsNone(helper.start_collect())
1563 resource.start.assert_called_once()
1565 def test_terminate(self):
1566 setup_helper = mock.MagicMock()
1567 helper = ProxResourceHelper(setup_helper)
1568 with self.assertRaises(NotImplementedError):
1571 def test_up_post(self):
1572 setup_helper = mock.MagicMock()
1573 helper = ProxResourceHelper(setup_helper)
1574 helper.client = expected = mock.MagicMock()
1575 result = helper.up_post()
1576 self.assertEqual(result, expected)
1578 def test_execute(self):
1579 setup_helper = mock.MagicMock()
1580 helper = ProxResourceHelper(setup_helper)
1581 helper.client = mock.MagicMock()
1583 expected = helper.client.my_command()
1584 result = helper.execute('my_command')
1585 self.assertEqual(result, expected)
1587 helper.client = object()
1589 result = helper.execute('my_command')
1590 self.assertIsNone(result)
1593 class TestProxDataHelper(unittest.TestCase):
1595 def test_totals_and_pps(self):
1597 vnfd_helper = mock.MagicMock()
1598 vnfd_helper.port_pairs.all_ports = list(range(4))
1600 sut = mock.MagicMock()
1601 sut.port_stats.return_value = list(range(10))
1603 data_helper = ProxDataHelper(vnfd_helper, sut, pkt_size, 25, None)
1605 self.assertEqual(data_helper.rx_total, 6)
1606 self.assertEqual(data_helper.tx_total, 7)
1607 self.assertEqual(data_helper.pps, 6.25e6)
1609 def test_samples(self):
1610 vnfd_helper = mock.MagicMock()
1611 vnfd_helper.port_pairs.all_ports = list(range(4))
1612 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1614 sut = mock.MagicMock()
1615 sut.port_stats.return_value = list(range(10))
1617 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1629 result = data_helper.samples
1630 self.assertDictEqual(result, expected)
1632 def test___enter__(self):
1633 vnfd_helper = mock.MagicMock()
1634 vnfd_helper.port_pairs.all_ports = list(range(4))
1635 vnfd_helper.ports_iter.return_value = [('xe1', 3), ('xe2', 7)]
1637 sut = mock.MagicMock()
1638 sut.port_stats.return_value = list(range(10))
1640 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1641 data_helper._totals_and_pps = 12, 32, 4.5
1642 data_helper.tsc_hz = 9.8
1643 data_helper.measured_stats = {'delta': TotStatsTuple(6.1, 6.2, 6.3, 6.4)}
1644 data_helper.latency = 7
1646 self.assertIsNone(data_helper.result_tuple)
1648 expected = ProxTestDataTuple(5.4, 9.8, 6.1, 6.2, 6.3, 7, 12, 32, 4.5)
1652 result = data_helper.result_tuple
1653 self.assertEqual(result, expected)
1655 data_helper.make_tuple()
1656 self.assertIs(data_helper.result_tuple, result)
1658 def test___enter___negative(self):
1659 vnfd_helper = mock.MagicMock()
1661 data_helper = ProxDataHelper(vnfd_helper, None, None, None, None)
1663 vnfd_helper.port_pairs.all_ports = []
1664 with self.assertRaises(AssertionError):
1668 vnfd_helper.port_pairs.all_ports = [0, 1, 2]
1669 with self.assertRaises(AssertionError):
1673 def test_measure_tot_stats(self):
1674 vnfd_helper = mock.MagicMock()
1675 vnfd_helper.port_pairs.all_ports = list(range(4))
1677 start = (3, 4, 1, 2)
1680 sut = ProxSocketHelper(mock.MagicMock())
1681 sut.get_all_tot_stats = mock.MagicMock(side_effect=[start, end])
1683 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, 5.4)
1685 self.assertIsNone(data_helper.measured_stats)
1690 'delta': TotStatsTuple(6, 3, 5, 6),
1692 with data_helper.measure_tot_stats():
1695 self.assertEqual(data_helper.measured_stats, expected)
1697 def test_capture_tsc_hz(self):
1698 vnfd_helper = mock.MagicMock()
1699 vnfd_helper.port_pairs.all_ports = list(range(4))
1701 sut = mock.MagicMock()
1702 sut.hz.return_value = '54.6'
1704 data_helper = ProxDataHelper(vnfd_helper, sut, None, None, None)
1706 self.assertIsNone(data_helper.tsc_hz)
1709 data_helper.capture_tsc_hz()
1710 self.assertEqual(data_helper.tsc_hz, expected)
1713 class TestProxProfileHelper(unittest.TestCase):
1715 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1716 def test_get_cls(self, mock_utils):
1717 mock_type1 = mock.MagicMock()
1718 mock_type1.__prox_profile_type__ = 'another_type'
1719 mock_type2 = mock.MagicMock()
1720 mock_type2.__prox_profile_type__ = 'my_type'
1721 mock_utils.itersubclasses.return_value = [mock_type1, mock_type2]
1723 self.assertEqual(ProxProfileHelper.get_cls('my_type'), mock_type2)
1725 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.utils')
1726 def test_get_cls_default(self, mock_utils):
1727 mock_utils.itersubclasses.return_value = []
1728 ProxProfileHelper.get_cls('my_type')
1730 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1731 def test_cpu_topology(self, mock_socket_topology):
1732 mock_socket_topology.parse_cpuinfo.return_value = 432
1734 resource_helper = mock.MagicMock()
1735 resource_helper.setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1737 helper = ProxProfileHelper(resource_helper)
1738 self.assertIsNone(helper._cpu_topology)
1739 result = helper.cpu_topology
1740 self.assertEqual(result, 432)
1741 self.assertIs(result, helper._cpu_topology)
1742 self.assertIs(result, helper.cpu_topology)
1744 def test_test_cores(self):
1745 resource_helper = mock.MagicMock()
1746 resource_helper.setup_helper.prox_config_data = []
1748 helper = ProxProfileHelper(resource_helper)
1749 helper._cpu_topology = []
1752 result = helper.test_cores
1753 self.assertEqual(result, expected)
1755 resource_helper.setup_helper.prox_config_data = [
1776 helper = ProxProfileHelper(resource_helper)
1777 helper._cpu_topology = {
1794 self.assertIsNone(helper._test_cores)
1796 result = helper.test_cores
1797 self.assertEqual(result, expected)
1798 self.assertIs(result, helper._test_cores)
1799 self.assertIs(result, helper.test_cores)
1801 def test_latency_cores(self):
1802 resource_helper = mock.MagicMock()
1803 resource_helper.setup_helper.prox_config_data= []
1805 helper = ProxProfileHelper(resource_helper)
1806 helper._cpu_topology = []
1809 result = helper.latency_cores
1810 self.assertEqual(result, expected)
1812 resource_helper.setup_helper.prox_config_data = [
1833 helper = ProxProfileHelper(resource_helper)
1834 helper._cpu_topology = {
1851 self.assertIsNone(helper._latency_cores)
1853 result = helper.latency_cores
1854 self.assertEqual(result, expected)
1855 self.assertIs(result, helper._latency_cores)
1856 self.assertIs(result, helper.latency_cores)
1858 def test_all_rx_cores(self):
1859 helper = ProxBngProfileHelper(mock.MagicMock())
1860 helper._latency_cores = expected = [3, 4, 6]
1861 helper._test_cores = [5, 2, 1]
1863 result = helper.all_rx_cores
1864 self.assertEqual(result, expected)
1866 def test_get_cores(self):
1867 resource_helper = mock.MagicMock()
1868 resource_helper.setup_helper.prox_config_data = [
1889 helper = ProxProfileHelper(resource_helper)
1890 helper._cpu_topology = {
1908 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1909 self.assertEqual(result, expected)
1911 def test_get_latency(self):
1912 resource_helper = mock.MagicMock()
1913 resource_helper.setup_helper.vnfd_helper.interfaces = []
1915 helper = ProxProfileHelper(resource_helper)
1916 helper._latency_cores = []
1919 result = helper.get_latency()
1920 self.assertEqual(result, expected)
1922 helper._latency_cores = [1, 2]
1923 helper.client = mock.MagicMock()
1925 expected = helper.sut.lat_stats()
1926 result = helper.get_latency()
1927 self.assertIs(result, expected)
1929 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1930 def test_traffic_context(self, mock_time):
1931 setup_helper = mock.MagicMock()
1932 setup_helper.vnfd_helper.interfaces = []
1934 helper = ProxProfileHelper(setup_helper)
1935 helper._cpu_topology = {
1952 setup_helper.prox_config_data = [
1954 ('not_name', 'other data'),
1955 ('name_not', 'more data'),
1956 ('name', helper.__prox_profile_type__),
1981 client = mock.MagicMock()
1982 client.hz.return_value = 2
1983 client.port_stats.return_value = tuple(range(12))
1985 helper.client = client
1986 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1988 helper._test_cores = [3, 4]
1990 with helper.traffic_context(64, 1):
1993 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1994 def test_run_test(self, _):
1995 resource_helper = mock.MagicMock()
1996 resource_helper.step_delta = 0.4
1997 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
1998 resource_helper.sut.port_stats.return_value = list(range(10))
2000 helper = ProxProfileHelper(resource_helper)
2002 helper.run_test(120, 5, 6.5)
2005 class TestProxMplsProfileHelper(unittest.TestCase):
2007 def test_mpls_cores(self):
2008 resource_helper = mock.MagicMock()
2009 resource_helper.setup_helper.prox_config_data = [
2032 helper = ProxMplsProfileHelper(resource_helper)
2033 helper._cpu_topology = {
2050 expected_tagged = [7]
2051 expected_plain = [8]
2052 self.assertIsNone(helper._cores_tuple)
2053 self.assertEqual(helper.tagged_cores, expected_tagged)
2054 self.assertEqual(helper.plain_cores, expected_plain)
2055 self.assertEqual(helper._cores_tuple, (expected_tagged, expected_plain))
2057 def test_traffic_context(self):
2058 setup_helper = mock.MagicMock()
2059 helper = ProxMplsProfileHelper(setup_helper)
2061 with helper.traffic_context(120, 5.4):
2065 class TestProxBngProfileHelper(unittest.TestCase):
2067 def test_bng_cores(self):
2068 resource_helper = mock.MagicMock()
2069 resource_helper.setup_helper.prox_config_data = [
2093 ('name', 'arp_task'),
2102 helper = ProxBngProfileHelper(resource_helper)
2103 helper._cpu_topology = {
2128 expected_arp = [4, 3]
2129 expected_arp_task = [0, 4]
2130 expected_combined = (expected_cpe, expected_inet, expected_arp, expected_arp_task)
2132 self.assertIsNone(helper._cores_tuple)
2133 self.assertEqual(helper.cpe_cores, expected_cpe)
2134 self.assertEqual(helper.inet_cores, expected_inet)
2135 self.assertEqual(helper.arp_cores, expected_arp)
2136 self.assertEqual(helper.arp_task_cores, expected_arp_task)
2137 self.assertEqual(helper._cores_tuple, expected_combined)
2139 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
2140 def test_run_test(self, _):
2141 resource_helper = mock.MagicMock()
2142 resource_helper.step_delta = 0.4
2143 resource_helper.vnfd_helper.port_pairs.all_ports = list(range(2))
2144 resource_helper.sut.port_stats.return_value = list(range(10))
2146 helper = ProxBngProfileHelper(resource_helper)
2148 helper.run_test(120, 5, 6.5)
2149 helper.run_test(-1000, 5, 6.5) # negative pkt_size is the only way to make ratio > 1