From 447f90205d41ed903dccc0c1c233294e5eb81551 Mon Sep 17 00:00:00 2001 From: ScottW514 Date: Mon, 21 Sep 2026 16:12:19 -0400 Subject: [PATCH] exthost.service: the reference package has settings of its own The package now declares three settings and, from inside its sandbox, reads them, sets two, and is refused an undeclared key and a value out of bounds. The store on disk is checked for its mode and its contents, so the test proves the host keeps them and not only that it answered. Proven. The unit suite: 451 tests. On the bench reference, image 20260921190848 with the cross-built forgectrl and extension host mounted over the image's: exthost.service PASS. Against the image's own daemons it FAILS where it must, the older parser refusing the manifest with unknown key "settings". Acceptance. exthost.service already covers forgeext's ** and forgectrl's src/main.c; the settings are part of what a confined service can reach, so they are exercised there rather than in a test of their own. --- .../cool-fanwrite-test/run/cooling.state | 1 + forgetest/cool-fanwrite-test/sys/cnc/faults | 1 + .../sys/cnc/laser_on_sampled | 1 + .../sys/cnc/laser_pgood_sampled | 1 + forgetest/cool-fanwrite-test/sys/cnc/state | 1 + .../sys/head/air_assist_pwm | 1 + .../sys/head/air_assist_tach | 1 + .../sys/head/purge_air_current | 1 + .../cool-fanwrite-test/sys/pic/hv_current | 1 + .../cool-fanwrite-test/sys/pic/water_temp_1 | 1 + .../cool-fanwrite-test/sys/pic/water_temp_2 | 1 + .../sys/thermal/exhaust_pwm | 1 + .../cool-fanwrite-test/sys/thermal/heater_pwm | 1 + .../cool-fanwrite-test/sys/thermal/intake_pwm | 1 + .../sys/thermal/tach_exhaust | 1 + .../sys/thermal/tach_intake_1 | 1 + .../sys/thermal/tach_intake_2 | 1 + forgetest/cool-flow-test/run/cooling.state | 1 + forgetest/cool-flow-test/sys/cnc/faults | 1 + forgetest/cool-flow-test/sys/cnc/laser_latch | 1 + .../cool-flow-test/sys/cnc/laser_on_sampled | 1 + .../sys/cnc/laser_pgood_sampled | 1 + forgetest/cool-flow-test/sys/cnc/state | 1 + forgetest/cool-flow-test/sys/cnc/stop | 1 + .../cool-flow-test/sys/head/air_assist_pwm | 1 + .../cool-flow-test/sys/head/air_assist_tach | 1 + .../cool-flow-test/sys/head/purge_air_current | 1 + forgetest/cool-flow-test/sys/pic/hv_current | 1 + forgetest/cool-flow-test/sys/pic/lid_ir_1 | 1 + forgetest/cool-flow-test/sys/pic/lid_ir_2 | 1 + forgetest/cool-flow-test/sys/pic/lid_ir_3 | 1 + forgetest/cool-flow-test/sys/pic/lid_ir_4 | 1 + forgetest/cool-flow-test/sys/pic/water_temp_1 | 1 + forgetest/cool-flow-test/sys/pic/water_temp_2 | 1 + .../cool-flow-test/sys/thermal/exhaust_pwm | 1 + .../cool-flow-test/sys/thermal/heater_pwm | 1 + .../cool-flow-test/sys/thermal/intake_pwm | 1 + .../cool-flow-test/sys/thermal/tach_exhaust | 1 + .../cool-flow-test/sys/thermal/tach_intake_1 | 1 + .../cool-flow-test/sys/thermal/tach_intake_2 | 1 + forgetest/forgetest/suite/exthost.py | 39 ++++++++++++++++++- forgetest/super-test/dev/glowforge | 0 forgetest/super-test/sys/cnc/disable | 1 + forgetest/super-test/sys/cnc/enable | 1 + forgetest/super-test/sys/cnc/halt | 1 + forgetest/super-test/sys/cnc/laser_latch | 1 + forgetest/super-test/sys/cnc/stop | 1 + 47 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 forgetest/cool-fanwrite-test/run/cooling.state create mode 100644 forgetest/cool-fanwrite-test/sys/cnc/faults create mode 100644 forgetest/cool-fanwrite-test/sys/cnc/laser_on_sampled create mode 100644 forgetest/cool-fanwrite-test/sys/cnc/laser_pgood_sampled create mode 100644 forgetest/cool-fanwrite-test/sys/cnc/state create mode 100644 forgetest/cool-fanwrite-test/sys/head/air_assist_pwm create mode 100644 forgetest/cool-fanwrite-test/sys/head/air_assist_tach create mode 100644 forgetest/cool-fanwrite-test/sys/head/purge_air_current create mode 100644 forgetest/cool-fanwrite-test/sys/pic/hv_current create mode 100644 forgetest/cool-fanwrite-test/sys/pic/water_temp_1 create mode 100644 forgetest/cool-fanwrite-test/sys/pic/water_temp_2 create mode 100644 forgetest/cool-fanwrite-test/sys/thermal/exhaust_pwm create mode 100644 forgetest/cool-fanwrite-test/sys/thermal/heater_pwm create mode 100644 forgetest/cool-fanwrite-test/sys/thermal/intake_pwm create mode 100644 forgetest/cool-fanwrite-test/sys/thermal/tach_exhaust create mode 100644 forgetest/cool-fanwrite-test/sys/thermal/tach_intake_1 create mode 100644 forgetest/cool-fanwrite-test/sys/thermal/tach_intake_2 create mode 100644 forgetest/cool-flow-test/run/cooling.state create mode 100644 forgetest/cool-flow-test/sys/cnc/faults create mode 100644 forgetest/cool-flow-test/sys/cnc/laser_latch create mode 100644 forgetest/cool-flow-test/sys/cnc/laser_on_sampled create mode 100644 forgetest/cool-flow-test/sys/cnc/laser_pgood_sampled create mode 100644 forgetest/cool-flow-test/sys/cnc/state create mode 100644 forgetest/cool-flow-test/sys/cnc/stop create mode 100644 forgetest/cool-flow-test/sys/head/air_assist_pwm create mode 100644 forgetest/cool-flow-test/sys/head/air_assist_tach create mode 100644 forgetest/cool-flow-test/sys/head/purge_air_current create mode 100644 forgetest/cool-flow-test/sys/pic/hv_current create mode 100644 forgetest/cool-flow-test/sys/pic/lid_ir_1 create mode 100644 forgetest/cool-flow-test/sys/pic/lid_ir_2 create mode 100644 forgetest/cool-flow-test/sys/pic/lid_ir_3 create mode 100644 forgetest/cool-flow-test/sys/pic/lid_ir_4 create mode 100644 forgetest/cool-flow-test/sys/pic/water_temp_1 create mode 100644 forgetest/cool-flow-test/sys/pic/water_temp_2 create mode 100644 forgetest/cool-flow-test/sys/thermal/exhaust_pwm create mode 100644 forgetest/cool-flow-test/sys/thermal/heater_pwm create mode 100644 forgetest/cool-flow-test/sys/thermal/intake_pwm create mode 100644 forgetest/cool-flow-test/sys/thermal/tach_exhaust create mode 100644 forgetest/cool-flow-test/sys/thermal/tach_intake_1 create mode 100644 forgetest/cool-flow-test/sys/thermal/tach_intake_2 create mode 100644 forgetest/super-test/dev/glowforge create mode 100644 forgetest/super-test/sys/cnc/disable create mode 100644 forgetest/super-test/sys/cnc/enable create mode 100644 forgetest/super-test/sys/cnc/halt create mode 100644 forgetest/super-test/sys/cnc/laser_latch create mode 100644 forgetest/super-test/sys/cnc/stop diff --git a/forgetest/cool-fanwrite-test/run/cooling.state b/forgetest/cool-fanwrite-test/run/cooling.state new file mode 100644 index 0000000..77d9bc1 --- /dev/null +++ b/forgetest/cool-fanwrite-test/run/cooling.state @@ -0,0 +1 @@ +{"seq":268,"ts_mono":1268.000,"fire_ok":true,"verdict":"OK","hold":false,"resume_ok":true,"armed":true,"reason":"","down_c":22.30,"up_c":22.30} diff --git a/forgetest/cool-fanwrite-test/sys/cnc/faults b/forgetest/cool-fanwrite-test/sys/cnc/faults new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/cnc/faults @@ -0,0 +1 @@ +0 diff --git a/forgetest/cool-fanwrite-test/sys/cnc/laser_on_sampled b/forgetest/cool-fanwrite-test/sys/cnc/laser_on_sampled new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/cnc/laser_on_sampled @@ -0,0 +1 @@ +0 diff --git a/forgetest/cool-fanwrite-test/sys/cnc/laser_pgood_sampled b/forgetest/cool-fanwrite-test/sys/cnc/laser_pgood_sampled new file mode 100644 index 0000000..ace9d03 --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/cnc/laser_pgood_sampled @@ -0,0 +1 @@ +255 diff --git a/forgetest/cool-fanwrite-test/sys/cnc/state b/forgetest/cool-fanwrite-test/sys/cnc/state new file mode 100644 index 0000000..5a5e41c --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/cnc/state @@ -0,0 +1 @@ +idle diff --git a/forgetest/cool-fanwrite-test/sys/head/air_assist_pwm b/forgetest/cool-fanwrite-test/sys/head/air_assist_pwm new file mode 100644 index 0000000..7e68ad7 --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/head/air_assist_pwm @@ -0,0 +1 @@ +1023 \ No newline at end of file diff --git a/forgetest/cool-fanwrite-test/sys/head/air_assist_tach b/forgetest/cool-fanwrite-test/sys/head/air_assist_tach new file mode 100644 index 0000000..697cb3a --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/head/air_assist_tach @@ -0,0 +1 @@ +300 diff --git a/forgetest/cool-fanwrite-test/sys/head/purge_air_current b/forgetest/cool-fanwrite-test/sys/head/purge_air_current new file mode 100644 index 0000000..f075110 --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/head/purge_air_current @@ -0,0 +1 @@ +629 diff --git a/forgetest/cool-fanwrite-test/sys/pic/hv_current b/forgetest/cool-fanwrite-test/sys/pic/hv_current new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/pic/hv_current @@ -0,0 +1 @@ +0 diff --git a/forgetest/cool-fanwrite-test/sys/pic/water_temp_1 b/forgetest/cool-fanwrite-test/sys/pic/water_temp_1 new file mode 100644 index 0000000..a4890ce --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/pic/water_temp_1 @@ -0,0 +1 @@ +700 diff --git a/forgetest/cool-fanwrite-test/sys/pic/water_temp_2 b/forgetest/cool-fanwrite-test/sys/pic/water_temp_2 new file mode 100644 index 0000000..a4890ce --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/pic/water_temp_2 @@ -0,0 +1 @@ +700 diff --git a/forgetest/cool-fanwrite-test/sys/thermal/exhaust_pwm b/forgetest/cool-fanwrite-test/sys/thermal/exhaust_pwm new file mode 100644 index 0000000..35ff949 --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/thermal/exhaust_pwm @@ -0,0 +1 @@ +65535 \ No newline at end of file diff --git a/forgetest/cool-fanwrite-test/sys/thermal/heater_pwm b/forgetest/cool-fanwrite-test/sys/thermal/heater_pwm new file mode 100644 index 0000000..022f7e7 --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/thermal/heater_pwm @@ -0,0 +1 @@ +26214 \ No newline at end of file diff --git a/forgetest/cool-fanwrite-test/sys/thermal/intake_pwm b/forgetest/cool-fanwrite-test/sys/thermal/intake_pwm new file mode 100644 index 0000000..e6e4f56 --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/thermal/intake_pwm @@ -0,0 +1 @@ +43278 \ No newline at end of file diff --git a/forgetest/cool-fanwrite-test/sys/thermal/tach_exhaust b/forgetest/cool-fanwrite-test/sys/thermal/tach_exhaust new file mode 100644 index 0000000..697cb3a --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/thermal/tach_exhaust @@ -0,0 +1 @@ +300 diff --git a/forgetest/cool-fanwrite-test/sys/thermal/tach_intake_1 b/forgetest/cool-fanwrite-test/sys/thermal/tach_intake_1 new file mode 100644 index 0000000..697cb3a --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/thermal/tach_intake_1 @@ -0,0 +1 @@ +300 diff --git a/forgetest/cool-fanwrite-test/sys/thermal/tach_intake_2 b/forgetest/cool-fanwrite-test/sys/thermal/tach_intake_2 new file mode 100644 index 0000000..697cb3a --- /dev/null +++ b/forgetest/cool-fanwrite-test/sys/thermal/tach_intake_2 @@ -0,0 +1 @@ +300 diff --git a/forgetest/cool-flow-test/run/cooling.state b/forgetest/cool-flow-test/run/cooling.state new file mode 100644 index 0000000..5f1028f --- /dev/null +++ b/forgetest/cool-flow-test/run/cooling.state @@ -0,0 +1 @@ +{"seq":1517,"ts_mono":3127.000,"fire_ok":true,"verdict":"OK","hold":false,"resume_ok":true,"armed":false,"reason":"HEAD CRASH SIGNAL (axes x) - motion stopped, laser locked","down_c":22.30,"up_c":22.30} diff --git a/forgetest/cool-flow-test/sys/cnc/faults b/forgetest/cool-flow-test/sys/cnc/faults new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/cool-flow-test/sys/cnc/faults @@ -0,0 +1 @@ +0 diff --git a/forgetest/cool-flow-test/sys/cnc/laser_latch b/forgetest/cool-flow-test/sys/cnc/laser_latch new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/forgetest/cool-flow-test/sys/cnc/laser_latch @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/forgetest/cool-flow-test/sys/cnc/laser_on_sampled b/forgetest/cool-flow-test/sys/cnc/laser_on_sampled new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/cool-flow-test/sys/cnc/laser_on_sampled @@ -0,0 +1 @@ +0 diff --git a/forgetest/cool-flow-test/sys/cnc/laser_pgood_sampled b/forgetest/cool-flow-test/sys/cnc/laser_pgood_sampled new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/cool-flow-test/sys/cnc/laser_pgood_sampled @@ -0,0 +1 @@ +0 diff --git a/forgetest/cool-flow-test/sys/cnc/state b/forgetest/cool-flow-test/sys/cnc/state new file mode 100644 index 0000000..5a5e41c --- /dev/null +++ b/forgetest/cool-flow-test/sys/cnc/state @@ -0,0 +1 @@ +idle diff --git a/forgetest/cool-flow-test/sys/cnc/stop b/forgetest/cool-flow-test/sys/cnc/stop new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/forgetest/cool-flow-test/sys/cnc/stop @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/forgetest/cool-flow-test/sys/head/air_assist_pwm b/forgetest/cool-flow-test/sys/head/air_assist_pwm new file mode 100644 index 0000000..cbd6012 --- /dev/null +++ b/forgetest/cool-flow-test/sys/head/air_assist_pwm @@ -0,0 +1 @@ +204 \ No newline at end of file diff --git a/forgetest/cool-flow-test/sys/head/air_assist_tach b/forgetest/cool-flow-test/sys/head/air_assist_tach new file mode 100644 index 0000000..697cb3a --- /dev/null +++ b/forgetest/cool-flow-test/sys/head/air_assist_tach @@ -0,0 +1 @@ +300 diff --git a/forgetest/cool-flow-test/sys/head/purge_air_current b/forgetest/cool-flow-test/sys/head/purge_air_current new file mode 100644 index 0000000..f075110 --- /dev/null +++ b/forgetest/cool-flow-test/sys/head/purge_air_current @@ -0,0 +1 @@ +629 diff --git a/forgetest/cool-flow-test/sys/pic/hv_current b/forgetest/cool-flow-test/sys/pic/hv_current new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/cool-flow-test/sys/pic/hv_current @@ -0,0 +1 @@ +0 diff --git a/forgetest/cool-flow-test/sys/pic/lid_ir_1 b/forgetest/cool-flow-test/sys/pic/lid_ir_1 new file mode 100644 index 0000000..29d6383 --- /dev/null +++ b/forgetest/cool-flow-test/sys/pic/lid_ir_1 @@ -0,0 +1 @@ +100 diff --git a/forgetest/cool-flow-test/sys/pic/lid_ir_2 b/forgetest/cool-flow-test/sys/pic/lid_ir_2 new file mode 100644 index 0000000..29d6383 --- /dev/null +++ b/forgetest/cool-flow-test/sys/pic/lid_ir_2 @@ -0,0 +1 @@ +100 diff --git a/forgetest/cool-flow-test/sys/pic/lid_ir_3 b/forgetest/cool-flow-test/sys/pic/lid_ir_3 new file mode 100644 index 0000000..29d6383 --- /dev/null +++ b/forgetest/cool-flow-test/sys/pic/lid_ir_3 @@ -0,0 +1 @@ +100 diff --git a/forgetest/cool-flow-test/sys/pic/lid_ir_4 b/forgetest/cool-flow-test/sys/pic/lid_ir_4 new file mode 100644 index 0000000..29d6383 --- /dev/null +++ b/forgetest/cool-flow-test/sys/pic/lid_ir_4 @@ -0,0 +1 @@ +100 diff --git a/forgetest/cool-flow-test/sys/pic/water_temp_1 b/forgetest/cool-flow-test/sys/pic/water_temp_1 new file mode 100644 index 0000000..a4890ce --- /dev/null +++ b/forgetest/cool-flow-test/sys/pic/water_temp_1 @@ -0,0 +1 @@ +700 diff --git a/forgetest/cool-flow-test/sys/pic/water_temp_2 b/forgetest/cool-flow-test/sys/pic/water_temp_2 new file mode 100644 index 0000000..a4890ce --- /dev/null +++ b/forgetest/cool-flow-test/sys/pic/water_temp_2 @@ -0,0 +1 @@ +700 diff --git a/forgetest/cool-flow-test/sys/thermal/exhaust_pwm b/forgetest/cool-flow-test/sys/thermal/exhaust_pwm new file mode 100644 index 0000000..c227083 --- /dev/null +++ b/forgetest/cool-flow-test/sys/thermal/exhaust_pwm @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/forgetest/cool-flow-test/sys/thermal/heater_pwm b/forgetest/cool-flow-test/sys/thermal/heater_pwm new file mode 100644 index 0000000..c227083 --- /dev/null +++ b/forgetest/cool-flow-test/sys/thermal/heater_pwm @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/forgetest/cool-flow-test/sys/thermal/intake_pwm b/forgetest/cool-flow-test/sys/thermal/intake_pwm new file mode 100644 index 0000000..c227083 --- /dev/null +++ b/forgetest/cool-flow-test/sys/thermal/intake_pwm @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/forgetest/cool-flow-test/sys/thermal/tach_exhaust b/forgetest/cool-flow-test/sys/thermal/tach_exhaust new file mode 100644 index 0000000..697cb3a --- /dev/null +++ b/forgetest/cool-flow-test/sys/thermal/tach_exhaust @@ -0,0 +1 @@ +300 diff --git a/forgetest/cool-flow-test/sys/thermal/tach_intake_1 b/forgetest/cool-flow-test/sys/thermal/tach_intake_1 new file mode 100644 index 0000000..697cb3a --- /dev/null +++ b/forgetest/cool-flow-test/sys/thermal/tach_intake_1 @@ -0,0 +1 @@ +300 diff --git a/forgetest/cool-flow-test/sys/thermal/tach_intake_2 b/forgetest/cool-flow-test/sys/thermal/tach_intake_2 new file mode 100644 index 0000000..697cb3a --- /dev/null +++ b/forgetest/cool-flow-test/sys/thermal/tach_intake_2 @@ -0,0 +1 @@ +300 diff --git a/forgetest/forgetest/suite/exthost.py b/forgetest/forgetest/suite/exthost.py index 2b0b70f..b953774 100644 --- a/forgetest/forgetest/suite/exthost.py +++ b/forgetest/forgetest/suite/exthost.py @@ -581,6 +581,10 @@ report = { "loopback_undeclared_port": dial("127.0.0.1", 80), "netlink_socket": family(16), "unix_socket": family(1), + "api_settings": api("GET", "/v0/settings"), + "api_settings_set": api("POST", "/v0/settings", {"threshold": 70, "note": "set from inside"}), + "api_settings_undeclared": api("POST", "/v0/settings", {"nothere": 1}), + "api_settings_out_of_bounds": api("POST", "/v0/settings", {"threshold": 9000}), "api_self": api("GET", "/v0/self"), "api_mode": api("GET", "/v0/machine/mode"), "api_hold": api("GET", "/v0/hold"), @@ -739,7 +743,12 @@ def _pack_reference(work, lan, more_caps=()): manifest = {"manifest": 1, "id": REF_ID, "name": "forgetest reference", "version": "1.0.0", "author": "forgetest", "license": "MIT", "api": "0.1", "runtime": "python", "service": {"exec": "bin/reference.py", "args": [lan or "-"]}, - "capabilities": ["net.outbound:%s:443" % REF_DEST, "storage:1", "machine.read"] + list(more_caps)} + "settings": {"threshold": {"type": "number", "default": 40, "min": 0, "max": 100}, + "note": {"type": "string", "default": "", "max": 32, "label": "A note"}, + "when": {"type": "choice", "default": "end", + "choices": ["start", "end", "never"]}}, + "capabilities": ["net.outbound:%s:443" % REF_DEST, "storage:1", "machine.read", + "settings.own"] + list(more_caps)} payload = os.path.join(work, "payload.tar.gz") with tarfile.open(payload, "w:gz") as t: for name, text, mode in (("manifest.json", json.dumps(manifest), 0o644), @@ -933,8 +942,34 @@ def service(ctx): me = rep.get("api_self") or [0, {}] ev["api"] = {k: rep.get(k) for k in ("api_self", "api_mode", "api_hold", "api_nowhere", "api_traversal")} ctx.check(me[0] == 200 and me[1].get("id") == REF_ID and me[1].get("version") == "1.0.0" - and sorted(me[1].get("capabilities") or []) == sorted(["net.outbound:%s:443" % REF_DEST, "storage:1", "machine.read"]), + and sorted(me[1].get("capabilities") or []) == sorted(["net.outbound:%s:443" % REF_DEST, "storage:1", + "machine.read", "settings.own"]), "GET /v0/self from the inside: %s", me) + + # its own settings: read, set, and what the schema will not take + got = rep.get("api_settings") or [0, {}] + ev["api_settings"] = got + ctx.check(got[0] == 200 and (got[1] or {}).get("settings", {}).get("threshold") == 40 + and (got[1] or {}).get("settings", {}).get("when") == "end" + and len((got[1] or {}).get("schema") or []) == 3, + "GET /v0/settings before anything is set, with its schema: %s", got) + set_ = rep.get("api_settings_set") or [0, {}] + ev["api_settings_set"] = set_ + ctx.check(set_[0] == 200 and (set_[1] or {}).get("settings", {}).get("threshold") == 70 + and (set_[1] or {}).get("settings", {}).get("note") == "set from inside" + and (set_[1] or {}).get("settings", {}).get("when") == "end", + "POST /v0/settings sets what it names and leaves the rest: %s", set_) + for key, why in (("api_settings_undeclared", "a setting the package does not declare"), + ("api_settings_out_of_bounds", "a value outside its bounds")): + bad_ = rep.get(key) or [0, {}] + ev[key] = bad_ + ctx.check(bad_[0] == 400 and (bad_[1] or {}).get("error"), "%s -> %s", why, bad_) + store = "%s/settings/%s.json" % (EXT_ROOT, REF_ID) + ev["settings_store"] = {"mode": "%04o" % (os.stat(store).st_mode & 0o7777) if os.path.exists(store) else None} + ctx.check(os.path.exists(store) and os.stat(store).st_mode & 0o7777 == 0o600, + "the settings store is not root's alone: %s", ev["settings_store"]) + ctx.check(os.path.exists(store) and json.loads(_read(store)).get("threshold") == 70, + "the store does not hold what the package set") mode_ = rep.get("api_mode") or [0, {}] ctx.check(mode_[0] == 200 and mode_[1].get("mode") in ("grbl", "cloud") and "controller" in mode_[1], "GET /v0/machine/mode from the inside is not forgectrl's answer: %s", mode_) diff --git a/forgetest/super-test/dev/glowforge b/forgetest/super-test/dev/glowforge new file mode 100644 index 0000000..e69de29 diff --git a/forgetest/super-test/sys/cnc/disable b/forgetest/super-test/sys/cnc/disable new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/super-test/sys/cnc/disable @@ -0,0 +1 @@ +0 diff --git a/forgetest/super-test/sys/cnc/enable b/forgetest/super-test/sys/cnc/enable new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/forgetest/super-test/sys/cnc/enable @@ -0,0 +1 @@ +1 diff --git a/forgetest/super-test/sys/cnc/halt b/forgetest/super-test/sys/cnc/halt new file mode 100644 index 0000000..573541a --- /dev/null +++ b/forgetest/super-test/sys/cnc/halt @@ -0,0 +1 @@ +0 diff --git a/forgetest/super-test/sys/cnc/laser_latch b/forgetest/super-test/sys/cnc/laser_latch new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/forgetest/super-test/sys/cnc/laser_latch @@ -0,0 +1 @@ +1 diff --git a/forgetest/super-test/sys/cnc/stop b/forgetest/super-test/sys/cnc/stop new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/forgetest/super-test/sys/cnc/stop @@ -0,0 +1 @@ +1