313 lines
8.1 KiB
Python
Executable File
313 lines
8.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Behavioral tests for render_psp_handoff.py."""
|
|
|
|
import json
|
|
import subprocess
|
|
import tempfile
|
|
from pathlib import Path
|
|
|
|
import render_psp_handoff
|
|
|
|
|
|
def git(path: Path, *args: str) -> str:
|
|
result = subprocess.run(
|
|
["git", "-C", str(path), *args],
|
|
text=True,
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.PIPE,
|
|
check=True,
|
|
)
|
|
return result.stdout.strip()
|
|
|
|
|
|
def write(path: Path, payload: dict) -> Path:
|
|
path.write_text(json.dumps(payload), encoding="utf-8")
|
|
return path
|
|
|
|
|
|
def main() -> int:
|
|
with tempfile.TemporaryDirectory() as tmp:
|
|
root = Path(tmp)
|
|
psp = root / "psp"
|
|
psp.mkdir()
|
|
(psp / "psp.json").write_text("{}", encoding="utf-8")
|
|
(psp / "metadata").mkdir()
|
|
bsp = write(
|
|
psp / "metadata" / "bsp.lock.json", {"schema_version": 1, "build_id": "B1"}
|
|
)
|
|
git(psp, "init", "-q")
|
|
git(psp, "add", "psp.json", "metadata/bsp.lock.json")
|
|
git(
|
|
psp,
|
|
"-c",
|
|
"user.name=PSP Test",
|
|
"-c",
|
|
"user.email=psp-test@example.invalid",
|
|
"commit",
|
|
"-qm",
|
|
"candidate",
|
|
)
|
|
commit = git(psp, "rev-parse", "HEAD")
|
|
image = root / "flash.img"
|
|
image.write_bytes(b"flash")
|
|
image_hash = render_psp_handoff.subprocess.run(
|
|
["sha256sum", str(image)], text=True, stdout=subprocess.PIPE, check=True
|
|
).stdout.split()[0]
|
|
contract = write(
|
|
root / "packaging-contract.json",
|
|
{
|
|
"schema_version": 2,
|
|
"contract_type": "emx21-project-packaging",
|
|
},
|
|
)
|
|
contract_hash = render_psp_handoff.sha256_file(contract)
|
|
|
|
static = write(root / "static.json", {"passed": True})
|
|
packaging = write(
|
|
root / "packaging.json",
|
|
{
|
|
"schema_version": 2,
|
|
"passed": True,
|
|
"contract": {
|
|
"path": str(contract),
|
|
"sha256": contract_hash,
|
|
"contract_id": "fixture",
|
|
},
|
|
"expected_psp_commit": commit,
|
|
"image": {"path": str(image), "sha256": image_hash},
|
|
},
|
|
)
|
|
device = write(
|
|
root / "device.json",
|
|
{
|
|
"result": "PASS",
|
|
"evidence_source": "USER_REPORTED",
|
|
"psp_commit": commit,
|
|
"image_path": str(image),
|
|
"image_sha256": image_hash,
|
|
"checks": [{"name": "boot", "result": "PASS"}],
|
|
"unexecuted": [],
|
|
},
|
|
)
|
|
application = write(
|
|
root / "application.json",
|
|
{
|
|
"result": "PASS",
|
|
"psp_commit": commit,
|
|
"application_commit": "a" * 40,
|
|
"unexecuted": [],
|
|
"internal_approved": True,
|
|
},
|
|
)
|
|
approval = write(
|
|
root / "approval.json",
|
|
{
|
|
"internal_approved": True,
|
|
"confirmed_by": "embedded-lowlevel owner",
|
|
"confirmed_at": "2026-09-02T00:00:00+00:00",
|
|
"confirmed_scope": "packaged candidate",
|
|
},
|
|
)
|
|
context = write(
|
|
root / "context.json",
|
|
{
|
|
"work_id": "WORK-1",
|
|
"subtask_id": "SUB-1",
|
|
"phase": "implementation",
|
|
"wave": "wave-1",
|
|
"role": "embedded-lowlevel",
|
|
},
|
|
)
|
|
repository_url = "ssh://git.example/psp-NEW.git"
|
|
remote = {
|
|
"schema_version": 1,
|
|
"passed": True,
|
|
"checked_at": "2026-09-02T00:00:00+00:00",
|
|
"repository_url": repository_url,
|
|
"commit": commit,
|
|
"refs": ["refs/heads/candidate/SUB-1"],
|
|
"errors": [],
|
|
}
|
|
|
|
candidate = render_psp_handoff.render(
|
|
"NEW",
|
|
"CV1841CP",
|
|
"candidate",
|
|
psp,
|
|
None,
|
|
"psp-REF",
|
|
None,
|
|
static,
|
|
bsp,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
None,
|
|
[],
|
|
[],
|
|
[],
|
|
None,
|
|
False,
|
|
)
|
|
assert candidate["passed"] is True, candidate
|
|
assert candidate["etunel"]["sent"] is False
|
|
|
|
packaged = render_psp_handoff.render(
|
|
"NEW",
|
|
"CV1841CP",
|
|
"packaged",
|
|
psp,
|
|
repository_url,
|
|
"psp-REF",
|
|
None,
|
|
static,
|
|
bsp,
|
|
packaging,
|
|
None,
|
|
None,
|
|
context,
|
|
approval,
|
|
"Media-1",
|
|
"AI-1",
|
|
[],
|
|
[],
|
|
[],
|
|
remote,
|
|
True,
|
|
)
|
|
assert packaged["passed"] is True, packaged
|
|
assert packaged["etunel"]["prepared_for_send"] is True
|
|
assert packaged["etunel"]["sent"] is False
|
|
|
|
before_tag = render_psp_handoff.render(
|
|
"NEW",
|
|
"CV1841CP",
|
|
"accepted",
|
|
psp,
|
|
repository_url,
|
|
"psp-REF",
|
|
None,
|
|
static,
|
|
bsp,
|
|
packaging,
|
|
device,
|
|
application,
|
|
context,
|
|
approval,
|
|
"Media-1",
|
|
"AI-1",
|
|
[],
|
|
[],
|
|
[],
|
|
remote,
|
|
True,
|
|
)
|
|
assert before_tag["passed"] is False
|
|
assert any("accepted" in error for error in before_tag["errors"])
|
|
|
|
git(
|
|
psp,
|
|
"-c",
|
|
"user.name=PSP Test",
|
|
"-c",
|
|
"user.email=psp-test@example.invalid",
|
|
"tag",
|
|
"-a",
|
|
f"accepted/{commit[:12]}",
|
|
"-m",
|
|
"accepted fixture",
|
|
)
|
|
accepted = render_psp_handoff.render(
|
|
"NEW",
|
|
"CV1841CP",
|
|
"accepted",
|
|
psp,
|
|
repository_url,
|
|
"psp-REF",
|
|
None,
|
|
static,
|
|
bsp,
|
|
packaging,
|
|
device,
|
|
application,
|
|
context,
|
|
approval,
|
|
"Media-1",
|
|
"AI-1",
|
|
[],
|
|
[],
|
|
[],
|
|
remote,
|
|
True,
|
|
)
|
|
assert accepted["passed"] is True, accepted
|
|
|
|
no_remote = render_psp_handoff.render(
|
|
"NEW",
|
|
"CV1841CP",
|
|
"packaged",
|
|
psp,
|
|
repository_url,
|
|
"psp-REF",
|
|
None,
|
|
static,
|
|
bsp,
|
|
packaging,
|
|
None,
|
|
None,
|
|
context,
|
|
approval,
|
|
"Media-1",
|
|
"AI-1",
|
|
[],
|
|
[],
|
|
[],
|
|
None,
|
|
True,
|
|
)
|
|
assert no_remote["passed"] is False
|
|
assert any("远端" in error for error in no_remote["errors"])
|
|
|
|
candidate_etunel = render_psp_handoff.render(
|
|
"NEW",
|
|
"CV1841CP",
|
|
"candidate",
|
|
psp,
|
|
repository_url,
|
|
"psp-REF",
|
|
None,
|
|
static,
|
|
bsp,
|
|
None,
|
|
None,
|
|
None,
|
|
context,
|
|
approval,
|
|
None,
|
|
None,
|
|
[],
|
|
[],
|
|
[],
|
|
remote,
|
|
True,
|
|
)
|
|
assert candidate_etunel["passed"] is False
|
|
assert any("packaged" in error for error in candidate_etunel["errors"])
|
|
|
|
bare = root / "remote.git"
|
|
subprocess.run(["git", "init", "--bare", "-q", str(bare)], check=True)
|
|
git(psp, "remote", "add", "fixture", str(bare))
|
|
git(psp, "push", "-q", "fixture", f"{commit}:refs/heads/candidate")
|
|
reachable = render_psp_handoff.verify_remote(str(bare), commit)
|
|
assert reachable["passed"] is True, reachable
|
|
|
|
print("PSP handoff renderer tests passed")
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
raise SystemExit(main())
|