""" Tests for deb-mock core functionality """ import pytest import os import tempfile from unittest.mock import Mock, patch, MagicMock from deb_mock.core import DebMock from deb_mock.exceptions import DebMockError, ChrootError, CacheError class TestDebMock: """Test the core DebMock class""" def test_initialization(self, test_config): """Test DebMock initialization""" deb_mock = DebMock(test_config) assert deb_mock.config == test_config assert deb_mock.chroot_manager is not None assert deb_mock.cache_manager is not None assert deb_mock.sbuild_wrapper is not None assert deb_mock.plugin_manager is not None assert deb_mock.performance_monitor is not None def test_initialization_with_performance_monitoring(self, performance_test_config): """Test DebMock initialization with performance monitoring enabled""" deb_mock = DebMock(performance_test_config) assert deb_mock.performance_monitor.enable_monitoring is True assert deb_mock.performance_optimizer is not None assert deb_mock.performance_reporter is not None def test_initialization_with_plugins(self, plugin_test_config): """Test DebMock initialization with plugins""" deb_mock = DebMock(plugin_test_config) assert deb_mock.plugin_manager is not None # Plugin manager should be initialized deb_mock.plugin_manager.init_plugins.assert_called_once_with(deb_mock) @patch('deb_mock.core.ChrootManager') @patch('deb_mock.core.CacheManager') @patch('deb_mock.core.SbuildWrapper') @patch('deb_mock.core.PluginManager') @patch('deb_mock.core.PerformanceMonitor') def test_component_initialization(self, mock_perf_mon, mock_plugin_mgr, mock_sbuild, mock_cache_mgr, mock_chroot_mgr, test_config): """Test that all components are properly initialized""" deb_mock = DebMock(test_config) # Verify all managers are created mock_chroot_mgr.assert_called_once_with(test_config) mock_cache_mgr.assert_called_once_with(test_config) mock_sbuild.assert_called_once_with(test_config) mock_plugin_mgr.assert_called_once_with(test_config) mock_perf_mon.assert_called_once_with(test_config) def test_build_with_existing_chroot(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building with an existing chroot""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build result = mock_deb_mock.build(sample_source_package) # Verify chroot was not created mock_chroot_manager.create_chroot.assert_not_called() # Verify hooks were called mock_plugin_manager.call_hooks.assert_any_call( mock_plugin_manager.HookStages.PREBUILD, sample_source_package, chroot_name="test-chroot" ) mock_plugin_manager.call_hooks.assert_any_call( mock_plugin_manager.HookStages.BUILD_START, sample_source_package, "test-chroot" ) mock_plugin_manager.call_hooks.assert_any_call( mock_plugin_manager.HookStages.BUILD_END, result, sample_source_package, "test-chroot" ) mock_plugin_manager.call_hooks.assert_any_call( mock_plugin_manager.HookStages.POSTBUILD, result, sample_source_package ) # Verify build result assert result["success"] is True def test_build_with_new_chroot(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building with a new chroot""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot doesn't exist mock_chroot_manager.chroot_exists.return_value = False # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build result = mock_deb_mock.build(sample_source_package) # Verify chroot was created mock_chroot_manager.create_chroot.assert_called_once_with("test-chroot") # Verify build result assert result["success"] is True def test_build_with_cache_restore(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building with cache restoration""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot doesn't exist but cache restore succeeds mock_chroot_manager.chroot_exists.return_value = False mock_cache_manager.restore_root_cache.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build result = mock_deb_mock.build(sample_source_package) # Verify cache was restored mock_cache_manager.restore_root_cache.assert_called_once() # Verify chroot was not created (cache restore succeeded) mock_chroot_manager.create_chroot.assert_not_called() # Verify build result assert result["success"] is True def test_build_with_failed_cache_restore(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building with failed cache restoration""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot doesn't exist and cache restore fails mock_chroot_manager.chroot_exists.return_value = False mock_cache_manager.restore_root_cache.return_value = False # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build result = mock_deb_mock.build(sample_source_package) # Verify cache restore was attempted mock_cache_manager.restore_root_cache.assert_called_once() # Verify chroot was created (cache restore failed) mock_chroot_manager.create_chroot.assert_called_once_with("test-chroot") # Verify build result assert result["success"] is True def test_build_with_custom_chroot_name(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building with a custom chroot name""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/custom-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build with custom chroot name result = mock_deb_mock.build(sample_source_package, chroot_name="custom-chroot") # Verify custom chroot name was used mock_chroot_manager.chroot_exists.assert_called_with("custom-chroot") # Verify hooks were called with custom chroot name mock_plugin_manager.call_hooks.assert_any_call( mock_plugin_manager.HookStages.BUILD_START, sample_source_package, "custom-chroot" ) # Verify build result assert result["success"] is True def test_build_with_keep_chroot(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building with keep_chroot option""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") mock_deb_mock.config.keep_chroot = False # Default is False # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build with keep_chroot=True result = mock_deb_mock.build(sample_source_package, keep_chroot=True) # Verify chroot was not cleaned up mock_chroot_manager.clean_chroot.assert_not_called() # Verify build result assert result["success"] is True def test_build_without_keep_chroot(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building without keep_chroot option""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") mock_deb_mock.config.keep_chroot = False # Default is False # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build (default keep_chroot=False) result = mock_deb_mock.build(sample_source_package) # Verify chroot was cleaned up mock_chroot_manager.clean_chroot.assert_called_once_with("test-chroot") # Verify build result assert result["success"] is True def test_build_with_successful_result(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building with successful result triggers cache creation""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build result = mock_deb_mock.build(sample_source_package) # Verify cache was created (successful build) mock_cache_manager.create_root_cache.assert_called_once() # Verify build result assert result["success"] is True def test_build_with_failed_result(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building with failed result doesn't trigger cache creation""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock failed build result mock_sbuild_wrapper.build_package.return_value = { "success": False, "error": "Build failed", "output": "Error output" } # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Run build result = mock_deb_mock.build(sample_source_package) # Verify cache was not created (failed build) mock_cache_manager.create_root_cache.assert_not_called() # Verify build result assert result["success"] is False assert "error" in result def test_build_metadata_capture(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test that build metadata is captured and stored""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={"test": "data"}) mock_deb_mock.metadata_manager = Mock() # Run build result = mock_deb_mock.build(sample_source_package) # Verify metadata was captured mock_deb_mock._capture_build_metadata.assert_called_once_with(result, sample_source_package) # Verify metadata was stored mock_deb_mock.metadata_manager.store_metadata.assert_called_once_with({"test": "data"}) # Verify build result assert result["success"] is True def test_build_with_performance_monitoring(self, performance_test_config, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager): """Test building with performance monitoring enabled""" # Create DebMock with performance monitoring deb_mock = DebMock(performance_test_config) # Mock the components deb_mock.chroot_manager = mock_chroot_manager deb_mock.cache_manager = mock_cache_manager deb_mock.sbuild_wrapper = mock_sbuild_wrapper deb_mock.plugin_manager = mock_plugin_manager # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods deb_mock.config.setup_build_environment = Mock(return_value={}) deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods deb_mock._capture_build_metadata = Mock(return_value={}) deb_mock.metadata_manager = Mock() # Run build result = deb_mock.build(sample_source_package) # Verify performance monitoring was used assert deb_mock.performance_monitor.create_build_profile.called assert deb_mock.performance_monitor.finalize_build_profile.called # Verify build result assert result["success"] is True def test_build_with_auto_optimization(self, performance_test_config, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager): """Test building with automatic optimization enabled""" # Enable auto optimization performance_test_config.performance_auto_optimization = True # Create DebMock with performance monitoring and auto optimization deb_mock = DebMock(performance_test_config) # Mock the components deb_mock.chroot_manager = mock_chroot_manager deb_mock.cache_manager = mock_cache_manager deb_mock.sbuild_wrapper = mock_sbuild_wrapper deb_mock.plugin_manager = mock_plugin_manager # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods deb_mock.config.setup_build_environment = Mock(return_value={}) deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods deb_mock._capture_build_metadata = Mock(return_value={}) deb_mock.metadata_manager = Mock() # Mock performance analysis mock_analysis = { "automatic_tunings": [{"type": "parallel_builds", "suggested": 3}] } deb_mock.performance_optimizer.analyze_build_performance = Mock(return_value=mock_analysis) # Run build result = deb_mock.build(sample_source_package) # Verify optimization analysis was performed deb_mock.performance_optimizer.analyze_build_performance.assert_called_once() # Verify build result assert result["success"] is True def test_build_chain(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building multiple packages in a chain""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Create multiple packages packages = [sample_source_package, sample_source_package] # Run build chain results = mock_deb_mock.build_chain(packages) # Verify all packages were built assert len(results) == 2 assert all(result["success"] for result in results) # Verify build was called for each package assert mock_deb_mock.sbuild_wrapper.build_package.call_count == 2 def test_build_chain_with_failure(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test building chain stops on first failure""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Mock first build succeeds, second fails mock_deb_mock.sbuild_wrapper.build_package.side_effect = [ {"success": True, "output": "First build succeeded"}, {"success": False, "error": "Second build failed"} ] # Create multiple packages packages = [sample_source_package, sample_source_package] # Run build chain results = mock_deb_mock.build_chain(packages) # Verify only first package was built successfully assert len(results) == 1 assert results[0]["success"] is True # Verify build was called only once (stopped on failure) assert mock_deb_mock.sbuild_wrapper.build_package.call_count == 2 def test_parallel_build(self, mock_deb_mock, sample_source_package, mock_chroot_manager, mock_cache_manager, mock_sbuild_wrapper, mock_plugin_manager, mock_performance_monitor): """Test parallel building of packages""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager mock_deb_mock.sbuild_wrapper = mock_sbuild_wrapper mock_deb_mock.plugin_manager = mock_plugin_manager mock_deb_mock.performance_monitor = mock_performance_monitor # Mock chroot exists mock_chroot_manager.chroot_exists.return_value = True # Mock config methods mock_deb_mock.config.setup_build_environment = Mock(return_value={}) mock_deb_mock.config.get_chroot_path = Mock(return_value="/tmp/test-chroot") mock_deb_mock.config.parallel_builds = 2 # Mock metadata methods mock_deb_mock._capture_build_metadata = Mock(return_value={}) mock_deb_mock.metadata_manager = Mock() # Create multiple packages packages = [sample_source_package, sample_source_package, sample_source_package] # Run parallel build results = mock_deb_mock.build_parallel(packages) # Verify all packages were built assert len(results) == 3 assert all(result["success"] for result in results) # Verify build was called for each package assert mock_deb_mock.sbuild_wrapper.build_package.call_count == 3 def test_cleanup(self, mock_deb_mock, mock_chroot_manager, mock_cache_manager): """Test cleanup functionality""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager # Run cleanup mock_deb_mock.cleanup() # Verify cleanup was called on managers mock_chroot_manager.cleanup.assert_called_once() mock_cache_manager.cleanup.assert_called_once() def test_get_status(self, mock_deb_mock, mock_chroot_manager, mock_cache_manager): """Test status reporting""" # Mock the components mock_deb_mock.chroot_manager = mock_chroot_manager mock_deb_mock.cache_manager = mock_cache_manager # Mock status methods mock_chroot_manager.get_status.return_value = {"chroots": 2, "active": 1} mock_cache_manager.get_status.return_value = {"caches": 3, "size_mb": 1024} # Get status status = mock_deb_mock.get_status() # Verify status includes all components assert "chroot_manager" in status assert "cache_manager" in status assert status["chroot_manager"]["chroots"] == 2 assert status["cache_manager"]["caches"] == 3