190 lines
5.8 KiB
Python
190 lines
5.8 KiB
Python
import platform
|
|
import unittest
|
|
from unittest import skipUnless
|
|
from unittest.mock import NonCallableMock
|
|
from itertools import chain
|
|
from datetime import datetime
|
|
from contextlib import redirect_stdout
|
|
from io import StringIO
|
|
|
|
from numba.tests.support import TestCase
|
|
import numba.misc.numba_sysinfo as nsi
|
|
|
|
|
|
class TestSysInfo(TestCase):
|
|
|
|
def setUp(self):
|
|
super(TestSysInfo, self).setUp()
|
|
self.info = nsi.get_sysinfo()
|
|
self.safe_contents = {
|
|
int: (
|
|
nsi._cpu_count,
|
|
),
|
|
float: (
|
|
nsi._runtime,
|
|
),
|
|
str: (
|
|
nsi._machine,
|
|
nsi._cpu_name,
|
|
nsi._platform_name,
|
|
nsi._os_name,
|
|
nsi._os_version,
|
|
nsi._python_comp,
|
|
nsi._python_impl,
|
|
nsi._python_version,
|
|
nsi._llvm_version,
|
|
nsi._numpy_version,
|
|
),
|
|
bool: (
|
|
nsi._cu_dev_init,
|
|
nsi._svml_state,
|
|
nsi._svml_loaded,
|
|
nsi._svml_operational,
|
|
nsi._llvm_svml_patched,
|
|
nsi._tbb_thread,
|
|
nsi._openmp_thread,
|
|
nsi._wkq_thread,
|
|
nsi._numpy_AVX512_SKX_detected,
|
|
),
|
|
list: (
|
|
nsi._errors,
|
|
nsi._warnings,
|
|
),
|
|
dict: (
|
|
nsi._numba_env_vars,
|
|
),
|
|
datetime: (
|
|
nsi._start,
|
|
nsi._start_utc,
|
|
),
|
|
}
|
|
self.safe_keys = chain(*self.safe_contents.values())
|
|
|
|
def tearDown(self):
|
|
super(TestSysInfo, self).tearDown()
|
|
# System info might contain long strings or lists so delete it.
|
|
del self.info
|
|
|
|
def test_has_safe_keys(self):
|
|
for k in self.safe_keys:
|
|
with self.subTest(k=k):
|
|
self.assertIn(k, self.info)
|
|
|
|
def test_safe_content_type(self):
|
|
for t, keys in self.safe_contents.items():
|
|
for k in keys:
|
|
with self.subTest(k=k):
|
|
self.assertIsInstance(self.info[k], t)
|
|
|
|
def test_has_no_error(self):
|
|
self.assertFalse(self.info[nsi._errors])
|
|
|
|
def test_display_empty_info(self):
|
|
output = StringIO()
|
|
with redirect_stdout(output):
|
|
res = nsi.display_sysinfo({})
|
|
self.assertIsNone(res)
|
|
output.close()
|
|
|
|
|
|
class TestSysInfoWithPsutil(TestCase):
|
|
|
|
mem_total = 2 * 1024 ** 2 # 2_097_152
|
|
mem_available = 1024 ** 2 # 1_048_576
|
|
cpus_list = [1, 2]
|
|
|
|
def setUp(self):
|
|
super(TestSysInfoWithPsutil, self).setUp()
|
|
self.psutil_orig_state = nsi._psutil_import
|
|
# Mocking psutil
|
|
nsi._psutil_import = True
|
|
nsi.psutil = NonCallableMock()
|
|
vm = nsi.psutil.virtual_memory.return_value
|
|
vm.total = self.mem_total
|
|
vm.available = self.mem_available
|
|
if platform.system() in ('Linux', 'Windows',):
|
|
# cpu_affiniy only available on Linux and Windows
|
|
proc = nsi.psutil.Process.return_value
|
|
proc.cpu_affinity.return_value = self.cpus_list
|
|
else:
|
|
nsi.psutil.Process.return_value = None
|
|
|
|
self.info = nsi.get_os_spec_info(platform.system())
|
|
|
|
def tearDown(self):
|
|
super(TestSysInfoWithPsutil, self).tearDown()
|
|
nsi._psutil_import = self.psutil_orig_state
|
|
|
|
def test_has_all_data(self):
|
|
keys = (nsi._mem_total, nsi._mem_available)
|
|
for k in keys:
|
|
with self.subTest(k=k):
|
|
self.assertIn(k, self.info.keys())
|
|
self.assertIsInstance(self.info[k], int)
|
|
|
|
def test_has_correct_values(self):
|
|
self.assertEqual(self.info[nsi._mem_total], self.mem_total)
|
|
self.assertEqual(self.info[nsi._mem_available], self.mem_available)
|
|
|
|
@skipUnless(platform.system() in ('Linux', 'Windows'),
|
|
"CPUs allowed info only available on Linux and Windows")
|
|
def test_cpus_list(self):
|
|
self.assertEqual(self.info[nsi._cpus_allowed], len(self.cpus_list))
|
|
self.assertEqual(self.info[nsi._cpus_list],
|
|
' '.join(str(n) for n in self.cpus_list))
|
|
|
|
|
|
class TestSysInfoWithoutPsutil(TestCase):
|
|
|
|
def setUp(self):
|
|
super(TestSysInfoWithoutPsutil, self).setUp()
|
|
self.psutil_orig_state = nsi._psutil_import
|
|
nsi._psutil_import = False
|
|
self.info = nsi.get_os_spec_info(platform.system())
|
|
|
|
def tearDown(self):
|
|
super(TestSysInfoWithoutPsutil, self).tearDown()
|
|
nsi._psutil_import = self.psutil_orig_state
|
|
|
|
def test_has_all_data(self):
|
|
keys = (nsi._mem_total, nsi._mem_available)
|
|
for k in keys:
|
|
with self.subTest(k=k):
|
|
self.assertIn(k, self.info.keys())
|
|
self.assertIsInstance(self.info[k], int)
|
|
|
|
|
|
class TestPlatformSpecificInfo(TestCase):
|
|
|
|
def setUp(self):
|
|
self.plat_spec_info = {
|
|
'Linux': {
|
|
str: (nsi._libc_version,),
|
|
},
|
|
'Windows': {
|
|
str: (nsi._os_spec_version,),
|
|
},
|
|
'Darwin': {
|
|
str: (nsi._os_spec_version,),
|
|
},
|
|
}
|
|
self.os_name = platform.system()
|
|
self.contents = self.plat_spec_info.get(self.os_name, {})
|
|
self.info = nsi.get_os_spec_info(self.os_name)
|
|
|
|
def test_has_all_data(self):
|
|
keys = chain(*self.contents.values())
|
|
for k in keys:
|
|
with self.subTest(k=k):
|
|
self.assertIn(k, self.info.keys())
|
|
|
|
def test_content_type(self):
|
|
for t, keys in self.contents.items():
|
|
for k in keys:
|
|
with self.subTest(k=k):
|
|
self.assertIsInstance(self.info[k], t)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|