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