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