chore: merge settled probe findings

This commit is contained in:
Abdessamad Derraz committed 2026-10-28 11:01:09 +01:00
commit 7e3bc4cf0f
16 files changed
+330 -27

No files matched your search

+52
View File
@@ -560,3 +560,55 @@ content:
- sha1: 003685f698160f1cc79ca0bc00091f30ccb681db
stage: game
shows: Rez asking to format the unformatted memory card in slot 1
- name: "Lunar - Silver Star Story (Japan)"
catalog: redump
sha1: aee4e96d37132c53c6405c68e11787a6bc75c972
references:
"Beetle Saturn":
recorded_from: 2026-10-28-90ae07f141fe
frames:
- sha1: 5edec5180d1c04dc0ead1e5fbbc7d6d53cc23fdb
stage: bios
shows: the SEGA SATURN logo of the Japanese BIOS v1.01
- sha1: dcd45679fcd31a423d0e54690e89b52f417d8728
stage: bios
shows: SEGA, produced by or under license from Sega Enterprises
- sha1: ae83d3e3ba167fb1c2e59175faf042e4e483b1cd
stage: game
shows: the Kadokawa Shoten logo
- sha1: 55c544650f06ff9f4a165ea06ac6e534ab0a00a1
stage: game
shows: the Game Arts logo on white
- sha1: 78865212bfe9d9a946f1ec4985092ccec6d01b67
stage: game
shows: the JAM logo on white
- sha1: af869e868d94e8b4c551be5570ade580f5c15ce6
stage: game
shows: the Lunar Silver Star Story title over the planet
- sha1: cb64c728de69873915f0bbb3f95ce06dbe305d10
stage: game
shows: the Lunar Silver Star Story title over the planet
"Yabause":
recorded_from: 2026-10-28-5d299098fb23
frames:
- sha1: 1f1ddd5e434a82b54be476ac95b6bfe7925a92b5
stage: bios
shows: the SEGA SATURN logo of the Japanese BIOS v1.00
- sha1: 1bdd0d3a315fc85bf0ac2e74be512ccf711ee9aa
stage: bios
shows: SEGA, produced by or under license from Sega Enterprises
- sha1: af1cac6b29a68a9dab27bd8ee26c7e543f39cd03
stage: game
shows: the Kadokawa Shoten logo
- sha1: fa94920ad89884eeb11286f982b19e0b93a622af
stage: game
shows: the Game Arts logo on white
- sha1: 25df8806f67e4cc34d4e5584600218b2131c930c
stage: game
shows: the JAM logo on white
- sha1: 3077677e616d76f56330c57701e0e6f0e87b5a17
stage: game
shows: the Lunar Silver Star Story title over the planet
- sha1: e49f6dbd8bc19f53383699c622c43595a3816538
stage: game
shows: the Lunar Silver Star Story title over the planet
+7 -2
View File
@@ -6,12 +6,17 @@ systems:
sega-saturn:
romfetch: saturn
content:
- name: "Lunar - Silver Star Story Complete (Japan)"
- name: "Lunar - Silver Star Story (Japan)"
catalog: redump
reason: >-
A Japanese disc. Every Saturn core needs a BIOS image to start a disc,
so the run shows whether the BIOS the pack put in the folder is one
the core reads, under the name it looks for.
the core reads, under the name it looks for. It reaches its title on
Beetle Saturn and Yabause with the RetroArch pack's BIOS (records
2026-10-28-6b5b55d3480f, 2026-10-28-9270d1928be7). The Complete
edition is not used: it needs the MPEG card, which a core without
MPEG decoding never gets past (Yabause stops on a black screen after
the logos).
region: japan
load: cue
frames: 3600
+66
View File
@@ -235,6 +235,25 @@ class RuleTable(unittest.TestCase):
self.assertIsNone(rules.rule_validation(run(rules.UNKNOWN), None, NONE_BOOTS, PRESENT,
{"name": "b"}))
def test_a_warned_check_lets_a_wrong_file_run(self) -> None:
"""Beetle PSX logs a wrong SHA1 and boots the file (libretro.c:853-860),
PCSX ReARMed refuses an image without the kernel's first instruction
or "PS compatible" (frontend/libretro.c:3646-3651)."""
refused = run(rules.BIOS_ERROR)
used = run(rules.HANG)
warned = {"name": "b", "validation": ["sha1"], "on_mismatch": "warn"}
self.assertEqual(rules.rule_validation(used, used, NONE_BOOTS, PRESENT, warned).rule,
"validation_agrees")
by_check = {"name": "b", "validation": ["size", "md5"], "on_mismatch": {"md5": "warn"}}
self.assertEqual(rules.rule_validation(used, refused, NONE_BOOTS, PRESENT, by_check).rule,
"validation_agrees")
self.assertEqual(rules.rule_validation(used, None, NONE_BOOTS, PRESENT,
{"name": "b", "validation": ["sha1"]}).rule,
"validation_contradicted")
signature = {"name": "b", "validation": ["size", "signature"]}
self.assertEqual(rules.rule_validation(refused, None, NONE_BOOTS, PRESENT, signature).rule,
"validation_agrees")
def test_path_and_alias(self) -> None:
self.assertIsNone(rules.rule_path(self.ENTRY, "bios.bin", rules.Opened("bios.bin", self.RID)))
moved = rules.rule_path(self.ENTRY, "bios.bin", rules.Opened("sys/bios.bin", self.RID))
@@ -922,6 +941,53 @@ class Findings(Workspace):
for line in mr.read_campaign(self.root, name):
self.assertEqual(list(Draft202012Validator(schema).iter_errors(line)), [], name)
def contradicted(self) -> rules.Verdict:
return rules.rule_validation(rules.Run(rules.HANG, self.RID, "zeros"), None,
self.none(rules.BOOTS), self.present(),
{**self.entry(), "validation": ["md5"]})
def test_a_review_applies_through_the_profile_editor(self) -> None:
self.c.settle("fake", self.content, self.core, 0, self.entry(), [self.contradicted()])
key = self.lines()[-1]["key"]
with self.assertRaises(ValueError):
campaign.review_finding(self.root, key, "applied", " ")
line = campaign.review_finding(self.root, key, "applied", "the core logs the md5 (x.c:1)",
{"on_mismatch": "warn"})
self.assertEqual((line["status"], line["reason"]), ("applied", "the core logs the md5 (x.c:1)"))
entry = self.entry()
self.assertEqual(entry["on_mismatch"], "warn")
self.assertEqual(entry["evidence"], {"validation": [self.RID]})
text = self.profile.read_text()
self.assertLess(text.index("validation: [size]"), text.index("on_mismatch"))
self.assertEqual(campaign.open_findings(self.root), [])
with self.assertRaises(ValueError):
campaign.review_finding(self.root, key, "rejected", "again")
try:
from jsonschema import Draft202012Validator
except ImportError:
self.skipTest("jsonschema is a tooling dependency")
schema = json.loads((REPO_ROOT / "schemas" / "campaign-finding.schema.json").read_text())
for found in self.lines():
self.assertEqual(list(Draft202012Validator(schema).iter_errors(found)), [])
def test_a_rejected_finding_stays_closed_on_the_same_run(self) -> None:
verdict = self.contradicted()
self.c.settle("fake", self.content, self.core, 0, self.entry(), [verdict])
key = self.lines()[-1]["key"]
with self.assertRaises(ValueError):
campaign.review_finding(self.root, key, "rejected", "kept", {"required": False})
out = io.StringIO()
with contextlib.redirect_stdout(out), unittest.mock.patch.object(campaign.Paths, "default",
return_value=self.paths):
self.assertEqual(campaign.main(["review", key, "--status", "rejected",
"--reason", "the md5 is checked (x.c:2)"]), 0)
before = self.profile.read_text()
later = rules.Verdict(verdict.rule, verdict.field, verdict.value, verdict.statement,
("2026-10-28-000000000000",))
self.c.settle("fake", self.content, self.core, 0, self.entry(), [later])
self.assertEqual([line["status"] for line in self.lines()], ["open", "rejected"])
self.assertEqual(self.profile.read_text(), before)
def test_the_batch_commit_plan(self) -> None:
verdicts = rules.rule_need(self.none(rules.BOOTS), self.present(), self.entry())
self.c.settle("fake", self.content, self.core, 0, self.entry(), verdicts)