mirror of
https://github.com/openglow-org/forgefirm.git
synced 2026-09-28 09:11:11 -07:00
A campaign asked a person for about eighty things: lid, button and interlock actions, app jobs, and sixteen confirmations by eye, most of them as popups to read and answer while the head was already moving. This is the forgetest-only step of cutting that down. The operator channel. A test asks for its operator's part in four ways: ctx.ready() pre-announces a timed step and waits for the click that starts it; ctx.notice() is a standing instruction with no button, the test watching the machine for the result; ctx.act(channel, state) is a machine action by name (lid, interlock, button) - a notice for the operator today, proven done by the switch reading or an `until` condition, recorded in evidence.actions with who performed it, and the seam a bench actuator plugs into through runner.fixture; ctx.confirm() stays for the yes/no the evidence cannot answer. Tests declare `actions`; a `precheck` refuses a start the machine cannot honor (a reason, no result, a queue skips it and carries on). The page shows what you will do before it is asked: the running test's steps, a queue's attended tests still waiting, or the test whose title you clicked while idle; notices and prompts sit under it. The campaign card no longer carries baseline, queue and leftover notes: those go to the runner journal (daemon.log, syslog as `forgetest`, and the run in progress), with a Runner journal button in the footer. The catalog, 43 tests (27 auto, 8 operator, 8 live; was 45: 25/12/8): cloud.mode-switch absorbs cloud.hunt-lid-open and cloud.gfhome-homing (the connect made with the lid open, the hunt judged lid-open with its Z cycle, the re-hunt waited out after the close, the switch back, then $H judged by gfhome's own "homing complete" line with its motion windows; precheck homing_mode = gfcloud). kernel.fire-line is auto with the HV-not-good precheck, camera.snapshot is auto (a second frame with the lid lamp off differs and is smaller), motion.jog-roundtrip is auto (the head accelerometer per leg, the supervisor's own witness). The remaining attended tests use Ready gates and act(); the head's beam detector and the button LEDs replace the eye, leaving two confirms: the emission witness's mark and the app's display in cloud.pause-resume. Proof: tests/test_operator.py (the channel, the precheck, the journal), the cloud replays re-targeted to the merged round trip over a fake grbl and the bench excerpts, 196 host tests green, coverage lint 0 uncovered. Every re-ported attended test is owed one bench run on the next dev image (BRINGUP). Catalog consequence: the merged and reclassified tests' implementation hashes move; nothing else is invalidated.
69 lines
2.2 KiB
Python
69 lines
2.2 KiB
Python
"""forgetest daemon entry point.
|
|
|
|
python3 -m forgetest [--port 8090] [--host 0.0.0.0] [--manifest PATH]
|
|
|
|
Environment: FORGETEST_DATA (state directory, default /data/forgetest),
|
|
FORGETEST_MANIFEST, FORGETEST_BENCH_DIR, FORGETEST_MARKER, and the hw.py
|
|
overrides.
|
|
"""
|
|
import argparse
|
|
import os
|
|
import signal
|
|
import sys
|
|
import threading
|
|
|
|
from . import VERSION
|
|
from . import bench as _bench
|
|
from . import catalog as _catalog
|
|
from . import manifest as _manifest
|
|
from . import server as _server
|
|
from .log import Log, data_dir
|
|
from .runner import Runner, configure_journal
|
|
|
|
|
|
def main(argv=None):
|
|
ap = argparse.ArgumentParser(prog="forgetest")
|
|
ap.add_argument("--port", type=int, default=int(os.environ.get("FORGETEST_PORT") or 8090))
|
|
ap.add_argument("--host", default=os.environ.get("FORGETEST_HOST") or "0.0.0.0")
|
|
ap.add_argument("--manifest", default=None)
|
|
ap.add_argument("--version", action="version", version="forgetest %s" % VERSION)
|
|
args = ap.parse_args(argv)
|
|
|
|
try:
|
|
manifest = _manifest.Manifest.load(args.manifest)
|
|
except (OSError, ValueError) as e:
|
|
print("forgetest: cannot load the image manifest: %s" % e, file=sys.stderr)
|
|
return 2
|
|
registry = _catalog.load_suite()
|
|
os.makedirs(data_dir(), exist_ok=True)
|
|
configure_journal()
|
|
log = Log()
|
|
bench = _bench.Bench()
|
|
runner = Runner(log, manifest, registry, bench)
|
|
token = _server.load_token()
|
|
app = _server.App(runner, token)
|
|
srv = _server.make_server(app, args.host, args.port)
|
|
|
|
stop = threading.Event()
|
|
|
|
def on_signal(*_):
|
|
stop.set()
|
|
signal.signal(signal.SIGTERM, on_signal)
|
|
signal.signal(signal.SIGINT, on_signal)
|
|
print("forgetest %s: %d tests, image %s (%s), listening on %s:%d"
|
|
% (VERSION, len(registry), manifest.version, (manifest.content_sha or "")[:12],
|
|
args.host, args.port), file=sys.stderr, flush=True)
|
|
th = threading.Thread(target=srv.serve_forever, name="forgetest-http", daemon=True)
|
|
th.start()
|
|
try:
|
|
while not stop.is_set():
|
|
stop.wait(1.0)
|
|
finally:
|
|
srv.shutdown()
|
|
srv.server_close()
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|