Spaces:
Build error
Build error
| from unittest import mock | |
| import pytest | |
| from openhands.core.config import SandboxConfig,OpenHandsConfig | |
| from openhands.events.action import CmdRunAction | |
| from openhands.resolver.issue_resolver import IssueResolver | |
| def assert_sandbox_config( | |
| config: SandboxConfig, | |
| base_container_image=SandboxConfig.model_fields['base_container_image'].default, | |
| runtime_container_image='ghcr.io/all-hands-ai/runtime:mock-nikolaik', # Default to mock version | |
| local_runtime_url=SandboxConfig.model_fields['local_runtime_url'].default, | |
| ): | |
| """Helper function to assert the properties of the SandboxConfig object.""" | |
| assert isinstance(config, SandboxConfig) | |
| assert config.base_container_image == base_container_image | |
| assert config.runtime_container_image == runtime_container_image | |
| assert config.enable_auto_lint is False | |
| assert config.use_host_network is False | |
| assert config.timeout == 300 | |
| assert config.local_runtime_url == local_runtime_url | |
| def test_setup_sandbox_config_default(): | |
| """Test default configuration when no images provided and not experimental""" | |
| with mock.patch('openhands.__version__', 'mock'): | |
| openhands_config = OpenHandsConfig() | |
| IssueResolver.update_sandbox_config( | |
| openhands_config=openhands_config, | |
| base_container_image=None, | |
| runtime_container_image=None, | |
| is_experimental=False, | |
| ) | |
| assert_sandbox_config( | |
| openhands_config.sandbox, runtime_container_image='ghcr.io/all-hands-ai/runtime:mock-nikolaik' | |
| ) | |
| def test_setup_sandbox_config_both_images(): | |
| """Test that providing both container images raises ValueError""" | |
| with pytest.raises( | |
| ValueError, match='Cannot provide both runtime and base container images.' | |
| ): | |
| openhands_config = OpenHandsConfig() | |
| IssueResolver.update_sandbox_config( | |
| openhands_config=openhands_config, | |
| base_container_image='base-image', | |
| runtime_container_image='runtime-image', | |
| is_experimental=False, | |
| ) | |
| def test_setup_sandbox_config_base_only(): | |
| """Test configuration when only base_container_image is provided""" | |
| base_image = 'custom-base-image' | |
| openhands_config = OpenHandsConfig() | |
| IssueResolver.update_sandbox_config( | |
| openhands_config=openhands_config, | |
| base_container_image=base_image, | |
| runtime_container_image=None, | |
| is_experimental=False, | |
| ) | |
| assert_sandbox_config( | |
| openhands_config.sandbox, base_container_image=base_image, runtime_container_image=None | |
| ) | |
| def test_setup_sandbox_config_runtime_only(): | |
| """Test configuration when only runtime_container_image is provided""" | |
| runtime_image = 'custom-runtime-image' | |
| openhands_config = OpenHandsConfig() | |
| IssueResolver.update_sandbox_config( | |
| openhands_config=openhands_config, | |
| base_container_image=None, | |
| runtime_container_image=runtime_image, | |
| is_experimental=False, | |
| ) | |
| assert_sandbox_config(openhands_config.sandbox, runtime_container_image=runtime_image) | |
| def test_setup_sandbox_config_experimental(): | |
| """Test configuration when experimental mode is enabled""" | |
| with mock.patch('openhands.__version__', 'mock'): | |
| openhands_config = OpenHandsConfig() | |
| IssueResolver.update_sandbox_config( | |
| openhands_config=openhands_config, | |
| base_container_image=None, | |
| runtime_container_image=None, | |
| is_experimental=True, | |
| ) | |
| assert_sandbox_config(openhands_config.sandbox, runtime_container_image=None) | |
| def test_setup_sandbox_config_gitlab_ci(mock_get_unique_uid, mock_getuid): | |
| """Test GitLab CI specific configuration when running as root""" | |
| with mock.patch('openhands.__version__', 'mock'): | |
| with mock.patch.object(IssueResolver, 'GITLAB_CI', True): | |
| openhands_config = OpenHandsConfig() | |
| IssueResolver.update_sandbox_config( | |
| openhands_config=openhands_config, | |
| base_container_image=None, | |
| runtime_container_image=None, | |
| is_experimental=False, | |
| ) | |
| assert_sandbox_config(openhands_config.sandbox, local_runtime_url='http://localhost') | |
| def test_setup_sandbox_config_gitlab_ci_non_root(mock_getuid): | |
| """Test GitLab CI configuration when not running as root""" | |
| with mock.patch('openhands.__version__', 'mock'): | |
| with mock.patch.object(IssueResolver, 'GITLAB_CI', True): | |
| openhands_config = OpenHandsConfig() | |
| IssueResolver.update_sandbox_config( | |
| openhands_config=openhands_config, | |
| base_container_image=None, | |
| runtime_container_image=None, | |
| is_experimental=False, | |
| ) | |
| assert_sandbox_config(openhands_config.sandbox, local_runtime_url='http://localhost') | |
| def test_initialize_runtime_runs_setup_script_and_git_hooks( | |
| mock_runtime, mock_cmd_output | |
| ): | |
| """Test that initialize_runtime calls maybe_run_setup_script and maybe_setup_git_hooks""" | |
| # Create a minimal resolver instance with just the methods we need | |
| class MinimalResolver: | |
| def initialize_runtime(self, runtime): | |
| # This is the method we're testing | |
| action = CmdRunAction(command='git config --global core.pager ""') | |
| runtime.run_action(action) | |
| # Run setup script if it exists | |
| runtime.maybe_run_setup_script() | |
| # Setup git hooks if they exist | |
| runtime.maybe_setup_git_hooks() | |
| resolver = MinimalResolver() | |
| # Mock the runtime's run_action method to return a successful CmdOutputObservation | |
| mock_cmd_output.return_value.exit_code = 0 | |
| mock_runtime.run_action.return_value = mock_cmd_output.return_value | |
| # Call the method | |
| resolver.initialize_runtime(mock_runtime) | |
| # Verify that both methods were called | |
| mock_runtime.maybe_run_setup_script.assert_called_once() | |
| mock_runtime.maybe_setup_git_hooks.assert_called_once() | |