Merge "Added test descriptors for vCMTS testcase"
[yardstick.git] / yardstick / tests / unit / network_services / vnf_generic / vnf / test_tg_vcmts_pktgen.py
1 # Copyright (c) 2019 Viosoft Corporation
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
6 #
7 #      http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 import unittest
16 import mock
17 import socket
18 import threading
19 import time
20 import os
21 import copy
22
23 from yardstick.benchmark.contexts import base as ctx_base
24 from yardstick.network_services.vnf_generic.vnf.base import VnfdHelper
25 from yardstick.network_services.vnf_generic.vnf import tg_vcmts_pktgen
26 from yardstick.common import exceptions
27
28
29 NAME = "tg__0"
30
31
32 class TestPktgenHelper(unittest.TestCase):
33
34     def test___init__(self):
35         pktgen_helper = tg_vcmts_pktgen.PktgenHelper("localhost", 23000)
36         self.assertEqual(pktgen_helper.host, "localhost")
37         self.assertEqual(pktgen_helper.port, 23000)
38         self.assertFalse(pktgen_helper.connected)
39
40     def _run_fake_server(self):
41         server_sock = socket.socket()
42         server_sock.bind(('localhost', 23000))
43         server_sock.listen(0)
44         client_socket, _ = server_sock.accept()
45         client_socket.close()
46         server_sock.close()
47
48     def test__connect(self):
49         pktgen_helper = tg_vcmts_pktgen.PktgenHelper("localhost", 23000)
50         self.assertFalse(pktgen_helper._connect())
51         server_thread = threading.Thread(target=self._run_fake_server)
52         server_thread.start()
53         time.sleep(0.5)
54         self.assertTrue(pktgen_helper._connect())
55         pktgen_helper._sock.close()
56         server_thread.join()
57
58     @mock.patch('yardstick.network_services.vnf_generic.vnf.tg_vcmts_pktgen.time')
59     def test_connect(self, *args):
60         pktgen_helper = tg_vcmts_pktgen.PktgenHelper("localhost", 23000)
61         pktgen_helper.connected = True
62         self.assertTrue(pktgen_helper.connect())
63         pktgen_helper.connected = False
64
65         pktgen_helper._connect = mock.MagicMock(return_value=True)
66         self.assertTrue(pktgen_helper.connect())
67         self.assertTrue(pktgen_helper.connected)
68
69         pktgen_helper = tg_vcmts_pktgen.PktgenHelper("localhost", 23000)
70         pktgen_helper._connect = mock.MagicMock(return_value=False)
71         self.assertFalse(pktgen_helper.connect())
72         self.assertFalse(pktgen_helper.connected)
73
74     def test_send_command(self):
75         pktgen_helper = tg_vcmts_pktgen.PktgenHelper("localhost", 23000)
76         self.assertFalse(pktgen_helper.send_command(""))
77
78         pktgen_helper.connected = True
79         pktgen_helper._sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
80         self.assertFalse(pktgen_helper.send_command(""))
81
82         pktgen_helper._sock = mock.MagicMock()
83         self.assertTrue(pktgen_helper.send_command(""))
84
85
86 class TestVcmtsPktgenSetupEnvHelper(unittest.TestCase):
87
88     PKTGEN_PARAMETERS = "export LUA_PATH=/vcmts/Pktgen.lua;"\
89                         "export CMK_PROC_FS=/host/proc;"\
90                         "  /pktgen-config/setup.sh 0 4 18:02.0 "\
91                         "18:02.1 18:02.2 18:02.3 00:00.0 00:00.0 "\
92                         "00:00.0 00:00.0 imix1_100cms_1ofdm.pcap "\
93                         "imix1_100cms_1ofdm.pcap imix1_100cms_1ofdm.pcap "\
94                         "imix1_100cms_1ofdm.pcap imix1_100cms_1ofdm.pcap "\
95                         "imix1_100cms_1ofdm.pcap imix1_100cms_1ofdm.pcap "\
96                         "imix1_100cms_1ofdm.pcap"
97
98     OPTIONS = {
99         "pktgen_values": "/tmp/pktgen_values.yaml",
100         "tg__0": {
101             "pktgen_id": 0
102         },
103         "vcmts_influxdb_ip": "10.80.5.150",
104         "vcmts_influxdb_port": 8086,
105         "vcmtsd_values": "/tmp/vcmtsd_values.yaml",
106         "vnf__0": {
107             "sg_id": 0,
108             "stream_dir": "us"
109         },
110         "vnf__1": {
111             "sg_id": 0,
112             "stream_dir": "ds"
113         }
114     }
115
116     def setUp(self):
117         vnfd_helper = VnfdHelper(
118             TestVcmtsPktgen.VNFD['vnfd:vnfd-catalog']['vnfd'][0])
119         ssh_helper = mock.Mock()
120         scenario_helper = mock.Mock()
121         scenario_helper.options = self.OPTIONS
122
123         self.setup_helper = tg_vcmts_pktgen.VcmtsPktgenSetupEnvHelper(
124             vnfd_helper, ssh_helper, scenario_helper)
125
126     def test_generate_pcap_filename(self):
127         pcap_file_name = self.setup_helper.generate_pcap_filename(\
128                             TestVcmtsPktgen.PKTGEN_POD_VALUES[0]['ports'][0])
129         self.assertEquals(pcap_file_name, "imix1_100cms_1ofdm.pcap")
130
131     def test_find_port_cfg(self):
132         port_cfg = self.setup_helper.find_port_cfg(\
133                 TestVcmtsPktgen.PKTGEN_POD_VALUES[0]['ports'], "port_0")
134         self.assertIsNotNone(port_cfg)
135
136         port_cfg = self.setup_helper.find_port_cfg(\
137                 TestVcmtsPktgen.PKTGEN_POD_VALUES[0]['ports'], "port_8")
138         self.assertIsNone(port_cfg)
139
140     def test_build_pktgen_parameters(self):
141         parameters = self.setup_helper.build_pktgen_parameters(
142             TestVcmtsPktgen.PKTGEN_POD_VALUES[0])
143         self.assertEquals(parameters, self.PKTGEN_PARAMETERS)
144
145     def test_start_pktgen(self):
146         self.setup_helper.ssh_helper = mock.MagicMock()
147         self.setup_helper.start_pktgen(TestVcmtsPktgen.PKTGEN_POD_VALUES[0])
148         self.setup_helper.ssh_helper.send_command.assert_called_with(
149             self.PKTGEN_PARAMETERS)
150
151     def test_setup_vnf_environment(self):
152         self.assertIsNone(self.setup_helper.setup_vnf_environment())
153
154 class TestVcmtsPktgen(unittest.TestCase):
155
156     VNFD = {'vnfd:vnfd-catalog':
157             {'vnfd':
158             [{
159             "benchmark": {
160                 "kpi": [
161                     "upstream/bits_per_second"
162                 ]
163             },
164             "connection-point": [
165                 {
166                     "name": "xe0",
167                     "type": "VPORT"
168                 },
169                 {
170                     "name": "xe1",
171                     "type": "VPORT"
172                 }
173             ],
174             "description": "vCMTS Pktgen Kubernetes",
175             "id": "VcmtsPktgen",
176             "mgmt-interface": {
177                 "ip": "192.168.24.150",
178                 "key_filename": "/tmp/yardstick_key-a3b663c2",
179                 "user": "root",
180                 "vdu-id": "vcmtspktgen-kubernetes"
181             },
182             "name": "vcmtspktgen",
183             "short-name": "vcmtspktgen",
184             "vdu": [
185                 {
186                     "description": "vCMTS Pktgen Kubernetes",
187                     "external-interface": [],
188                     "id": "vcmtspktgen-kubernetes",
189                     "name": "vcmtspktgen-kubernetes"
190                 }
191             ],
192             "vm-flavor": {
193                 "memory-mb": "4096",
194                 "vcpu-count": "4"
195             }
196         }]
197     }}
198
199     PKTGEN_POD_VALUES = [
200         {
201             "num_ports": "4",
202             "pktgen_id": "0",
203             "ports": [
204                 {
205                     "net_pktgen": "18:02.0",
206                     "num_ofdm": "1",
207                     "num_subs": "100",
208                     "port_0": "",
209                     "traffic_type": "imix1"
210                 },
211                 {
212                     "net_pktgen": "18:02.1",
213                     "num_ofdm": "1",
214                     "num_subs": "100",
215                     "port_1": "",
216                     "traffic_type": "imix1"
217                 },
218                 {
219                     "net_pktgen": "18:02.2",
220                     "num_ofdm": "1",
221                     "num_subs": "100",
222                     "port_2": "",
223                     "traffic_type": "imix1"
224                 },
225                 {
226                     "net_pktgen": "18:02.3",
227                     "num_ofdm": "1",
228                     "num_subs": "100",
229                     "port_3": "",
230                     "traffic_type": "imix1"
231                 },
232                 {
233                     "net_pktgen": "00:00.0",
234                     "num_ofdm": "1",
235                     "num_subs": "100",
236                     "port_4": "",
237                     "traffic_type": "imix1"
238                 },
239                 {
240                     "net_pktgen": "00:00.0",
241                     "num_ofdm": "1",
242                     "num_subs": "100",
243                     "port_5": "",
244                     "traffic_type": "imix1"
245                 },
246                 {
247                     "net_pktgen": "00:00.0",
248                     "num_ofdm": "1",
249                     "num_subs": "100",
250                     "port_6": "",
251                     "traffic_type": "imix1"
252                 },
253                 {
254                     "net_pktgen": "00:00.0",
255                     "num_ofdm": "1",
256                     "num_subs": "100",
257                     "port_7": "",
258                     "traffic_type": "imix1"
259                 }
260             ]
261         },
262         {
263             "num_ports": 4,
264             "pktgen_id": 1,
265             "ports": [
266                 {
267                     "net_pktgen": "18:0a.0",
268                     "num_ofdm": "1",
269                     "num_subs": "100",
270                     "port_0": "",
271                     "traffic_type": "imix1"
272                 },
273                 {
274                     "net_pktgen": "18:0a.1",
275                     "num_ofdm": "1",
276                     "num_subs": "100",
277                     "port_1": "",
278                     "traffic_type": "imix1"
279                 },
280                 {
281                     "net_pktgen": "18:0a.2",
282                     "num_ofdm": "1",
283                     "num_subs": "100",
284                     "port_2": "",
285                     "traffic_type": "imix1"
286                 },
287                 {
288                     "net_pktgen": "18:0a.3",
289                     "num_ofdm": "1",
290                     "num_subs": "100",
291                     "port_3": "",
292                     "traffic_type": "imix1"
293                 },
294                 {
295                     "net_pktgen": "00:00.0",
296                     "num_ofdm": "1",
297                     "num_subs": "100",
298                     "port_4": "",
299                     "traffic_type": "imix1"
300                 },
301                 {
302                     "net_pktgen": "00:00.0",
303                     "num_ofdm": "1",
304                     "num_subs": "100",
305                     "port_5": "",
306                     "traffic_type": "imix1"
307                 },
308                 {
309                     "net_pktgen": "00:00.0",
310                     "num_ofdm": "1",
311                     "num_subs": "100",
312                     "port_6": "",
313                     "traffic_type": "imix1"
314                 },
315                 {
316                     "net_pktgen": "00:00.0",
317                     "num_ofdm": "1",
318                     "num_subs": "100",
319                     "port_7": "",
320                     "traffic_type": "imix1"
321                 }
322             ]
323         }
324     ]
325
326     SCENARIO_CFG = {
327         "nodes": {
328             "tg__0": "pktgen0-k8syardstick-a3b663c2",
329             "vnf__0": "vnf0us-k8syardstick-a3b663c2",
330             "vnf__1": "vnf0ds-k8syardstick-a3b663c2"
331         },
332         "options": {
333             "pktgen_values": "/tmp/pktgen_values.yaml",
334             "tg__0": {
335                 "pktgen_id": 0
336             },
337             "vcmts_influxdb_ip": "10.80.5.150",
338             "vcmts_influxdb_port": 8086,
339             "vcmtsd_values": "/tmp/vcmtsd_values.yaml",
340             "vnf__0": {
341                 "sg_id": 0,
342                 "stream_dir": "us"
343             },
344             "vnf__1": {
345                 "sg_id": 0,
346                 "stream_dir": "ds"
347             }
348         },
349         "task_id": "a3b663c2-e616-4777-b6d0-ec2ea7a06f42",
350         "task_path": "samples/vnf_samples/nsut/cmts",
351         "tc": "tc_vcmts_k8s_pktgen",
352         "topology": "k8s_vcmts_topology.yaml",
353         "traffic_profile": "../../traffic_profiles/fixed.yaml",
354         "type": "NSPerf"
355     }
356
357     CONTEXT_CFG = {
358         "networks": {
359             "flannel": {
360                 "name": "flannel"
361             },
362             "xe0": {
363                 "name": "xe0"
364             },
365             "xe1": {
366                 "name": "xe1"
367             }
368         },
369         "nodes": {
370             "tg__0": {
371                 "VNF model": "../../vnf_descriptors/tg_vcmts_tpl.yaml",
372                 "interfaces": {
373                     "flannel": {
374                         "local_ip": "192.168.24.150",
375                         "local_mac": None,
376                         "network_name": "flannel"
377                     },
378                     "xe0": {
379                         "local_ip": "192.168.24.150",
380                         "local_mac": None,
381                         "network_name": "xe0"
382                     },
383                     "xe1": {
384                         "local_ip": "192.168.24.150",
385                         "local_mac": None,
386                         "network_name": "xe1"
387                     }
388                 },
389                 "ip": "192.168.24.150",
390                 "key_filename": "/tmp/yardstick_key-a3b663c2",
391                 "member-vnf-index": "1",
392                 "name": "pktgen0-k8syardstick-a3b663c2",
393                 "private_ip": "192.168.24.150",
394                 "service_ports": [
395                     {
396                         "name": "ssh",
397                         "node_port": 60270,
398                         "port": 22,
399                         "protocol": "TCP",
400                         "target_port": 22
401                     },
402                     {
403                         "name": "lua",
404                         "node_port": 43619,
405                         "port": 22022,
406                         "protocol": "TCP",
407                         "target_port": 22022
408                     }
409                 ],
410                 "ssh_port": 60270,
411                 "user": "root",
412                 "vnfd-id-ref": "tg__0"
413             },
414             "vnf__0": {
415                 "VNF model": "../../vnf_descriptors/vnf_vcmts_tpl.yaml",
416                 "interfaces": {
417                     "flannel": {
418                         "local_ip": "192.168.100.132",
419                         "local_mac": None,
420                         "network_name": "flannel"
421                     },
422                     "xe0": {
423                         "local_ip": "192.168.100.132",
424                         "local_mac": None,
425                         "network_name": "xe0"
426                     },
427                     "xe1": {
428                         "local_ip": "192.168.100.132",
429                         "local_mac": None,
430                         "network_name": "xe1"
431                     }
432                 },
433                 "ip": "192.168.100.132",
434                 "key_filename": "/tmp/yardstick_key-a3b663c2",
435                 "member-vnf-index": "3",
436                 "name": "vnf0us-k8syardstick-a3b663c2",
437                 "private_ip": "192.168.100.132",
438                 "service_ports": [
439                     {
440                         "name": "ssh",
441                         "node_port": 57057,
442                         "port": 22,
443                         "protocol": "TCP",
444                         "target_port": 22
445                     },
446                     {
447                         "name": "lua",
448                         "node_port": 29700,
449                         "port": 22022,
450                         "protocol": "TCP",
451                         "target_port": 22022
452                     }
453                 ],
454                 "ssh_port": 57057,
455                 "user": "root",
456                 "vnfd-id-ref": "vnf__0"
457             },
458             "vnf__1": {
459                 "VNF model": "../../vnf_descriptors/vnf_vcmts_tpl.yaml",
460                 "interfaces": {
461                     "flannel": {
462                         "local_ip": "192.168.100.134",
463                         "local_mac": None,
464                         "network_name": "flannel"
465                     },
466                     "xe0": {
467                         "local_ip": "192.168.100.134",
468                         "local_mac": None,
469                         "network_name": "xe0"
470                     },
471                     "xe1": {
472                         "local_ip": "192.168.100.134",
473                         "local_mac": None,
474                         "network_name": "xe1"
475                     }
476                 },
477                 "ip": "192.168.100.134",
478                 "key_filename": "/tmp/yardstick_key-a3b663c2",
479                 "member-vnf-index": "4",
480                 "name": "vnf0ds-k8syardstick-a3b663c2",
481                 "private_ip": "192.168.100.134",
482                 "service_ports": [
483                     {
484                         "name": "ssh",
485                         "node_port": 18581,
486                         "port": 22,
487                         "protocol": "TCP",
488                         "target_port": 22
489                     },
490                     {
491                         "name": "lua",
492                         "node_port": 18469,
493                         "port": 22022,
494                         "protocol": "TCP",
495                         "target_port": 22022
496                     }
497                 ],
498                 "ssh_port": 18581,
499                 "user": "root",
500                 "vnfd-id-ref": "vnf__1"
501             }
502         }
503     }
504
505     PKTGEN_VALUES_PATH = "/tmp/pktgen_values.yaml"
506
507     PKTGEN_VALUES = \
508             "serviceAccount: cmk-serviceaccount\n" \
509             "images:\n" \
510             "  vcmts_pktgen: vcmts-pktgen:v18.10\n" \
511             "topology:\n" \
512             "  pktgen_replicas: 8\n" \
513             "  pktgen_pods:\n" \
514             "    - pktgen_id: 0\n" \
515             "      num_ports: 4\n" \
516             "      ports:\n" \
517             "        - port_0:\n" \
518             "          traffic_type: 'imix2'\n" \
519             "          num_ofdm: 4\n" \
520             "          num_subs: 300\n" \
521             "          net_pktgen: 8a:02.0\n" \
522             "        - port_1:\n" \
523             "          traffic_type: 'imix2'\n" \
524             "          num_ofdm: 4\n" \
525             "          num_subs: 300\n" \
526             "          net_pktgen: 8a:02.1\n" \
527             "        - port_2:\n" \
528             "          traffic_type: 'imix2'\n" \
529             "          num_ofdm: 4\n" \
530             "          num_subs: 300\n" \
531             "          net_pktgen: 8a:02.2\n" \
532             "        - port_3:\n" \
533             "          traffic_type: 'imix2'\n" \
534             "          num_ofdm: 4\n" \
535             "          num_subs: 300\n" \
536             "          net_pktgen: 8a:02.3\n" \
537             "        - port_4:\n" \
538             "          traffic_type: 'imix2'\n" \
539             "          num_ofdm: 4\n" \
540             "          num_subs: 300\n" \
541             "          net_pktgen: 8a:02.4\n" \
542             "        - port_5:\n" \
543             "          traffic_type: 'imix2'\n" \
544             "          num_ofdm: 4\n" \
545             "          num_subs: 300\n" \
546             "          net_pktgen: 8a:02.5\n" \
547             "        - port_6:\n" \
548             "          traffic_type: 'imix2'\n" \
549             "          num_ofdm: 4\n" \
550             "          num_subs: 300\n" \
551             "          net_pktgen: 8a:02.6\n" \
552             "        - port_7:\n" \
553             "          traffic_type: 'imix2'\n" \
554             "          num_ofdm: 4\n" \
555             "          num_subs: 300\n" \
556             "          net_pktgen: 8a:02.7\n"
557
558     def setUp(self):
559         vnfd = self.VNFD['vnfd:vnfd-catalog']['vnfd'][0]
560         self.vcmts_pktgen = tg_vcmts_pktgen.VcmtsPktgen(NAME, vnfd)
561         self.vcmts_pktgen._start_server = mock.Mock(return_value=0)
562         self.vcmts_pktgen.resource_helper = mock.MagicMock()
563         self.vcmts_pktgen.setup_helper = mock.MagicMock()
564
565     def test___init__(self):
566         self.assertFalse(self.vcmts_pktgen.traffic_finished)
567         self.assertIsNotNone(self.vcmts_pktgen.setup_helper)
568         self.assertIsNotNone(self.vcmts_pktgen.resource_helper)
569
570     def test_extract_pod_cfg(self):
571         pod_cfg = self.vcmts_pktgen.extract_pod_cfg(self.PKTGEN_POD_VALUES, "0")
572         self.assertIsNotNone(pod_cfg)
573         self.assertEqual(pod_cfg["pktgen_id"], "0")
574         pod_cfg = self.vcmts_pktgen.extract_pod_cfg(self.PKTGEN_POD_VALUES, "4")
575         self.assertIsNone(pod_cfg)
576
577     @mock.patch.object(ctx_base.Context, 'get_context_from_server',
578                        return_value='fake_context')
579     def test_instantiate_missing_pktgen_values_key(self, *args):
580         err_scenario_cfg = copy.deepcopy(self.SCENARIO_CFG)
581         err_scenario_cfg['options'].pop('pktgen_values', None)
582         with self.assertRaises(KeyError):
583             self.vcmts_pktgen.instantiate(err_scenario_cfg, self.CONTEXT_CFG)
584
585     @mock.patch.object(ctx_base.Context, 'get_context_from_server',
586                        return_value='fake_context')
587     def test_instantiate_missing_pktgen_values_file(self, *args):
588         if os.path.isfile(self.PKTGEN_VALUES_PATH):
589             os.remove(self.PKTGEN_VALUES_PATH)
590         err_scenario_cfg = copy.deepcopy(self.SCENARIO_CFG)
591         err_scenario_cfg['options']['pktgen_values'] = self.PKTGEN_VALUES_PATH
592         with self.assertRaises(RuntimeError):
593             self.vcmts_pktgen.instantiate(err_scenario_cfg, self.CONTEXT_CFG)
594
595     @mock.patch.object(ctx_base.Context, 'get_context_from_server',
596                        return_value='fake_context')
597     def test_instantiate_empty_pktgen_values_file(self, *args):
598         yaml_sample = open(self.PKTGEN_VALUES_PATH, 'w')
599         yaml_sample.write("")
600         yaml_sample.close()
601
602         err_scenario_cfg = copy.deepcopy(self.SCENARIO_CFG)
603         err_scenario_cfg['options']['pktgen_values'] = self.PKTGEN_VALUES_PATH
604         with self.assertRaises(RuntimeError):
605             self.vcmts_pktgen.instantiate(err_scenario_cfg, self.CONTEXT_CFG)
606
607         if os.path.isfile(self.PKTGEN_VALUES_PATH):
608             os.remove(self.PKTGEN_VALUES_PATH)
609
610     @mock.patch.object(ctx_base.Context, 'get_context_from_server',
611                        return_value='fake_context')
612     def test_instantiate_invalid_pktgen_id(self, *args):
613         yaml_sample = open(self.PKTGEN_VALUES_PATH, 'w')
614         yaml_sample.write(self.PKTGEN_VALUES)
615         yaml_sample.close()
616
617         err_scenario_cfg = copy.deepcopy(self.SCENARIO_CFG)
618         err_scenario_cfg['options'][NAME]['pktgen_id'] = 12
619         with self.assertRaises(KeyError):
620             self.vcmts_pktgen.instantiate(err_scenario_cfg, self.CONTEXT_CFG)
621
622         if os.path.isfile(self.PKTGEN_VALUES_PATH):
623             os.remove(self.PKTGEN_VALUES_PATH)
624
625     @mock.patch.object(ctx_base.Context, 'get_context_from_server',
626                        return_value='fake_context')
627     def test_instantiate_all_valid(self, *args):
628         yaml_sample = open(self.PKTGEN_VALUES_PATH, 'w')
629         yaml_sample.write(self.PKTGEN_VALUES)
630         yaml_sample.close()
631
632         self.vcmts_pktgen.instantiate(self.SCENARIO_CFG, self.CONTEXT_CFG)
633         self.assertIsNotNone(self.vcmts_pktgen.pod_cfg)
634         self.assertEqual(self.vcmts_pktgen.pod_cfg["pktgen_id"], "0")
635
636         if os.path.isfile(self.PKTGEN_VALUES_PATH):
637             os.remove(self.PKTGEN_VALUES_PATH)
638
639     def test_run_traffic_failed_connect(self):
640         self.vcmts_pktgen.pktgen_helper = mock.MagicMock()
641         self.vcmts_pktgen.pktgen_helper.connect.return_value = False
642         with self.assertRaises(exceptions.PktgenActionError):
643             self.vcmts_pktgen.run_traffic({})
644
645     def test_run_traffic_successful_connect(self):
646         self.vcmts_pktgen.pktgen_helper = mock.MagicMock()
647         self.vcmts_pktgen.pktgen_helper.connect.return_value = True
648         self.vcmts_pktgen.pktgen_rate = 8.0
649         self.assertTrue(self.vcmts_pktgen.run_traffic({}))
650         self.vcmts_pktgen.pktgen_helper.connect.assert_called_once()
651         self.vcmts_pktgen.pktgen_helper.send_command.assert_called_with(
652             'pktgen.start("all");')