3 # Copyright (c) 2016-2017 Intel Corporation
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
18 from __future__ import absolute_import
23 from itertools import repeat, chain
24 from contextlib import contextmanager
27 from tests.unit import STL_MOCKS
29 STLClient = mock.MagicMock()
30 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
34 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
35 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper
36 from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump
37 from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple
38 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple
39 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper
40 from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple
41 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper
44 class TestCoreTuple(unittest.TestCase):
45 def test___init__(self):
46 core_tuple = CoreSocketTuple('core 5s6')
47 self.assertEqual(core_tuple.core_id, 5)
48 self.assertEqual(core_tuple.socket_id, 6)
49 self.assertFalse(core_tuple.is_hyperthread())
51 core_tuple = CoreSocketTuple('core 5s6h')
52 self.assertEqual(core_tuple.core_id, 5)
53 self.assertEqual(core_tuple.socket_id, 6)
54 self.assertTrue(core_tuple.is_hyperthread())
56 def test___init__negative(self):
77 for bad_input in bad_inputs:
78 with self.assertRaises(ValueError):
79 CoreSocketTuple(bad_input)
81 def test_find_in_topology(self):
91 core_tuple = CoreSocketTuple('core 5s6')
94 result = core_tuple.find_in_topology(topology_in)
95 self.assertEqual(result, expected)
97 core_tuple = CoreSocketTuple('core 5s6h')
100 result = core_tuple.find_in_topology(topology_in)
101 self.assertEqual(result, expected)
103 def test_find_in_topology_negative(self):
104 core_tuple = CoreSocketTuple('core 6s5')
105 with self.assertRaises(ValueError):
107 core_tuple.find_in_topology({})
109 with self.assertRaises(ValueError):
111 core_tuple.find_in_topology({5: {}})
113 with self.assertRaises(ValueError):
114 # no first value (as needed by non-hyperthread core)
115 core_tuple.find_in_topology({5: {6: {'key1': []}}})
117 core_tuple = CoreSocketTuple('core 6s5h')
118 with self.assertRaises(ValueError):
119 # no second value (as needed by hyperthread core)
120 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
123 class TestTotStatsTuple(unittest.TestCase):
124 def test___new___negative(self):
125 with self.assertRaises(TypeError):
129 with self.assertRaises(TypeError):
130 # one, non-integer value
133 with self.assertRaises(TypeError):
135 TotStatsTuple(3, 4, 5, 6, 7)
138 class TestProxTestDataTuple(unittest.TestCase):
139 def test___init__(self):
140 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
141 self.assertEqual(prox_test_data.tolerated, 1)
142 self.assertEqual(prox_test_data.tsc_hz, 2)
143 self.assertEqual(prox_test_data.delta_rx, 3)
144 self.assertEqual(prox_test_data.delta_tx, 4)
145 self.assertEqual(prox_test_data.delta_tsc, 5)
146 self.assertEqual(prox_test_data.latency, 6)
147 self.assertEqual(prox_test_data.rx_total, 7)
148 self.assertEqual(prox_test_data.tx_total, 8)
149 self.assertEqual(prox_test_data.pps, 9)
151 def test_properties(self):
152 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
153 self.assertEqual(prox_test_data.pkt_loss, 12.5)
154 self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
155 self.assertEqual(prox_test_data.can_be_lost, 0)
156 self.assertEqual(prox_test_data.drop_total, 1)
157 self.assertFalse(prox_test_data.success)
159 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
160 self.assertTrue(prox_test_data.success)
162 def test_pkt_loss_zero_division(self):
163 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
164 self.assertEqual(prox_test_data.pkt_loss, 100.0)
166 def test_get_samples(self):
167 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
170 "Throughput": 1.6 / 1e6,
172 "CurrentDropPackets": 12.5,
173 "TxThroughput": 9 / 1e6,
174 "RxThroughput": 1.6 / 1e6,
181 result = prox_test_data.get_samples(64, port_samples={"PortSample": 1})
182 self.assertDictEqual(result, expected)
185 "Throughput": 1.6 / 1e6,
186 "DropPackets": 0.123,
187 "CurrentDropPackets": 0.123,
188 "TxThroughput": 9 / 1e6,
189 "RxThroughput": 1.6 / 1e6,
195 result = prox_test_data.get_samples(64, 0.123)
196 self.assertDictEqual(result, expected)
198 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
199 def test_log_data(self, mock_logger):
200 my_mock_logger = mock.MagicMock()
201 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
202 prox_test_data.log_data()
203 self.assertEqual(my_mock_logger.debug.call_count, 0)
204 self.assertEqual(mock_logger.debug.call_count, 2)
206 mock_logger.debug.reset_mock()
207 prox_test_data.log_data(my_mock_logger)
208 self.assertEqual(my_mock_logger.debug.call_count, 2)
209 self.assertEqual(mock_logger.debug.call_count, 0)
212 class TestPacketDump(unittest.TestCase):
215 def test__init__(self):
216 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
218 def test___str__(self):
219 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
220 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
221 self.assertEqual(str(dump1), expected)
223 def test_port_id(self):
224 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
225 self.assertEqual(p.port_id, "port_id")
227 def test_data_len(self):
228 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
229 self.assertEqual(p.data_len, len(self.PAYLOAD))
231 def test_payload(self):
232 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
233 self.assertEqual(p.payload(), self.PAYLOAD)
235 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
237 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
239 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
251 brown fox jumped over
257 PACKET_DUMP_NON_1 = """\
262 PACKET_DUMP_MIXED_1 = """\
269 PACKET_DUMP_BAD_1 = """\
274 PACKET_DUMP_BAD_2 = """\
279 PACKET_DUMP_BAD_3 = """\
285 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
286 class TestProxSocketHelper(unittest.TestCase):
287 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
288 def test___init__(self, mock_socket, mock_time):
289 expected = mock_socket.socket()
290 prox = ProxSocketHelper()
292 self.assertEqual(result, expected)
294 def test_connect(self, mock_time):
295 mock_sock = mock.MagicMock()
296 prox = ProxSocketHelper(mock_sock)
297 prox.connect('10.20.30.40', 23456)
298 self.assertEqual(mock_sock.connect.call_count, 1)
300 def test_get_sock(self, mock_time):
301 mock_sock = mock.MagicMock()
302 prox = ProxSocketHelper(mock_sock)
303 result = prox.get_socket()
304 self.assertIs(result, mock_sock)
306 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
307 def test_get_data(self, mock_select, mock_time):
308 mock_select.select.side_effect = [[1], [0]]
309 mock_socket = mock.MagicMock()
310 mock_recv = mock_socket.recv()
311 mock_recv.decode.return_value = ""
312 prox = ProxSocketHelper(mock_socket)
313 ret = prox.get_data()
314 self.assertEqual(ret, "")
315 self.assertEqual(len(prox._pkt_dumps), 0)
317 mock_select.select.reset_mock()
318 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
319 mock_recv.decode.return_value = PACKET_DUMP_1
320 ret = prox.get_data()
321 self.assertEqual(mock_select.select.call_count, 2)
322 self.assertEqual(ret, 'pktdump,3,11')
323 self.assertEqual(len(prox._pkt_dumps), 1)
325 mock_select.select.reset_mock()
326 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
327 mock_recv.decode.return_value = PACKET_DUMP_2
328 ret = prox.get_data()
329 self.assertEqual(mock_select.select.call_count, 2)
330 self.assertEqual(ret, 'jumped over')
331 self.assertEqual(len(prox._pkt_dumps), 3)
333 def test__parse_socket_data_mixed_data(self, mock_time):
334 prox = ProxSocketHelper(mock.MagicMock())
335 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
336 self.assertEqual(ret, 'not_a_dump,1,2')
337 self.assertEqual(len(prox._pkt_dumps), 0)
339 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
340 self.assertEqual(ret, 'not_a_dump,1,2')
341 self.assertEqual(len(prox._pkt_dumps), 1)
343 def test__parse_socket_data_bad_data(self, mock_time):
344 prox = ProxSocketHelper(mock.MagicMock())
345 with self.assertRaises(ValueError):
346 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
348 with self.assertRaises(ValueError):
349 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
351 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
352 self.assertEqual(ret, 'pktdump,3')
354 def test__parse_socket_data_pkt_dump_only(self, mock_time):
355 prox = ProxSocketHelper(mock.MagicMock())
356 ret = prox._parse_socket_data('', True)
357 self.assertFalse(ret)
359 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
362 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
365 def test_put_command(self, mock_time):
366 mock_socket = mock.MagicMock()
367 prox = ProxSocketHelper(mock_socket)
368 prox.put_command("data")
369 mock_socket.sendall.assert_called_once()
371 def test_put_command_socket_error(self, mock_time):
372 mock_socket = mock.MagicMock()
373 mock_socket.sendall.side_effect = OSError
374 prox = ProxSocketHelper(mock_socket)
375 prox.put_command("data")
376 mock_socket.sendall.assert_called_once()
378 def test_get_packet_dump(self, mock_time):
379 mock_socket = mock.MagicMock()
380 prox = ProxSocketHelper(mock_socket)
382 self.assertIsNone(prox.get_packet_dump())
384 prox._pkt_dumps = [234]
385 self.assertEqual(prox.get_packet_dump(), 234)
386 self.assertEqual(prox._pkt_dumps, [])
388 def test_stop_all_reset(self, mock_time):
389 mock_socket = mock.MagicMock()
390 prox = ProxSocketHelper(mock_socket)
391 prox.stop_all_reset()
392 mock_socket.sendall.assert_called()
394 def test_stop_all(self, mock_time):
395 mock_socket = mock.MagicMock()
396 prox = ProxSocketHelper(mock_socket)
398 mock_socket.sendall.assert_called()
400 def test_stop(self, mock_time):
401 mock_socket = mock.MagicMock()
402 prox = ProxSocketHelper(mock_socket)
403 prox.stop([3, 4, 5], 16)
404 mock_socket.sendall.assert_called()
406 def test_start_all(self, mock_time):
407 mock_socket = mock.MagicMock()
408 prox = ProxSocketHelper(mock_socket)
410 mock_socket.sendall.assert_called()
412 def test_start(self, mock_time):
413 mock_socket = mock.MagicMock()
414 prox = ProxSocketHelper(mock_socket)
415 prox.start([3, 4, 5])
416 mock_socket.sendall.assert_called()
418 def test_reset_stats(self, mock_time):
419 mock_socket = mock.MagicMock()
420 prox = ProxSocketHelper(mock_socket)
422 mock_socket.sendall.assert_called()
424 def test_set_pkt_size(self, mock_time):
425 mock_socket = mock.MagicMock()
426 prox = ProxSocketHelper(mock_socket)
427 prox.set_pkt_size([3, 4, 5], 1024)
428 self.assertEqual(mock_socket.sendall.call_count, 3)
430 def test_set_value(self, mock_time):
431 mock_socket = mock.MagicMock()
432 prox = ProxSocketHelper(mock_socket)
433 prox.set_value([3, 4, 5], 10, 20, 30)
434 self.assertEqual(mock_socket.sendall.call_count, 3)
436 def test_reset_values(self, mock_time):
437 mock_socket = mock.MagicMock()
438 prox = ProxSocketHelper(mock_socket)
439 prox.reset_values([3, 4, 5])
440 self.assertEqual(mock_socket.sendall.call_count, 3)
442 def test_set_speed(self, mock_time):
443 mock_socket = mock.MagicMock()
444 prox = ProxSocketHelper(mock_socket)
445 prox.set_speed([3, 4, 5], 1000)
446 self.assertEqual(mock_socket.sendall.call_count, 3)
448 def test_slope_speed(self, mock_time):
455 'cores': [9, 10, 11],
460 mock_socket = mock.MagicMock()
461 prox = ProxSocketHelper(mock_socket)
462 prox.set_speed = set_speed = mock.MagicMock()
463 prox.slope_speed(core_data, 5)
464 self.assertEqual(set_speed.call_count, 20)
466 set_speed.reset_mock()
467 prox.slope_speed(core_data, 5, 5)
468 self.assertEqual(set_speed.call_count, 10)
470 def test_set_pps(self, mock_time):
471 mock_socket = mock.MagicMock()
472 prox = ProxSocketHelper(mock_socket)
473 prox.set_pps([3, 4, 5], 1000, 512)
474 self.assertEqual(mock_socket.sendall.call_count, 3)
476 def test_lat_stats(self, mock_time):
478 '1, 2 , 3', # has white space
480 '7,8,9,10.5,11', # too long with float, but float is in unused portion
481 'twelve,13,14', # value as English word
482 '15,16.2,17', # float in used portion
485 mock_socket = mock.MagicMock()
486 prox = ProxSocketHelper(mock_socket)
487 prox.get_data = mock.MagicMock(side_effect=latency_output)
503 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
504 self.assertEqual(mock_socket.sendall.call_count, 5)
505 self.assertEqual(result, expected)
507 def test_get_all_tot_stats_error(self, mock_time):
508 mock_socket = mock.MagicMock()
509 prox = ProxSocketHelper(mock_socket)
510 prox.get_data = mock.MagicMock(return_value='3,4,5')
511 expected = [0, 0, 0, 0]
512 result = prox.get_all_tot_stats()
513 self.assertEqual(result, expected)
515 def test_get_all_tot_stats(self, mock_time):
516 mock_socket = mock.MagicMock()
517 prox = ProxSocketHelper(mock_socket)
518 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
519 expected = 3, 4, 5, 6
520 result = prox.get_all_tot_stats()
521 self.assertEqual(result, expected)
523 def test_hz(self, mock_time):
524 mock_socket = mock.MagicMock()
525 prox = ProxSocketHelper(mock_socket)
526 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
529 self.assertEqual(result, expected)
531 def test_rx_stats(self, mock_time):
538 mock_socket = mock.MagicMock()
539 prox = ProxSocketHelper(mock_socket)
540 prox.get_data = mock.MagicMock(side_effect=core_stats)
541 expected = 21, 24, 27, 14
542 result = prox.rx_stats([3, 4, 5], 16)
543 self.assertEqual(result, expected)
545 def test_core_stats(self, mock_time):
552 mock_socket = mock.MagicMock()
553 prox = ProxSocketHelper(mock_socket)
554 prox.get_data = mock.MagicMock(side_effect=core_stats)
555 expected = 21, 24, 27, 14
556 result = prox.core_stats([3, 4, 5], 16)
557 self.assertEqual(result, expected)
559 def test_port_stats(self, mock_time):
561 ','.join(str(n) for n in range(3, 15)),
562 ','.join(str(n) for n in range(8, 32, 2)),
563 ','.join(str(n) for n in range(5, 89, 7)),
566 mock_socket = mock.MagicMock()
567 prox = ProxSocketHelper(mock_socket)
568 prox.get_data = mock.MagicMock(side_effect=port_stats)
569 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
570 result = prox.port_stats([3, 4, 5])
571 self.assertEqual(result, expected)
573 def test_measure_tot_stats(self, mock_time):
574 start_tot = 3, 4, 5, 6
575 end_tot = 7, 9, 11, 13
576 delta_tot = 4, 5, 6, 7
579 ','.join(str(n) for n in start_tot),
580 ','.join(str(n) for n in end_tot),
583 mock_socket = mock.MagicMock()
584 prox = ProxSocketHelper(mock_socket)
585 prox.get_data = mock.MagicMock(side_effect=get_data_output)
587 'start_tot': start_tot,
591 with prox.measure_tot_stats() as result:
593 self.assertEqual(result, expected)
595 def test_tot_stats(self, mock_time):
596 mock_socket = mock.MagicMock()
597 prox = ProxSocketHelper(mock_socket)
598 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
600 result = prox.tot_stats()
601 self.assertEqual(result, expected)
603 def test_tot_ierrors(self, mock_time):
604 mock_socket = mock.MagicMock()
605 prox = ProxSocketHelper(mock_socket)
606 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
608 result = prox.tot_ierrors()
609 self.assertEqual(result, expected)
611 def test_set_count(self, mock_time):
612 mock_socket = mock.MagicMock()
613 prox = ProxSocketHelper(mock_socket)
614 prox.set_count(432, [3, 4, 5])
615 self.assertEqual(mock_socket.sendall.call_count, 3)
617 def test_dump_rx(self, mock_time):
618 mock_socket = mock.MagicMock()
619 prox = ProxSocketHelper(mock_socket)
620 prox.dump_rx(3, 5, 8)
621 self.assertEqual(mock_socket.sendall.call_count, 1)
623 def test_quit(self, mock_time):
624 mock_socket = mock.MagicMock()
625 prox = ProxSocketHelper(mock_socket)
627 mock_socket.sendall.assert_called()
629 def test_force_quit(self, mock_time):
630 mock_socket = mock.MagicMock()
631 prox = ProxSocketHelper(mock_socket)
633 mock_socket.sendall.assert_called()
636 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
637 def test__replace_quoted_with_value(self):
641 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
642 self.assertEqual(result, expected)
644 # no quoted substring
645 input_str = 'lion tiger bear'
646 expected = 'lion tiger bear'
647 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
648 self.assertEqual(result, expected)
650 # partially quoted substring
651 input_str = 'lion "tiger bear'
652 expected = 'lion "tiger bear'
653 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
654 self.assertEqual(result, expected)
656 # one quoted substring
657 input_str = 'lion "tiger" bear'
658 expected = 'lion "cat" bear'
659 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
660 self.assertEqual(result, expected)
662 # two quoted substrings
663 input_str = 'lion "tiger" bear "shark" whale'
664 expected = 'lion "cat" bear "shark" whale'
665 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat')
666 self.assertEqual(result, expected)
668 # two quoted substrings, both replaced
669 input_str = 'lion "tiger" bear "shark" whale'
670 expected = 'lion "cat" bear "cat" whale'
671 result = ProxDpdkVnfSetupEnvHelper._replace_quoted_with_value(input_str, 'cat', 2)
672 self.assertEqual(result, expected)
674 def test__get_tx_port(self):
676 input_data = {'section1': []}
678 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
679 self.assertEqual(result, expected)
681 # data for other section
690 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
691 self.assertEqual(result, expected)
694 input_data['section1'] = section1 = [
695 ('rx port', '4', 'more', 432),
699 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
700 self.assertEqual(result, expected)
702 # more data for section,
705 ('tx port', '1', 'and more', 234),
708 result = ProxDpdkVnfSetupEnvHelper._get_tx_port('section1', input_data)
709 self.assertEqual(result, expected)
711 def test_write_prox_config(self):
714 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
715 self.assertEqual(result, expected)
723 expected = '[section1]'
724 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
725 self.assertEqual(result, expected)
736 ['__name__', 'not this one'],
739 ['key4', 'multi-line\nvalue'],
743 expected = os.linesep.join([
749 'key4=multi-line\n\tvalue',
751 result = ProxDpdkVnfSetupEnvHelper.write_prox_config(input_data)
752 self.assertEqual(result, expected)
754 def test_rebind_drivers(self):
755 def find_drivers(*args, **kwargs):
756 setup_helper.used_drivers = used_drivers
763 vnfd_helper = mock.MagicMock()
764 ssh_helper = mock.MagicMock()
765 scenario_helper = mock.MagicMock()
766 setup_helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
767 setup_helper._find_used_drivers = mock_find = mock.MagicMock(side_effect=find_drivers)
769 setup_helper.rebind_drivers()
770 self.assertEqual(mock_find.call_count, 1)
771 self.assertEqual(ssh_helper.execute.call_count, 2)
772 self.assertIn('--force', ssh_helper.execute.call_args[0][0])
774 mock_find.reset_mock()
775 ssh_helper.execute.reset_mock()
776 setup_helper.rebind_drivers(False)
777 self.assertEqual(mock_find.call_count, 0)
778 self.assertEqual(ssh_helper.execute.call_count, 2)
779 self.assertNotIn('--force', ssh_helper.execute.call_args[0][0])
781 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
782 def test_build_config_file_no_additional_file(self, mock_find_path):
784 'prox_args': {'-c': ""},
786 'prox_config': 'e/f',
789 mock_find_path.side_effect = ['1', '2']
791 vnfd_helper = mock.MagicMock()
792 ssh_helper = mock.MagicMock()
793 scenario_helper = ScenarioHelper('vnf1')
794 scenario_helper.scenario_cfg = {
801 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
802 helper.copy_to_target = mock.MagicMock(return_value='3')
803 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
804 helper.upload_prox_config = mock.MagicMock(return_value='5')
806 self.assertEqual(helper.additional_files, {})
807 self.assertNotEqual(helper.prox_config_dict, '4')
808 self.assertNotEqual(helper.remote_path, '5')
809 helper.build_config_file()
810 self.assertEqual(helper.additional_files, {})
811 self.assertEqual(helper.prox_config_dict, '4')
812 self.assertEqual(helper.remote_path, '5')
814 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
815 def test_build_config_file_additional_file_string(self, mock_find_path):
817 'prox_args': {'-c': ""},
819 'prox_config': 'e/f',
820 'prox_files': 'g/h.i',
823 mock_find_path.side_effect = ['1', '2']
824 vnfd_helper = mock.MagicMock()
825 ssh_helper = mock.MagicMock()
826 scenario_helper = ScenarioHelper('vnf1')
827 scenario_helper.scenario_cfg = {
834 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
835 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
836 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
837 helper.upload_prox_config = mock.MagicMock(return_value='55')
839 self.assertEqual(helper.additional_files, {})
840 expected = {'h.i': '33'}
841 helper.build_config_file()
842 self.assertDictEqual(helper.additional_files, expected)
844 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
845 def test_build_config_file_additional_file(self, mock_find_path):
847 'prox_args': {'-c': ""},
849 'prox_config': 'e/f',
857 mock_find_path.side_effect = ['1', '2']
858 vnfd_helper = mock.MagicMock()
859 ssh_helper = mock.MagicMock()
860 scenario_helper = ScenarioHelper('vnf1')
861 scenario_helper.scenario_cfg = {
868 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
869 helper.copy_to_target = mock.MagicMock(side_effect=['33', '34', '35'])
870 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
871 helper.upload_prox_config = mock.MagicMock(return_value='55')
873 self.assertEqual(helper.additional_files, {})
874 self.assertNotEqual(helper.prox_config_dict, '44')
875 self.assertNotEqual(helper.remote_path, '55')
876 expected = {'h.i': '33', 'l': '34', 'm_n': '35'}
877 helper.build_config_file()
878 self.assertDictEqual(helper.additional_files, expected)
879 self.assertEqual(helper.prox_config_dict, '44')
880 self.assertEqual(helper.remote_path, '55')
882 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
883 def test_build_config(self, mock_find_path):
885 'prox_args': {'-f': ""},
886 'prox_path': '/opt/nsb_bin/prox',
887 'prox_config': 'configs/gen_l2fwd-2.cfg',
895 mock_find_path.side_effect = ['1', '2']
896 vnfd_helper = mock.MagicMock()
897 ssh_helper = mock.MagicMock()
898 ssh_helper.provision_tool.return_value = "/opt/nsb_bin/prox"
899 scenario_helper = ScenarioHelper('vnf1')
900 scenario_helper.scenario_cfg = {
907 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
908 helper.remote_path = "/tmp/prox.cfg"
909 prox_cmd = helper.build_config()
910 expected = "sudo bash -c 'cd /opt/nsb_bin; /opt/nsb_bin/prox -o cli -f -f /tmp/prox.cfg '"
911 self.assertEqual(prox_cmd, expected)
913 def test__insert_additional_file(self):
914 vnfd_helper = mock.MagicMock()
915 ssh_helper = mock.MagicMock()
916 scenario_helper = mock.MagicMock()
918 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
919 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
920 res = helper._insert_additional_file('dofile("ipv4.lua")')
921 self.assertEqual(res, 'dofile("/tmp/ipv4.lua")')
923 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
924 def test_generate_prox_config_file(self, mock_parser_type):
927 args[-1].extend(sections_data)
928 return mock.MagicMock()
932 mock_parser_type.side_effect = init
934 vnfd_helper = mock.MagicMock()
935 vnfd_helper.interfaces = []
936 ssh_helper = mock.MagicMock()
937 scenario_helper = mock.MagicMock()
939 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
940 helper.additional_files = {}
943 result = helper.generate_prox_config_file('a/b')
944 self.assertEqual(result, expected)
946 helper.additional_files = {"ipv4.lua": "/tmp/ipv4.lua"}
948 helper.remote_prox_file_name = 'remote'
949 vnfd_helper.interfaces = [
951 'virtual-interface': {
952 'dst_mac': '00:00:00:de:ad:88',
956 'virtual-interface': {
957 'dst_mac': '00:00:00:de:ad:ee',
961 'virtual-interface': {
962 'dst_mac': '00:00:00:de:ad:ff',
970 ['dofile("ipv4.lua")', ''],
986 ['$sut_mac0', '@@dst_mac0'],
989 ['user_table', 'dofile("ipv4.lua")'],
990 ['missing_addtional_file', 'dofile("nosuch")'],
999 ['dofile("/tmp/ipv4.lua")', ''],
1006 ['mac', 'hardware'],
1007 ['dst mac', '00:00:00:de:ad:ff'],
1015 ['$sut_mac0', '00 00 00 de ad 88'],
1018 ['user_table', 'dofile("/tmp/ipv4.lua")'],
1019 ['missing_addtional_file', 'dofile("nosuch")'],
1023 result = helper.generate_prox_config_file('/c/d/e')
1024 self.assertEqual(result, expected, str(result))
1026 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1027 def test_generate_prox_config_file_negative(self, mock_parser_type):
1029 args[-1].update(sections_data)
1030 return mock.MagicMock()
1034 mock_parser_type.side_effect = init
1036 vnfd_helper = mock.MagicMock()
1037 vnfd_helper.interfaces = []
1038 ssh_helper = mock.MagicMock()
1039 scenario_helper = mock.MagicMock()
1041 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1042 helper.additional_files = {}
1043 helper.remote_prox_file_name = 'remote'
1044 vnfd_helper.interfaces = [
1046 'virtual-interface': {
1048 'dst_mac': '00:00:00:de:ad:88',
1052 'virtual-interface': {
1054 'dst_mac': '00:00:00:de:ad:ff',
1058 'virtual-interface': {
1060 'dst_mac': '00:00:00:de:ad:ff',
1074 ['???', 'dofile "here" 23'],
1078 with self.assertRaises(Exception):
1079 helper.generate_prox_config_file('a/b')
1081 def test_generate_prox_lua_file(self):
1082 vnfd_helper = mock.MagicMock()
1083 vnfd_helper.interfaces = []
1084 ssh_helper = mock.MagicMock()
1085 scenario_helper = mock.MagicMock()
1087 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1088 helper.LUA_PARAMETER_NAME = 'sut'
1091 result = helper.generate_prox_lua_file()
1092 self.assertEqual(result, expected)
1094 vnfd_helper.interfaces = [
1096 'local_ip': '10.20.30.40',
1097 'dst_ip': '10.11.12.13',
1098 'virtual-interface': {
1103 'local_ip': '10.20.30.45',
1104 'dst_ip': '10.11.12.19',
1105 'virtual-interface': {
1111 expected = os.linesep.join([
1112 'sut_hex_ip_port_3:"0a 14 1e 28"',
1113 'sut_ip_port_3:"10.20.30.40"',
1114 'gen_hex_ip_port_3:"0a 0b 0c 0d"',
1115 'gen_ip_port_3:"10.11.12.13"',
1117 'sut_hex_ip_port_7:"0a 14 1e 2d"',
1118 'sut_ip_port_7:"10.20.30.45"',
1119 'gen_hex_ip_port_7:"0a 0b 0c 13"',
1120 'gen_ip_port_7:"10.11.12.19"',
1122 result = helper.generate_prox_lua_file()
1123 self.assertEqual(result, expected)
1125 def test_upload_prox_lua(self):
1126 def identity(*args):
1129 vnfd_helper = mock.MagicMock()
1130 vnfd_helper.interfaces = []
1131 ssh_helper = mock.MagicMock()
1132 scenario_helper = mock.MagicMock()
1134 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1135 helper.generate_prox_lua_file = mock.MagicMock(return_value=234)
1136 helper.put_string_to_file = identity
1139 result = helper.upload_prox_lua('my_dir', {})
1140 self.assertEqual(result, expected)
1144 'key1': 'value1 ("inside") tail',
1146 'key3 ("key_side") head': 'value3',
1150 expected = 234, 'my_dir/key_side'
1151 result = helper.upload_prox_lua('my_dir', input_data)
1152 self.assertEqual(result, expected)
1154 def test_put_string_to_file(self):
1155 vnfd_helper = mock.MagicMock()
1156 vnfd_helper.interfaces = []
1157 ssh_helper = mock.MagicMock()
1158 scenario_helper = mock.MagicMock()
1160 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1163 result = helper.put_string_to_file('my long string', 'a/b')
1164 self.assertEqual(result, expected)
1166 def test__build_pipeline_kwarags(self):
1167 vnfd_helper = mock.MagicMock()
1168 ssh_helper = mock.MagicMock()
1169 ssh_helper.provision_tool.return_value = "/tmp/nosuch"
1170 scenario_helper = mock.MagicMock()
1172 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1173 helper._build_pipeline_kwargs()
1174 self.assertEqual(helper.pipeline_kwargs, {'tool_path': '/tmp/nosuch', 'tool_dir': '/tmp'})
1176 def test_copy_to_target(self):
1177 vnfd_helper = mock.MagicMock()
1178 vnfd_helper.interfaces = []
1179 ssh_helper = mock.MagicMock()
1180 scenario_helper = mock.MagicMock()
1182 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1184 result = helper.copy_to_target('a/b', 'c')
1185 self.assertEqual(result, expected)
1187 def test_upload_prox_config(self):
1188 vnfd_helper = mock.MagicMock()
1189 vnfd_helper.interfaces = []
1190 ssh_helper = mock.MagicMock()
1191 scenario_helper = mock.MagicMock()
1193 helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
1194 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1196 result = helper.upload_prox_config('a', {})
1197 self.assertEqual(result, expected)
1200 class TestProxResourceHelper(unittest.TestCase):
1201 def test_line_rate_to_pps(self):
1202 expected = 0.25 * 1e8
1203 result = ProxResourceHelper.line_rate_to_pps(180, 4)
1204 self.assertEqual(result, expected)
1206 def test_find_pci(self):
1212 result = ProxResourceHelper.find_pci('target', input_str_list)
1213 self.assertFalse(result)
1221 result = ProxResourceHelper.find_pci('target', input_str_list)
1222 self.assertTrue(result)
1224 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.RETRY_INTERVAL', 0)
1225 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1226 def test_sut(self, mock_socket_helper):
1227 helper = ProxResourceHelper(mock.MagicMock())
1228 self.assertIsNone(helper.client)
1230 self.assertIsNotNone(result)
1231 self.assertIs(result, helper.client)
1232 self.assertIs(result, helper.sut)
1234 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
1235 def test_cpu_topology(self, mock_socket_topology):
1236 mock_socket_topology.parse_cpuinfo.return_value = 432
1238 setup_helper = mock.MagicMock()
1239 setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
1241 helper = ProxResourceHelper(setup_helper)
1242 self.assertIsNone(helper._cpu_topology)
1243 result = helper.cpu_topology
1244 self.assertEqual(result, 432)
1245 self.assertIs(result, helper._cpu_topology)
1246 self.assertIs(result, helper.cpu_topology)
1248 def test_test_cores(self):
1249 setup_helper = mock.MagicMock()
1250 setup_helper.prox_config_dict = {}
1252 helper = ProxResourceHelper(setup_helper)
1253 helper._cpu_topology = []
1256 result = helper.test_cores
1257 self.assertEqual(result, expected)
1259 setup_helper.prox_config_dict = [
1280 helper = ProxResourceHelper(setup_helper)
1281 helper._cpu_topology = {
1298 self.assertIsNone(helper._test_cores)
1300 result = helper.test_cores
1301 self.assertEqual(result, expected)
1302 self.assertIs(result, helper._test_cores)
1303 self.assertIs(result, helper.test_cores)
1305 def test_get_test_type(self):
1306 setup_helper = mock.MagicMock()
1307 setup_helper.prox_config_dict = {}
1309 helper = ProxResourceHelper(setup_helper)
1310 setup_helper.prox_config_dict = [
1312 ('name', helper.PROX_CORE_MPLS_TEST)
1332 test_type = helper.get_test_type()
1333 self.assertEqual(test_type, helper.PROX_CORE_MPLS_TEST)
1335 def test_get_cores(self):
1336 setup_helper = mock.MagicMock()
1337 setup_helper.prox_config_dict = {}
1339 helper = ProxResourceHelper(setup_helper)
1340 helper._cpu_topology = {
1357 setup_helper.prox_config_dict = [
1379 result = helper.get_cores(helper.PROX_CORE_GEN_MODE)
1380 self.assertEqual(result, expected)
1382 def test_get_cores_mpls(self):
1383 setup_helper = mock.MagicMock()
1384 setup_helper.prox_config_dict = {}
1386 helper = ProxResourceHelper(setup_helper)
1387 helper._cpu_topology = {
1404 setup_helper.prox_config_dict = [
1427 expected_tagged = [7]
1428 expected_plain = [8]
1429 result_tagged, result_plain = helper.get_cores_mpls(helper.PROX_CORE_GEN_MODE)
1430 self.assertEqual(result_tagged, expected_tagged)
1431 self.assertEqual(result_plain, expected_plain)
1433 def test_latency_cores(self):
1434 setup_helper = mock.MagicMock()
1435 setup_helper.prox_config_dict = {}
1437 helper = ProxResourceHelper(setup_helper)
1438 helper._cpu_topology = []
1441 result = helper.latency_cores
1442 self.assertEqual(result, expected)
1444 setup_helper.prox_config_dict = [
1465 helper = ProxResourceHelper(setup_helper)
1466 helper._cpu_topology = {
1483 self.assertIsNone(helper._latency_cores)
1485 result = helper.latency_cores
1486 self.assertEqual(result, expected)
1487 self.assertIs(result, helper._latency_cores)
1488 self.assertIs(result, helper.latency_cores)
1490 def test_run_traffic(self):
1491 setup_helper = mock.MagicMock()
1492 helper = ProxResourceHelper(setup_helper)
1493 traffic_proifle = mock.MagicMock(**{"done": True})
1494 helper.run_traffic(traffic_proifle)
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_proifle = mock.MagicMock(**{"done": True})
1501 helper._run_traffic_once(traffic_proifle)
1502 self.assertEqual(helper._terminated.value, 1)
1504 def test_start_collect(self):
1505 setup_helper = mock.MagicMock()
1506 helper = ProxResourceHelper(setup_helper)
1507 self.assertIsNone(helper.start_collect())
1509 def test_terminate(self):
1510 setup_helper = mock.MagicMock()
1511 helper = ProxResourceHelper(setup_helper)
1512 with self.assertRaises(NotImplementedError):
1515 def test_up_post(self):
1516 setup_helper = mock.MagicMock()
1517 helper = ProxResourceHelper(setup_helper)
1518 helper.client = expected = mock.MagicMock()
1519 result = helper.up_post()
1520 self.assertEqual(result, expected)
1522 def test_execute(self):
1523 setup_helper = mock.MagicMock()
1524 helper = ProxResourceHelper(setup_helper)
1525 helper.client = mock.MagicMock()
1527 expected = helper.client.my_command()
1528 result = helper.execute('my_command')
1529 self.assertEqual(result, expected)
1531 helper.client = object()
1533 result = helper.execute('my_command')
1534 self.assertIsNone(result)
1536 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1537 def test_traffic_context(self, mock_time):
1538 setup_helper = mock.MagicMock()
1539 setup_helper.prox_config_dict = {}
1541 helper = ProxResourceHelper(setup_helper)
1542 helper._cpu_topology = {
1559 setup_helper.prox_config_dict = [
1561 ('name', helper.PROX_CORE_MPLS_TEST)
1585 setup_helper = mock.MagicMock()
1586 setup_helper.vnfd_helper.interfaces = []
1588 client = mock.MagicMock()
1589 client.hz.return_value = 2
1590 client.port_stats.return_value = tuple(range(12))
1592 helper.client = client
1593 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1595 helper._test_cores = [3, 4]
1597 with helper.traffic_context(64, 1):
1600 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1601 def test_run_test(self, mock_time):
1603 def measure(*args, **kwargs):
1606 setup_helper = mock.MagicMock()
1607 setup_helper.vnfd_helper.interfaces = []
1610 'delta': TotStatsTuple(6, 7, 8, 9),
1613 client = mock.MagicMock()
1614 client.hz.return_value = 2
1615 client.measure_tot_stats = measure
1616 client.port_stats.return_value = tuple(range(12))
1618 helper = ProxResourceHelper(setup_helper)
1619 helper.client = client
1620 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1622 with self.assertRaises(AssertionError):
1623 helper.run_test(980, 15, 45)
1625 setup_helper.vnfd_helper.interfaces = [
1626 {'name': 'a', 'virtual-interface': {'vpci': 'z'}},
1627 {'name': 'b', 'virtual-interface': {'vpci': 'y'}},
1628 {'name': 'c', 'virtual-interface': {'vpci': 'x'}},
1629 {'name': 'd', 'virtual-interface': {'vpci': 'w'}},
1631 helper._test_cores = [3, 4]
1633 expected_test_data = ProxTestDataTuple(0.0, 2.0, 6, 7, 8, [3.3, 3.6, 3.8], 6, 7, 1.3e7)
1634 expected_port_samples = {
1635 'a': {'in_packets': 6, 'out_packets': 7},
1636 'b': {'in_packets': 6, 'out_packets': 7},
1637 'c': {'in_packets': 6, 'out_packets': 7},
1638 'd': {'in_packets': 6, 'out_packets': 7},
1640 test_data, port_samples = helper.run_test(230, 60, 65)
1641 self.assertEqual(test_data, expected_test_data, '\n'.join(str(x) for x in test_data))
1642 self.assertEqual(port_samples, expected_port_samples,
1643 '\n'.join(str(x) for x in port_samples))
1645 def test_get_latency(self):
1646 setup_helper = mock.MagicMock()
1647 setup_helper.vnfd_helper.interfaces = []
1649 helper = ProxResourceHelper(setup_helper)
1650 helper._latency_cores = []
1653 result = helper.get_latency()
1654 self.assertEqual(result, expected)
1656 helper._latency_cores = [1, 2]
1657 helper.client = mock.MagicMock()
1659 expected = helper.sut.lat_stats()
1660 result = helper.get_latency()
1661 self.assertIs(result, expected)
1663 def test__get_logical_if_name(self):
1664 setup_helper = mock.MagicMock()
1665 setup_helper.vnfd_helper.interfaces = []
1667 helper = ProxResourceHelper(setup_helper)
1668 helper._vpci_to_if_name_map = {
1674 result = helper._get_logical_if_name('key1')
1675 self.assertEqual(result, expected)
1677 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1678 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1679 def test__connect(self, mock_socket_helper_type, mock_time):
1680 client = mock_socket_helper_type()
1681 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1683 setup_helper = mock.MagicMock()
1684 setup_helper.vnfd_helper.interfaces = []
1686 helper = ProxResourceHelper(setup_helper)
1688 result = helper._connect()
1689 self.assertIs(result, client)
1691 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1693 with self.assertRaises(Exception):