1 ##############################################################################
2 # Copyright (c) 2017 Rajesh Kudaka.
3 # Copyright (c) 2018 Intel Corporation.
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Apache License, Version 2.0
7 # which accompanies this distribution, and is available at
8 # http://www.apache.org/licenses/LICENSE-2.0
9 ##############################################################################
16 from api.utils import influx
17 from yardstick.benchmark.core import report
18 from yardstick.cmd.commands import change_osloobj_to_paras
20 GOOD_YAML_NAME = 'fake_name'
21 GOOD_TASK_ID = str(uuid.uuid4())
22 GOOD_DB_FIELDKEYS = [{'fieldKey': 'fake_key'}]
25 'time': '0000-00-00T12:34:56.789012Z',
27 GOOD_TIMESTAMP = ['12:34:56.789012']
28 BAD_YAML_NAME = 'F@KE_NAME'
29 BAD_TASK_ID = 'aaaaaa-aaaaaaaa-aaaaaaaaaa-aaaaaa'
31 {'fieldKey': 'fake_key'},
32 {'fieldKey': 'str_str'},
33 {'fieldKey': u'str_unicode'},
34 {u'fieldKey': 'unicode_str'},
35 {u'fieldKey': u'unicode_unicode'},
39 'time': '0000-00-00T00:00:00.000000Z',
42 'time': '0000-00-00T00:00:01.000000Z',
45 'time': '0000-00-00T00:00:02.000000Z',
47 'fake_key': 9876543210987654321,
48 'time': '0000-00-00T00:00:03.000000Z',
50 'fake_key': 'str_str value',
51 'time': '0000-00-00T00:00:04.000000Z',
53 'fake_key': u'str_unicode value',
54 'time': '0000-00-00T00:00:05.000000Z',
56 u'fake_key': 'unicode_str value',
57 'time': '0000-00-00T00:00:06.000000Z',
59 u'fake_key': u'unicode_unicode value',
60 'time': '0000-00-00T00:00:07.000000Z',
63 'time': '0000-00-00T00:00:08.000000Z',
66 'time': '0000-00-00T00:00:09.000000Z',
68 'fake_key': '9876543210123456789',
69 'time': '0000-00-00T00:00:10.000000Z',
71 MORE_TIMESTAMP = ['00:00:%02d.000000' % n for n in range(len(MORE_DB_METRICS))]
72 MORE_EMPTY_DATA = [None] * len(MORE_DB_METRICS)
73 MORE_EXPECTED_TABLE_VALS = {
74 'Timestamp': MORE_TIMESTAMP,
79 9876543210987654321 if six.PY3 else 9.876543210987655e+18,
83 'unicode_unicode value',
86 9876543210123456789 if six.PY3 else 9.876543210123457e+18,
88 'str_str': MORE_EMPTY_DATA,
89 'str_unicode': MORE_EMPTY_DATA,
90 'unicode_str': MORE_EMPTY_DATA,
91 'unicode_unicode': MORE_EMPTY_DATA,
93 MORE_EXPECTED_DATASETS = [{
95 'data': MORE_EXPECTED_TABLE_VALS[key],
97 for key in map(str, [field['fieldKey'] for field in MORE_DB_FIELDKEYS])
101 class JSTreeTestCase(unittest.TestCase):
104 self.jstree = report.JSTree()
106 def test__create_node(self):
107 _id = "tg__0.DropPackets"
110 {"id": "tg__0", "text": "tg__0", "parent": "#"},
111 {"id": "tg__0.DropPackets", "text": "DropPackets", "parent": "tg__0"}
113 self.jstree._create_node(_id)
115 self.assertEqual(self.jstree._created_nodes, ['#', 'tg__0', 'tg__0.DropPackets'])
116 self.assertEqual(self.jstree.jstree_data, expected_data)
118 def test_format_for_jstree(self):
121 'tg__0.LatencyAvg.5', 'tg__0.LatencyAvg.6',
122 'tg__0.LatencyMax.5', 'tg__0.LatencyMax.6',
123 'tg__0.RxThroughput', 'tg__0.TxThroughput',
125 'tg__1.LatencyAvg.5', 'tg__1.LatencyAvg.6',
126 'tg__1.LatencyMax.5', 'tg__1.LatencyMax.6',
127 'tg__1.RxThroughput', 'tg__1.TxThroughput',
128 'vnf__0.curr_packets_in', 'vnf__0.packets_dropped', 'vnf__0.packets_fwd',
132 {"id": "tg__0", "text": "tg__0", "parent": "#"},
133 {"id": "tg__0.DropPackets", "text": "DropPackets", "parent": "tg__0"},
134 {"id": "tg__0.LatencyAvg", "text": "LatencyAvg", "parent": "tg__0"},
135 {"id": "tg__0.LatencyAvg.5", "text": "5", "parent": "tg__0.LatencyAvg"},
136 {"id": "tg__0.LatencyAvg.6", "text": "6", "parent": "tg__0.LatencyAvg"},
137 {"id": "tg__0.LatencyMax", "text": "LatencyMax", "parent": "tg__0"},
138 {"id": "tg__0.LatencyMax.5", "text": "5", "parent": "tg__0.LatencyMax"},
139 {"id": "tg__0.LatencyMax.6", "text": "6", "parent": "tg__0.LatencyMax"},
140 {"id": "tg__0.RxThroughput", "text": "RxThroughput", "parent": "tg__0"},
141 {"id": "tg__0.TxThroughput", "text": "TxThroughput", "parent": "tg__0"},
142 {"id": "tg__1", "text": "tg__1", "parent": "#"},
143 {"id": "tg__1.DropPackets", "text": "DropPackets", "parent": "tg__1"},
144 {"id": "tg__1.LatencyAvg", "text": "LatencyAvg", "parent": "tg__1"},
145 {"id": "tg__1.LatencyAvg.5", "text": "5", "parent": "tg__1.LatencyAvg"},
146 {"id": "tg__1.LatencyAvg.6", "text": "6", "parent": "tg__1.LatencyAvg"},
147 {"id": "tg__1.LatencyMax", "text": "LatencyMax", "parent": "tg__1"},
148 {"id": "tg__1.LatencyMax.5", "text": "5", "parent": "tg__1.LatencyMax"},
149 {"id": "tg__1.LatencyMax.6", "text": "6", "parent": "tg__1.LatencyMax"},
150 {"id": "tg__1.RxThroughput", "text": "RxThroughput", "parent": "tg__1"},
151 {"id": "tg__1.TxThroughput", "text": "TxThroughput", "parent": "tg__1"},
152 {"id": "vnf__0", "text": "vnf__0", "parent": "#"},
153 {"id": "vnf__0.curr_packets_in", "text": "curr_packets_in", "parent": "vnf__0"},
154 {"id": "vnf__0.packets_dropped", "text": "packets_dropped", "parent": "vnf__0"},
155 {"id": "vnf__0.packets_fwd", "text": "packets_fwd", "parent": "vnf__0"},
158 result = self.jstree.format_for_jstree(data)
159 self.assertEqual(expected_output, result)
162 class ReportTestCase(unittest.TestCase):
165 super(ReportTestCase, self).setUp()
166 self.param = change_osloobj_to_paras({})
167 self.param.yaml_name = [GOOD_YAML_NAME]
168 self.param.task_id = [GOOD_TASK_ID]
169 self.rep = report.Report()
171 def test___init__(self):
172 self.assertEqual([], self.rep.Timestamp)
173 self.assertEqual("", self.rep.yaml_name)
174 self.assertEqual("", self.rep.task_id)
176 def test__validate(self):
177 self.rep._validate(GOOD_YAML_NAME, GOOD_TASK_ID)
178 self.assertEqual(GOOD_YAML_NAME, self.rep.yaml_name)
179 self.assertEqual(GOOD_TASK_ID, str(self.rep.task_id))
181 def test__validate_invalid_yaml_name(self):
182 with six.assertRaisesRegex(self, ValueError, "yaml*"):
183 self.rep._validate(BAD_YAML_NAME, GOOD_TASK_ID)
185 def test__validate_invalid_task_id(self):
186 with six.assertRaisesRegex(self, ValueError, "task*"):
187 self.rep._validate(GOOD_YAML_NAME, BAD_TASK_ID)
189 @mock.patch.object(influx, 'query')
190 def test__get_fieldkeys(self, mock_query):
191 mock_query.return_value = GOOD_DB_FIELDKEYS
192 self.rep.yaml_name = GOOD_YAML_NAME
193 self.rep.task_id = GOOD_TASK_ID
194 self.assertEqual(GOOD_DB_FIELDKEYS, self.rep._get_fieldkeys())
196 @mock.patch.object(influx, 'query')
197 def test__get_fieldkeys_nodbclient(self, mock_query):
198 mock_query.side_effect = RuntimeError
199 self.assertRaises(RuntimeError, self.rep._get_fieldkeys)
201 @mock.patch.object(influx, 'query')
202 def test__get_fieldkeys_testcase_not_found(self, mock_query):
203 mock_query.return_value = []
204 self.rep.yaml_name = GOOD_YAML_NAME
205 self.rep.task_id = GOOD_TASK_ID
206 six.assertRaisesRegex(self, KeyError, "Test case", self.rep._get_fieldkeys)
208 @mock.patch.object(influx, 'query')
209 def test__get_metrics(self, mock_query):
210 mock_query.return_value = GOOD_DB_METRICS
211 self.rep.yaml_name = GOOD_YAML_NAME
212 self.rep.task_id = GOOD_TASK_ID
213 self.assertEqual(GOOD_DB_METRICS, self.rep._get_metrics())
215 @mock.patch.object(influx, 'query')
216 def test__get_metrics_task_not_found(self, mock_query):
217 mock_query.return_value = []
218 self.rep.yaml_name = GOOD_YAML_NAME
219 self.rep.task_id = GOOD_TASK_ID
220 six.assertRaisesRegex(self, KeyError, "Task ID", self.rep._get_metrics)
222 @mock.patch.object(report.Report, '_get_metrics')
223 @mock.patch.object(report.Report, '_get_fieldkeys')
224 def test__generate_common(self, mock_keys, mock_metrics):
225 mock_metrics.return_value = MORE_DB_METRICS
226 mock_keys.return_value = MORE_DB_FIELDKEYS
227 datasets, table_vals = self.rep._generate_common(self.param)
228 self.assertEqual(MORE_EXPECTED_DATASETS, datasets)
229 self.assertEqual(MORE_EXPECTED_TABLE_VALS, table_vals)
231 @mock.patch.object(report.Report, '_get_metrics')
232 @mock.patch.object(report.Report, '_get_fieldkeys')
233 @mock.patch.object(report.Report, '_validate')
234 def test_generate(self, mock_valid, mock_keys, mock_metrics):
235 mock_metrics.return_value = GOOD_DB_METRICS
236 mock_keys.return_value = GOOD_DB_FIELDKEYS
237 self.rep.generate(self.param)
238 mock_valid.assert_called_once_with(GOOD_YAML_NAME, GOOD_TASK_ID)
239 mock_metrics.assert_called_once_with()
240 mock_keys.assert_called_once_with()
241 self.assertEqual(GOOD_TIMESTAMP, self.rep.Timestamp)
243 @mock.patch.object(report.Report, '_get_metrics')
244 @mock.patch.object(report.Report, '_get_fieldkeys')
245 @mock.patch.object(report.Report, '_validate')
246 def test_generate_nsb(self, mock_valid, mock_keys, mock_metrics):
247 mock_metrics.return_value = GOOD_DB_METRICS
248 mock_keys.return_value = GOOD_DB_FIELDKEYS
249 self.rep.generate_nsb(self.param)
250 mock_valid.assert_called_once_with(GOOD_YAML_NAME, GOOD_TASK_ID)
251 mock_metrics.assert_called_once_with()
252 mock_keys.assert_called_once_with()
253 self.assertEqual(GOOD_TIMESTAMP, self.rep.Timestamp)