38 lines
1.5 KiB
Python
38 lines
1.5 KiB
Python
#!/usr/bin/env python3
|
|
"""Small negative controls for artifact tampering and VSTest's misleading skipped counter."""
|
|
import hashlib
|
|
import json
|
|
from pathlib import Path
|
|
import tempfile
|
|
from launch_saturation import trx, verify
|
|
|
|
with tempfile.TemporaryDirectory(prefix="opcua-saturation-tools-") as temporary:
|
|
root = Path(temporary)
|
|
artifact = root / "immutable"
|
|
artifact.write_text("control")
|
|
receipt = {"protocol": "sdk2-saturation-v1", "acceptance": False, "canonicalCycles": 384,
|
|
"completedRestarts": 96, "settlingCycles": 1, "maximumPhaseSeconds": 1800,
|
|
"files": {"immutable": hashlib.sha256(artifact.read_bytes()).hexdigest()}}
|
|
path = root / "receipt.json"
|
|
path.write_text(json.dumps(receipt))
|
|
digest = hashlib.sha256(path.read_bytes()).hexdigest()
|
|
verify(root, digest)
|
|
artifact.write_text("tampered")
|
|
try:
|
|
verify(root, digest)
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
raise RuntimeError("Changed artifact was accepted")
|
|
xml = root / "skipped.trx"
|
|
xml.write_text('<TestRun xmlns="http://microsoft.com/schemas/VisualStudio/TeamTest/2010"><Results>'
|
|
'<UnitTestResult outcome="NotExecuted" /></Results><ResultSummary>'
|
|
'<Counters executed="1" notExecuted="0" /></ResultSummary></TestRun>')
|
|
try:
|
|
trx(xml, 1)
|
|
except ValueError:
|
|
pass
|
|
else:
|
|
raise RuntimeError("Direct skipped result was hidden by the counter")
|
|
print("Artifact verification, tamper rejection and direct skipped-result controls passed (3/3)")
|