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
31 'stl': mock.MagicMock(),
32 'stl.trex_stl_lib': mock.MagicMock(),
33 'stl.trex_stl_lib.base64': mock.MagicMock(),
34 'stl.trex_stl_lib.binascii': mock.MagicMock(),
35 'stl.trex_stl_lib.collections': mock.MagicMock(),
36 'stl.trex_stl_lib.copy': mock.MagicMock(),
37 'stl.trex_stl_lib.datetime': mock.MagicMock(),
38 'stl.trex_stl_lib.functools': mock.MagicMock(),
39 'stl.trex_stl_lib.imp': mock.MagicMock(),
40 'stl.trex_stl_lib.inspect': mock.MagicMock(),
41 'stl.trex_stl_lib.json': mock.MagicMock(),
42 'stl.trex_stl_lib.linecache': mock.MagicMock(),
43 'stl.trex_stl_lib.math': mock.MagicMock(),
44 'stl.trex_stl_lib.os': mock.MagicMock(),
45 'stl.trex_stl_lib.platform': mock.MagicMock(),
46 'stl.trex_stl_lib.pprint': mock.MagicMock(),
47 'stl.trex_stl_lib.random': mock.MagicMock(),
48 'stl.trex_stl_lib.re': mock.MagicMock(),
49 'stl.trex_stl_lib.scapy': mock.MagicMock(),
50 'stl.trex_stl_lib.socket': mock.MagicMock(),
51 'stl.trex_stl_lib.string': mock.MagicMock(),
52 'stl.trex_stl_lib.struct': mock.MagicMock(),
53 'stl.trex_stl_lib.sys': mock.MagicMock(),
54 'stl.trex_stl_lib.threading': mock.MagicMock(),
55 'stl.trex_stl_lib.time': mock.MagicMock(),
56 'stl.trex_stl_lib.traceback': mock.MagicMock(),
57 'stl.trex_stl_lib.trex_stl_async_client': mock.MagicMock(),
58 'stl.trex_stl_lib.trex_stl_client': mock.MagicMock(),
59 'stl.trex_stl_lib.trex_stl_exceptions': mock.MagicMock(),
60 'stl.trex_stl_lib.trex_stl_ext': mock.MagicMock(),
61 'stl.trex_stl_lib.trex_stl_jsonrpc_client': mock.MagicMock(),
62 'stl.trex_stl_lib.trex_stl_packet_builder_interface': mock.MagicMock(),
63 'stl.trex_stl_lib.trex_stl_packet_builder_scapy': mock.MagicMock(),
64 'stl.trex_stl_lib.trex_stl_port': mock.MagicMock(),
65 'stl.trex_stl_lib.trex_stl_stats': mock.MagicMock(),
66 'stl.trex_stl_lib.trex_stl_streams': mock.MagicMock(),
67 'stl.trex_stl_lib.trex_stl_types': mock.MagicMock(),
68 'stl.trex_stl_lib.types': mock.MagicMock(),
69 'stl.trex_stl_lib.utils': mock.MagicMock(),
70 'stl.trex_stl_lib.utils.argparse': mock.MagicMock(),
71 'stl.trex_stl_lib.utils.collections': mock.MagicMock(),
72 'stl.trex_stl_lib.utils.common': mock.MagicMock(),
73 'stl.trex_stl_lib.utils.json': mock.MagicMock(),
74 'stl.trex_stl_lib.utils.os': mock.MagicMock(),
75 'stl.trex_stl_lib.utils.parsing_opts': mock.MagicMock(),
76 'stl.trex_stl_lib.utils.pwd': mock.MagicMock(),
77 'stl.trex_stl_lib.utils.random': mock.MagicMock(),
78 'stl.trex_stl_lib.utils.re': mock.MagicMock(),
79 'stl.trex_stl_lib.utils.string': mock.MagicMock(),
80 'stl.trex_stl_lib.utils.sys': mock.MagicMock(),
81 'stl.trex_stl_lib.utils.text_opts': mock.MagicMock(),
82 'stl.trex_stl_lib.utils.text_tables': mock.MagicMock(),
83 'stl.trex_stl_lib.utils.texttable': mock.MagicMock(),
84 'stl.trex_stl_lib.warnings': mock.MagicMock(),
85 'stl.trex_stl_lib.yaml': mock.MagicMock(),
86 'stl.trex_stl_lib.zlib': mock.MagicMock(),
87 'stl.trex_stl_lib.zmq': mock.MagicMock(),
90 STLClient = mock.MagicMock()
91 stl_patch = mock.patch.dict("sys.modules", STL_MOCKS)
95 from yardstick.network_services.vnf_generic.vnf.sample_vnf import ScenarioHelper
96 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxSocketHelper
97 from yardstick.network_services.vnf_generic.vnf.prox_helpers import PacketDump
98 from yardstick.network_services.vnf_generic.vnf.prox_helpers import CoreSocketTuple
99 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxTestDataTuple
100 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxDpdkVnfSetupEnvHelper
101 from yardstick.network_services.vnf_generic.vnf.prox_helpers import TotStatsTuple
102 from yardstick.network_services.vnf_generic.vnf.prox_helpers import ProxResourceHelper
105 class TestCoreTuple(unittest.TestCase):
107 def test___init__(self):
108 core_tuple = CoreSocketTuple('core 5s6')
109 self.assertEqual(core_tuple.core_id, 5)
110 self.assertEqual(core_tuple.socket_id, 6)
111 self.assertFalse(core_tuple.is_hyperthread())
113 core_tuple = CoreSocketTuple('core 5s6h')
114 self.assertEqual(core_tuple.core_id, 5)
115 self.assertEqual(core_tuple.socket_id, 6)
116 self.assertTrue(core_tuple.is_hyperthread())
118 def test___init__negative(self):
140 for bad_input in bad_inputs:
141 with self.assertRaises(ValueError):
142 CoreSocketTuple(bad_input)
144 def test_find_in_topology(self):
154 core_tuple = CoreSocketTuple('core 5s6')
157 result = core_tuple.find_in_topology(topology_in)
158 self.assertEqual(result, expected)
160 core_tuple = CoreSocketTuple('core 5s6h')
163 result = core_tuple.find_in_topology(topology_in)
164 self.assertEqual(result, expected)
166 def test_find_in_topology_negative(self):
167 core_tuple = CoreSocketTuple('core 6s5')
168 with self.assertRaises(ValueError):
170 core_tuple.find_in_topology({})
172 with self.assertRaises(ValueError):
174 core_tuple.find_in_topology({5: {}})
176 with self.assertRaises(ValueError):
177 # no first value (as needed by non-hyperthread core)
178 core_tuple.find_in_topology({5: {6: {'key1': []}}})
180 core_tuple = CoreSocketTuple('core 6s5h')
181 with self.assertRaises(ValueError):
182 # no second value (as needed by hyperthread core)
183 core_tuple.find_in_topology({5: {6: {'key1': ['e']}}})
186 class TestTotStatsTuple(unittest.TestCase):
188 def test___new___negative(self):
189 with self.assertRaises(TypeError):
193 with self.assertRaises(TypeError):
194 # one, non-integer value
197 with self.assertRaises(TypeError):
199 TotStatsTuple(3, 4, 5, 6, 7)
202 class TestProxTestDataTuple(unittest.TestCase):
204 def test___init__(self):
205 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
206 self.assertEqual(prox_test_data.tolerated, 1)
207 self.assertEqual(prox_test_data.tsc_hz, 2)
208 self.assertEqual(prox_test_data.delta_rx, 3)
209 self.assertEqual(prox_test_data.delta_tx, 4)
210 self.assertEqual(prox_test_data.delta_tsc, 5)
211 self.assertEqual(prox_test_data.latency, 6)
212 self.assertEqual(prox_test_data.rx_total, 7)
213 self.assertEqual(prox_test_data.tx_total, 8)
214 self.assertEqual(prox_test_data.pps, 9)
216 def test_properties(self):
217 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 8, 9)
218 self.assertEqual(prox_test_data.pkt_loss, 12.5)
219 self.assertEqual(prox_test_data.mpps, 1.6 / 1e6)
220 self.assertEqual(prox_test_data.can_be_lost, 0)
221 self.assertEqual(prox_test_data.drop_total, 1)
222 self.assertFalse(prox_test_data.success)
224 prox_test_data = ProxTestDataTuple(10, 2, 3, 4, 5, 6, 997, 998, 9)
225 self.assertTrue(prox_test_data.success)
227 def test_pkt_loss_zero_division(self):
228 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, 6, 7, 0, 9)
229 self.assertEqual(prox_test_data.pkt_loss, 100.0)
231 def test_get_samples(self):
232 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
235 "Throughput": 1.6 / 1e6,
237 "CurrentDropPackets": 12.5,
238 "TxThroughput": 9 / 1e6,
239 "RxThroughput": 1.6 / 1e6,
245 result = prox_test_data.get_samples(64)
246 self.assertDictEqual(result, expected)
249 "Throughput": 1.6 / 1e6,
250 "DropPackets": 0.123,
251 "CurrentDropPackets": 0.123,
252 "TxThroughput": 9 / 1e6,
253 "RxThroughput": 1.6 / 1e6,
259 result = prox_test_data.get_samples(64, 0.123)
260 self.assertDictEqual(result, expected)
262 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.LOG')
263 def test_log_data(self, mock_logger):
264 my_mock_logger = mock.MagicMock()
265 prox_test_data = ProxTestDataTuple(1, 2, 3, 4, 5, [6.1, 6.9, 6.4], 7, 8, 9)
266 prox_test_data.log_data()
267 self.assertEqual(my_mock_logger.debug.call_count, 0)
268 self.assertEqual(mock_logger.debug.call_count, 2)
270 mock_logger.debug.reset_mock()
271 prox_test_data.log_data(my_mock_logger)
272 self.assertEqual(my_mock_logger.debug.call_count, 2)
273 self.assertEqual(mock_logger.debug.call_count, 0)
276 class TestPacketDump(unittest.TestCase):
280 def test__init__(self):
281 PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
283 def test___str__(self):
284 expected = '<PacketDump port: port_id payload: {}>'.format(self.PAYLOAD)
285 dump1 = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
286 self.assertEqual(str(dump1), expected)
288 def test_port_id(self):
289 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
290 self.assertEqual(p.port_id, "port_id")
292 def test_data_len(self):
293 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
294 self.assertEqual(p.data_len, len(self.PAYLOAD))
296 def test_payload(self):
297 p = PacketDump("port_id", len(self.PAYLOAD), self.PAYLOAD)
298 self.assertEqual(p.payload(), self.PAYLOAD)
300 self.assertEqual(p.payload(3), self.PAYLOAD[3:])
302 self.assertEqual(p.payload(end=3), self.PAYLOAD[:4])
304 self.assertEqual(p.payload(2, 4), self.PAYLOAD[2:5])
316 brown fox jumped over
322 PACKET_DUMP_NON_1 = """\
327 PACKET_DUMP_MIXED_1 = """\
334 PACKET_DUMP_BAD_1 = """\
339 PACKET_DUMP_BAD_2 = """\
344 PACKET_DUMP_BAD_3 = """\
350 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
351 class TestProxSocketHelper(unittest.TestCase):
353 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.socket')
354 def test___init__(self, mock_socket, mock_time):
355 expected = mock_socket.socket()
356 prox = ProxSocketHelper()
358 self.assertEqual(result, expected)
360 def test_connect(self, mock_time):
361 mock_sock = mock.MagicMock()
362 prox = ProxSocketHelper(mock_sock)
363 prox.connect('10.20.30.40', 23456)
364 self.assertEqual(mock_sock.connect.call_count, 1)
366 def test_get_sock(self, mock_time):
367 mock_sock = mock.MagicMock()
368 prox = ProxSocketHelper(mock_sock)
369 result = prox.get_socket()
370 self.assertIs(result, mock_sock)
372 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.select')
373 def test_get_data(self, mock_select, mock_time):
374 mock_select.select.side_effect = [[1], [0]]
375 mock_socket = mock.MagicMock()
376 mock_recv = mock_socket.recv()
377 mock_recv.decode.return_value = ""
378 prox = ProxSocketHelper(mock_socket)
379 ret = prox.get_data()
380 self.assertEqual(ret, "")
381 self.assertEqual(len(prox._pkt_dumps), 0)
383 mock_select.select.reset_mock()
384 mock_select.select.side_effect = chain([['a'], ['']], repeat([1], 3))
385 mock_recv.decode.return_value = PACKET_DUMP_1
386 ret = prox.get_data()
387 self.assertEqual(mock_select.select.call_count, 2)
388 self.assertEqual(ret, 'pktdump,3,11')
389 self.assertEqual(len(prox._pkt_dumps), 1)
391 mock_select.select.reset_mock()
392 mock_select.select.side_effect = chain([[object()], [None]], repeat([1], 3))
393 mock_recv.decode.return_value = PACKET_DUMP_2
394 ret = prox.get_data()
395 self.assertEqual(mock_select.select.call_count, 2)
396 self.assertEqual(ret, 'jumped over')
397 self.assertEqual(len(prox._pkt_dumps), 3)
399 def test__parse_socket_data_mixed_data(self, mock_time):
400 prox = ProxSocketHelper(mock.MagicMock())
401 ret = prox._parse_socket_data(PACKET_DUMP_NON_1, False)
402 self.assertEqual(ret, 'not_a_dump,1,2')
403 self.assertEqual(len(prox._pkt_dumps), 0)
405 ret = prox._parse_socket_data(PACKET_DUMP_MIXED_1, False)
406 self.assertEqual(ret, 'not_a_dump,1,2')
407 self.assertEqual(len(prox._pkt_dumps), 1)
409 def test__parse_socket_data_bad_data(self, mock_time):
410 prox = ProxSocketHelper(mock.MagicMock())
411 with self.assertRaises(ValueError):
412 prox._parse_socket_data(PACKET_DUMP_BAD_1, False)
414 with self.assertRaises(ValueError):
415 prox._parse_socket_data(PACKET_DUMP_BAD_2, False)
417 ret = prox._parse_socket_data(PACKET_DUMP_BAD_3, False)
418 self.assertEqual(ret, 'pktdump,3')
420 def test__parse_socket_data_pkt_dump_only(self, mock_time):
421 prox = ProxSocketHelper(mock.MagicMock())
422 ret = prox._parse_socket_data('', True)
423 self.assertFalse(ret)
425 ret = prox._parse_socket_data(PACKET_DUMP_1, True)
428 ret = prox._parse_socket_data(PACKET_DUMP_2, True)
431 def test_put_command(self, mock_time):
432 mock_socket = mock.MagicMock()
433 prox = ProxSocketHelper(mock_socket)
434 prox.put_command("data")
435 mock_socket.sendall.assert_called_once()
437 def test_get_packet_dump(self, mock_time):
438 mock_socket = mock.MagicMock()
439 prox = ProxSocketHelper(mock_socket)
441 self.assertIsNone(prox.get_packet_dump())
443 prox._pkt_dumps = [234]
444 self.assertEqual(prox.get_packet_dump(), 234)
445 self.assertEqual(prox._pkt_dumps, [])
447 def test_stop_all_reset(self, mock_time):
448 mock_socket = mock.MagicMock()
449 prox = ProxSocketHelper(mock_socket)
450 prox.stop_all_reset()
451 mock_socket.sendall.assert_called()
453 def test_stop_all(self, mock_time):
454 mock_socket = mock.MagicMock()
455 prox = ProxSocketHelper(mock_socket)
457 mock_socket.sendall.assert_called()
459 def test_stop(self, mock_time):
460 mock_socket = mock.MagicMock()
461 prox = ProxSocketHelper(mock_socket)
462 prox.stop([3, 4, 5], 16)
463 mock_socket.sendall.assert_called()
465 def test_start_all(self, mock_time):
466 mock_socket = mock.MagicMock()
467 prox = ProxSocketHelper(mock_socket)
469 mock_socket.sendall.assert_called()
471 def test_start(self, mock_time):
472 mock_socket = mock.MagicMock()
473 prox = ProxSocketHelper(mock_socket)
474 prox.start([3, 4, 5])
475 mock_socket.sendall.assert_called()
477 def test_reset_stats(self, mock_time):
478 mock_socket = mock.MagicMock()
479 prox = ProxSocketHelper(mock_socket)
481 mock_socket.sendall.assert_called()
483 def test_set_pkt_size(self, mock_time):
484 mock_socket = mock.MagicMock()
485 prox = ProxSocketHelper(mock_socket)
486 prox.set_pkt_size([3, 4, 5], 1024)
487 self.assertEqual(mock_socket.sendall.call_count, 3)
489 def test_set_value(self, mock_time):
490 mock_socket = mock.MagicMock()
491 prox = ProxSocketHelper(mock_socket)
492 prox.set_value([3, 4, 5], 10, 20, 30)
493 self.assertEqual(mock_socket.sendall.call_count, 3)
495 def test_reset_values(self, mock_time):
496 mock_socket = mock.MagicMock()
497 prox = ProxSocketHelper(mock_socket)
498 prox.reset_values([3, 4, 5])
499 self.assertEqual(mock_socket.sendall.call_count, 3)
501 def test_set_speed(self, mock_time):
502 mock_socket = mock.MagicMock()
503 prox = ProxSocketHelper(mock_socket)
504 prox.set_speed([3, 4, 5], 1000)
505 self.assertEqual(mock_socket.sendall.call_count, 3)
507 def test_slope_speed(self, mock_time):
514 'cores': [9, 10, 11],
519 mock_socket = mock.MagicMock()
520 prox = ProxSocketHelper(mock_socket)
521 prox.set_speed = set_speed = mock.MagicMock()
522 prox.slope_speed(core_data, 5)
523 self.assertEqual(set_speed.call_count, 20)
525 set_speed.reset_mock()
526 prox.slope_speed(core_data, 5, 5)
527 self.assertEqual(set_speed.call_count, 10)
529 def test_set_pps(self, mock_time):
530 mock_socket = mock.MagicMock()
531 prox = ProxSocketHelper(mock_socket)
532 prox.set_pps([3, 4, 5], 1000, 512)
533 self.assertEqual(mock_socket.sendall.call_count, 3)
535 def test_lat_stats(self, mock_time):
537 '1, 2 , 3', # has white space
539 '7,8,9,10.5,11', # too long with float, but float is in unused portion
540 'twelve,13,14', # value as English word
541 '15,16.2,17', # float in used portion
544 mock_socket = mock.MagicMock()
545 prox = ProxSocketHelper(mock_socket)
546 prox.get_data = mock.MagicMock(side_effect=latency_output)
562 result = prox.lat_stats([3, 4, 5, 6, 7], 16)
563 self.assertEqual(mock_socket.sendall.call_count, 5)
564 self.assertEqual(result, expected)
566 def test_get_all_tot_stats(self, mock_time):
567 mock_socket = mock.MagicMock()
568 prox = ProxSocketHelper(mock_socket)
569 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
570 expected = 3, 4, 5, 6
571 result = prox.get_all_tot_stats()
572 self.assertEqual(result, expected)
574 def test_hz(self, mock_time):
575 mock_socket = mock.MagicMock()
576 prox = ProxSocketHelper(mock_socket)
577 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
580 self.assertEqual(result, expected)
582 def test_rx_stats(self, mock_time):
589 mock_socket = mock.MagicMock()
590 prox = ProxSocketHelper(mock_socket)
591 prox.get_data = mock.MagicMock(side_effect=core_stats)
592 expected = 21, 24, 27, 14
593 result = prox.rx_stats([3, 4, 5], 16)
594 self.assertEqual(result, expected)
596 def test_core_stats(self, mock_time):
603 mock_socket = mock.MagicMock()
604 prox = ProxSocketHelper(mock_socket)
605 prox.get_data = mock.MagicMock(side_effect=core_stats)
606 expected = 21, 24, 27, 14
607 result = prox.core_stats([3, 4, 5], 16)
608 self.assertEqual(result, expected)
610 def test_port_stats(self, mock_time):
612 ','.join(str(n) for n in range(3, 15)),
613 ','.join(str(n) for n in range(8, 32, 2)),
614 ','.join(str(n) for n in range(5, 89, 7)),
617 mock_socket = mock.MagicMock()
618 prox = ProxSocketHelper(mock_socket)
619 prox.get_data = mock.MagicMock(side_effect=port_stats)
620 expected = [16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116, 126]
621 result = prox.port_stats([3, 4, 5])
622 self.assertEqual(result, expected)
624 def test_measure_tot_stats(self, mock_time):
625 start_tot = 3, 4, 5, 6
626 end_tot = 7, 9, 11, 13
627 delta_tot = 4, 5, 6, 7
630 ','.join(str(n) for n in start_tot),
631 ','.join(str(n) for n in end_tot),
634 mock_socket = mock.MagicMock()
635 prox = ProxSocketHelper(mock_socket)
636 prox.get_data = mock.MagicMock(side_effect=get_data_output)
638 'start_tot': start_tot,
642 with prox.measure_tot_stats() as result:
644 self.assertEqual(result, expected)
646 def test_tot_stats(self, mock_time):
647 mock_socket = mock.MagicMock()
648 prox = ProxSocketHelper(mock_socket)
649 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
651 result = prox.tot_stats()
652 self.assertEqual(result, expected)
654 def test_tot_ierrors(self, mock_time):
655 mock_socket = mock.MagicMock()
656 prox = ProxSocketHelper(mock_socket)
657 prox.get_data = mock.MagicMock(return_value='3,4,5,6')
659 result = prox.tot_ierrors()
660 self.assertEqual(result, expected)
662 def test_set_count(self, mock_time):
663 mock_socket = mock.MagicMock()
664 prox = ProxSocketHelper(mock_socket)
665 prox.set_count(432, [3, 4, 5])
666 self.assertEqual(mock_socket.sendall.call_count, 3)
668 def test_dump_rx(self, mock_time):
669 mock_socket = mock.MagicMock()
670 prox = ProxSocketHelper(mock_socket)
671 prox.dump_rx(3, 5, 8)
672 self.assertEqual(mock_socket.sendall.call_count, 1)
674 def test_quit(self, mock_time):
675 mock_socket = mock.MagicMock()
676 prox = ProxSocketHelper(mock_socket)
678 mock_socket.sendall.assert_called()
680 def test_force_quit(self, mock_time):
681 mock_socket = mock.MagicMock()
682 prox = ProxSocketHelper(mock_socket)
684 mock_socket.sendall.assert_called()
687 class TestProxDpdkVnfSetupEnvHelper(unittest.TestCase):
689 def test_rebind_drivers(self):
690 def find_drivers(*args, **kwargs):
691 setup_helper.used_drivers = used_drivers
698 vnfd_helper = mock.MagicMock()
699 ssh_helper = mock.MagicMock()
700 scenario_helper = mock.MagicMock()
701 setup_helper = ProxDpdkVnfSetupEnvHelper(vnfd_helper, ssh_helper, scenario_helper)
702 setup_helper._find_used_drivers = mock_find = mock.MagicMock(side_effect=find_drivers)
704 setup_helper.rebind_drivers()
705 self.assertEqual(mock_find.call_count, 1)
706 self.assertEqual(ssh_helper.execute.call_count, 2)
707 self.assertIn('--force', ssh_helper.execute.call_args[0][0])
709 mock_find.reset_mock()
710 ssh_helper.execute.reset_mock()
711 setup_helper.rebind_drivers(False)
712 self.assertEqual(mock_find.call_count, 0)
713 self.assertEqual(ssh_helper.execute.call_count, 2)
714 self.assertNotIn('--force', ssh_helper.execute.call_args[0][0])
717 class TestProxResourceHelper(unittest.TestCase):
719 def test__replace_quoted_with_value(self):
723 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
724 self.assertEqual(result, expected)
726 # no quoted substring
727 input_str = 'lion tiger bear'
728 expected = 'lion tiger bear'
729 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
730 self.assertEqual(result, expected)
732 # partially quoted substring
733 input_str = 'lion "tiger bear'
734 expected = 'lion "tiger bear'
735 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
736 self.assertEqual(result, expected)
738 # one quoted substring
739 input_str = 'lion "tiger" bear'
740 expected = 'lion "cat" bear'
741 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
742 self.assertEqual(result, expected)
744 # two quoted substrings
745 input_str = 'lion "tiger" bear "shark" whale'
746 expected = 'lion "cat" bear "shark" whale'
747 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat')
748 self.assertEqual(result, expected)
750 # two quoted substrings, both replaced
751 input_str = 'lion "tiger" bear "shark" whale'
752 expected = 'lion "cat" bear "cat" whale'
753 result = ProxResourceHelper._replace_quoted_with_value(input_str, 'cat', 2)
754 self.assertEqual(result, expected)
756 def test__get_tx_port(self):
758 input_data = {'section1': []}
760 result = ProxResourceHelper._get_tx_port('section1', input_data)
761 self.assertEqual(result, expected)
763 # data for other section
772 result = ProxResourceHelper._get_tx_port('section1', input_data)
773 self.assertEqual(result, expected)
776 input_data['section1'] = section1 = [
777 ('rx port', '4', 'more', 432),
781 result = ProxResourceHelper._get_tx_port('section1', input_data)
782 self.assertEqual(result, expected)
784 # more data for section,
787 ('tx port', '1', 'and more', 234),
790 result = ProxResourceHelper._get_tx_port('section1', input_data)
791 self.assertEqual(result, expected)
793 def test_line_rate_to_pps(self):
794 expected = 0.25 * 1e8
795 result = ProxResourceHelper.line_rate_to_pps(180, 4)
796 self.assertEqual(result, expected)
798 def test_find_pci(self):
804 result = ProxResourceHelper.find_pci('target', input_str_list)
805 self.assertFalse(result)
813 result = ProxResourceHelper.find_pci('target', input_str_list)
814 self.assertTrue(result)
816 def test_write_prox_config(self):
819 result = ProxResourceHelper.write_prox_config(input_data)
820 self.assertEqual(result, expected)
825 expected = '[section1]'
826 result = ProxResourceHelper.write_prox_config(input_data)
827 self.assertEqual(result, expected)
829 input_data = OrderedDict([
834 ('__name__', 'not this one'),
837 ('key4', 'multi-line\nvalue'),
841 expected = os.linesep.join([
847 'key4=multi-line\n\tvalue',
849 result = ProxResourceHelper.write_prox_config(input_data)
850 self.assertEqual(result, expected)
853 helper = ProxResourceHelper(mock.MagicMock())
854 self.assertIsNone(helper.client)
856 self.assertIsNotNone(result)
857 self.assertIs(result, helper.client)
858 self.assertIs(result, helper.sut)
860 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.SocketTopology')
861 def test_cpu_topology(self, mock_socket_topology):
862 mock_socket_topology.parse_cpuinfo.return_value = 432
864 setup_helper = mock.MagicMock()
865 setup_helper.ssh_helper.execute.return_value = 0, 'output', ''
867 helper = ProxResourceHelper(setup_helper)
868 self.assertIsNone(helper._cpu_topology)
869 result = helper.cpu_topology
870 self.assertEqual(result, 432)
871 self.assertIs(result, helper._cpu_topology)
872 self.assertIs(result, helper.cpu_topology)
874 def test_vpci_to_if_name_map(self):
875 setup_helper = mock.MagicMock()
876 setup_helper.vnfd_helper.interfaces = []
878 helper = ProxResourceHelper(setup_helper)
879 self.assertIsNone(helper._vpci_to_if_name_map)
880 result = helper.vpci_to_if_name_map
881 self.assertEqual(result, {})
882 self.assertIs(result, helper._vpci_to_if_name_map)
883 self.assertIs(result, helper.vpci_to_if_name_map)
885 setup_helper.vnfd_helper.interfaces = [
888 'virtual-interface': {
889 'vpci': '0000:01.02.03',
894 'virtual-interface': {
895 'vpci': '0000:04.05.06',
900 '0000:01.02.03': 'vnf1',
901 '0000:04.05.06': 'vnf2',
903 helper = ProxResourceHelper(setup_helper)
904 self.assertIsNone(helper._vpci_to_if_name_map)
905 result = helper.vpci_to_if_name_map
906 self.assertDictEqual(result, expected)
907 self.assertIs(result, helper._vpci_to_if_name_map)
908 self.assertIs(result, helper.vpci_to_if_name_map)
910 def test_test_cores(self):
911 setup_helper = mock.MagicMock()
912 helper = ProxResourceHelper(setup_helper)
913 helper.prox_config_dict = {}
914 helper._cpu_topology = []
917 result = helper.test_cores
918 self.assertEqual(result, expected)
920 helper = ProxResourceHelper(setup_helper)
921 helper.prox_config_dict = OrderedDict([
941 helper._cpu_topology = {
958 self.assertIsNone(helper._test_cores)
960 result = helper.test_cores
961 self.assertEqual(result, expected)
962 self.assertIs(result, helper._test_cores)
963 self.assertIs(result, helper.test_cores)
965 def test_latency_cores(self):
966 setup_helper = mock.MagicMock()
967 helper = ProxResourceHelper(setup_helper)
968 helper.prox_config_dict = {}
969 helper._cpu_topology = []
972 result = helper.latency_cores
973 self.assertEqual(result, expected)
975 helper = ProxResourceHelper(setup_helper)
976 helper.prox_config_dict = OrderedDict([
996 helper._cpu_topology = {
1013 self.assertIsNone(helper._latency_cores)
1015 result = helper.latency_cores
1016 self.assertEqual(result, expected)
1017 self.assertIs(result, helper._latency_cores)
1018 self.assertIs(result, helper.latency_cores)
1020 def test_start_collect(self):
1021 setup_helper = mock.MagicMock()
1022 helper = ProxResourceHelper(setup_helper)
1023 self.assertIsNone(helper.start_collect())
1025 def test_terminate(self):
1026 setup_helper = mock.MagicMock()
1027 helper = ProxResourceHelper(setup_helper)
1028 self.assertIsNone(helper.terminate())
1030 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1031 def test_get_process_args_no_additional_file(self, mock_find_path):
1035 'prox_config': 'e/f',
1038 mock_find_path.side_effect = ['1', '2']
1039 setup_helper = mock.MagicMock()
1040 setup_helper.scenario_helper = ScenarioHelper('vnf1')
1041 setup_helper.scenario_helper.scenario_cfg = {
1048 helper = ProxResourceHelper(setup_helper)
1049 helper.copy_to_target = mock.MagicMock(return_value='3')
1050 helper.generate_prox_config_file = mock.MagicMock(return_value='4')
1051 helper.upload_prox_config = mock.MagicMock(return_value='5')
1053 expected = 'c', 'd', '5'
1054 result = helper.get_process_args()
1055 self.assertEqual(result, expected)
1056 self.assertFalse(helper.additional_file)
1057 self.assertIsNone(helper.remote_prox_file_name)
1059 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.find_relative_file')
1060 def test_get_process_args_additional_file(self, mock_find_path):
1064 'prox_config': 'e/f',
1065 'prox_files': 'g/h',
1068 mock_find_path.side_effect = ['1', '2']
1069 setup_helper = mock.MagicMock()
1070 setup_helper.scenario_helper = ScenarioHelper('vnf1')
1071 setup_helper.scenario_helper.scenario_cfg = {
1078 helper = ProxResourceHelper(setup_helper)
1079 helper.copy_to_target = mock.MagicMock(return_value='33')
1080 helper.generate_prox_config_file = mock.MagicMock(return_value='44')
1081 helper.upload_prox_config = mock.MagicMock(return_value='55')
1083 expected = 'c', 'd', '55'
1084 result = helper.get_process_args()
1085 self.assertEqual(result, expected)
1086 self.assertTrue(helper.additional_file)
1087 self.assertEqual(helper.remote_prox_file_name, '33')
1089 def test_up_post(self):
1090 setup_helper = mock.MagicMock()
1091 helper = ProxResourceHelper(setup_helper)
1092 helper.client = expected = mock.MagicMock()
1093 result = helper.up_post()
1094 self.assertEqual(result, expected)
1096 def test_execute(self):
1097 setup_helper = mock.MagicMock()
1098 helper = ProxResourceHelper(setup_helper)
1099 helper.client = mock.MagicMock()
1101 expected = helper.client.my_command()
1102 result = helper.execute('my_command')
1103 self.assertEqual(result, expected)
1105 helper.client = object()
1107 result = helper.execute('my_command')
1108 self.assertIsNone(result)
1110 def test_copy_to_target(self):
1111 setup_helper = mock.MagicMock()
1112 helper = ProxResourceHelper(setup_helper)
1114 result = helper.copy_to_target('a/b', 'c')
1115 self.assertEqual(result, expected)
1117 def test_upload_prox_config(self):
1118 setup_helper = mock.MagicMock()
1119 helper = ProxResourceHelper(setup_helper)
1120 helper.write_prox_config = mock.MagicMock(return_value='a long string')
1122 result = helper.upload_prox_config('a', {})
1123 self.assertEqual(result, expected)
1125 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1126 def test_run_test(self, mock_time):
1128 def measure(*args, **kwargs):
1131 setup_helper = mock.MagicMock()
1132 setup_helper.vnfd_helper.interfaces = []
1135 'delta': TotStatsTuple(6, 7, 8, 9),
1138 client = mock.MagicMock()
1139 client.hz.return_value = 2
1140 client.measure_tot_stats = measure
1141 client.port_stats.return_value = tuple(range(12))
1143 helper = ProxResourceHelper(setup_helper)
1144 helper.client = client
1145 helper.get_latency = mock.MagicMock(return_value=[3.3, 3.6, 3.8])
1147 with self.assertRaises(AssertionError):
1148 helper.run_test(980, 15, 45)
1150 setup_helper.vnfd_helper.interfaces = ['a', 'b', 'c', 'd']
1151 helper._test_cores = [3, 4]
1153 expected = ProxTestDataTuple(0.0, 2.0, 6, 7, 8, [3.3, 3.6, 3.8], 6, 7, 1.3e7)
1154 result = helper.run_test(230, 60, 65)
1155 self.assertEqual(result, expected)
1157 def test_generate_prox_lua_file(self):
1158 setup_helper = mock.MagicMock()
1159 setup_helper.vnfd_helper.interfaces = []
1161 helper = ProxResourceHelper(setup_helper)
1162 helper.LUA_PARAMETER_NAME = 'sut'
1165 result = helper.generate_prox_lua_file()
1166 self.assertEqual(result, expected)
1168 setup_helper.vnfd_helper.interfaces = [
1170 'local_ip': '10.20.30.40',
1171 'dst_ip': '10.11.12.13',
1172 'virtual-interface': {
1177 'local_ip': '10.20.30.45',
1178 'dst_ip': '10.11.12.19',
1179 'virtual-interface': {
1185 expected = os.linesep.join([
1186 'sut_hex_ip_port_3:"0a 14 1e 28"',
1187 'sut_ip_port_3:"10.20.30.40"',
1188 'gen_hex_ip_port_3:"0a 0b 0c 0d"',
1189 'gen_ip_port_3:"10.11.12.13"',
1191 'sut_hex_ip_port_7:"0a 14 1e 2d"',
1192 'sut_ip_port_7:"10.20.30.45"',
1193 'gen_hex_ip_port_7:"0a 0b 0c 13"',
1194 'gen_ip_port_7:"10.11.12.19"',
1196 result = helper.generate_prox_lua_file()
1197 self.assertEqual(result, expected)
1199 def test_upload_prox_lua(self):
1200 def identity(*args):
1203 setup_helper = mock.MagicMock()
1204 setup_helper.vnfd_helper.interfaces = []
1206 helper = ProxResourceHelper(setup_helper)
1207 helper.generate_prox_lua_file = mock.MagicMock(return_value=234)
1208 helper.put_string_to_file = identity
1211 result = helper.upload_prox_lua('my_dir', {})
1212 self.assertEqual(result, expected)
1216 'key1': 'value1 ("inside") tail',
1218 'key3 ("key_side") head': 'value3',
1222 expected = 234, 'my_dir/key_side'
1223 result = helper.upload_prox_lua('my_dir', input_data)
1224 self.assertEqual(result, expected)
1226 def test_put_string_to_file(self):
1227 setup_helper = mock.MagicMock()
1228 setup_helper.vnfd_helper.interfaces = []
1230 helper = ProxResourceHelper(setup_helper)
1233 result = helper.put_string_to_file('my long string', 'a/b')
1234 self.assertEqual(result, expected)
1236 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1237 def test_generate_prox_config_file(self, mock_parser_type):
1239 args[-1].update(sections_data)
1240 return mock.MagicMock()
1244 mock_parser_type.side_effect = init
1246 setup_helper = mock.MagicMock()
1247 setup_helper.vnfd_helper.interfaces = []
1249 helper = ProxResourceHelper(setup_helper)
1250 helper.additional_file = False
1253 result = helper.generate_prox_config_file('a/b')
1254 self.assertEqual(result, expected)
1256 helper.additional_file = True
1257 helper.remote_prox_file_name = 'remote'
1258 setup_helper.vnfd_helper.interfaces = [
1260 'virtual-interface': {
1262 'dst_mac': '00:00:00:de:ad:88',
1266 'virtual-interface': {
1268 'dst_mac': '00:00:00:de:ad:ff',
1272 'virtual-interface': {
1274 'dst_mac': '00:00:00:de:ad:ff',
1290 ['???', 'dofile "here" 23'],
1297 ['mac', 'hardware'],
1298 ['dst mac', '00:00:00:de:ad:ff'],
1303 ['dst mac', '00:00:00:de:ad:88'],
1306 ['???', 'dofile "remote" 23'],
1309 result = helper.generate_prox_config_file('a/b')
1310 self.assertDictEqual(result, expected)
1312 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ConfigParser')
1313 def test_generate_prox_config_file_negative(self, mock_parser_type):
1315 args[-1].update(sections_data)
1316 return mock.MagicMock()
1320 mock_parser_type.side_effect = init
1322 setup_helper = mock.MagicMock()
1323 setup_helper.vnfd_helper.interfaces = []
1325 helper = ProxResourceHelper(setup_helper)
1326 helper.additional_file = False
1327 helper.remote_prox_file_name = 'remote'
1328 setup_helper.vnfd_helper.interfaces = [
1330 'virtual-interface': {
1332 'dst_mac': '00:00:00:de:ad:88',
1336 'virtual-interface': {
1338 'dst_mac': '00:00:00:de:ad:ff',
1342 'virtual-interface': {
1344 'dst_mac': '00:00:00:de:ad:ff',
1358 ['???', 'dofile "here" 23'],
1362 with self.assertRaises(Exception):
1363 helper.generate_prox_config_file('a/b')
1365 def test_get_latency(self):
1366 setup_helper = mock.MagicMock()
1367 setup_helper.vnfd_helper.interfaces = []
1369 helper = ProxResourceHelper(setup_helper)
1370 helper._latency_cores = []
1373 result = helper.get_latency()
1374 self.assertEqual(result, expected)
1376 helper._latency_cores = [1, 2]
1377 helper.client = mock.MagicMock()
1379 expected = helper.sut.lat_stats()
1380 result = helper.get_latency()
1381 self.assertIs(result, expected)
1383 def test__get_logical_if_name(self):
1384 setup_helper = mock.MagicMock()
1385 setup_helper.vnfd_helper.interfaces = []
1387 helper = ProxResourceHelper(setup_helper)
1388 helper._vpci_to_if_name_map = {
1394 result = helper._get_logical_if_name('key1')
1395 self.assertEqual(result, expected)
1397 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.time')
1398 @mock.patch('yardstick.network_services.vnf_generic.vnf.prox_helpers.ProxSocketHelper')
1399 def test__connect(self, mock_socket_helper_type, mock_time):
1400 client = mock_socket_helper_type()
1401 client.connect.side_effect = chain(repeat(socket.error, 5), [None])
1403 setup_helper = mock.MagicMock()
1404 setup_helper.vnfd_helper.interfaces = []
1406 helper = ProxResourceHelper(setup_helper)
1408 result = helper._connect()
1409 self.assertIs(result, client)
1411 client.connect.side_effect = chain(repeat(socket.error, 65), [None])
1413 with self.assertRaises(Exception):