Merge "Fix up formatting on devguide"
[yardstick.git] / yardstick / tests / unit / benchmark / scenarios / networking / test_vsperf_dpdk.py
1 # Copyright 2017 Nokia
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 subprocess
16 import time
17
18 import mock
19 import unittest
20
21 from yardstick import exceptions as y_exc
22 from yardstick.benchmark.scenarios.networking import vsperf_dpdk
23
24
25 class VsperfDPDKTestCase(unittest.TestCase):
26
27     def setUp(self):
28         self.ctx = {
29             "host": {
30                 "ip": "10.229.47.137",
31                 "user": "ubuntu",
32                 "password": "ubuntu",
33             },
34         }
35         self.args = {
36             'task_id': "1234-5678",
37             'options': {
38                 'testname': 'pvp_tput',
39                 'traffic_type': 'rfc2544_throughput',
40                 'frame_size': '64',
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',
52             },
53             'sla': {
54                 'metrics': 'throughput_rx_fps',
55                 'throughput_rx_fps': 500000,
56                 'action': 'monitor',
57             }
58         }
59
60         self.scenario = vsperf_dpdk.VsperfDPDK(self.args, self.ctx)
61
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)
69
70     def _cleanup(self):
71         self._mock_ssh.stop()
72         self._mock_subprocess_call.stop()
73         self._mock_log_info.stop()
74
75     def test_setup(self):
76         # setup() specific mocks
77         self.mock_subprocess_call().execute.return_value = None
78
79         self.scenario.setup()
80         self.assertIsNotNone(self.scenario.client)
81         self.assertTrue(self.scenario.setup_done)
82
83     def test_teardown(self):
84         # setup() specific mocks
85         self.mock_subprocess_call().execute.return_value = None
86
87         self.scenario.setup()
88         self.assertIsNotNone(self.scenario.client)
89         self.assertTrue(self.scenario.setup_done)
90
91         self.scenario.teardown()
92         self.assertFalse(self.scenario.setup_done)
93
94     def test_is_dpdk_setup_no(self):
95         # setup() specific mocks
96         self.mock_subprocess_call().execute.return_value = None
97
98         self.scenario.setup()
99         self.assertIsNotNone(self.scenario.client)
100         self.assertTrue(self.scenario.setup_done)
101
102         # is_dpdk_setup() specific mocks
103         self.mock_ssh.SSH.from_node().execute.return_value = (0, 'dummy', '')
104
105         result = self.scenario._is_dpdk_setup()
106         self.assertFalse(result)
107
108     def test_is_dpdk_setup_yes(self):
109         # setup() specific mocks
110         self.mock_subprocess_call().execute.return_value = None
111
112         self.scenario.setup()
113         self.assertIsNotNone(self.scenario.client)
114         self.assertTrue(self.scenario.setup_done)
115
116         # is_dpdk_setup() specific mocks
117         self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
118
119         result = self.scenario._is_dpdk_setup()
120         self.assertTrue(result)
121
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
126
127         self.scenario.setup()
128         self.assertIsNotNone(self.scenario.client)
129         self.assertTrue(self.scenario.setup_done)
130
131         # is_dpdk_setup() specific mocks
132         self.mock_ssh.SSH.from_node().execute.return_value = (0, 'dummy', '')
133
134         self.scenario.dpdk_setup()
135         self.assertFalse(self.scenario._is_dpdk_setup())
136         self.assertTrue(self.scenario.dpdk_setup_done)
137
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
143
144         self.scenario.setup()
145         self.assertIsNotNone(self.scenario.client)
146         self.assertTrue(self.scenario.setup_done)
147
148         self.scenario.dpdk_setup()
149         self.assertTrue(self.scenario._is_dpdk_setup())
150         self.assertTrue(self.scenario.dpdk_setup_done)
151
152     @mock.patch.object(time, 'sleep')
153     def test_dpdk_setup_runtime_error(self, *args):
154
155         # setup specific mocks
156         self.mock_ssh.SSH.from_node().execute.return_value = (0, '', '')
157         self.mock_subprocess_call().execute.return_value = None
158
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)
163
164         self.assertRaises(RuntimeError, self.scenario.dpdk_setup)
165
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
172
173         self.scenario.setup()
174         self.assertIsNotNone(self.scenario.client)
175         self.assertTrue(self.scenario.setup_done)
176
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', '')
181
182         result = {}
183         self.scenario.run(result)
184
185         self.assertEqual(result['throughput_rx_fps'], '14797660.000')
186
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
191
192         self.scenario.setup()
193         self.assertIsNotNone(self.scenario.client)
194         self.assertTrue(self.scenario.setup_done)
195
196         self.mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
197
198         result = {}
199         self.assertRaises(RuntimeError, self.scenario.run, result)
200
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
205
206         self.scenario.setup()
207         self.assertIsNotNone(self.scenario.client)
208         self.assertTrue(self.scenario.setup_done)
209
210         # run() specific mocks
211         self.mock_subprocess_call().execute.return_value = None
212         self.mock_ssh.SSH.from_node().execute.return_value = (1, '', '')
213
214         result = {}
215         self.assertRaises(RuntimeError, self.scenario.run, result)
216
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()
221
222         self.mock_ssh.SSH.from_node().execute.return_value = (
223             0, 'throughput_rx_fps\r\n123456.000\r\n', '')
224
225         with self.assertRaises(y_exc.SLAValidationError) as raised:
226             self.scenario.run({})
227
228         self.assertIn('VSPERF_throughput_rx_fps(123456.000000) < '
229                       'SLA_throughput_rx_fps(500000.000000)',
230                       str(raised.exception))
231
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()
236
237         self.mock_ssh.SSH.from_node().execute.return_value = (
238             0, 'nonexisting_metric\r\n123456.000\r\n', '')
239
240         with self.assertRaises(y_exc.SLAValidationError) as raised:
241             self.scenario.run({})
242
243         self.assertIn('throughput_rx_fps was not collected by VSPERF',
244                       str(raised.exception))
245
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()
251
252         self.mock_ssh.SSH.from_node().execute.return_value = (
253             0, 'throughput_rx_fps\r\n14797660.000\r\n', '')
254
255         with self.assertRaises(y_exc.SLAValidationError) as raised:
256             self.scenario.run({})
257
258         self.assertIn('throughput_rx_fps is not defined in SLA',
259                       str(raised.exception))