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.
17 # Unittest for yardstick.benchmark.scenarios.networking.MoongenTestPMD
19 from __future__ import absolute_import
21 from unittest import mock
26 from yardstick.benchmark.scenarios.networking import moongen_testpmd
29 @mock.patch('yardstick.benchmark.scenarios.networking.moongen_testpmd.subprocess')
30 class MoongenTestPMDTestCase(unittest.TestCase):
35 "ip": "10.229.47.137",
41 'task_id': "1234-5678",
46 'trafficgen_port1': 'ens5',
47 'trafficgen_port2': 'ens6',
48 'moongen_host_user': 'root',
49 'moongen_host_passwd': 'root',
50 'moongen_host_ip': '10.5.201.151',
51 'moongen_dir': '/home/lua-trafficgen',
52 'moongen_runBidirec': 'true',
55 'moongen_port1_mac': '88:cf:98:2f:4d:ed',
56 'moongen_port2_mac': '88:cf:98:2f:4d:ee',
57 'forward_type': 'testpmd',
60 'metrics': 'throughput_rx_mpps',
61 'throughput_rx_mpps': 0.5,
66 'task_id': "1234-5678",
71 'trafficgen_port1': 'ens5',
72 'trafficgen_port2': 'ens6',
73 'moongen_host_user': 'root',
74 'moongen_host_passwd': 'root',
75 'moongen_host_ip': '10.5.201.151',
76 'moongen_dir': '/home/lua-trafficgen',
77 'moongen_runBidirec': 'true',
80 'moongen_port1_mac': '88:cf:98:2f:4d:ed',
81 'moongen_port2_mac': '88:cf:98:2f:4d:ee',
82 'forward_type': 'l2fwd',
85 'metrics': 'throughput_rx_mpps',
86 'throughput_rx_mpps': 0.5,
91 self._mock_ssh = mock.patch(
92 'yardstick.benchmark.scenarios.networking.moongen_testpmd.ssh')
93 self.mock_ssh = self._mock_ssh.start()
95 self.addCleanup(self._cleanup)
100 def test_MoongenTestPMD_setup(self, mock_subprocess):
101 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
103 # setup() specific mocks
104 mock_subprocess.call().execute.return_value = None
107 self.assertIsNotNone(p.client)
108 self.assertTrue(p.setup_done)
110 def test_MoongenTestPMD_teardown(self, mock_subprocess):
111 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
113 # setup() specific mocks
114 mock_subprocess.call().execute.return_value = None
117 self.assertIsNotNone(p.client)
118 self.assertTrue(p.setup_done)
121 self.assertFalse(p.setup_done)
123 def test_MoongenTestPMD_l2fwd_is_forward_setup_no(self, mock_subprocess):
124 p = moongen_testpmd.MoongenTestPMD(self.L2fwdargs, self.ctx)
126 # setup() specific mocks
127 mock_subprocess.call().execute.return_value = None
130 self.assertIsNotNone(p.client)
131 self.assertTrue(p.setup_done)
133 # is_dpdk_setup() specific mocks
134 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
136 result = p._is_forward_setup()
137 self.assertFalse(result)
139 def test_MoongenTestPMD_l2fwd_is_forward_setup_yes(self, mock_subprocess):
140 p = moongen_testpmd.MoongenTestPMD(self.L2fwdargs, self.ctx)
142 # setup() specific mocks
143 mock_subprocess.call().execute.return_value = None
146 self.assertIsNotNone(p.client)
147 self.assertTrue(p.setup_done)
149 # is_dpdk_setup() specific mocks
150 self.mock_ssh.SSH.from_node().execute.return_value = (0, 'dummy', '')
152 result = p._is_forward_setup()
153 self.assertTrue(result)
155 def test_MoongenTestPMD_testpmd_is_forward_setup_no(self, mock_subprocess):
156 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
158 # setup() specific mocks
159 mock_subprocess.call().execute.return_value = None
162 self.assertIsNotNone(p.client)
163 self.assertTrue(p.setup_done)
165 # is_dpdk_setup() specific mocks
166 self.mock_ssh.SSH.from_node().execute.return_value = (0, 'dummy', '')
168 result = p._is_forward_setup()
169 self.assertFalse(result)
171 def test_MoongenTestPMD_testpmd_is_forward_setup_yes(self, mock_subprocess):
172 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
174 # setup() specific mocks
175 mock_subprocess.call().execute.return_value = None
178 self.assertIsNotNone(p.client)
179 self.assertTrue(p.setup_done)
181 # is_dpdk_setup() specific mocks
182 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
184 result = p._is_forward_setup()
185 self.assertTrue(result)
187 @mock.patch('time.sleep')
188 def test_MoongenTestPMD_testpmd_forward_setup_first(self, _, mock_subprocess):
189 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
191 # setup() specific mocks
192 mock_subprocess.call().execute.return_value = None
195 self.assertIsNotNone(p.client)
196 self.assertTrue(p.setup_done)
198 # is_dpdk_setup() specific mocks
199 self.mock_ssh.SSH.from_node().execute.return_value = (0, 'dummy', '')
202 self.assertFalse(p._is_forward_setup())
203 self.assertTrue(p.forward_setup_done)
205 @mock.patch('time.sleep')
206 def test_MoongenTestPMD_testpmd_dpdk_setup_next(self, _, mock_subprocess):
207 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
209 # setup() specific mocks
210 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
211 mock_subprocess.call().execute.return_value = None
214 self.assertIsNotNone(p.client)
215 self.assertTrue(p.setup_done)
218 self.assertTrue(p._is_forward_setup())
219 self.assertTrue(p.forward_setup_done)
221 @mock.patch('time.sleep')
222 def test_MoongenTestPMD_l2fwd_forward_setup_first(self, _, mock_subprocess):
223 p = moongen_testpmd.MoongenTestPMD(self.L2fwdargs, self.ctx)
225 # setup() specific mocks
226 mock_subprocess.call().execute.return_value = None
229 self.assertIsNotNone(p.client)
230 self.assertTrue(p.setup_done)
232 # is_dpdk_setup() specific mocks
233 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
236 self.assertFalse(p._is_forward_setup())
237 self.assertTrue(p.forward_setup_done)
239 @mock.patch('time.sleep')
240 def test_MoongenTestPMD_l2fwd_dpdk_setup_next(self, _, mock_subprocess):
241 p = moongen_testpmd.MoongenTestPMD(self.L2fwdargs, self.ctx)
243 # setup() specific mocks
244 self.mock_ssh.SSH.from_node().execute.return_value = (0, 'dummy', '')
245 mock_subprocess.call().execute.return_value = None
248 self.assertIsNotNone(p.client)
249 self.assertTrue(p.setup_done)
252 self.assertTrue(p._is_forward_setup())
253 self.assertTrue(p.forward_setup_done)
255 def test_moongen_testpmd_generate_config_file(self, mock_subprocess):
256 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
258 # setup() specific mocks
259 mock_subprocess.call().execute.return_value = None
261 p.generate_config_file(frame_size=1, multistream=1,
262 runBidirec="True", tg_port1_vlan=1,
263 tg_port2_vlan=2, SearchRuntime=1,
265 self.assertTrue(p.CONFIG_FILE)
267 def test_moongen_testpmd_result_to_data_match(self, mock_subprocess):
268 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
270 mock_subprocess.call().execute.return_value = None
271 result = ("[REPORT]Device 1->0: Tx frames: 420161490 Rx Frames: 420161490"
272 " frame loss: 0, 0.000000% Rx Mpps: 7.002708\n[REPORT] "
273 "total: Tx frames: 840321216 Rx Frames: 840321216 frame loss: "
274 "0, 0.000000% Tx Mpps: 14.005388 Rx Mpps: 14.005388\n'")
275 p.result_to_data(result=result)
276 self.assertTrue(p.TO_DATA)
278 def test_moongen_testpmd_result_to_data_not_match(self, mock_subprocess):
279 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
281 mock_subprocess.call().execute.return_value = None
283 p.result_to_data(result=result)
284 self.assertTrue(p.TO_DATA)
286 @mock.patch('time.sleep')
287 def test_moongen_testpmd_run_ok(self, _, mock_subprocess):
288 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
290 p.forward_setup_done = True
293 # run() specific mocks
294 p.server = self.mock_ssh.SSH.from_node()
295 mock_subprocess.call().execute.return_value = None
296 mock_subprocess.call().execute.return_value = None
297 result = ("[REPORT]Device 1->0: Tx frames: 420161490 Rx Frames: 420161490"
298 " frame loss: 0, 0.000000% Rx Mpps: 7.002708\n[REPORT] "
299 "total: Tx frames: 840321216 Rx Frames: 840321216 frame loss: "
300 "0, 0.000000% Tx Mpps: 14.005388 Rx Mpps: 14.005388\n'")
301 self.mock_ssh.SSH.from_node().execute.return_value = (
307 self.assertEqual(test_result['rx_mpps'], 14.005388)
309 def test_moongen_testpmd_run_falied_vsperf_execution(self, mock_subprocess):
310 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
312 # setup() specific mocks
313 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
314 mock_subprocess.call().execute.return_value = None
317 self.assertIsNotNone(p.client)
318 self.assertTrue(p.setup_done)
320 # run() specific mocks
321 mock_subprocess.call().execute.return_value = None
322 mock_subprocess.call().execute.return_value = None
323 self.mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
326 self.assertRaises(RuntimeError, p.run, result)
328 def test_moongen_testpmd_run_falied_csv_report(self, mock_subprocess):
329 p = moongen_testpmd.MoongenTestPMD(self.TestPMDargs, self.ctx)
331 # setup() specific mocks
332 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
333 mock_subprocess.call().execute.return_value = None
336 self.assertIsNotNone(p.client)
337 self.assertTrue(p.setup_done)
339 # run() specific mocks
340 mock_subprocess.call().execute.return_value = None
341 mock_subprocess.call().execute.return_value = None
342 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
343 self.mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
346 self.assertRaises(RuntimeError, p.run, result)
352 if __name__ == '__main__':