From 33e8c6e43f1fc9320f6ffe3382f93cd2b172c28e Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Wed, 14 Oct 2026 10:20:32 -0400 Subject: [PATCH] Catalog: logs.level-settings leaves logs.level-settings leaves for forgectrl's tests/logs_test.c (9317b54): the six levels taken and verbose and 7 refused, port 70000 refused, udp and tcp taken and tls refused, a server name with spaces refused, and a remote level changed since boot listed as configured against effective with pending_reboot raised, and lowered once they match. The settings route's refusal of a value its validator rejects, with the file left byte for byte, is tests/host_routes.sh's bounds case. The catalog goes from 99 to 98. It was the last test in suite/logs.py and called no helper of its own, so nothing else goes. logs.tree-tail-export and logs.routing stay: they are the only catalog covers of forgectrl src/fflog.*, and the pinned workflow runs neither fflog_e2e.sh nor the new log tests. setup.record-export keeps its requirement on logs.tree-tail-export. The coverage lint on the tree manifest finds no uncovered path and no host-tested row problem across the 98 tests; its one finding is setup.check-lens's empty src/lensfind.* entry, which the forgectrl pin bump clears. pyflakes is clean on logs.py. The full forgetest suite was not run. Fingerprints: the deletion changes suite/logs.py's shared text (the two separator lines), so logs.tree-tail-export and logs.routing move; no other module imports it. The pending forgectrl pin bump from c274f19 already owes both, so this commit adds none to it. releases/ is unchanged. --- forgetest/forgetest/suite/logs.py | 59 ------------------------------- 1 file changed, 59 deletions(-) diff --git a/forgetest/forgetest/suite/logs.py b/forgetest/forgetest/suite/logs.py index e3e98dc..fae2ad2 100644 --- a/forgetest/forgetest/suite/logs.py +++ b/forgetest/forgetest/suite/logs.py @@ -318,62 +318,3 @@ def routing(ctx): "/data/log/gfcloud", "/data/log/gfhome", "/var/log/messages"): ctx.check(not os.path.exists(stray), "pre-syslog log path still present: %s", stray) ctx.log("no ForgeFIRM log outside %s", LOGS_ROOT) - - -@test("logs.level-settings", title="Log level and remote-target settings", subsystem="logs", - kind="auto", est_min=1, - covers=[("forgectrl", "src/logs.*"), ("forgectrl", "src/main.c"), ("forgectrl", "src/settings.*")], - requires=["logs.tree-tail-export", "forgectrl.settings-bounds"], - description="A log level outside off..debug, a bad remote port, a bad protocol and a bad " - "server name are refused (400); a valid remote level is accepted and /logs shows " - "it as configured but not effective (pending_reboot); the setting is restored to " - "its prior value.") -def level_settings(ctx): - fc = ctx.forgectrl - ev = ctx.evidence - ctx.check(fc.wait_idle(timeout=30, abort=ctx.aborted), "machine not idle: settings are locked") - - for key, val in (("log_grblhal_disk", "verbose"), ("log_kernel_remote", "7"), - ("syslog_port", "70000"), ("syslog_proto", "tls"), - ("syslog_server", "bad host name")): - st, body = fc.post("/settings", data={key: val}) - ev["refused %s=%s" % (key, val)] = st - ctx.log("POST /settings %s=%s -> %s", key, val, st) - ctx.check(st == 400, "%s=%s -> %s, expected 400", key, val, st) - - st, before = fc.get("/logs") - ctx.check(st == 200 and isinstance(before, dict), "GET /logs -> %s", st) - prior = {l["name"]: l for l in before.get("loggers") or []} - ctx.check("system" in prior, "/logs lacks the system logger") - was = prior["system"].get("remote") or "off" - was_pending = bool(before.get("pending_reboot")) - new = "warning" if was != "warning" else "error" - ev["system_remote_before"] = was - ev["pending_before"] = was_pending - try: - st, body = fc.post("/settings", data={"log_system_remote": new}) - ctx.log("POST /settings log_system_remote=%s -> %s", new, st) - ctx.check(st == 200, "valid level refused: %s", st) - st, after = fc.get("/logs") - now = {l["name"]: l for l in after.get("loggers") or []} - ctx.check(now["system"].get("remote") == new, "configured level reads %r", now["system"].get("remote")) - ctx.check(now["system"].get("effective_remote") == prior["system"].get("effective_remote"), - "effective level changed without a reboot") - ctx.check(after.get("pending_reboot") is True, "pending_reboot not raised by a level change") - ctx.log("configured %s, effective %s, pending_reboot %s", - now["system"].get("remote"), now["system"].get("effective_remote"), after.get("pending_reboot")) - finally: - # restore: a value that was stored goes back as a value; a default - # is restored by clearing the key (a query parameter - empty - # values never reach the form body) - stored = fc.settings().get("log_system_remote", "") - if was == "off" and stored in ("", None, new): - st, body = fc.post("/settings", params={"log_system_remote": ""}) - else: - st, body = fc.post("/settings", data={"log_system_remote": was}) - ctx.log("restore log_system_remote -> %s", st) - st, final = fc.get("/logs") - fin = {l["name"]: l for l in final.get("loggers") or []} - ctx.check(fin["system"].get("remote") == was, "system remote level not restored (%r)", fin["system"].get("remote")) - ctx.check(bool(final.get("pending_reboot")) == was_pending, - "pending_reboot did not return to %s after the restore", was_pending)