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 collections import OrderedDict
24 from itertools import repeat, chain
25 from contextlib import contextmanager
28 from tests.unit import STL_MOCKS
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 ProxResourceHelper
46 class TestCoreTuple(unittest.TestCase):
48 def test___init__(self):
49 core_tuple = CoreSocketTuple('core 5s6')
50 self.assertEqual(core_tuple.core_id, 5)
51 self.assertEqual(core_tuple.socket_id, 6)
52 self.assertFalse(core_tuple.is_hyperthread())
54 core_tuple = CoreSocketTuple('core 5s6h')
55 self.assertEqual(core_tuple.core_id, 5)
56 self.assertEqual(core_tuple.socket_id, 6)
57 self.assertTrue(core_tuple.is_hyperthread())
59 def test___init__negative(self):
81 for bad_input in bad_inputs:
82 with self.assertRaises(ValueError):
83 CoreSocketTuple(bad_input)
85 def test_find_in_topology(self):
95 core_tuple = CoreSocketTuple('core 5s6')
98 result = core_tuple.find_in_topology(topology_in)
99 self.assertEqual(result, expected)
101 core_tuple = CoreSocketTuple('core 5s6h')
104 result = core_tuple.find_in_topology(topology_in)
105 self.assertEqual(result, expected)
107 def test_find_in_topology_negative(self):
108 core_tuple = CoreSocketTuple('core 6s5')
109 with self.assertRaises(ValueError):
111 core_tuple.find_in_topology({})
113 with self.assertRaises(ValueError):
115 core_tuple.find_in_topology({5: {}})
117 with self.assertRaises(ValueError):
118 # no first value (as needed by non-hyperthread core)
119 core_tuple.find_in_topology({5: {6: {'key1': []}}})
121 core_tuple = CoreSocketTuple('core 6s5h')
122 with self.assertRaises(ValueError):
123 # no second value (as needed by hyperthread core)
124 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
127 class TestTotStatsTuple(unittest.TestCase):
129 def test___new___negative(self):
130 with self.assertRaises(TypeError):
134 with self.assertRaises(TypeError):
135 # one, non-integer value
138 with self.assertRaises(TypeError):
140 TotStatsTuple(3, 4, 5, 6, 7)
143 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,
186 result = prox_test_data.get_samples(64)
187 self.assertDictEqual(result, expected)
190 "Throughput": 1.6 / 1e6,
191 "DropPackets": 0.123,
192 "CurrentDropPackets": 0.123,
193 "TxThroughput": 9 / 1e6,
194 "RxThroughput": 1.6 / 1e6,
200 result = prox_test_data.get_samples(64, 0.123)
201 self.assertDictEqual(result, expected)
203 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
204 def test_log_data(self, mock_logger):
205 my_mock_logger = mock.MagicMock()
206 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
207 prox_test_data.log_data()
208 self.assertEqual(my_mock_logger.debug.call_count, 0)
209 self.assertEqual(mock_logger.debug.call_count, 2)
211 mock_logger.debug.reset_mock()
212 prox_test_data.log_data(my_mock_logger)
213 self.assertEqual(my_mock_logger.debug.call_count, 2)
214 self.assertEqual(mock_logger.debug.call_count, 0)
217 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):
294 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
295 def test___init__(self, mock_socket, mock_time):
296 expected = mock_socket.socket()
297 prox = ProxSocketHelper()
299 self.assertEqual(result, expected)
301 def test_connect(self, mock_time):
302 mock_sock = mock.MagicMock()
303 prox = ProxSocketHelper(mock_sock)
304 prox.connect('10.20.30.40', 23456)
305 self.assertEqual(mock_sock.connect.call_count, 1)
307 def test_get_sock(self, mock_time):
308 mock_sock = mock.MagicMock()
309 prox = ProxSocketHelper(mock_sock)
310 result = prox.get_socket()
311 self.assertIs(result, mock_sock)
313 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
314 def test_get_data(self, mock_select, mock_time):
315 mock_select.select.side_effect = [[1], [0]]
316 mock_socket = mock.MagicMock()
317 mock_recv = mock_socket.recv()
318 mock_recv.decode.return_value = ""
319 prox = ProxSocketHelper(mock_socket)
320 ret = prox.get_data()
321 self.assertEqual(ret, "")
322 self.assertEqual(len(prox._pkt_dumps), 0)
324 mock_select.select.reset_mock()
325 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
326 mock_recv.decode.return_value = PACKET_DUMP_1
327 ret = prox.get_data()
328 self.assertEqual(mock_select.select.call_count, 2)
329 self.assertEqual(ret, 'pktdump,3,11')
330 self.assertEqual(len(prox._pkt_dumps), 1)
332 mock_select.select.reset_mock()
333 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
334 mock_recv.decode.return_value = PACKET_DUMP_2
335 ret = prox.get_data()
336 self.assertEqual(mock_select.select.call_count, 2)
337 self.assertEqual(ret, 'jumped over')
338 self.assertEqual(len(prox._pkt_dumps), 3)
340 def test__parse_socket_data_mixed_data(self, mock_time):
341 prox = ProxSocketHelper(mock.MagicMock())
342 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
343 self.assertEqual(ret, 'not_a_dump,1,2')
344 self.assertEqual(len(prox._pkt_dumps), 0)
346 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
347 self.assertEqual(ret, 'not_a_dump,1,2')
348 self.assertEqual(len(prox._pkt_dumps), 1)
350 def test__parse_socket_data_bad_data(self, mock_time):
351 prox = ProxSocketHelper(mock.MagicMock())
352 with self.assertRaises(ValueError):
353 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
355 with self.assertRaises(ValueError):
356 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
358 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
359 self.assertEqual(ret, 'pktdump,3')
361 def test__parse_socket_data_pkt_dump_only(self, mock_time):
362 prox = ProxSocketHelper(mock.MagicMock())
363 ret = prox._parse_socket_data('', True)
364 self.assertFalse(ret)
366 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
369 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
372 def test_put_command(self, mock_time):
373 mock_socket = mock.MagicMock()
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(self, mock_time):
508 mock_socket = mock.MagicMock()
509 prox = ProxSocketHelper(mock_socket)
510 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
511 expected = 3, 4, 5, 6
512 result = prox.get_all_tot_stats()
513 self.assertEqual(result, expected)
515 def test_hz(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')
521 self.assertEqual(result, expected)
523 def test_rx_stats(self, mock_time):
530 mock_socket = mock.MagicMock()
531 prox = ProxSocketHelper(mock_socket)
532 prox.get_data = mock.MagicMock(side_effect=core_stats)
533 expected = 21, 24, 27, 14
534 result = prox.rx_stats([3, 4, 5], 16)
535 self.assertEqual(result, expected)
537 def test_core_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.core_stats([3, 4, 5], 16)
549 self.assertEqual(result, expected)
551 def test_port_stats(self, mock_time):
553 ','.join(str(n) for n in range(3, 15)),
554 ','.join(str(n) for n in range(8, 32, 2)),
555 ','.join(str(n) for n in range(5, 89, 7)),
558 mock_socket = mock.MagicMock()
559 prox = ProxSocketHelper(mock_socket)
560 prox.get_data = mock.MagicMock(side_effect=port_stats)
561 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
562 result = prox.port_stats([3, 4, 5])
563 self.assertEqual(result, expected)
565 def test_measure_tot_stats(self, mock_time):
566 start_tot = 3, 4, 5, 6
567 end_tot = 7, 9, 11, 13
568 delta_tot = 4, 5, 6, 7
571 ','.join(str(n) for n in start_tot),
572 ','.join(str(n) for n in end_tot),
575 mock_socket = mock.MagicMock()
576 prox = ProxSocketHelper(mock_socket)
577 prox.get_data = mock.MagicMock(side_effect=get_data_output)
579 'start_tot': start_tot,
583 with prox.measure_tot_stats() as result:
585 self.assertEqual(result, expected)
587 def test_tot_stats(self, mock_time):
588 mock_socket = mock.MagicMock()
589 prox = ProxSocketHelper(mock_socket)
590 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
592 result = prox.tot_stats()
593 self.assertEqual(result, expected)
595 def test_tot_ierrors(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_ierrors()
601 self.assertEqual(result, expected)
603 def test_set_count(self, mock_time):
604 mock_socket = mock.MagicMock()
605 prox = ProxSocketHelper(mock_socket)
606 prox.set_count(432, [3, 4, 5])
607 self.assertEqual(mock_socket.sendall.call_count, 3)
609 def test_dump_rx(self, mock_time):
610 mock_socket = mock.MagicMock()
611 prox = ProxSocketHelper(mock_socket)
612 prox.dump_rx(3, 5, 8)
613 self.assertEqual(mock_socket.sendall.call_count, 1)
615 def test_quit(self, mock_time):
616 mock_socket = mock.MagicMock()
617 prox = ProxSocketHelper(mock_socket)
619 mock_socket.sendall.assert_called()
621 def test_force_quit(self, mock_time):
622 mock_socket = mock.MagicMock()
623 prox = ProxSocketHelper(mock_socket)
625 mock_socket.sendall.assert_called()
628 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
630 def test_rebind_drivers(self):
631 def find_drivers(*args, **kwargs):
632 setup_helper.used_drivers = used_drivers
639 vnfd_helper = mock.MagicMock()
640 ssh_helper = mock.MagicMock()
641 scenario_helper = mock.MagicMock()
642 setup_helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
643 setup_helper._find_used_drivers = mock_find = mock.MagicMock(side_effect=find_drivers)
645 setup_helper.rebind_drivers()
646 self.assertEqual(mock_find.call_count, 1)
647 self.assertEqual(ssh_helper.execute.call_count, 2)
648 self.assertIn('--force', ssh_helper.execute.call_args[0][0])
650 mock_find.reset_mock()
651 ssh_helper.execute.reset_mock()
652 setup_helper.rebind_drivers(False)
653 self.assertEqual(mock_find.call_count, 0)
654 self.assertEqual(ssh_helper.execute.call_count, 2)
655 self.assertNotIn('--force', ssh_helper.execute.call_args[0][0])
658 class TestProxResourceHelper(unittest.TestCase):
660 def test__replace_quoted_with_value(self):
664 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
665 self.assertEqual(result, expected)
667 # no quoted substring
668 input_str = 'lion tiger bear'
669 expected = 'lion tiger bear'
670 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
671 self.assertEqual(result, expected)
673 # partially quoted substring
674 input_str = 'lion "tiger bear'
675 expected = 'lion "tiger bear'
676 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
677 self.assertEqual(result, expected)
679 # one quoted substring
680 input_str = 'lion "tiger" bear'
681 expected = 'lion "cat" bear'
682 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
683 self.assertEqual(result, expected)
685 # two quoted substrings
686 input_str = 'lion "tiger" bear "shark" whale'
687 expected = 'lion "cat" bear "shark" whale'
688 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
689 self.assertEqual(result, expected)
691 # two quoted substrings, both replaced
692 input_str = 'lion "tiger" bear "shark" whale'
693 expected = 'lion "cat" bear "cat" whale'
694 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat', 2)
695 self.assertEqual(result, expected)
697 def test__get_tx_port(self):
699 input_data = {'section1': []}
701 result = ProxResourceHelper._get_tx_port('section1', input_data)
702 self.assertEqual(result, expected)
704 # data for other section
713 result = ProxResourceHelper._get_tx_port('section1', input_data)
714 self.assertEqual(result, expected)
717 input_data['section1'] = section1 = [
718 ('rx port', '4', 'more', 432),
722 result = ProxResourceHelper._get_tx_port('section1', input_data)
723 self.assertEqual(result, expected)
725 # more data for section,
728 ('tx port', '1', 'and more', 234),
731 result = ProxResourceHelper._get_tx_port('section1', input_data)
732 self.assertEqual(result, expected)
734 def test_line_rate_to_pps(self):
735 expected = 0.25 * 1e8
736 result = ProxResourceHelper.line_rate_to_pps(180, 4)
737 self.assertEqual(result, expected)
739 def test_find_pci(self):
745 result = ProxResourceHelper.find_pci('target', input_str_list)
746 self.assertFalse(result)
754 result = ProxResourceHelper.find_pci('target', input_str_list)
755 self.assertTrue(result)
757 def test_write_prox_config(self):
760 result = ProxResourceHelper.write_prox_config(input_data)
761 self.assertEqual(result, expected)
766 expected = '[section1]'
767 result = ProxResourceHelper.write_prox_config(input_data)
768 self.assertEqual(result, expected)
770 input_data = OrderedDict([
775 ('__name__', 'not this one'),
778 ('key4', 'multi-line\nvalue'),
782 expected = os.linesep.join([
788 'key4=multi-line\n\tvalue',
790 result = ProxResourceHelper.write_prox_config(input_data)
791 self.assertEqual(result, expected)
794 helper = ProxResourceHelper(mock.MagicMock())
795 self.assertIsNone(helper.client)
797 self.assertIsNotNone(result)
798 self.assertIs(result, helper.client)
799 self.assertIs(result, helper.sut)
801 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
802 def test_cpu_topology(self, mock_socket_topology):
803 mock_socket_topology.parse_cpuinfo.return_value = 432
805 setup_helper = mock.MagicMock()
806 setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
808 helper = ProxResourceHelper(setup_helper)
809 self.assertIsNone(helper._cpu_topology)
810 result = helper.cpu_topology
811 self.assertEqual(result, 432)
812 self.assertIs(result, helper._cpu_topology)
813 self.assertIs(result, helper.cpu_topology)
815 def test_vpci_to_if_name_map(self):
816 setup_helper = mock.MagicMock()
817 setup_helper.vnfd_helper.interfaces = []
819 helper = ProxResourceHelper(setup_helper)
820 self.assertIsNone(helper._vpci_to_if_name_map)
821 result = helper.vpci_to_if_name_map
822 self.assertEqual(result, {})
823 self.assertIs(result, helper._vpci_to_if_name_map)
824 self.assertIs(result, helper.vpci_to_if_name_map)
826 setup_helper.vnfd_helper.interfaces = [
829 'virtual-interface': {
830 'vpci': '0000:01.02.03',
835 'virtual-interface': {
836 'vpci': '0000:04.05.06',
841 '0000:01.02.03': 'vnf1',
842 '0000:04.05.06': 'vnf2',
844 helper = ProxResourceHelper(setup_helper)
845 self.assertIsNone(helper._vpci_to_if_name_map)
846 result = helper.vpci_to_if_name_map
847 self.assertDictEqual(result, expected)
848 self.assertIs(result, helper._vpci_to_if_name_map)
849 self.assertIs(result, helper.vpci_to_if_name_map)
851 def test_test_cores(self):
852 setup_helper = mock.MagicMock()
853 helper = ProxResourceHelper(setup_helper)
854 helper.prox_config_dict = {}
855 helper._cpu_topology = []
858 result = helper.test_cores
859 self.assertEqual(result, expected)
861 helper = ProxResourceHelper(setup_helper)
862 helper.prox_config_dict = OrderedDict([
882 helper._cpu_topology = {
899 self.assertIsNone(helper._test_cores)
901 result = helper.test_cores
902 self.assertEqual(result, expected)
903 self.assertIs(result, helper._test_cores)
904 self.assertIs(result, helper.test_cores)
906 def test_latency_cores(self):
907 setup_helper = mock.MagicMock()
908 helper = ProxResourceHelper(setup_helper)
909 helper.prox_config_dict = {}
910 helper._cpu_topology = []
913 result = helper.latency_cores
914 self.assertEqual(result, expected)
916 helper = ProxResourceHelper(setup_helper)
917 helper.prox_config_dict = OrderedDict([
937 helper._cpu_topology = {
954 self.assertIsNone(helper._latency_cores)
956 result = helper.latency_cores
957 self.assertEqual(result, expected)
958 self.assertIs(result, helper._latency_cores)
959 self.assertIs(result, helper.latency_cores)
961 def test_start_collect(self):
962 setup_helper = mock.MagicMock()
963 helper = ProxResourceHelper(setup_helper)
964 self.assertIsNone(helper.start_collect())
966 def test_terminate(self):
967 setup_helper = mock.MagicMock()
968 helper = ProxResourceHelper(setup_helper)
969 self.assertIsNone(helper.terminate())
971 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
972 def test_get_process_args_no_additional_file(self, mock_find_path):
976 'prox_config': 'e/f',
979 mock_find_path.side_effect = ['1', '2']
980 setup_helper = mock.MagicMock()
981 setup_helper.scenario_helper = ScenarioHelper('vnf1')
982 setup_helper.scenario_helper.scenario_cfg = {
989 helper = ProxResourceHelper(setup_helper)
990 helper.copy_to_target = mock.MagicMock(return_value='3')
991 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
992 helper.upload_prox_config = mock.MagicMock(return_value='5')
994 expected = 'c', 'd', '5'
995 result = helper.get_process_args()
996 self.assertEqual(result, expected)
997 self.assertFalse(helper.additional_file)
998 self.assertIsNone(helper.remote_prox_file_name)
1000 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1001 def test_get_process_args_additional_file(self, mock_find_path):
1005 'prox_config': 'e/f',
1006 'prox_files': 'g/h',
1009 mock_find_path.side_effect = ['1', '2']
1010 setup_helper = mock.MagicMock()
1011 setup_helper.scenario_helper = ScenarioHelper('vnf1')
1012 setup_helper.scenario_helper.scenario_cfg = {
1019 helper = ProxResourceHelper(setup_helper)
1020 helper.copy_to_target = mock.MagicMock(return_value='33')
1021 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1022 helper.upload_prox_config = mock.MagicMock(return_value='55')
1024 expected = 'c', 'd', '55'
1025 result = helper.get_process_args()
1026 self.assertEqual(result, expected)
1027 self.assertTrue(helper.additional_file)
1028 self.assertEqual(helper.remote_prox_file_name, '33')
1030 def test_up_post(self):
1031 setup_helper = mock.MagicMock()
1032 helper = ProxResourceHelper(setup_helper)
1033 helper.client = expected = mock.MagicMock()
1034 result = helper.up_post()
1035 self.assertEqual(result, expected)
1037 def test_execute(self):
1038 setup_helper = mock.MagicMock()
1039 helper = ProxResourceHelper(setup_helper)
1040 helper.client = mock.MagicMock()
1042 expected = helper.client.my_command()
1043 result = helper.execute('my_command')
1044 self.assertEqual(result, expected)
1046 helper.client = object()
1048 result = helper.execute('my_command')
1049 self.assertIsNone(result)
1051 def test_copy_to_target(self):
1052 setup_helper = mock.MagicMock()
1053 helper = ProxResourceHelper(setup_helper)
1055 result = helper.copy_to_target('a/b', 'c')
1056 self.assertEqual(result, expected)
1058 def test_upload_prox_config(self):
1059 setup_helper = mock.MagicMock()
1060 helper = ProxResourceHelper(setup_helper)
1061 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1063 result = helper.upload_prox_config('a', {})
1064 self.assertEqual(result, expected)
1066 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1067 def test_run_test(self, mock_time):
1069 def measure(*args, **kwargs):
1072 setup_helper = mock.MagicMock()
1073 setup_helper.vnfd_helper.interfaces = []
1076 'delta': TotStatsTuple(6, 7, 8, 9),
1079 client = mock.MagicMock()
1080 client.hz.return_value = 2
1081 client.measure_tot_stats = measure
1082 client.port_stats.return_value = tuple(range(12))
1084 helper = ProxResourceHelper(setup_helper)
1085 helper.client = client
1086 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1088 with self.assertRaises(AssertionError):
1089 helper.run_test(980, 15, 45)
1091 setup_helper.vnfd_helper.interfaces = ['a', 'b', 'c', 'd']
1092 helper._test_cores = [3, 4]
1094 expected = ProxTestDataTuple(0.0, 2.0, 6, 7, 8, [3.3, 3.6, 3.8], 6, 7, 1.3e7)
1095 result = helper.run_test(230, 60, 65)
1096 self.assertEqual(result, expected)
1098 def test_generate_prox_lua_file(self):
1099 setup_helper = mock.MagicMock()
1100 setup_helper.vnfd_helper.interfaces = []
1102 helper = ProxResourceHelper(setup_helper)
1103 helper.LUA_PARAMETER_NAME = 'sut'
1106 result = helper.generate_prox_lua_file()
1107 self.assertEqual(result, expected)
1109 setup_helper.vnfd_helper.interfaces = [
1111 'local_ip': '10.20.30.40',
1112 'dst_ip': '10.11.12.13',
1113 'virtual-interface': {
1118 'local_ip': '10.20.30.45',
1119 'dst_ip': '10.11.12.19',
1120 'virtual-interface': {
1126 expected = os.linesep.join([
1127 'sut_hex_ip_port_3:"0a 14 1e 28"',
1128 'sut_ip_port_3:"10.20.30.40"',
1129 'gen_hex_ip_port_3:"0a 0b 0c 0d"',
1130 'gen_ip_port_3:"10.11.12.13"',
1132 'sut_hex_ip_port_7:"0a 14 1e 2d"',
1133 'sut_ip_port_7:"10.20.30.45"',
1134 'gen_hex_ip_port_7:"0a 0b 0c 13"',
1135 'gen_ip_port_7:"10.11.12.19"',
1137 result = helper.generate_prox_lua_file()
1138 self.assertEqual(result, expected)
1140 def test_upload_prox_lua(self):
1141 def identity(*args):
1144 setup_helper = mock.MagicMock()
1145 setup_helper.vnfd_helper.interfaces = []
1147 helper = ProxResourceHelper(setup_helper)
1148 helper.generate_prox_lua_file = mock.MagicMock(return_value=234)
1149 helper.put_string_to_file = identity
1152 result = helper.upload_prox_lua('my_dir', {})
1153 self.assertEqual(result, expected)
1157 'key1': 'value1 ("inside") tail',
1159 'key3 ("key_side") head': 'value3',
1163 expected = 234, 'my_dir/key_side'
1164 result = helper.upload_prox_lua('my_dir', input_data)
1165 self.assertEqual(result, expected)
1167 def test_put_string_to_file(self):
1168 setup_helper = mock.MagicMock()
1169 setup_helper.vnfd_helper.interfaces = []
1171 helper = ProxResourceHelper(setup_helper)
1174 result = helper.put_string_to_file('my long string', 'a/b')
1175 self.assertEqual(result, expected)
1177 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1178 def test_generate_prox_config_file(self, mock_parser_type):
1180 args[-1].update(sections_data)
1181 return mock.MagicMock()
1185 mock_parser_type.side_effect = init
1187 setup_helper = mock.MagicMock()
1188 setup_helper.vnfd_helper.interfaces = []
1190 helper = ProxResourceHelper(setup_helper)
1191 helper.additional_file = False
1194 result = helper.generate_prox_config_file('a/b')
1195 self.assertEqual(result, expected)
1197 helper.additional_file = True
1198 helper.remote_prox_file_name = 'remote'
1199 setup_helper.vnfd_helper.interfaces = [
1201 'virtual-interface': {
1203 'dst_mac': '00:00:00:de:ad:88',
1207 'virtual-interface': {
1209 'dst_mac': '00:00:00:de:ad:ff',
1213 'virtual-interface': {
1215 'dst_mac': '00:00:00:de:ad:ff',
1231 ['???', 'dofile "here" 23'],
1238 ['mac', 'hardware'],
1239 ['dst mac', '00:00:00:de:ad:ff'],
1244 ['dst mac', '00:00:00:de:ad:88'],
1247 ['???', 'dofile "remote" 23'],
1250 result = helper.generate_prox_config_file('a/b')
1251 self.assertDictEqual(result, expected)
1253 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1254 def test_generate_prox_config_file_negative(self, mock_parser_type):
1256 args[-1].update(sections_data)
1257 return mock.MagicMock()
1261 mock_parser_type.side_effect = init
1263 setup_helper = mock.MagicMock()
1264 setup_helper.vnfd_helper.interfaces = []
1266 helper = ProxResourceHelper(setup_helper)
1267 helper.additional_file = False
1268 helper.remote_prox_file_name = 'remote'
1269 setup_helper.vnfd_helper.interfaces = [
1271 'virtual-interface': {
1273 'dst_mac': '00:00:00:de:ad:88',
1277 'virtual-interface': {
1279 'dst_mac': '00:00:00:de:ad:ff',
1283 'virtual-interface': {
1285 'dst_mac': '00:00:00:de:ad:ff',
1299 ['???', 'dofile "here" 23'],
1303 with self.assertRaises(Exception):
1304 helper.generate_prox_config_file('a/b')
1306 def test_get_latency(self):
1307 setup_helper = mock.MagicMock()
1308 setup_helper.vnfd_helper.interfaces = []
1310 helper = ProxResourceHelper(setup_helper)
1311 helper._latency_cores = []
1314 result = helper.get_latency()
1315 self.assertEqual(result, expected)
1317 helper._latency_cores = [1, 2]
1318 helper.client = mock.MagicMock()
1320 expected = helper.sut.lat_stats()
1321 result = helper.get_latency()
1322 self.assertIs(result, expected)
1324 def test__get_logical_if_name(self):
1325 setup_helper = mock.MagicMock()
1326 setup_helper.vnfd_helper.interfaces = []
1328 helper = ProxResourceHelper(setup_helper)
1329 helper._vpci_to_if_name_map = {
1335 result = helper._get_logical_if_name('key1')
1336 self.assertEqual(result, expected)
1338 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1339 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1340 def test__connect(self, mock_socket_helper_type, mock_time):
1341 client = mock_socket_helper_type()
1342 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1344 setup_helper = mock.MagicMock()
1345 setup_helper.vnfd_helper.interfaces = []
1347 helper = ProxResourceHelper(setup_helper)
1349 result = helper._connect()
1350 self.assertIs(result, client)
1352 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1354 with self.assertRaises(Exception):