deb-mock/tests/test_core.py
robojerk c51819c836
Some checks failed
Build Deb-Mock Package / build (push) Failing after 1m9s
Lint Code / Lint All Code (push) Failing after 1s
Test Deb-Mock Build / test (push) Failing after 35s
Add comprehensive testing framework, performance monitoring, and plugin system
- Add complete pytest testing framework with conftest.py and test files
- Add performance monitoring and benchmarking capabilities
- Add plugin system with ccache plugin example
- Add comprehensive documentation (API, deployment, testing, etc.)
- Add Docker API wrapper for service deployment
- Add advanced configuration examples
- Remove old wget package file
- Update core modules with enhanced functionality
2025-08-19 20:49:32 -07:00

643 lines
28 KiB
Python

"""
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