test-python
failed- Job ID
019d5f5e-8b5c-7e35-9948-f642b929b360- Created
- 2026-04-05 20:38:44 UTC
- Updated
- 2026-04-05 20:38:44 UTC
- Duration
- 1m 35s
- Source Ref
- f259a2f0333969316730625e3af00f2a12674aa6
- Source URL
- https://github.com/catalystcommunity/reactorcide.git
- Runner Image
10.16.0.1:5000/public/reactorcide/runnerbase:dev- Priority
- 10
- Queue
- reactorcide-jobs
Logs
Cloning into '/workspace'...
Updating files: 99% (346/347)
Updating files: 100% (347/347)
Updating files: 100% (347/347), done.
=== Running Python Tests ===
Using CPython 3.13.12 interpreter at: /usr/local/bin/python3.13
Creating virtual environment at: .venv
Building runnerlib @ file:///workspace/runnerlib
Downloading pygments (1.2MiB)
Downloading cryptography (4.3MiB)
Downloaded pygments
Built runnerlib @ file:///workspace/runnerlib
Downloaded cryptography
warning: Failed to hardlink files; falling back to full copy. This may lead to degraded performance.
If the cache and target directories are on different filesystems, hardlinking may not be supported.
If this is intentional, set `export UV_LINK_MODE=copy` or use `--link-mode=copy` to suppress this warning.
Installed 22 packages in 223ms
============================= test session starts ==============================
platform linux -- Python 3.13.12, pytest-8.3.5, pluggy-1.6.0
rootdir: /workspace/runnerlib
configfile: pyproject.toml
plugins: cov-7.0.0
collected 381 items
tests/test_config.py .................... [ 5%]
tests/test_container_advanced.py ......... [ 7%]
tests/test_container_isolation.py .... [ 8%]
tests/test_container_validation.py ................... [ 13%]
tests/test_directory_operations.py ............ [ 16%]
tests/test_eval.py ..................................................... [ 30%]
............. [ 34%]
tests/test_eval_cli.py ..................... [ 39%]
tests/test_git_operations.py .......... [ 42%]
tests/test_git_ops.py ....... [ 44%]
tests/test_integration.py ........... [ 46%]
tests/test_job_isolation.py .F.. [ 48%]
tests/test_plugins.py ....................... [ 54%]
tests/test_register_secret.py ............ [ 57%]
tests/test_secrets.py ................... [ 62%]
tests/test_secrets_local.py ............................ [ 69%]
tests/test_secrets_resolver.py ............................. [ 77%]
tests/test_secrets_server.py ........ [ 79%]
tests/test_source_preparation.py ............... [ 83%]
tests/test_validation.py ........................... [ 90%]
tests/test_workflow.py ..................................... [100%]
=================================== FAILURES ===================================
________________ TestJobIsolation.test_concurrent_job_isolation ________________
self = <runnerlib.tests.test_job_isolation.TestJobIsolation object at 0x7efc7811d090>
def test_concurrent_job_isolation(self):
"""Test that concurrent jobs don't interfere with each other."""
import threading
import time
results = {}
errors = {}
def run_job(job_id: str, work_dir: str):
"""Run a job in its own work directory."""
try:
original_cwd = os.getcwd()
os.chdir(work_dir)
config = RunnerConfig(
code_dir="/job/src",
job_dir="/job/src",
job_command=f"echo 'job-{job_id}'",
runner_image="alpine:latest"
)
job_path = prepare_job_directory(config)
# Create a unique file for this job
test_file = job_path / f"job-{job_id}.txt"
test_file.write_text(f"Data for job {job_id}")
# Simulate some work
time.sleep(0.1)
# Verify the file still exists and has correct content
assert test_file.exists()
assert test_file.read_text() == f"Data for job {job_id}"
# Check no files from other jobs exist
other_files = list(job_path.glob("job-*.txt"))
assert len(other_files) == 1
assert other_files[0].name == f"job-{job_id}.txt"
results[job_id] = True
except Exception as e:
errors[job_id] = str(e)
finally:
os.chdir(original_cwd)
# Create temporary directories for each job
temp_dirs = []
threads = []
try:
# Start multiple jobs concurrently
for i in range(5):
temp_dir = tempfile.mkdtemp(prefix=f"job-{i}-")
temp_dirs.append(temp_dir)
thread = threading.Thread(
target=run_job,
args=(str(i), temp_dir)
)
thread.start()
threads.append(thread)
# Wait for all jobs to complete
for thread in threads:
thread.join(timeout=5)
# Verify all jobs succeeded
> assert len(errors) == 0, f"Jobs failed: {errors}"
E AssertionError: Jobs failed: {'2': "assert 2 == 1\n + where 2 = len([PosixPath('/tmp/job-3-z6gdpuq0/job/job-2.txt'), PosixPath('/tmp/job-3-z6gdpuq0/job/job-3.txt')])", '3': "assert 2 == 1\n + where 2 = len([PosixPath('/tmp/job-3-z6gdpuq0/job/job-2.txt'), PosixPath('/tmp/job-3-z6gdpuq0/job/job-3.txt')])"}
E assert 2 == 0
E + where 2 = len({'2': "assert 2 == 1\n + where 2 = len([PosixPath('/tmp/job-3-z6gdpuq0/job/job-2.txt'), PosixPath('/tmp/job-3-z6gdpuq...\n + where 2 = len([PosixPath('/tmp/job-3-z6gdpuq0/job/job-2.txt'), PosixPath('/tmp/job-3-z6gdpuq0/job/job-3.txt')])"})
/workspace/runnerlib/tests/test_job_isolation.py:138: AssertionError
=========================== short test summary info ============================
FAILED tests/test_job_isolation.py::TestJobIsolation::test_concurrent_job_isolation
======================== 1 failed, 380 passed in 20.59s ========================