Spaces:
Build error
Build error
| """Env vars related tests for the DockerRuntime, which connects to the ActionExecutor running in the sandbox.""" | |
| import os | |
| from unittest.mock import patch | |
| import pytest | |
| from conftest import _close_test_runtime, _load_runtime | |
| from openhands.events.action import CmdRunAction | |
| from openhands.events.observation import CmdOutputObservation | |
| # ============================================================================================================================ | |
| # Environment variables tests | |
| # ============================================================================================================================ | |
| def test_env_vars_os_environ(temp_dir, runtime_cls, run_as_openhands): | |
| with patch.dict(os.environ, {'SANDBOX_ENV_FOOBAR': 'BAZ'}): | |
| runtime, config = _load_runtime(temp_dir, runtime_cls, run_as_openhands) | |
| obs: CmdOutputObservation = runtime.run_action(CmdRunAction(command='env')) | |
| print(obs) | |
| obs: CmdOutputObservation = runtime.run_action( | |
| CmdRunAction(command='echo $FOOBAR') | |
| ) | |
| print(obs) | |
| assert obs.exit_code == 0, 'The exit code should be 0.' | |
| assert obs.content.strip().split('\n\r')[0].strip() == 'BAZ', ( | |
| f'Output: [{obs.content}] for {runtime_cls}' | |
| ) | |
| _close_test_runtime(runtime) | |
| def test_env_vars_runtime_operations(temp_dir, runtime_cls): | |
| runtime, config = _load_runtime(temp_dir, runtime_cls) | |
| # Test adding single env var | |
| runtime.add_env_vars({'QUUX': 'abc"def'}) | |
| obs = runtime.run_action(CmdRunAction(command='echo $QUUX')) | |
| assert ( | |
| obs.exit_code == 0 and obs.content.strip().split('\r\n')[0].strip() == 'abc"def' | |
| ) | |
| # Test adding multiple env vars | |
| runtime.add_env_vars({'FOOBAR': 'xyz'}) | |
| obs = runtime.run_action(CmdRunAction(command='echo $QUUX $FOOBAR')) | |
| assert ( | |
| obs.exit_code == 0 | |
| and obs.content.strip().split('\r\n')[0].strip() == 'abc"def xyz' | |
| ) | |
| # Test adding empty dict | |
| prev_env = runtime.run_action(CmdRunAction(command='env')).content | |
| runtime.add_env_vars({}) | |
| current_env = runtime.run_action(CmdRunAction(command='env')).content | |
| assert prev_env == current_env | |
| # Test overwriting env vars | |
| runtime.add_env_vars({'QUUX': 'new_value'}) | |
| obs = runtime.run_action(CmdRunAction(command='echo $QUUX')) | |
| assert ( | |
| obs.exit_code == 0 | |
| and obs.content.strip().split('\r\n')[0].strip() == 'new_value' | |
| ) | |
| _close_test_runtime(runtime) | |
| def test_env_vars_added_by_config(temp_dir, runtime_cls): | |
| runtime, config = _load_runtime( | |
| temp_dir, | |
| runtime_cls, | |
| runtime_startup_env_vars={'ADDED_ENV_VAR': 'added_value'}, | |
| ) | |
| # Test adding single env var | |
| obs = runtime.run_action(CmdRunAction(command='echo $ADDED_ENV_VAR')) | |
| assert ( | |
| obs.exit_code == 0 | |
| and obs.content.strip().split('\r\n')[0].strip() == 'added_value' | |
| ) | |
| _close_test_runtime(runtime) | |
| def test_docker_runtime_env_vars_persist_after_restart(temp_dir): | |
| from openhands.runtime.impl.docker.docker_runtime import DockerRuntime | |
| runtime, config = _load_runtime(temp_dir, DockerRuntime) | |
| # Add a test environment variable | |
| runtime.add_env_vars({'GITHUB_TOKEN': 'test_token'}) | |
| # Verify the variable is set in current session | |
| obs = runtime.run_action(CmdRunAction(command='echo $GITHUB_TOKEN')) | |
| assert obs.exit_code == 0 | |
| assert obs.content.strip().split('\r\n')[0].strip() == 'test_token' | |
| # Verify the variable is added to .bashrc | |
| obs = runtime.run_action( | |
| CmdRunAction(command='grep "^export GITHUB_TOKEN=" ~/.bashrc') | |
| ) | |
| assert obs.exit_code == 0 | |
| assert 'export GITHUB_TOKEN=' in obs.content | |
| # Test pause/resume cycle | |
| runtime.pause() | |
| runtime.resume() | |
| # Verify the variable persists after restart | |
| obs = runtime.run_action(CmdRunAction(command='echo $GITHUB_TOKEN')) | |
| assert obs.exit_code == 0 | |
| assert obs.content.strip().split('\r\n')[0].strip() == 'test_token' | |
| _close_test_runtime(runtime) | |