def test_is_rpm_based_os(self): assert is_rpm_based_os() in (True, False)
class TestSysteminfo(unittest.TestCase): class RunSubprocessMocked(unit_tests.MockFunction): def __init__(self, output_tuple=("output", 0)): self.output_tuple = output_tuple self.called = 0 self.used_args = [] def __call__(self, *args, **kwargs): self.called += 1 self.used_args.append(args) return self.output_tuple class PathExistsMocked(unit_tests.MockFunction): def __init__(self, return_value=True): self.return_value = return_value def __call__(self, filepath): return self.return_value class GenerateRpmVaMocked(unit_tests.MockFunction): def __init__(self): self.called = 0 def __call__(self): self.called += 1 class GetLoggerMocked(unit_tests.MockFunction): def __init__(self): self.task_msgs = [] self.info_msgs = [] self.warning_msgs = [] self.critical_msgs = [] def __call__(self, msg): return self def critical(self, msg): self.critical_msgs.append(msg) raise SystemExit(1) def task(self, msg): self.task_msgs.append(msg) def info(self, msg): self.info_msgs.append(msg) def warn(self, msg, *args): self.warning_msgs.append(msg) def warning(self, msg, *args): self.warn(msg, *args) def debug(self, msg): pass class GetFileContentMocked(unit_tests.MockFunction): def __init__(self, data): self.data = data self.as_list = True self.called = 0 def __call__(self, filename, as_list): self.called += 1 return self.data[self.called - 1] ########################################################################## def setUp(self): if os.path.exists(unit_tests.TMP_DIR): shutil.rmtree(unit_tests.TMP_DIR) os.makedirs(unit_tests.TMP_DIR) system_info.logger = logging.getLogger(__name__) self.rpmva_output_file = os.path.join(unit_tests.TMP_DIR, "rpm_va.log") def tearDown(self): if os.path.exists(unit_tests.TMP_DIR): shutil.rmtree(unit_tests.TMP_DIR) @unit_tests.mock(tool_opts, "no_rpm_va", True) def test_modified_rpm_files_diff_with_no_rpm_va(self): self.assertEqual(system_info.modified_rpm_files_diff(), None) @unit_tests.mock(logger, "LOG_DIR", unit_tests.TMP_DIR) @unit_tests.mock( utils, "get_file_content", GetFileContentMocked(data=[["rpm1", "rpm2"], ["rpm1", "rpm2"]]), ) def test_modified_rpm_files_diff_without_differences_after_conversion( self, ): self.assertEqual(system_info.modified_rpm_files_diff(), None) @unit_tests.mock(os.path, "exists", PathExistsMocked(True)) @unit_tests.mock(tool_opts, "no_rpm_va", False) @unit_tests.mock(logger, "LOG_DIR", unit_tests.TMP_DIR) @unit_tests.mock(system_info, "logger", GetLoggerMocked()) @unit_tests.mock( utils, "get_file_content", GetFileContentMocked( data=[ [".M....... g /etc/pki/ca-trust/extracted/java/cacerts"], [ ".M....... g /etc/pki/ca-trust/extracted/java/cacerts", "S.5....T. c /etc/yum.conf", ], ] ), ) @pytest.mark.skipif( not is_rpm_based_os(), reason="Current test runs only on rpm based systems.", ) def test_modified_rpm_files_diff_with_differences_after_conversion(self): system_info.modified_rpm_files_diff() self.assertTrue(any("S.5....T. c /etc/yum.conf" in elem for elem in system_info.logger.info_msgs)) @unit_tests.mock(logger, "LOG_DIR", unit_tests.TMP_DIR) @unit_tests.mock(utils, "run_subprocess", RunSubprocessMocked(("rpmva\n", 0))) def test_generate_rpm_va(self): # TODO: move class from unittest to pytest and use global tool_opts fixture # Check that rpm -Va is executed (default) and stored into the specific file. tool_opts.no_rpm_va = False system_info.generate_rpm_va() self.assertTrue(utils.run_subprocess.called > 0) self.assertEqual(utils.run_subprocess.used_args[0][0], ["rpm", "-Va"]) self.assertTrue(os.path.isfile(self.rpmva_output_file)) self.assertEqual(utils.get_file_content(self.rpmva_output_file), "rpmva\n") @unit_tests.mock(logger, "LOG_DIR", unit_tests.TMP_DIR) @unit_tests.mock(utils, "run_subprocess", RunSubprocessMocked()) def test_generate_rpm_va_skip(self): # Check that rpm -Va is not called when the --no-rpm-va option is used. tool_opts.no_rpm_va = True system_info.generate_rpm_va() self.assertEqual(utils.run_subprocess.called, 0) self.assertFalse(os.path.exists(self.rpmva_output_file)) def test_get_system_version(self): Version = namedtuple("Version", ["major", "minor"]) versions = { "Oracle Linux Server release 6.10": Version(6, 10), "Oracle Linux Server release 7.8": Version(7, 8), "CentOS release 6.10 (Final)": Version(6, 10), "CentOS Linux release 7.6.1810 (Core)": Version(7, 6), "CentOS Linux release 8.1.1911 (Core)": Version(8, 1), } for system_release in versions: system_info.system_release_file_content = system_release version = system_info._get_system_version() self.assertEqual(version, versions[system_release]) system_info.system_release_file_content = "not containing the release" self.assertRaises(SystemExit, system_info._get_system_version)
class TestSysteminfo(unittest.TestCase): class RunSubprocessMocked(unit_tests.MockFunction): def __init__(self, output_tuple=('output', 0)): self.output_tuple = output_tuple self.called = 0 self.used_args = [] def __call__(self, *args, **kwargs): self.called += 1 self.used_args.append(args) return self.output_tuple class PathExistsMocked(unit_tests.MockFunction): def __init__(self, return_value=True): self.return_value = return_value def __call__(self, filepath): return self.return_value class GenerateRpmVaMocked(unit_tests.MockFunction): def __init__(self): self.called = 0 def __call__(self): self.called += 1 class GetLoggerMocked(unit_tests.MockFunction): def __init__(self): self.task_msgs = [] self.info_msgs = [] self.warning_msgs = [] self.critical_msgs = [] def __call__(self, msg): return self def critical(self, msg): self.critical_msgs.append(msg) raise SystemExit(1) def task(self, msg): self.task_msgs.append(msg) def info(self, msg): self.info_msgs.append(msg) def warn(self, msg, *args): self.warning_msgs.append(msg) def warning(self, msg, *args): self.warn(msg, *args) def debug(self, msg): pass class GetFileContentMocked(unit_tests.MockFunction): def __init__(self, data): self.data = data self.as_list = True self.called = 0 def __call__(self, filename, as_list): self.called += 1 return self.data[self.called - 1] ########################################################################## def setUp(self): if os.path.exists(unit_tests.TMP_DIR): shutil.rmtree(unit_tests.TMP_DIR) os.makedirs(unit_tests.TMP_DIR) system_info.logger = logging.getLogger(__name__) self.rpmva_output_file = os.path.join(unit_tests.TMP_DIR, "rpm_va.log") def tearDown(self): if os.path.exists(unit_tests.TMP_DIR): shutil.rmtree(unit_tests.TMP_DIR) @unit_tests.mock(tool_opts, "no_rpm_va", True) def test_modified_rpm_files_diff_with_no_rpm_va(self): self.assertEqual(system_info.modified_rpm_files_diff(), None) @unit_tests.mock(logger, "LOG_DIR", unit_tests.TMP_DIR) @unit_tests.mock( utils, "get_file_content", GetFileContentMocked(data=[['rpm1', 'rpm2'], ['rpm1', 'rpm2']])) def test_modified_rpm_files_diff_without_differences_after_conversion( self): self.assertEqual(system_info.modified_rpm_files_diff(), None) @unit_tests.mock(os.path, "exists", PathExistsMocked(True)) @unit_tests.mock(tool_opts, "no_rpm_va", False) @unit_tests.mock(logger, "LOG_DIR", unit_tests.TMP_DIR) @unit_tests.mock(system_info, "logger", GetLoggerMocked()) @unit_tests.mock( utils, "get_file_content", GetFileContentMocked( data=[['.M....... g /etc/pki/ca-trust/extracted/java/cacerts'], [ '.M....... g /etc/pki/ca-trust/extracted/java/cacerts', 'S.5....T. c /etc/yum.conf' ]])) @pytest.mark.skipif(not is_rpm_based_os(), reason="Current test runs only on rpm based systems.") def test_modified_rpm_files_diff_with_differences_after_conversion(self): system_info.modified_rpm_files_diff() self.assertTrue( any('S.5....T. c /etc/yum.conf' in elem for elem in system_info.logger.info_msgs)) @unit_tests.mock(logger, "LOG_DIR", unit_tests.TMP_DIR) @unit_tests.mock(utils, "run_subprocess", RunSubprocessMocked(("rpmva\n", 0))) def test_generate_rpm_va(self): # Check that rpm -Va is executed (default) and stored into the specific file. system_info.generate_rpm_va() self.assertTrue(utils.run_subprocess.called > 0) self.assertEqual(utils.run_subprocess.used_args[0][0], "rpm -Va") self.assertTrue(os.path.isfile(self.rpmva_output_file)) self.assertEqual(utils.get_file_content(self.rpmva_output_file), "rpmva\n") @unit_tests.mock(logger, "LOG_DIR", unit_tests.TMP_DIR) @unit_tests.mock(utils, "run_subprocess", RunSubprocessMocked()) def test_generate_rpm_va_skip(self): # Check that rpm -Va is not called when the --no-rpm-va option is used. tool_opts.no_rpm_va = True system_info.generate_rpm_va() self.assertEqual(utils.run_subprocess.called, 0) self.assertFalse(os.path.exists(self.rpmva_output_file))