From 150cc66d054aa69ab698e0eaac66d27a87fad13d Mon Sep 17 00:00:00 2001 From: Panacota96 Date: Fri, 13 Mar 2026 01:42:08 +0100 Subject: [PATCH] Add manifest verification tests Co-authored-by: Codex --- Test/test_logic.py | 48 +++++++++++++++++++ .../test-ctf/web/smoke-challenge/.gitignore | 3 -- .../web/smoke-challenge/.metadata.json | 10 ---- .../web/smoke-challenge/artifacts/.gitkeep | 0 .../web/smoke-challenge/notes/FAILURES.md | 4 -- .../smoke-challenge/notes/WORKING_NOTES.md | 9 ---- .../20260313-003626-94862b/commands.jsonl | 0 7 files changed, 48 insertions(+), 26 deletions(-) delete mode 100644 challenges/test-ctf/web/smoke-challenge/.gitignore delete mode 100644 challenges/test-ctf/web/smoke-challenge/.metadata.json delete mode 100644 challenges/test-ctf/web/smoke-challenge/artifacts/.gitkeep delete mode 100644 challenges/test-ctf/web/smoke-challenge/notes/FAILURES.md delete mode 100644 challenges/test-ctf/web/smoke-challenge/notes/WORKING_NOTES.md delete mode 100644 challenges/test-ctf/web/smoke-challenge/sessions/20260313-003626-94862b/commands.jsonl diff --git a/Test/test_logic.py b/Test/test_logic.py index f0b37d2..eca8389 100644 --- a/Test/test_logic.py +++ b/Test/test_logic.py @@ -1,9 +1,12 @@ import json from importlib.metadata import version as distribution_version +import pytest + from helm_path import __version__ from helm_path.ai import extract_json, render_report_prompt from helm_path.audit import init_audit_db, record_run, verify_chain +from helm_path.main import select_run_dirs, verify_manifest_files from helm_path.processing import ( build_clean_log, calculate_file_hash, @@ -159,3 +162,48 @@ def test_report_manifest_can_be_written_to_workspace(tmp_path): "payloads.json", "timeline.json", } + + +def test_verify_manifest_files_reports_incomplete_run_directory(tmp_path): + challenge_path = init_challenge_workspace(tmp_path, "HTB", "Web", "HalfRun") + incomplete_run = challenge_path / "sessions" / "20260313-000000-abcd12" + incomplete_run.mkdir() + (incomplete_run / "commands.jsonl").write_text("", encoding="utf-8") + + findings = verify_manifest_files(challenge_path, [incomplete_run]) + + assert findings + assert "missing manifest.json" in findings[0] + + +def test_select_run_dirs_skips_incomplete_latest_run(tmp_path): + challenge_path = init_challenge_workspace(tmp_path, "HTB", "Web", "Selector") + metadata = load_challenge_metadata(challenge_path) + run_dir, manifest = create_run_layout(challenge_path, metadata, image_tag="helm-path:lite", image_id="sha256:test") + paths = run_file_paths(challenge_path, manifest["run_id"]) + paths["raw_log"].write_text("curl -I http://target\n", encoding="utf-8") + paths["clean_log"].write_text("curl -I http://target\n", encoding="utf-8") + paths["commands_log"].write_text("", encoding="utf-8") + manifest["captured_at"]["end"] = "2026-03-13T10:00:00+00:00" + manifest["hashes"]["raw_log"] = calculate_file_hash(paths["raw_log"]) + manifest["hashes"]["clean_log"] = calculate_file_hash(paths["clean_log"]) + manifest["hashes"]["commands_log"] = calculate_file_hash(paths["commands_log"]) + write_json_file(paths["manifest"], manifest) + + incomplete_run = challenge_path / "sessions" / "99999999-235959-zzzzzz" + incomplete_run.mkdir() + + selected = select_run_dirs(challenge_path, run_id=None, all_runs=False) + + assert selected == [run_dir] + + +def test_select_run_dirs_rejects_incomplete_specific_run(tmp_path): + challenge_path = init_challenge_workspace(tmp_path, "HTB", "Web", "Specific") + incomplete_run = challenge_path / "sessions" / "20260313-000000-abcd12" + incomplete_run.mkdir() + + with pytest.raises(Exception) as exc_info: + select_run_dirs(challenge_path, run_id=incomplete_run.name, all_runs=False) + + assert "incomplete" in str(exc_info.value).lower() diff --git a/challenges/test-ctf/web/smoke-challenge/.gitignore b/challenges/test-ctf/web/smoke-challenge/.gitignore deleted file mode 100644 index faec835..0000000 --- a/challenges/test-ctf/web/smoke-challenge/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -.ffr/ -*.pdf -__pycache__/ diff --git a/challenges/test-ctf/web/smoke-challenge/.metadata.json b/challenges/test-ctf/web/smoke-challenge/.metadata.json deleted file mode 100644 index e487270..0000000 --- a/challenges/test-ctf/web/smoke-challenge/.metadata.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "schema_version": 1, - "challenge_id": "test-ctf__web__smoke-challenge", - "competition": "Test CTF", - "category": "Web", - "challenge_name": "Smoke Challenge", - "created_at": "2026-03-13T00:36:13+00:00", - "updated_at": "2026-03-13T00:36:13+00:00", - "status": "initialized" -} \ No newline at end of file diff --git a/challenges/test-ctf/web/smoke-challenge/artifacts/.gitkeep b/challenges/test-ctf/web/smoke-challenge/artifacts/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/challenges/test-ctf/web/smoke-challenge/notes/FAILURES.md b/challenges/test-ctf/web/smoke-challenge/notes/FAILURES.md deleted file mode 100644 index 0c3ed80..0000000 --- a/challenges/test-ctf/web/smoke-challenge/notes/FAILURES.md +++ /dev/null @@ -1,4 +0,0 @@ -# Failure Analysis - -| Attempt | Reason It Failed | Evidence | -| --- | --- | --- | diff --git a/challenges/test-ctf/web/smoke-challenge/notes/WORKING_NOTES.md b/challenges/test-ctf/web/smoke-challenge/notes/WORKING_NOTES.md deleted file mode 100644 index 75196e0..0000000 --- a/challenges/test-ctf/web/smoke-challenge/notes/WORKING_NOTES.md +++ /dev/null @@ -1,9 +0,0 @@ -# Working Notes - -## Target Summary - -## Hypotheses - -## Evidence - -## Final Chain diff --git a/challenges/test-ctf/web/smoke-challenge/sessions/20260313-003626-94862b/commands.jsonl b/challenges/test-ctf/web/smoke-challenge/sessions/20260313-003626-94862b/commands.jsonl deleted file mode 100644 index e69de29..0000000