CI-12: CI grades test_freeze.py against the real hwsim at a pinned admin/goodwe
checks / unit (pull_request) Failing after 2s
infra-pin / fresh (pull_request) Failing after 1s

- .gitea/infra-pin: the one place the admin/goodwe commit is pinned.
- checks.yml: checks out admin/goodwe at the pin as the sibling test_freeze.py
  looks for; any failure fails the job. Tests run with GOODWE_REQUIRE_HWSIM=1,
  and `CI: ` lines are echoed on PASS so the log shows which transport ran.
- test_freeze.py: GOODWE_REQUIRE_HWSIM refuses the stub; a local stub run
  prints a STUB USED line.
- infra-pin.yml: a separate, non-required check that goes red naming both
  SHAs when admin/goodwe master has moved past the pin.
- README: when and how to bump the pin.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-09-25 01:57:04 +02:00
co-authored by Claude Opus 5.5
parent 16c796fa30
commit 6e3399322a
5 changed files with 83 additions and 13 deletions
+13 -2
View File
@@ -19,7 +19,8 @@ shipped `meter_freeze_s` itself:
a check that calls the predicate directly would not be testing the thing
that ships. Uses the rig's own `sim/hwsim.py --fault freeze` when the infra
repo is next to this one (or `$GOODWE_SIM`), and an equivalent local stub
otherwise. Both are exercised; the run says which one it used.
otherwise. Both are exercised; the run says which one it used. CI sets
`GOODWE_REQUIRE_HWSIM=1`, which refuses the stub (CI-12).
4. THE WIRING: the real `Controller.cycle()`, asserted on the service call
that leaves the process;
@@ -600,6 +601,15 @@ hw = find_hwsim()
# that cannot fail, from the other end.
PART3_TRANSPORT = f"the rig hwsim at {hw}" if hw else "the local stub"
print(f"frozen meter over HTTP - using {PART3_TRANSPORT}")
# CI-12: CI sets GOODWE_REQUIRE_HWSIM=1, so a missing infra checkout fails here
# instead of passing on the stub. Local runs may still use the stub, and say so.
if not hw:
if os.environ.get("GOODWE_REQUIRE_HWSIM"):
print("FAIL: GOODWE_REQUIRE_HWSIM is set but sim/hwsim.py was not found "
"(sibling ../goodwe or $GOODWE_SIM) - refusing to fall back to the stub")
sys.exit(1)
print("STUB USED: part 3 ran against the local stub, NOT the infra repo's "
"sim/hwsim.py - not a CI-grade result")
if hw:
def argv_for(mode):
return [HWSIM_DRIVER, "8791" if mode == "freeze" else "8792", mode,
@@ -1263,7 +1273,8 @@ check("a Controller built with the key absent lands on the SHIPPED hold, so "
_ctl_c.freeze_wd.cfg.hold_s == SHIPPED_HOLD_S)
print()
print(f"part 3 (the live HTTP transport) ran against: {PART3_TRANSPORT}")
# `CI: ` lines are echoed into the CI log even on a pass (checks.yml).
print(f"CI: test_freeze part 3 (the live HTTP transport) ran against: {PART3_TRANSPORT}")
if fails:
print(f"{len(fails)} FAILED: {', '.join(fails)}")
sys.exit(1)