diff --git a/coriolis/tests/osmorphing/osdetect/test_manager.py b/coriolis/tests/osmorphing/osdetect/test_manager.py new file mode 100644 index 00000000..c8cdc22a --- /dev/null +++ b/coriolis/tests/osmorphing/osdetect/test_manager.py @@ -0,0 +1,205 @@ +# Copyright 2024 Cloudbase Solutions Srl +# All Rights Reserved. + +from unittest import mock + +from coriolis import exception +from coriolis.osmorphing.osdetect import base +from coriolis.osmorphing.osdetect import manager +from coriolis.tests import test_base + + +class MockOSDetectTool(base.BaseOSDetectTools): + def returned_detected_os_info_fields(self): + return ['os_type', 'os_version'] + + def detect_os(self): + return { + 'os_type': 'mock_os_type', + 'os_version': 'mock_os_version' + } + + +class MockOSDetectToolNoInfo(base.BaseOSDetectTools): + def returned_detected_os_info_fields(cls): + pass + + def detect_os(self): + pass + + +class MockOSDetectToolMissingFields(MockOSDetectTool): + def returned_detected_os_info_fields(self): + return ['os_type', 'os_version', 'extra_field'] + + def detect_os(self): + return { + 'os_type': 'mock_os_type', + 'os_version': 'mock_os_version' + } + + +class MockOSDetectToolExtraFields(MockOSDetectTool): + def returned_detected_os_info_fields(self): + return ['os_type', 'os_version'] + + def detect_os(self): + return { + 'os_type': 'mock_os_type', + 'os_version': 'mock_os_version', + 'extra_field': 'extra_value' + } + + +class ManagerTestCase(test_base.CoriolisBaseTestCase): + """Test suite for the Coriolis manager module.""" + + def setUp(self): + super(ManagerTestCase, self).setUp() + self.os_type = "linux" + self.os_root_dir = "/root" + self.conn = mock.MagicMock() + + def test__check_custom_os_detect_tools(self): + # Create a mock object that is an instance of BaseOSDetectTools + mock_os_detect_tool = mock.MagicMock(spec=base.BaseOSDetectTools) + + result = manager._check_custom_os_detect_tools([mock_os_detect_tool]) + + self.assertTrue(result) + + def test_check_custom_os_detect_tools_not_list(self): + self.assertRaises(exception.InvalidCustomOSDetectTools, + manager._check_custom_os_detect_tools, "not a list") + + def test_check_custom_os_detect_tools_invalid_type(self): + self.assertRaises(exception.InvalidCustomOSDetectTools, + manager._check_custom_os_detect_tools, [object()]) + + @mock.patch.object(manager, '_check_custom_os_detect_tools') + def test_detect_os_custom_tools(self, mock_check_custom_tools): + mock_os_detect_tool = MockOSDetectTool + + result = manager.detect_os( + self.conn, self.os_type, self.os_root_dir, + mock.sentinel.operation_timeout, + tools_environment=mock.sentinel.tools_environment, + custom_os_detect_tools=[mock_os_detect_tool]) + + mock_check_custom_tools.assert_called_once_with([mock_os_detect_tool]) + + expected_result = { + 'os_type': 'mock_os_type', + 'os_version': 'mock_os_version' + } + + self.assertEqual(result, expected_result) + + @mock.patch.object(manager, '_check_custom_os_detect_tools') + def test_detect_os_windows(self, mock_check_custom_tools): + mock_os_detect_tool = MockOSDetectTool + self.os_type = 'windows' + + result = manager.detect_os( + self.conn, self.os_type, self.os_root_dir, + mock.sentinel.operation_timeout, + custom_os_detect_tools=[mock_os_detect_tool]) + + mock_check_custom_tools.assert_called_once_with([mock_os_detect_tool]) + expected_result = { + 'os_type': 'mock_os_type', + 'os_version': 'mock_os_version' + } + + self.assertEqual(result, expected_result) + + def test_detect_os_invalid_os_type(self): + self.os_type = 'invalid_os_type' + + self.assertRaises(exception.OSDetectToolsNotFound, manager.detect_os, + self.conn, self.os_type, self.os_root_dir, + mock.sentinel.operation_timeout) + + @mock.patch.object(manager, '_check_custom_os_detect_tools') + @mock.patch.object(manager.rocky.RockyLinuxOSDetectTools, 'detect_os') + @mock.patch.object(manager.redhat.RedHatOSDetectTools, 'detect_os') + @mock.patch.object(manager.centos.CentOSOSDetectTools, 'detect_os') + @mock.patch.object(manager.oracle.OracleOSDetectTools, 'detect_os') + def test_detect_os_no_detected_info( + self, mock_oracle_detect_os, mock_centos_detect_os, + mock_redhat_detect_os, mock_rocky_detect_os, + mock_check_custom_tools): + mock_rocky_detect_os.return_value = None + mock_redhat_detect_os.return_value = None + mock_centos_detect_os.return_value = None + mock_oracle_detect_os.return_value = None + mock_os_detect_tool = MockOSDetectToolNoInfo + + self.assertRaises(exception.OSDetectToolsNotFound, manager.detect_os, + self.conn, self.os_type, self.os_root_dir, + mock.sentinel.operation_timeout, + custom_os_detect_tools=[mock_os_detect_tool]) + mock_check_custom_tools.assert_called_once_with([mock_os_detect_tool]) + + @mock.patch.object(manager, '_check_custom_os_detect_tools') + @mock.patch.object(manager.rocky.RockyLinuxOSDetectTools, 'detect_os') + @mock.patch.object(manager.redhat.RedHatOSDetectTools, 'detect_os') + @mock.patch.object(manager.centos.CentOSOSDetectTools, 'detect_os') + @mock.patch.object(manager.oracle.OracleOSDetectTools, 'detect_os') + def test_detect_os_invalid_detected_info( + self, mock_oracle_detect_os, mock_centos_detect_os, + mock_redhat_detect_os, mock_rocky_detect_os, + mock_check_custom_tools): + mock_rocky_detect_os.return_value = None + mock_redhat_detect_os.return_value = None + mock_centos_detect_os.return_value = None + mock_oracle_detect_os.return_value = "invalid_detected_info" + mock_os_detect_tool = MockOSDetectToolNoInfo + + self.assertRaises(exception.InvalidDetectedOSParams, manager.detect_os, + self.conn, self.os_type, self.os_root_dir, + mock.sentinel.operation_timeout, + custom_os_detect_tools=[mock_os_detect_tool]) + mock_check_custom_tools.assert_called_once_with([mock_os_detect_tool]) + + @mock.patch.object(manager, '_check_custom_os_detect_tools') + @mock.patch.object(manager.rocky.RockyLinuxOSDetectTools, 'detect_os') + @mock.patch.object(manager.redhat.RedHatOSDetectTools, 'detect_os') + @mock.patch.object(manager.centos.CentOSOSDetectTools, 'detect_os') + @mock.patch.object(manager.oracle.OracleOSDetectTools, 'detect_os') + def test_detect_os_missing_detected_info_fields( + self, mock_oracle_detect_os, mock_centos_detect_os, + mock_redhat_detect_os, mock_rocky_detect_os, + mock_check_custom_tools): + mock_rocky_detect_os.return_value = None + mock_redhat_detect_os.return_value = None + mock_centos_detect_os.return_value = None + mock_oracle_detect_os.return_value = None + mock_os_detect_tool = MockOSDetectToolMissingFields + + self.assertRaises(exception.InvalidDetectedOSParams, manager.detect_os, + self.conn, self.os_type, self.os_root_dir, + mock.sentinel.operation_timeout, + custom_os_detect_tools=[mock_os_detect_tool]) + mock_check_custom_tools.assert_called_once_with([mock_os_detect_tool]) + + @mock.patch.object(manager, '_check_custom_os_detect_tools') + @mock.patch.object(manager.rocky.RockyLinuxOSDetectTools, 'detect_os') + @mock.patch.object(manager.redhat.RedHatOSDetectTools, 'detect_os') + @mock.patch.object(manager.centos.CentOSOSDetectTools, 'detect_os') + @mock.patch.object(manager.oracle.OracleOSDetectTools, 'detect_os') + def test_detect_os_extra_detected_info_fields( + self, mock_oracle_detect_os, mock_centos_detect_os, + mock_redhat_detect_os, mock_rocky_detect_os, + mock_check_custom_tools): + mock_rocky_detect_os.return_value = None + mock_redhat_detect_os.return_value = None + mock_centos_detect_os.return_value = None + mock_oracle_detect_os.return_value = None + mock_os_detect_tool = MockOSDetectToolExtraFields + + self.assertRaises(exception.InvalidDetectedOSParams, manager.detect_os, + self.conn, self.os_type, self.os_root_dir, + mock.sentinel.operation_timeout, + custom_os_detect_tools=[mock_os_detect_tool]) + mock_check_custom_tools.assert_called_once_with([mock_os_detect_tool])