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
7 # http://www.apache.org/licenses/LICENSE-2.0
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.
21 from yardstick import exceptions as y_exc
22 from yardstick.benchmark.scenarios.networking import vsperf_dpdk
25 class VsperfDPDKTestCase(unittest.TestCase):
30 "ip": "10.229.47.137",
36 'task_id': "1234-5678",
38 'testname': 'pvp_tput',
39 'traffic_type': 'rfc2544_throughput',
41 'test_params': 'TRAFFICGEN_DURATION=30;',
42 'trafficgen_port1': 'ens4',
43 'trafficgen_port2': 'ens5',
44 'conf_file': 'vsperf-yardstick.conf',
45 'setup_script': 'setup_yardstick.sh',
46 'moongen_helper_file': '~/moongen.py',
47 'moongen_host_ip': '10.5.201.151',
48 'moongen_port1_mac': '8c:dc:d4:ae:7c:5c',
49 'moongen_port2_mac': '8c:dc:d4:ae:7c:5d',
50 'trafficgen_port1_nw': 'test2',
51 'trafficgen_port2_nw': 'test3',
54 'metrics': 'throughput_rx_fps',
55 'throughput_rx_fps': 500000,
60 self.scenario = vsperf_dpdk.VsperfDPDK(self.args, self.ctx)
62 self._mock_ssh = mock.patch.object(vsperf_dpdk, 'ssh')
63 self.mock_ssh = self._mock_ssh.start()
64 self._mock_subprocess_call = mock.patch.object(subprocess, 'call')
65 self.mock_subprocess_call = self._mock_subprocess_call.start()
66 self._mock_log_info = mock.patch.object(vsperf_dpdk.LOG, 'info')
67 self.mock_log_info = self._mock_log_info.start()
68 self.addCleanup(self._cleanup)
72 self._mock_subprocess_call.stop()
73 self._mock_log_info.stop()
76 # setup() specific mocks
77 self.mock_subprocess_call().execute.return_value = None
80 self.assertIsNotNone(self.scenario.client)
81 self.assertTrue(self.scenario.setup_done)
83 def test_teardown(self):
84 # setup() specific mocks
85 self.mock_subprocess_call().execute.return_value = None
88 self.assertIsNotNone(self.scenario.client)
89 self.assertTrue(self.scenario.setup_done)
91 self.scenario.teardown()
92 self.assertFalse(self.scenario.setup_done)
94 def test_is_dpdk_setup_no(self):
95 # setup() specific mocks
96 self.mock_subprocess_call().execute.return_value = None
99 self.assertIsNotNone(self.scenario.client)
100 self.assertTrue(self.scenario.setup_done)
102 # is_dpdk_setup() specific mocks
103 self.mock_ssh.SSH.from_node().execute.return_value = (0, 'dummy', '')
105 result = self.scenario._is_dpdk_setup()
106 self.assertFalse(result)
108 def test_is_dpdk_setup_yes(self):
109 # setup() specific mocks
110 self.mock_subprocess_call().execute.return_value = None
112 self.scenario.setup()
113 self.assertIsNotNone(self.scenario.client)
114 self.assertTrue(self.scenario.setup_done)
116 # is_dpdk_setup() specific mocks
117 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
119 result = self.scenario._is_dpdk_setup()
120 self.assertTrue(result)
122 @mock.patch.object(time, 'sleep')
123 def test_dpdk_setup_first(self, *args):
124 # setup() specific mocks
125 self.mock_subprocess_call().execute.return_value = None
127 self.scenario.setup()
128 self.assertIsNotNone(self.scenario.client)
129 self.assertTrue(self.scenario.setup_done)
131 # is_dpdk_setup() specific mocks
132 self.mock_ssh.SSH.from_node().execute.return_value = (0, 'dummy', '')
134 self.scenario.dpdk_setup()
135 self.assertFalse(self.scenario._is_dpdk_setup())
136 self.assertTrue(self.scenario.dpdk_setup_done)
138 @mock.patch.object(time, 'sleep')
139 def test_dpdk_setup_next(self, *args):
140 # setup() specific mocks
141 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
142 self.mock_subprocess_call().execute.return_value = None
144 self.scenario.setup()
145 self.assertIsNotNone(self.scenario.client)
146 self.assertTrue(self.scenario.setup_done)
148 self.scenario.dpdk_setup()
149 self.assertTrue(self.scenario._is_dpdk_setup())
150 self.assertTrue(self.scenario.dpdk_setup_done)
152 @mock.patch.object(time, 'sleep')
153 def test_dpdk_setup_runtime_error(self, *args):
155 # setup specific mocks
156 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
157 self.mock_subprocess_call().execute.return_value = None
159 self.scenario.setup()
160 self.assertIsNotNone(self.scenario.client)
161 self.mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
162 self.assertTrue(self.scenario.setup_done)
164 self.assertRaises(RuntimeError, self.scenario.dpdk_setup)
166 @mock.patch.object(subprocess, 'check_output')
167 @mock.patch('time.sleep')
168 def test_run_ok(self, *args):
169 # setup() specific mocks
170 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
171 self.mock_subprocess_call().execute.return_value = None
173 self.scenario.setup()
174 self.assertIsNotNone(self.scenario.client)
175 self.assertTrue(self.scenario.setup_done)
177 # run() specific mocks
178 self.mock_subprocess_call().execute.return_value = None
179 self.mock_ssh.SSH.from_node().execute.return_value = (
180 0, 'throughput_rx_fps\r\n14797660.000\r\n', '')
183 self.scenario.run(result)
185 self.assertEqual(result['throughput_rx_fps'], '14797660.000')
187 def test_run_failed_vsperf_execution(self):
188 # setup() specific mocks
189 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
190 self.mock_subprocess_call().execute.return_value = None
192 self.scenario.setup()
193 self.assertIsNotNone(self.scenario.client)
194 self.assertTrue(self.scenario.setup_done)
196 self.mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
199 self.assertRaises(RuntimeError, self.scenario.run, result)
201 def test_run_falied_csv_report(self):
202 # setup() specific mocks
203 self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
204 self.mock_subprocess_call().execute.return_value = None
206 self.scenario.setup()
207 self.assertIsNotNone(self.scenario.client)
208 self.assertTrue(self.scenario.setup_done)
210 # run() specific mocks
211 self.mock_subprocess_call().execute.return_value = None
212 self.mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
215 self.assertRaises(RuntimeError, self.scenario.run, result)
217 @mock.patch.object(time, 'sleep')
218 @mock.patch.object(subprocess, 'check_output')
219 def test_vsperf_run_sla_fail(self, *args):
220 self.scenario.setup()
222 self.mock_ssh.SSH.from_node().execute.return_value = (
223 0, 'throughput_rx_fps\r\n123456.000\r\n', '')
225 with self.assertRaises(y_exc.SLAValidationError) as raised:
226 self.scenario.run({})
228 self.assertIn('VSPERF_throughput_rx_fps(123456.000000) < '
229 'SLA_throughput_rx_fps(500000.000000)',
230 str(raised.exception))
232 @mock.patch.object(time, 'sleep')
233 @mock.patch.object(subprocess, 'check_output')
234 def test_vsperf_run_sla_fail_metric_not_collected(self, *args):
235 self.scenario.setup()
237 self.mock_ssh.SSH.from_node().execute.return_value = (
238 0, 'nonexisting_metric\r\n123456.000\r\n', '')
240 with self.assertRaises(y_exc.SLAValidationError) as raised:
241 self.scenario.run({})
243 self.assertIn('throughput_rx_fps was not collected by VSPERF',
244 str(raised.exception))
246 @mock.patch.object(time, 'sleep')
247 @mock.patch.object(subprocess, 'check_output')
248 def test_vsperf_run_sla_fail_sla_not_defined(self, *args):
249 del self.scenario.scenario_cfg['sla']['throughput_rx_fps']
250 self.scenario.setup()
252 self.mock_ssh.SSH.from_node().execute.return_value = (
253 0, 'throughput_rx_fps\r\n14797660.000\r\n', '')
255 with self.assertRaises(y_exc.SLAValidationError) as raised:
256 self.scenario.run({})
258 self.assertIn('throughput_rx_fps is not defined in SLA',
259 str(raised.exception))