ssh fix, always wait
[yardstick.git] / tests / unit / common / test_utils.py
1 ##############################################################################
2 # Copyright (c) 2015 Ericsson AB and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 # Unittest for yardstick.common.utils
11
12 from __future__ import absolute_import
13
14 import ipaddress
15 import os
16 import unittest
17 from copy import deepcopy
18 from itertools import product, chain
19
20 import mock
21 from six.moves import configparser
22
23 import yardstick
24 from yardstick.common import utils
25 from yardstick.common import constants
26
27
28 class IterSubclassesTestCase(unittest.TestCase):
29     # Disclaimer: this class is a modified copy from
30     # rally/tests/unit/common/plugin/test_discover.py
31     # Copyright 2015: Mirantis Inc.
32
33     def test_itersubclasses(self):
34         class A(object):
35             pass
36
37         class B(A):
38             pass
39
40         class C(A):
41             pass
42
43         class D(C):
44             pass
45
46         self.assertEqual([B, C, D], list(utils.itersubclasses(A)))
47
48
49 class ImportModulesFromPackageTestCase(unittest.TestCase):
50
51     @mock.patch('yardstick.common.utils.os.walk')
52     def test_import_modules_from_package_no_mod(self, mock_walk):
53         yardstick_root = os.path.dirname(os.path.dirname(yardstick.__file__))
54         mock_walk.return_value = ([
55             (os.path.join(yardstick_root, 'foo'), ['bar'], ['__init__.py']),
56             (os.path.join(yardstick_root, 'foo', 'bar'), [], ['baz.txt', 'qux.rst'])
57         ])
58
59         utils.import_modules_from_package('foo.bar')
60
61     @mock.patch('yardstick.common.utils.os.walk')
62     @mock.patch('yardstick.common.utils.importutils')
63     def test_import_modules_from_package(self, mock_importutils, mock_walk):
64
65         yardstick_root = os.path.dirname(os.path.dirname(yardstick.__file__))
66         mock_walk.return_value = ([
67             (os.path.join(yardstick_root, 'foo', os.pardir, 'bar'), [], ['baz.py'])
68         ])
69
70         utils.import_modules_from_package('foo.bar')
71         mock_importutils.import_module.assert_called_with('bar.baz')
72
73
74 class GetParaFromYaml(unittest.TestCase):
75
76     @mock.patch('yardstick.common.utils.os.environ.get')
77     def test_get_param_para_not_found(self, get_env):
78         file_path = 'config_sample.yaml'
79         get_env.return_value = self._get_file_abspath(file_path)
80         args = 'releng.file'
81         default = 'hello'
82         self.assertTrue(constants.get_param(args, default), default)
83
84     @mock.patch('yardstick.common.utils.os.environ.get')
85     def test_get_param_para_exists(self, get_env):
86         file_path = 'config_sample.yaml'
87         get_env.return_value = self._get_file_abspath(file_path)
88         args = 'releng.dir'
89         para = '/home/opnfv/repos/releng'
90         self.assertEqual(para, constants.get_param(args))
91
92     def _get_file_abspath(self, filename):
93         curr_path = os.path.dirname(os.path.abspath(__file__))
94         file_path = os.path.join(curr_path, filename)
95         return file_path
96
97
98 class CommonUtilTestCase(unittest.TestCase):
99
100     def setUp(self):
101         self.data = {
102             "benchmark": {
103                 "data": {
104                     "mpstat": {
105                         "cpu0": {
106                             "%sys": "0.00",
107                             "%idle": "99.00"
108                         },
109                         "loadavg": [
110                             "1.09",
111                             "0.29"
112                         ]
113                     },
114                     "rtt": "1.03"
115                 }
116             }
117         }
118
119     def test__dict_key_flatten(self):
120         line = 'mpstat.loadavg1=0.29,rtt=1.03,mpstat.loadavg0=1.09,' \
121                'mpstat.cpu0.%idle=99.00,mpstat.cpu0.%sys=0.00'
122         # need to sort for assert to work
123         line = ",".join(sorted(line.split(',')))
124         flattened_data = utils.flatten_dict_key(
125             self.data['benchmark']['data'])
126         result = ",".join(
127             ("=".join(item) for item in sorted(flattened_data.items())))
128         self.assertEqual(result, line)
129
130
131 class TestMacAddressToHex(unittest.TestCase):
132
133     def test_mac_address_to_hex_list(self):
134         self.assertEqual(utils.mac_address_to_hex_list("ea:3e:e1:9a:99:e8"),
135                          ['0xea', '0x3e', '0xe1', '0x9a', '0x99', '0xe8'])
136
137
138 class TranslateToStrTestCase(unittest.TestCase):
139
140     def test_translate_to_str_unicode(self):
141         input_str = u'hello'
142         output_str = utils.translate_to_str(input_str)
143
144         result = 'hello'
145         self.assertEqual(result, output_str)
146
147     def test_translate_to_str_dict_list_unicode(self):
148         input_str = {
149             u'hello': {u'hello': [u'world']}
150         }
151         output_str = utils.translate_to_str(input_str)
152
153         result = {
154             'hello': {'hello': ['world']}
155         }
156         self.assertEqual(result, output_str)
157
158     def test_translate_to_str_non_string(self):
159         input_value = object()
160         result = utils.translate_to_str(input_value)
161         self.assertIs(input_value, result)
162
163
164 class TestParseCpuInfo(unittest.TestCase):
165
166     def test_single_socket_no_hyperthread(self):
167         cpuinfo = """\
168 processor       : 2
169 vendor_id       : GenuineIntel
170 cpu family      : 6
171 model           : 60
172 model name      : Intel Core Processor (Haswell, no TSX)
173 stepping        : 1
174 microcode       : 0x1
175 cpu MHz         : 2294.684
176 cache size      : 4096 KB
177 physical id     : 0
178 siblings        : 5
179 core id         : 2
180 cpu cores       : 5
181 apicid          : 2
182 initial apicid  : 2
183 fpu             : yes
184 fpu_exception   : yes
185 cpuid level     : 13
186 wp              : yes
187 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat
188 bugs            :
189 bogomips        : 4589.36
190 clflush size    : 64
191 cache_alignment : 64
192 address sizes   : 46 bits physical, 48 bits virtual
193 power management:
194
195 processor       : 3
196 vendor_id       : GenuineIntel
197 cpu family      : 6
198 model           : 60
199 model name      : Intel Core Processor (Haswell, no TSX)
200 stepping        : 1
201 microcode       : 0x1
202 cpu MHz         : 2294.684
203 cache size      : 4096 KB
204 physical id     : 0
205 siblings        : 5
206 core id         : 3
207 cpu cores       : 5
208 apicid          : 3
209 initial apicid  : 3
210 fpu             : yes
211 fpu_exception   : yes
212 cpuid level     : 13
213 wp              : yes
214 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat
215 bugs            :
216 bogomips        : 4589.36
217 clflush size    : 64
218 cache_alignment : 64
219 address sizes   : 46 bits physical, 48 bits virtual
220 power management:
221
222 processor       : 4
223 vendor_id       : GenuineIntel
224 cpu family      : 6
225 model           : 60
226 model name      : Intel Core Processor (Haswell, no TSX)
227 stepping        : 1
228 microcode       : 0x1
229 cpu MHz         : 2294.684
230 cache size      : 4096 KB
231 physical id     : 0
232 siblings        : 5
233 core id         : 4
234 cpu cores       : 5
235 apicid          : 4
236 initial apicid  : 4
237 fpu             : yes
238 fpu_exception   : yes
239 cpuid level     : 13
240 wp              : yes
241 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ss ht syscall nx pdpe1gb rdtscp lm constant_tsc rep_good nopl eagerfpu pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand hypervisor lahf_lm abm fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt arat
242 bugs            :
243 bogomips        : 4589.36
244 clflush size    : 64
245 cache_alignment : 64
246 address sizes   : 46 bits physical, 48 bits virtual
247 power management:
248
249 """
250         socket_map = utils.SocketTopology.parse_cpuinfo(cpuinfo)
251         assert sorted(socket_map.keys()) == [0]
252         assert sorted(socket_map[0].keys()) == [2, 3, 4]
253
254     def test_single_socket_hyperthread(self):
255         cpuinfo = """\
256 processor       : 5
257 vendor_id       : GenuineIntel
258 cpu family      : 6
259 model           : 60
260 model name      : Intel(R) Xeon(R) CPU E3-1275 v3 @ 3.50GHz
261 stepping        : 3
262 microcode       : 0x1d
263 cpu MHz         : 3501.708
264 cache size      : 8192 KB
265 physical id     : 0
266 siblings        : 8
267 core id         : 1
268 cpu cores       : 4
269 apicid          : 3
270 initial apicid  : 3
271 fpu             : yes
272 fpu_exception   : yes
273 cpuid level     : 13
274 wp              : yes
275 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts
276 bugs            :
277 bogomips        : 6987.36
278 clflush size    : 64
279 cache_alignment : 64
280 address sizes   : 39 bits physical, 48 bits virtual
281 power management:
282
283 processor       : 6
284 vendor_id       : GenuineIntel
285 cpu family      : 6
286 model           : 60
287 model name      : Intel(R) Xeon(R) CPU E3-1275 v3 @ 3.50GHz
288 stepping        : 3
289 microcode       : 0x1d
290 cpu MHz         : 3531.829
291 cache size      : 8192 KB
292 physical id     : 0
293 siblings        : 8
294 core id         : 2
295 cpu cores       : 4
296 apicid          : 5
297 initial apicid  : 5
298 fpu             : yes
299 fpu_exception   : yes
300 cpuid level     : 13
301 wp              : yes
302 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts
303 bugs            :
304 bogomips        : 6987.36
305 clflush size    : 64
306 cache_alignment : 64
307 address sizes   : 39 bits physical, 48 bits virtual
308 power management:
309
310 processor       : 7
311 vendor_id       : GenuineIntel
312 cpu family      : 6
313 model           : 60
314 model name      : Intel(R) Xeon(R) CPU E3-1275 v3 @ 3.50GHz
315 stepping        : 3
316 microcode       : 0x1d
317 cpu MHz         : 3500.213
318 cache size      : 8192 KB
319 physical id     : 0
320 siblings        : 8
321 core id         : 3
322 cpu cores       : 4
323 apicid          : 7
324 initial apicid  : 7
325 fpu             : yes
326 fpu_exception   : yes
327 cpuid level     : 13
328 wp              : yes
329 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 avx2 smep bmi2 erms invpcid xsaveopt dtherm ida arat pln pts
330 bugs            :
331 bogomips        : 6987.24
332 clflush size    : 64
333 cache_alignment : 64
334 address sizes   : 39 bits physical, 48 bits virtual
335 power management:
336
337 """
338         socket_map = utils.SocketTopology.parse_cpuinfo(cpuinfo)
339         assert sorted(socket_map.keys()) == [0]
340         assert sorted(socket_map[0].keys()) == [1, 2, 3]
341         assert sorted(socket_map[0][1]) == [5]
342         assert sorted(socket_map[0][2]) == [6]
343         assert sorted(socket_map[0][3]) == [7]
344
345     def test_dual_socket_hyperthread(self):
346         cpuinfo = """\
347 processor       : 1
348 vendor_id       : GenuineIntel
349 cpu family      : 6
350 model           : 79
351 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
352 stepping        : 1
353 microcode       : 0xb00001f
354 cpu MHz         : 1200.976
355 cache size      : 56320 KB
356 physical id     : 0
357 siblings        : 44
358 core id         : 1
359 cpu cores       : 22
360 apicid          : 2
361 initial apicid  : 2
362 fpu             : yes
363 fpu_exception   : yes
364 cpuid level     : 20
365 wp              : yes
366 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
367 bugs            :
368 bogomips        : 4401.07
369 clflush size    : 64
370 cache_alignment : 64
371 address sizes   : 46 bits physical, 48 bits virtual
372 power management:
373
374 processor       : 2
375 vendor_id       : GenuineIntel
376 cpu family      : 6
377 model           : 79
378 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
379 stepping        : 1
380 microcode       : 0xb00001f
381 cpu MHz         : 1226.892
382 cache size      : 56320 KB
383 physical id     : 0
384 siblings        : 44
385 core id         : 2
386 cpu cores       : 22
387 apicid          : 4
388 initial apicid  : 4
389 fpu             : yes
390 fpu_exception   : yes
391 cpuid level     : 20
392 wp              : yes
393 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
394 bugs            :
395 bogomips        : 4400.84
396 clflush size    : 64
397 cache_alignment : 64
398 address sizes   : 46 bits physical, 48 bits virtual
399 power management:
400
401 processor       : 43
402 vendor_id       : GenuineIntel
403 cpu family      : 6
404 model           : 79
405 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
406 stepping        : 1
407 microcode       : 0xb00001f
408 cpu MHz         : 1200.305
409 cache size      : 56320 KB
410 physical id     : 1
411 siblings        : 44
412 core id         : 28
413 cpu cores       : 22
414 apicid          : 120
415 initial apicid  : 120
416 fpu             : yes
417 fpu_exception   : yes
418 cpuid level     : 20
419 wp              : yes
420 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
421 bugs            :
422 bogomips        : 4411.31
423 clflush size    : 64
424 cache_alignment : 64
425 address sizes   : 46 bits physical, 48 bits virtual
426 power management:
427
428 processor       : 44
429 vendor_id       : GenuineIntel
430 cpu family      : 6
431 model           : 79
432 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
433 stepping        : 1
434 microcode       : 0xb00001f
435 cpu MHz         : 1200.305
436 cache size      : 56320 KB
437 physical id     : 0
438 siblings        : 44
439 core id         : 0
440 cpu cores       : 22
441 apicid          : 1
442 initial apicid  : 1
443 fpu             : yes
444 fpu_exception   : yes
445 cpuid level     : 20
446 wp              : yes
447 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
448 bugs            :
449 bogomips        : 4410.61
450 clflush size    : 64
451 cache_alignment : 64
452 address sizes   : 46 bits physical, 48 bits virtual
453 power management:
454
455 processor       : 85
456 vendor_id       : GenuineIntel
457 cpu family      : 6
458 model           : 79
459 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
460 stepping        : 1
461 microcode       : 0xb00001f
462 cpu MHz         : 1200.573
463 cache size      : 56320 KB
464 physical id     : 1
465 siblings        : 44
466 core id         : 26
467 cpu cores       : 22
468 apicid          : 117
469 initial apicid  : 117
470 fpu             : yes
471 fpu_exception   : yes
472 cpuid level     : 20
473 wp              : yes
474 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
475 bugs            :
476 bogomips        : 4409.07
477 clflush size    : 64
478 cache_alignment : 64
479 address sizes   : 46 bits physical, 48 bits virtual
480 power management:
481
482 processor       : 86
483 vendor_id       : GenuineIntel
484 cpu family      : 6
485 model           : 79
486 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
487 stepping        : 1
488 microcode       : 0xb00001f
489 cpu MHz         : 1200.305
490 cache size      : 56320 KB
491 physical id     : 1
492 siblings        : 44
493 core id         : 27
494 cpu cores       : 22
495 apicid          : 119
496 initial apicid  : 119
497 fpu             : yes
498 fpu_exception   : yes
499 cpuid level     : 20
500 wp              : yes
501 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
502 bugs            :
503 bogomips        : 4406.62
504 clflush size    : 64
505 cache_alignment : 64
506 address sizes   : 46 bits physical, 48 bits virtual
507 power management:
508
509 processor       : 87
510 vendor_id       : GenuineIntel
511 cpu family      : 6
512 model           : 79
513 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
514 stepping        : 1
515 microcode       : 0xb00001f
516 cpu MHz         : 1200.708
517 cache size      : 56320 KB
518 physical id     : 1
519 siblings        : 44
520 core id         : 28
521 cpu cores       : 22
522 apicid          : 121
523 initial apicid  : 121
524 fpu             : yes
525 fpu_exception   : yes
526 cpuid level     : 20
527 wp              : yes
528 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
529 bugs            :
530 bogomips        : 4413.48
531 clflush size    : 64
532 cache_alignment : 64
533 address sizes   : 46 bits physical, 48 bits virtual
534 power management:
535
536 """
537         socket_map = utils.SocketTopology.parse_cpuinfo(cpuinfo)
538         assert sorted(socket_map.keys()) == [0, 1]
539         assert sorted(socket_map[0].keys()) == [0, 1, 2]
540         assert sorted(socket_map[1].keys()) == [26, 27, 28]
541         assert sorted(socket_map[0][0]) == [44]
542         assert sorted(socket_map[0][1]) == [1]
543         assert sorted(socket_map[0][2]) == [2]
544         assert sorted(socket_map[1][26]) == [85]
545         assert sorted(socket_map[1][27]) == [86]
546         assert sorted(socket_map[1][28]) == [43, 87]
547
548     def test_dual_socket_no_hyperthread(self):
549         cpuinfo = """\
550 processor       : 1
551 vendor_id       : GenuineIntel
552 cpu family      : 6
553 model           : 79
554 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
555 stepping        : 1
556 microcode       : 0xb00001f
557 cpu MHz         : 1200.976
558 cache size      : 56320 KB
559 physical id     : 0
560 siblings        : 44
561 core id         : 1
562 cpu cores       : 22
563 apicid          : 2
564 initial apicid  : 2
565 fpu             : yes
566 fpu_exception   : yes
567 cpuid level     : 20
568 wp              : yes
569 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
570 bugs            :
571 bogomips        : 4401.07
572 clflush size    : 64
573 cache_alignment : 64
574 address sizes   : 46 bits physical, 48 bits virtual
575 power management:
576
577 processor       : 2
578 vendor_id       : GenuineIntel
579 cpu family      : 6
580 model           : 79
581 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
582 stepping        : 1
583 microcode       : 0xb00001f
584 cpu MHz         : 1226.892
585 cache size      : 56320 KB
586 physical id     : 0
587 siblings        : 44
588 core id         : 2
589 cpu cores       : 22
590 apicid          : 4
591 initial apicid  : 4
592 fpu             : yes
593 fpu_exception   : yes
594 cpuid level     : 20
595 wp              : yes
596 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
597 bugs            :
598 bogomips        : 4400.84
599 clflush size    : 64
600 cache_alignment : 64
601 address sizes   : 46 bits physical, 48 bits virtual
602 power management:
603
604 processor       : 43
605 vendor_id       : GenuineIntel
606 cpu family      : 6
607 model           : 79
608 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
609 stepping        : 1
610 microcode       : 0xb00001f
611 cpu MHz         : 1200.305
612 cache size      : 56320 KB
613 physical id     : 1
614 siblings        : 44
615 core id         : 28
616 cpu cores       : 22
617 apicid          : 120
618 initial apicid  : 120
619 fpu             : yes
620 fpu_exception   : yes
621 cpuid level     : 20
622 wp              : yes
623 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
624 bugs            :
625 bogomips        : 4411.31
626 clflush size    : 64
627 cache_alignment : 64
628 address sizes   : 46 bits physical, 48 bits virtual
629 power management:
630
631 processor       : 44
632 vendor_id       : GenuineIntel
633 cpu family      : 6
634 model           : 79
635 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
636 stepping        : 1
637 microcode       : 0xb00001f
638 cpu MHz         : 1200.305
639 cache size      : 56320 KB
640 physical id     : 0
641 siblings        : 44
642 core id         : 0
643 cpu cores       : 22
644 apicid          : 1
645 initial apicid  : 1
646 fpu             : yes
647 fpu_exception   : yes
648 cpuid level     : 20
649 wp              : yes
650 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
651 bugs            :
652 bogomips        : 4410.61
653 clflush size    : 64
654 cache_alignment : 64
655 address sizes   : 46 bits physical, 48 bits virtual
656 power management:
657
658 processor       : 85
659 vendor_id       : GenuineIntel
660 cpu family      : 6
661 model           : 79
662 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
663 stepping        : 1
664 microcode       : 0xb00001f
665 cpu MHz         : 1200.573
666 cache size      : 56320 KB
667 physical id     : 1
668 siblings        : 44
669 core id         : 26
670 cpu cores       : 22
671 apicid          : 117
672 initial apicid  : 117
673 fpu             : yes
674 fpu_exception   : yes
675 cpuid level     : 20
676 wp              : yes
677 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
678 bugs            :
679 bogomips        : 4409.07
680 clflush size    : 64
681 cache_alignment : 64
682 address sizes   : 46 bits physical, 48 bits virtual
683 power management:
684
685 processor       : 86
686 vendor_id       : GenuineIntel
687 cpu family      : 6
688 model           : 79
689 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
690 stepping        : 1
691 microcode       : 0xb00001f
692 cpu MHz         : 1200.305
693 cache size      : 56320 KB
694 physical id     : 1
695 siblings        : 44
696 core id         : 27
697 cpu cores       : 22
698 apicid          : 119
699 initial apicid  : 119
700 fpu             : yes
701 fpu_exception   : yes
702 cpuid level     : 20
703 wp              : yes
704 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
705 bugs            :
706 bogomips        : 4406.62
707 clflush size    : 64
708 cache_alignment : 64
709 address sizes   : 46 bits physical, 48 bits virtual
710 power management:
711
712 processor       : 87
713 vendor_id       : GenuineIntel
714 cpu family      : 6
715 model           : 79
716 model name      : Intel(R) Xeon(R) CPU E5-2699 v4 @ 2.20GHz
717 stepping        : 1
718 microcode       : 0xb00001f
719 cpu MHz         : 1200.708
720 cache size      : 56320 KB
721 physical id     : 1
722 siblings        : 44
723 core id         : 28
724 cpu cores       : 22
725 apicid          : 121
726 initial apicid  : 121
727 fpu             : yes
728 fpu_exception   : yes
729 cpuid level     : 20
730 wp              : yes
731 flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm 3dnowprefetch epb cat_l3 cdp_l3 intel_ppin intel_pt tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm cqm rdt_a rdseed adx smap xsaveopt cqm_llc cqm_occup_llc cqm_mbm_total cqm_mbm_local dtherm ida arat pln pts
732 bugs            :
733 bogomips        : 4413.48
734 clflush size    : 64
735 cache_alignment : 64
736 address sizes   : 46 bits physical, 48 bits virtual
737 power management:
738
739 """
740         socket_map = utils.SocketTopology.parse_cpuinfo(cpuinfo)
741         processors = socket_map.processors()
742         assert processors == [1, 2, 43, 44, 85, 86, 87]
743         cores = socket_map.cores()
744         assert cores == [0, 1, 2, 26, 27, 28]
745         sockets = socket_map.sockets()
746         assert sockets == [0, 1]
747
748
749 class ChangeObjToDictTestCase(unittest.TestCase):
750
751     def test_change_obj_to_dict(self):
752         class A(object):
753             def __init__(self):
754                 self.name = 'yardstick'
755
756         obj = A()
757         obj_r = utils.change_obj_to_dict(obj)
758         obj_s = {'name': 'yardstick'}
759         self.assertEqual(obj_r, obj_s)
760
761
762 class SetDictValueTestCase(unittest.TestCase):
763
764     def test_set_dict_value(self):
765         input_dic = {
766             'hello': 'world'
767         }
768         output_dic = utils.set_dict_value(input_dic, 'welcome.to', 'yardstick')
769         self.assertEqual(output_dic.get('welcome', {}).get('to'), 'yardstick')
770
771
772 class RemoveFileTestCase(unittest.TestCase):
773
774     def test_remove_file(self):
775         try:
776             utils.remove_file('notexistfile.txt')
777         except Exception as e:
778             self.assertTrue(isinstance(e, OSError))
779
780
781 class TestUtils(unittest.TestCase):
782
783     @mock.patch('yardstick.common.utils.jsonify')
784     def test_result_handler(self, mock_jsonify):
785         mock_jsonify.return_value = 432
786
787         self.assertEqual(utils.result_handler('x', 234), 432)
788         mock_jsonify.assert_called_once_with({'status': 'x', 'result': 234})
789
790     @mock.patch('random.randint')
791     @mock.patch('socket.socket')
792     def test_get_free_port(self, mock_socket, mock_randint):
793         mock_randint.return_value = 7777
794         s = mock_socket('x', 'y')
795         s.connect_ex.side_effect = iter([0, 1])
796         result = utils.get_free_port('10.20.30.40')
797         self.assertEqual(result, 7777)
798         self.assertEqual(s.connect_ex.call_count, 2)
799
800     @mock.patch('subprocess.check_output')
801     def test_execute_command(self, mock_check_output):
802         expected = ['hello world', '1234']
803         mock_check_output.return_value = os.linesep.join(expected)
804         result = utils.execute_command('my_command arg1 arg2')
805         self.assertEqual(result, expected)
806
807     @mock.patch('subprocess.Popen')
808     def test_source_env(self, mock_popen):
809         base_env = deepcopy(os.environ)
810         mock_process = mock_popen()
811         output_list = [
812             'garbage line before',
813             'NEW_ENV_VALUE=234',
814             'garbage line after',
815         ]
816         mock_process.communicate.return_value = os.linesep.join(output_list), '', 0
817         expected = {'NEW_ENV_VALUE': '234'}
818         result = utils.source_env('my_file')
819         self.assertDictEqual(result, expected)
820         os.environ.clear()
821         os.environ.update(base_env)
822
823     @mock.patch('yardstick.common.utils.configparser.ConfigParser')
824     def test_parse_ini_file(self, mock_config_parser_type):
825         defaults = {
826             'default1': 'value1',
827             'default2': 'value2',
828         }
829         s1 = {
830             'key1': 'value11',
831             'key2': 'value22',
832         }
833         s2 = {
834             'key1': 'value123',
835             'key2': 'value234',
836         }
837
838         mock_config_parser = mock_config_parser_type()
839         mock_config_parser.read.return_value = True
840         mock_config_parser.sections.return_value = ['s1', 's2']
841         mock_config_parser.items.side_effect = iter([
842             defaults.items(),
843             s1.items(),
844             s2.items(),
845         ])
846
847         expected = {
848             'DEFAULT': defaults,
849             's1': s1,
850             's2': s2,
851         }
852         result = utils.parse_ini_file('my_path')
853         self.assertDictEqual(result, expected)
854
855     @mock.patch('yardstick.common.utils.configparser.ConfigParser')
856     def test_parse_ini_file_missing_section_header(self, mock_config_parser_type):
857         mock_config_parser = mock_config_parser_type()
858         mock_config_parser.read.side_effect = \
859             configparser.MissingSectionHeaderError(mock.Mock(), 321, mock.Mock())
860
861         with self.assertRaises(configparser.MissingSectionHeaderError):
862             utils.parse_ini_file('my_path')
863
864     @mock.patch('yardstick.common.utils.configparser.ConfigParser')
865     def test_parse_ini_file_no_file(self, mock_config_parser_type):
866         mock_config_parser = mock_config_parser_type()
867         mock_config_parser.read.return_value = False
868         with self.assertRaises(RuntimeError):
869             utils.parse_ini_file('my_path')
870
871     @mock.patch('yardstick.common.utils.configparser.ConfigParser')
872     def test_parse_ini_file_no_default_section_header(self, mock_config_parser_type):
873         s1 = {
874             'key1': 'value11',
875             'key2': 'value22',
876         }
877         s2 = {
878             'key1': 'value123',
879             'key2': 'value234',
880         }
881
882         mock_config_parser = mock_config_parser_type()
883         mock_config_parser.read.return_value = True
884         mock_config_parser.sections.return_value = ['s1', 's2']
885         mock_config_parser.items.side_effect = iter([
886             configparser.NoSectionError(mock.Mock()),
887             s1.items(),
888             s2.items(),
889         ])
890
891         expected = {
892             'DEFAULT': {},
893             's1': s1,
894             's2': s2,
895         }
896         result = utils.parse_ini_file('my_path')
897         self.assertDictEqual(result, expected)
898
899     def test_join_non_strings(self):
900         self.assertEqual(utils.join_non_strings(':'), '')
901         self.assertEqual(utils.join_non_strings(':', 'a'), 'a')
902         self.assertEqual(utils.join_non_strings(':', 'a', 2, 'c'), 'a:2:c')
903         self.assertEqual(utils.join_non_strings(':', ['a', 2, 'c']), 'a:2:c')
904         self.assertEqual(utils.join_non_strings(':', 'abc'), 'abc')
905
906     def test_validate_non_string_sequence(self):
907         self.assertEqual(utils.validate_non_string_sequence([1, 2, 3]), [1, 2, 3])
908         self.assertIsNone(utils.validate_non_string_sequence('123'))
909         self.assertIsNone(utils.validate_non_string_sequence(1))
910
911         self.assertEqual(utils.validate_non_string_sequence(1, 2), 2)
912         self.assertEqual(utils.validate_non_string_sequence(1, default=2), 2)
913
914         with self.assertRaises(RuntimeError):
915             utils.validate_non_string_sequence(1, raise_exc=RuntimeError)
916
917     def test_error_class(self):
918         with self.assertRaises(RuntimeError):
919             utils.ErrorClass()
920
921         error_instance = utils.ErrorClass(test='')
922         with self.assertRaises(AttributeError):
923             error_instance.get_name()
924
925
926 class TestUtilsIpAddrMethods(unittest.TestCase):
927
928     GOOD_IP_V4_ADDRESS_STR_LIST = [
929         u'0.0.0.0',
930         u'10.20.30.40',
931         u'127.0.0.1',
932         u'10.20.30.40',
933         u'172.29.50.75',
934         u'192.168.230.9',
935         u'255.255.255.255',
936     ]
937
938     GOOD_IP_V4_MASK_STR_LIST = [
939         u'/1',
940         u'/8',
941         u'/13',
942         u'/19',
943         u'/24',
944         u'/32',
945     ]
946
947     GOOD_IP_V6_ADDRESS_STR_LIST = [
948         u'::1',
949         u'fe80::250:56ff:fe89:91ff',
950         u'123:4567:89ab:cdef:123:4567:89ab:cdef',
951     ]
952
953     GOOD_IP_V6_MASK_STR_LIST = [
954         u'/1',
955         u'/16',
956         u'/29',
957         u'/64',
958         u'/99',
959         u'/128',
960     ]
961
962     INVALID_IP_ADDRESS_STR_LIST = [
963         1,
964         u'w.x.y.z',
965         u'10.20.30.40/33',
966         u'123:4567:89ab:cdef:123:4567:89ab:cdef/129',
967     ]
968
969     def test_safe_ip_address(self):
970         addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST
971         for addr in addr_list:
972             # test with no mask
973             expected = ipaddress.ip_address(addr)
974             self.assertEqual(utils.safe_ip_address(addr), expected, addr)
975
976     def test_safe_ip_address_v6_ip(self):
977         addr_list = self.GOOD_IP_V6_ADDRESS_STR_LIST
978         for addr in addr_list:
979             # test with no mask
980             expected = ipaddress.ip_address(addr)
981             self.assertEqual(utils.safe_ip_address(addr), expected, addr)
982
983     @mock.patch("yardstick.common.utils.logging")
984     def test_safe_ip_address_negative(self, mock_logging):
985         for value in self.INVALID_IP_ADDRESS_STR_LIST:
986             self.assertIsNone(utils.safe_ip_address(value), value)
987
988         addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST
989         mask_list = self.GOOD_IP_V4_MASK_STR_LIST
990         for addr_mask_pair in product(addr_list, mask_list):
991             value = ''.join(addr_mask_pair)
992             self.assertIsNone(utils.safe_ip_address(value), value)
993
994         addr_list = self.GOOD_IP_V6_ADDRESS_STR_LIST
995         mask_list = self.GOOD_IP_V6_MASK_STR_LIST
996         for addr_mask_pair in product(addr_list, mask_list):
997             value = ''.join(addr_mask_pair)
998             self.assertIsNone(utils.safe_ip_address(value), value)
999
1000     def test_get_ip_version(self):
1001         addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST
1002         for addr in addr_list:
1003             # test with no mask
1004             self.assertEqual(utils.get_ip_version(addr), 4, addr)
1005
1006     def test_get_ip_version_v6_ip(self):
1007         addr_list = self.GOOD_IP_V6_ADDRESS_STR_LIST
1008         for addr in addr_list:
1009             # test with no mask
1010             self.assertEqual(utils.get_ip_version(addr), 6, addr)
1011
1012     @mock.patch("yardstick.common.utils.logging")
1013     def test_get_ip_version_negative(self, mock_logging):
1014         for value in self.INVALID_IP_ADDRESS_STR_LIST:
1015             self.assertIsNone(utils.get_ip_version(value), value)
1016
1017         addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST
1018         mask_list = self.GOOD_IP_V4_MASK_STR_LIST
1019         for addr_mask_pair in product(addr_list, mask_list):
1020             value = ''.join(addr_mask_pair)
1021             self.assertIsNone(utils.get_ip_version(value), value)
1022
1023         addr_list = self.GOOD_IP_V6_ADDRESS_STR_LIST
1024         mask_list = self.GOOD_IP_V6_MASK_STR_LIST
1025         for addr_mask_pair in product(addr_list, mask_list):
1026             value = ''.join(addr_mask_pair)
1027             self.assertIsNone(utils.get_ip_version(value), value)
1028
1029     def test_ip_to_hex(self):
1030         self.assertEqual(utils.ip_to_hex('0.0.0.0'), '00000000')
1031         self.assertEqual(utils.ip_to_hex('10.20.30.40'), '0a141e28')
1032         self.assertEqual(utils.ip_to_hex('127.0.0.1'), '7f000001')
1033         self.assertEqual(utils.ip_to_hex('172.31.90.100'), 'ac1f5a64')
1034         self.assertEqual(utils.ip_to_hex('192.168.254.253'), 'c0a8fefd')
1035         self.assertEqual(utils.ip_to_hex('255.255.255.255'), 'ffffffff')
1036
1037     def test_ip_to_hex_v6_ip(self):
1038         for value in self.GOOD_IP_V6_ADDRESS_STR_LIST:
1039             self.assertEqual(utils.ip_to_hex(value), value)
1040
1041     @mock.patch("yardstick.common.utils.logging")
1042     def test_ip_to_hex_negative(self, mock_logging):
1043         addr_list = self.GOOD_IP_V4_ADDRESS_STR_LIST
1044         mask_list = self.GOOD_IP_V4_MASK_STR_LIST
1045         value_iter = (''.join(pair) for pair in product(addr_list, mask_list))
1046         for value in chain(value_iter, self.INVALID_IP_ADDRESS_STR_LIST):
1047             self.assertEqual(utils.ip_to_hex(value), value)
1048
1049
1050 def main():
1051     unittest.main()
1052
1053 if __name__ == '__main__':
1054     main()