Spaces:
Build error
Build error
"""Test CLIRuntime class.""" | |
import os | |
import tempfile | |
import pytest | |
from openhands.core.config import OpenHandsConfig | |
from openhands.core.exceptions import LLMMalformedActionError | |
from openhands.events import EventStream | |
from openhands.runtime.impl.cli.cli_runtime import CLIRuntime | |
from openhands.storage import get_file_store | |
def temp_dir(): | |
"""Create a temporary directory for testing.""" | |
with tempfile.TemporaryDirectory() as temp_dir: | |
yield temp_dir | |
def cli_runtime(temp_dir): | |
"""Create a CLIRuntime instance for testing.""" | |
file_store = get_file_store('local', temp_dir) | |
event_stream = EventStream('test', file_store) | |
config = OpenHandsConfig() | |
config.workspace_base = temp_dir | |
runtime = CLIRuntime(config, event_stream) | |
runtime._runtime_initialized = True # Skip initialization | |
return runtime | |
def test_sanitize_filename_valid_path(cli_runtime): | |
"""Test _sanitize_filename with a valid path.""" | |
test_path = os.path.join(cli_runtime._workspace_path, 'test.txt') | |
sanitized_path = cli_runtime._sanitize_filename(test_path) | |
assert sanitized_path == os.path.realpath(test_path) | |
def test_sanitize_filename_relative_path(cli_runtime): | |
"""Test _sanitize_filename with a relative path.""" | |
test_path = 'test.txt' | |
expected_path = os.path.join(cli_runtime._workspace_path, test_path) | |
sanitized_path = cli_runtime._sanitize_filename(test_path) | |
assert sanitized_path == os.path.realpath(expected_path) | |
def test_sanitize_filename_outside_workspace(cli_runtime): | |
"""Test _sanitize_filename with a path outside the workspace.""" | |
test_path = '/tmp/test.txt' # Path outside workspace | |
with pytest.raises(LLMMalformedActionError) as exc_info: | |
cli_runtime._sanitize_filename(test_path) | |
assert 'Invalid path:' in str(exc_info.value) | |
assert 'You can only work with files in' in str(exc_info.value) | |
def test_sanitize_filename_path_traversal(cli_runtime): | |
"""Test _sanitize_filename with path traversal attempt.""" | |
test_path = os.path.join(cli_runtime._workspace_path, '..', 'test.txt') | |
with pytest.raises(LLMMalformedActionError) as exc_info: | |
cli_runtime._sanitize_filename(test_path) | |
assert 'Invalid path traversal:' in str(exc_info.value) | |
assert 'Path resolves outside the workspace' in str(exc_info.value) | |
def test_sanitize_filename_absolute_path_with_dots(cli_runtime): | |
"""Test _sanitize_filename with absolute path containing dots.""" | |
test_path = os.path.join(cli_runtime._workspace_path, 'subdir', '..', 'test.txt') | |
# Create the parent directory | |
os.makedirs(os.path.join(cli_runtime._workspace_path, 'subdir'), exist_ok=True) | |
sanitized_path = cli_runtime._sanitize_filename(test_path) | |
assert sanitized_path == os.path.join(cli_runtime._workspace_path, 'test.txt') | |
def test_sanitize_filename_nested_path(cli_runtime): | |
"""Test _sanitize_filename with a nested path.""" | |
nested_dir = os.path.join(cli_runtime._workspace_path, 'dir1', 'dir2') | |
os.makedirs(nested_dir, exist_ok=True) | |
test_path = os.path.join(nested_dir, 'test.txt') | |
sanitized_path = cli_runtime._sanitize_filename(test_path) | |
assert sanitized_path == os.path.realpath(test_path) | |