Преглед на файлове

Add unit tests for `osmorphing.osdetect.manager.py`
module

Signed-off-by: Mihaela Balutoiu <mbalutoiu@cloudbasesolutions.com>

Mihaela Balutoiu преди 2 години
родител
ревизия
69dc6b5cdb
променени са 1 файла, в които са добавени 205 реда и са изтрити 0 реда
  1. 205 0
      coriolis/tests/osmorphing/osdetect/test_manager.py

+ 205 - 0
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])