@matter/testing 0.17.9 → 0.18.0-alpha.0-20260812-4d7f2790e
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/chai.js +4 -4
- package/dist/cjs/chai.js.map +2 -2
- package/dist/cjs/chip/cert/cert-context.d.ts +115 -0
- package/dist/cjs/chip/cert/cert-context.d.ts.map +1 -0
- package/dist/cjs/chip/cert/cert-context.js +22 -0
- package/dist/cjs/chip/cert/cert-context.js.map +6 -0
- package/dist/cjs/chip/cert/cert-dsl.d.ts +48 -0
- package/dist/cjs/chip/cert/cert-dsl.d.ts.map +1 -0
- package/dist/cjs/chip/cert/cert-dsl.js +308 -0
- package/dist/cjs/chip/cert/cert-dsl.js.map +6 -0
- package/dist/cjs/chip/cert/cert-test.d.ts +46 -0
- package/dist/cjs/chip/cert/cert-test.d.ts.map +1 -0
- package/dist/cjs/chip/cert/cert-test.js +250 -0
- package/dist/cjs/chip/cert/cert-test.js.map +6 -0
- package/dist/cjs/chip/cert/chip-app-subject.d.ts +80 -0
- package/dist/cjs/chip/cert/chip-app-subject.d.ts.map +1 -0
- package/dist/cjs/chip/cert/chip-app-subject.js +337 -0
- package/dist/cjs/chip/cert/chip-app-subject.js.map +6 -0
- package/dist/cjs/chip/cert/controller-adapter.d.ts +119 -0
- package/dist/cjs/chip/cert/controller-adapter.d.ts.map +1 -0
- package/dist/cjs/chip/cert/controller-adapter.js +45 -0
- package/dist/cjs/chip/cert/controller-adapter.js.map +6 -0
- package/dist/cjs/chip/cert/device-config.d.ts +15 -0
- package/dist/cjs/chip/cert/device-config.d.ts.map +1 -0
- package/dist/cjs/chip/cert/device-config.js +43 -0
- package/dist/cjs/chip/cert/device-config.js.map +6 -0
- package/dist/cjs/chip/cert/evidence.d.ts +70 -0
- package/dist/cjs/chip/cert/evidence.d.ts.map +1 -0
- package/dist/cjs/chip/cert/evidence.js +128 -0
- package/dist/cjs/chip/cert/evidence.js.map +6 -0
- package/dist/cjs/chip/cert/log-follower.d.ts +96 -0
- package/dist/cjs/chip/cert/log-follower.d.ts.map +1 -0
- package/dist/cjs/chip/cert/log-follower.js +209 -0
- package/dist/cjs/chip/cert/log-follower.js.map +6 -0
- package/dist/cjs/chip/cert/matterjs-subject-registry.d.ts +22 -0
- package/dist/cjs/chip/cert/matterjs-subject-registry.d.ts.map +1 -0
- package/dist/cjs/chip/cert/matterjs-subject-registry.js +40 -0
- package/dist/cjs/chip/cert/matterjs-subject-registry.js.map +6 -0
- package/dist/cjs/chip/cert/prompt-driven-python-test.d.ts +40 -0
- package/dist/cjs/chip/cert/prompt-driven-python-test.d.ts.map +1 -0
- package/dist/cjs/chip/cert/prompt-driven-python-test.js +77 -0
- package/dist/cjs/chip/cert/prompt-driven-python-test.js.map +6 -0
- package/dist/cjs/chip/chip-bins.d.ts +132 -0
- package/dist/cjs/chip/chip-bins.d.ts.map +1 -0
- package/dist/cjs/chip/chip-bins.js +232 -0
- package/dist/cjs/chip/chip-bins.js.map +6 -0
- package/dist/cjs/chip/chip-test-common.d.ts.map +1 -1
- package/dist/cjs/chip/chip-test-common.js +1 -1
- package/dist/cjs/chip/chip-test-common.js.map +1 -1
- package/dist/cjs/chip/chip.d.ts.map +1 -1
- package/dist/cjs/chip/chip.js +1 -1
- package/dist/cjs/chip/chip.js.map +1 -1
- package/dist/cjs/chip/config.d.ts +26 -0
- package/dist/cjs/chip/config.d.ts.map +1 -1
- package/dist/cjs/chip/config.js +11 -3
- package/dist/cjs/chip/config.js.map +1 -1
- package/dist/cjs/chip/index.d.ts +26 -0
- package/dist/cjs/chip/index.d.ts.map +1 -1
- package/dist/cjs/chip/index.js +49 -0
- package/dist/cjs/chip/index.js.map +2 -2
- package/dist/cjs/chip/pics/file.d.ts +8 -0
- package/dist/cjs/chip/pics/file.d.ts.map +1 -1
- package/dist/cjs/chip/pics/file.js +4 -1
- package/dist/cjs/chip/pics/file.js.map +1 -1
- package/dist/cjs/chip/pics/source.d.ts +8 -5
- package/dist/cjs/chip/pics/source.d.ts.map +1 -1
- package/dist/cjs/chip/pics/source.js +25 -17
- package/dist/cjs/chip/pics/source.js.map +1 -1
- package/dist/cjs/chip/python-test.d.ts +12 -0
- package/dist/cjs/chip/python-test.d.ts.map +1 -1
- package/dist/cjs/chip/python-test.js +6 -4
- package/dist/cjs/chip/python-test.js.map +1 -1
- package/dist/cjs/chip/state.d.ts.map +1 -1
- package/dist/cjs/chip/state.js +24 -7
- package/dist/cjs/chip/state.js.map +1 -1
- package/dist/cjs/chip/yaml-test.js +1 -1
- package/dist/cjs/chip/yaml-test.js.map +1 -1
- package/dist/cjs/cli.d.ts.map +1 -1
- package/dist/cjs/cli.js +33 -2
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/device/backchannel.d.ts.map +1 -1
- package/dist/cjs/device/subject.d.ts.map +1 -1
- package/dist/cjs/device/test.d.ts.map +1 -1
- package/dist/cjs/docker/container.d.ts.map +1 -1
- package/dist/cjs/docker/docker.d.ts.map +1 -1
- package/dist/cjs/docker/edit.d.ts.map +1 -1
- package/dist/cjs/docker/errors.d.ts.map +1 -1
- package/dist/cjs/docker/network.d.ts.map +1 -1
- package/dist/cjs/docker/terminal.d.ts.map +1 -1
- package/dist/cjs/failure-reporter.d.ts.map +1 -1
- package/dist/cjs/global-declarations.d.js +0 -1
- package/dist/cjs/global-declarations.d.js.map +1 -1
- package/dist/cjs/global-declarations.d.ts +2 -2
- package/dist/cjs/global-definitions.js +17 -4
- package/dist/cjs/global-definitions.js.map +2 -2
- package/dist/cjs/index.d.js +2 -0
- package/dist/cjs/index.d.js.map +1 -1
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.js +2 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mocha.d.ts.map +1 -1
- package/dist/cjs/mocha.js +5 -0
- package/dist/cjs/mocha.js.map +1 -1
- package/dist/cjs/mocharc.cjs +4 -3
- package/dist/cjs/options.d.ts.map +1 -1
- package/dist/cjs/print-report.js +1 -1
- package/dist/cjs/print-report.js.map +1 -1
- package/dist/cjs/test-descriptor.d.ts +1 -1
- package/dist/cjs/test-descriptor.d.ts.map +1 -1
- package/dist/cjs/text-diff.d.ts.map +1 -1
- package/dist/cjs/util/async.d.ts +30 -0
- package/dist/cjs/util/async.d.ts.map +1 -0
- package/dist/cjs/util/async.js +85 -0
- package/dist/cjs/util/async.js.map +6 -0
- package/dist/cjs/util/trace-unhandled.d.ts.map +1 -1
- package/dist/cjs/util/wtf.d.ts.map +1 -1
- package/dist/cjs/util/wtf.js +1 -1
- package/dist/cjs/util/wtf.js.map +1 -1
- package/dist/cjs/web.d.ts.map +1 -1
- package/dist/cjs/web.js +5 -1
- package/dist/cjs/web.js.map +1 -1
- package/dist/esm/chai.js +1 -1
- package/dist/esm/chai.js.map +1 -1
- package/dist/esm/chip/cert/cert-context.d.ts +115 -0
- package/dist/esm/chip/cert/cert-context.d.ts.map +1 -0
- package/dist/esm/chip/cert/cert-context.js +6 -0
- package/dist/esm/chip/cert/cert-context.js.map +6 -0
- package/dist/esm/chip/cert/cert-dsl.d.ts +48 -0
- package/dist/esm/chip/cert/cert-dsl.d.ts.map +1 -0
- package/dist/esm/chip/cert/cert-dsl.js +288 -0
- package/dist/esm/chip/cert/cert-dsl.js.map +6 -0
- package/dist/esm/chip/cert/cert-test.d.ts +46 -0
- package/dist/esm/chip/cert/cert-test.d.ts.map +1 -0
- package/dist/esm/chip/cert/cert-test.js +230 -0
- package/dist/esm/chip/cert/cert-test.js.map +6 -0
- package/dist/esm/chip/cert/chip-app-subject.d.ts +80 -0
- package/dist/esm/chip/cert/chip-app-subject.d.ts.map +1 -0
- package/dist/esm/chip/cert/chip-app-subject.js +317 -0
- package/dist/esm/chip/cert/chip-app-subject.js.map +6 -0
- package/dist/esm/chip/cert/controller-adapter.d.ts +119 -0
- package/dist/esm/chip/cert/controller-adapter.d.ts.map +1 -0
- package/dist/esm/chip/cert/controller-adapter.js +25 -0
- package/dist/esm/chip/cert/controller-adapter.js.map +6 -0
- package/dist/esm/chip/cert/device-config.d.ts +15 -0
- package/dist/esm/chip/cert/device-config.d.ts.map +1 -0
- package/dist/esm/chip/cert/device-config.js +23 -0
- package/dist/esm/chip/cert/device-config.js.map +6 -0
- package/dist/esm/chip/cert/evidence.d.ts +70 -0
- package/dist/esm/chip/cert/evidence.d.ts.map +1 -0
- package/dist/esm/chip/cert/evidence.js +108 -0
- package/dist/esm/chip/cert/evidence.js.map +6 -0
- package/dist/esm/chip/cert/log-follower.d.ts +96 -0
- package/dist/esm/chip/cert/log-follower.d.ts.map +1 -0
- package/dist/esm/chip/cert/log-follower.js +189 -0
- package/dist/esm/chip/cert/log-follower.js.map +6 -0
- package/dist/esm/chip/cert/matterjs-subject-registry.d.ts +22 -0
- package/dist/esm/chip/cert/matterjs-subject-registry.d.ts.map +1 -0
- package/dist/esm/chip/cert/matterjs-subject-registry.js +20 -0
- package/dist/esm/chip/cert/matterjs-subject-registry.js.map +6 -0
- package/dist/esm/chip/cert/prompt-driven-python-test.d.ts +40 -0
- package/dist/esm/chip/cert/prompt-driven-python-test.d.ts.map +1 -0
- package/dist/esm/chip/cert/prompt-driven-python-test.js +57 -0
- package/dist/esm/chip/cert/prompt-driven-python-test.js.map +6 -0
- package/dist/esm/chip/chip-bins.d.ts +132 -0
- package/dist/esm/chip/chip-bins.d.ts.map +1 -0
- package/dist/esm/chip/chip-bins.js +212 -0
- package/dist/esm/chip/chip-bins.js.map +6 -0
- package/dist/esm/chip/chip-test-common.d.ts.map +1 -1
- package/dist/esm/chip/chip-test-common.js +1 -1
- package/dist/esm/chip/chip-test-common.js.map +1 -1
- package/dist/esm/chip/chip.d.ts.map +1 -1
- package/dist/esm/chip/chip.js +1 -1
- package/dist/esm/chip/chip.js.map +1 -1
- package/dist/esm/chip/config.d.ts +26 -0
- package/dist/esm/chip/config.d.ts.map +1 -1
- package/dist/esm/chip/config.js +11 -3
- package/dist/esm/chip/config.js.map +1 -1
- package/dist/esm/chip/index.d.ts +26 -0
- package/dist/esm/chip/index.d.ts.map +1 -1
- package/dist/esm/chip/index.js +60 -0
- package/dist/esm/chip/index.js.map +1 -1
- package/dist/esm/chip/pics/file.d.ts +8 -0
- package/dist/esm/chip/pics/file.d.ts.map +1 -1
- package/dist/esm/chip/pics/file.js +4 -1
- package/dist/esm/chip/pics/file.js.map +1 -1
- package/dist/esm/chip/pics/source.d.ts +8 -5
- package/dist/esm/chip/pics/source.d.ts.map +1 -1
- package/dist/esm/chip/pics/source.js +24 -16
- package/dist/esm/chip/pics/source.js.map +1 -1
- package/dist/esm/chip/python-test.d.ts +12 -0
- package/dist/esm/chip/python-test.d.ts.map +1 -1
- package/dist/esm/chip/python-test.js +6 -4
- package/dist/esm/chip/python-test.js.map +1 -1
- package/dist/esm/chip/state.d.ts.map +1 -1
- package/dist/esm/chip/state.js +25 -8
- package/dist/esm/chip/state.js.map +1 -1
- package/dist/esm/chip/yaml-test.js +1 -1
- package/dist/esm/chip/yaml-test.js.map +1 -1
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +33 -2
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/device/backchannel.d.ts.map +1 -1
- package/dist/esm/device/subject.d.ts.map +1 -1
- package/dist/esm/device/test.d.ts.map +1 -1
- package/dist/esm/docker/container.d.ts.map +1 -1
- package/dist/esm/docker/docker.d.ts.map +1 -1
- package/dist/esm/docker/edit.d.ts.map +1 -1
- package/dist/esm/docker/errors.d.ts.map +1 -1
- package/dist/esm/docker/network.d.ts.map +1 -1
- package/dist/esm/docker/terminal.d.ts.map +1 -1
- package/dist/esm/failure-reporter.d.ts.map +1 -1
- package/dist/esm/global-declarations.d.js +0 -1
- package/dist/esm/global-declarations.d.js.map +1 -1
- package/dist/esm/global-declarations.d.ts +2 -2
- package/dist/esm/global-definitions.js +16 -3
- package/dist/esm/global-definitions.js.map +1 -1
- package/dist/esm/index.d.js +2 -0
- package/dist/esm/index.d.js.map +1 -1
- package/dist/esm/index.d.ts +3 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mocha.d.ts.map +1 -1
- package/dist/esm/mocha.js +5 -0
- package/dist/esm/mocha.js.map +1 -1
- package/dist/esm/mocharc.cjs +4 -3
- package/dist/esm/options.d.ts.map +1 -1
- package/dist/esm/print-report.js +1 -1
- package/dist/esm/print-report.js.map +1 -1
- package/dist/esm/test-descriptor.d.ts +1 -1
- package/dist/esm/test-descriptor.d.ts.map +1 -1
- package/dist/esm/text-diff.d.ts.map +1 -1
- package/dist/esm/util/async.d.ts +30 -0
- package/dist/esm/util/async.d.ts.map +1 -0
- package/dist/esm/util/async.js +65 -0
- package/dist/esm/util/async.js.map +6 -0
- package/dist/esm/util/trace-unhandled.d.ts.map +1 -1
- package/dist/esm/util/wtf.d.ts.map +1 -1
- package/dist/esm/util/wtf.js +1 -1
- package/dist/esm/util/wtf.js.map +1 -1
- package/dist/esm/web.d.ts.map +1 -1
- package/dist/esm/web.js +5 -1
- package/dist/esm/web.js.map +1 -1
- package/package.json +9 -9
- package/src/chai.ts +3 -3
- package/src/chip/cert/cert-context.ts +126 -0
- package/src/chip/cert/cert-dsl.ts +451 -0
- package/src/chip/cert/cert-test.ts +360 -0
- package/src/chip/cert/chip-app-subject.ts +457 -0
- package/src/chip/cert/controller-adapter.ts +142 -0
- package/src/chip/cert/device-config.ts +33 -0
- package/src/chip/cert/evidence.ts +170 -0
- package/src/chip/cert/log-follower.ts +266 -0
- package/src/chip/cert/matterjs-subject-registry.ts +33 -0
- package/src/chip/cert/prompt-driven-python-test.ts +104 -0
- package/src/chip/chip-bins.ts +401 -0
- package/src/chip/chip-test-common.ts +3 -1
- package/src/chip/chip.ts +1 -1
- package/src/chip/config.ts +28 -1
- package/src/chip/index.ts +67 -0
- package/src/chip/pics/file.ts +8 -0
- package/src/chip/pics/source.ts +39 -19
- package/src/chip/python-test.ts +5 -4
- package/src/chip/state.ts +39 -8
- package/src/chip/yaml-test.ts +1 -1
- package/src/cli.ts +40 -2
- package/src/global-declarations.d.ts +2 -2
- package/src/global-definitions.ts +27 -3
- package/src/index.d.ts +3 -0
- package/src/index.js +1 -0
- package/src/mocha.ts +13 -0
- package/src/mocharc.cjs +4 -3
- package/src/print-report.ts +1 -1
- package/src/test-descriptor.ts +1 -1
- package/src/util/async.ts +83 -0
- package/src/util/wtf.ts +3 -1
- package/src/web.ts +5 -1
- package/test/util/AsyncTest.ts +68 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var log_follower_exports = {};
|
|
20
|
+
__export(log_follower_exports, {
|
|
21
|
+
CertLogClosedError: () => CertLogClosedError,
|
|
22
|
+
CertLogTimeoutError: () => CertLogTimeoutError,
|
|
23
|
+
LogFollower: () => LogFollower
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(log_follower_exports);
|
|
26
|
+
var import_async = require("../../util/async.js");
|
|
27
|
+
var import_text = require("../../util/text.js");
|
|
28
|
+
/**
|
|
29
|
+
* @license
|
|
30
|
+
* Copyright 2022-2026 Matter.js Authors
|
|
31
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
32
|
+
*/
|
|
33
|
+
const DEFAULT_TIMEOUT_MS = 3e4;
|
|
34
|
+
class CertLogTimeoutError extends Error {
|
|
35
|
+
constructor(pattern, from, tail) {
|
|
36
|
+
super(
|
|
37
|
+
`Timed out waiting for ${pattern} (from index ${from}); last lines: ` + tail.slice(-20).map((line) => line.text).join("\n")
|
|
38
|
+
);
|
|
39
|
+
this.pattern = pattern;
|
|
40
|
+
this.from = from;
|
|
41
|
+
this.tail = tail;
|
|
42
|
+
}
|
|
43
|
+
pattern;
|
|
44
|
+
from;
|
|
45
|
+
tail;
|
|
46
|
+
}
|
|
47
|
+
class CertLogClosedError extends Error {
|
|
48
|
+
constructor(name) {
|
|
49
|
+
super(`Log follower "${name}" closed before a pending expect() matched`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function patternFor(patterns, flavor) {
|
|
53
|
+
if (flavor.startsWith("chip")) {
|
|
54
|
+
return patterns.chip;
|
|
55
|
+
}
|
|
56
|
+
if (flavor === "matterjs") {
|
|
57
|
+
return patterns.matterjs;
|
|
58
|
+
}
|
|
59
|
+
return void 0;
|
|
60
|
+
}
|
|
61
|
+
function matchableCopy(pattern) {
|
|
62
|
+
return new RegExp(pattern.source, pattern.flags.replace(/[gy]/g, ""));
|
|
63
|
+
}
|
|
64
|
+
class LogFollower {
|
|
65
|
+
name;
|
|
66
|
+
#lines = new Array();
|
|
67
|
+
#lastMark = 0;
|
|
68
|
+
#closed = false;
|
|
69
|
+
#closeError;
|
|
70
|
+
#waiters = new Array();
|
|
71
|
+
#resolveCloseSignal;
|
|
72
|
+
#closeSignal;
|
|
73
|
+
#pump;
|
|
74
|
+
constructor(source, name) {
|
|
75
|
+
this.name = name;
|
|
76
|
+
this.#closeSignal = new Promise((resolve) => {
|
|
77
|
+
this.#resolveCloseSignal = resolve;
|
|
78
|
+
});
|
|
79
|
+
this.#pump = this.#consume(source);
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Appends a synthetic line (e.g. a step-boundary banner) to the buffer at the current position,
|
|
83
|
+
* indexed like a real line but flagged so {@link expect} skips it. Lets a caller mark the
|
|
84
|
+
* chronologically right position in the evidence `.log` output without that marker ever
|
|
85
|
+
* satisfying a step's own pattern.
|
|
86
|
+
*/
|
|
87
|
+
annotate(text) {
|
|
88
|
+
this.#lines.push({ index: this.#lines.length, at: /* @__PURE__ */ new Date(), text, synthetic: true });
|
|
89
|
+
this.#wake();
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Sets the default cursor a subsequent {@link expect} call scans from when it doesn't specify
|
|
93
|
+
* `from` itself. Typically called once at the start of a step.
|
|
94
|
+
*/
|
|
95
|
+
mark() {
|
|
96
|
+
this.#lastMark = this.#lines.length;
|
|
97
|
+
return this.#lastMark;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Every line seen so far, in arrival order. A fresh copy on each access — callers cannot
|
|
101
|
+
* mutate the follower's own buffer through it.
|
|
102
|
+
*/
|
|
103
|
+
get lines() {
|
|
104
|
+
return [...this.#lines];
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Waits for a line at or after the cursor (`options.from`, default: the last {@link mark})
|
|
108
|
+
* matching the pattern for `options.flavor`. Resolves `unverified` immediately if `patterns`
|
|
109
|
+
* has no entry for that flavor. Throws {@link CertLogTimeoutError} if the deadline passes
|
|
110
|
+
* first, or {@link CertLogClosedError} (or the source's own error) if the follower closes
|
|
111
|
+
* first.
|
|
112
|
+
*/
|
|
113
|
+
async expect(patterns, options) {
|
|
114
|
+
const original = patternFor(patterns, options.flavor);
|
|
115
|
+
if (!original) {
|
|
116
|
+
return { verdict: "unverified", reason: "no-pattern-for-flavor" };
|
|
117
|
+
}
|
|
118
|
+
const pattern = matchableCopy(original);
|
|
119
|
+
const from = options.from ?? this.#lastMark;
|
|
120
|
+
const timeout = (0, import_async.delay)(options.timeoutMs ?? DEFAULT_TIMEOUT_MS);
|
|
121
|
+
try {
|
|
122
|
+
for (; ; ) {
|
|
123
|
+
const matched = this.#firstMatchFrom(pattern, from);
|
|
124
|
+
if (matched) {
|
|
125
|
+
return { verdict: "pass", matched, pattern: String(original) };
|
|
126
|
+
}
|
|
127
|
+
if (this.#closeError) {
|
|
128
|
+
throw this.#closeError;
|
|
129
|
+
}
|
|
130
|
+
if (this.#closed) {
|
|
131
|
+
throw new CertLogClosedError(this.name);
|
|
132
|
+
}
|
|
133
|
+
const outcome = await Promise.race([this.#waitForWake(), timeout.promise]);
|
|
134
|
+
if (outcome === "timeout") {
|
|
135
|
+
throw new CertLogTimeoutError(String(original), from, this.#lines.slice(from));
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
} finally {
|
|
139
|
+
timeout.cancel();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
follow() {
|
|
143
|
+
return this.#replay();
|
|
144
|
+
}
|
|
145
|
+
async close() {
|
|
146
|
+
this.#resolveCloseSignal();
|
|
147
|
+
await this.#pump;
|
|
148
|
+
}
|
|
149
|
+
#firstMatchFrom(pattern, from) {
|
|
150
|
+
for (let i = from; i < this.#lines.length; i++) {
|
|
151
|
+
if (this.#lines[i].synthetic) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
if (pattern.test(this.#lines[i].text)) {
|
|
155
|
+
return this.#lines[i];
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return void 0;
|
|
159
|
+
}
|
|
160
|
+
#waitForWake() {
|
|
161
|
+
return new Promise((resolve) => this.#waiters.push(() => resolve("activity")));
|
|
162
|
+
}
|
|
163
|
+
#wake() {
|
|
164
|
+
const waiters = this.#waiters;
|
|
165
|
+
this.#waiters = new Array();
|
|
166
|
+
for (const waiter of waiters) {
|
|
167
|
+
waiter();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
async *#replay() {
|
|
171
|
+
let index = 0;
|
|
172
|
+
for (; ; ) {
|
|
173
|
+
while (index < this.#lines.length) {
|
|
174
|
+
yield this.#lines[index++].text;
|
|
175
|
+
}
|
|
176
|
+
if (this.#closed) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
await new Promise((resolve) => this.#waiters.push(resolve));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// #closeSignal is a single reused promise, so close() ends the loop immediately without
|
|
183
|
+
// forcing the source's iterator closed (which could hang on a source parked mid-await).
|
|
184
|
+
// Never rethrows: failures land on #closeError for expect() to surface, so #pump always
|
|
185
|
+
// resolves and close() has nothing to catch.
|
|
186
|
+
async #consume(source) {
|
|
187
|
+
const iterator = source[Symbol.asyncIterator]();
|
|
188
|
+
try {
|
|
189
|
+
for (; ; ) {
|
|
190
|
+
const outcome = await Promise.race([
|
|
191
|
+
iterator.next().then((result) => ({ closed: false, result })),
|
|
192
|
+
this.#closeSignal.then(() => ({ closed: true }))
|
|
193
|
+
]);
|
|
194
|
+
if (outcome.closed || outcome.result.done) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
this.#lines.push({ index: this.#lines.length, at: /* @__PURE__ */ new Date(), text: (0, import_text.deansify)(outcome.result.value) });
|
|
198
|
+
this.#wake();
|
|
199
|
+
}
|
|
200
|
+
} catch (e) {
|
|
201
|
+
this.#closeError = e instanceof Error ? e : new Error(String(e));
|
|
202
|
+
console.warn(`Log follower "${this.name}" lost its source:`, this.#closeError);
|
|
203
|
+
} finally {
|
|
204
|
+
this.#closed = true;
|
|
205
|
+
this.#wake();
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=log-follower.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/chip/cert/log-follower.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { CertDeviceFactory } from "./cert-context.js";
|
|
7
|
+
/**
|
|
8
|
+
* Registers a {@link CertDeviceFactory} for the "matterjs" {@link DeviceFlavor}, keyed by
|
|
9
|
+
* chip-test-header app name.
|
|
10
|
+
*
|
|
11
|
+
* Kept separate from {@link Chip.subjectFor}'s app registry: that one is for the existing py/yaml
|
|
12
|
+
* harness's plain `Subject.Factory`s, which don't carry {@link CertDevice}'s extra fields
|
|
13
|
+
* (`log`/`flavor`/`exit`). Registering the same app name in both places is fine — they're
|
|
14
|
+
* independent maps — but a cert factory needs the matter.js `Logger` sink that only
|
|
15
|
+
* `support/chip-testing` (not this package) is allowed to depend on, so it registers here instead.
|
|
16
|
+
*/
|
|
17
|
+
export declare function registerMatterJsCertSubject(app: string, factory: CertDeviceFactory): void;
|
|
18
|
+
/**
|
|
19
|
+
* Looks up a factory registered via {@link registerMatterJsCertSubject}.
|
|
20
|
+
*/
|
|
21
|
+
export declare function matterJsCertSubjectFor(app: string): CertDeviceFactory | undefined;
|
|
22
|
+
//# sourceMappingURL=matterjs-subject-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"matterjs-subject-registry.d.ts","sourceRoot":"","sources":["../../../../src/chip/cert/matterjs-subject-registry.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAI3D;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,IAAI,CAKzF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAEjF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var matterjs_subject_registry_exports = {};
|
|
20
|
+
__export(matterjs_subject_registry_exports, {
|
|
21
|
+
matterJsCertSubjectFor: () => matterJsCertSubjectFor,
|
|
22
|
+
registerMatterJsCertSubject: () => registerMatterJsCertSubject
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(matterjs_subject_registry_exports);
|
|
25
|
+
/**
|
|
26
|
+
* @license
|
|
27
|
+
* Copyright 2022-2026 Matter.js Authors
|
|
28
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
29
|
+
*/
|
|
30
|
+
const subjects = /* @__PURE__ */ new Map();
|
|
31
|
+
function registerMatterJsCertSubject(app, factory) {
|
|
32
|
+
if (subjects.has(app)) {
|
|
33
|
+
throw new Error(`A matterjs cert subject is already registered for app "${app}"`);
|
|
34
|
+
}
|
|
35
|
+
subjects.set(app, factory);
|
|
36
|
+
}
|
|
37
|
+
function matterJsCertSubjectFor(app) {
|
|
38
|
+
return subjects.get(app);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=matterjs-subject-registry.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/chip/cert/matterjs-subject-registry.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,MAAM,WAAW,oBAAI,IAA+B;AAY7C,SAAS,4BAA4B,KAAa,SAAkC;AACvF,MAAI,SAAS,IAAI,GAAG,GAAG;AACnB,UAAM,IAAI,MAAM,0DAA0D,GAAG,GAAG;AAAA,EACpF;AACA,WAAS,IAAI,KAAK,OAAO;AAC7B;AAKO,SAAS,uBAAuB,KAA4C;AAC/E,SAAO,SAAS,IAAI,GAAG;AAC3B;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Subject } from "../../device/subject.js";
|
|
7
|
+
import type { Container } from "../../docker/container.js";
|
|
8
|
+
import type { TestFileDescriptor } from "../../test-descriptor.js";
|
|
9
|
+
import { PythonTest } from "../python-test.js";
|
|
10
|
+
import type { CertStepContext } from "./cert-context.js";
|
|
11
|
+
/**
|
|
12
|
+
* Reacts to one line of a python-wrapped CHIP test script's own stdout. `pattern` identifies a prompt
|
|
13
|
+
* line — see `MatterBaseTest.wait_for_user_input` in `connectedhomeip`'s
|
|
14
|
+
* `matter/testing/matter_testing.py`, which logs the prompt then blocks on a bare `input()` read — and
|
|
15
|
+
* `action` reacts to it (e.g. drives a {@link CertStepContext} controller through a commissioning
|
|
16
|
+
* attempt) and returns the text {@link PromptDrivenPythonTest} writes to the script's stdin to unblock
|
|
17
|
+
* it.
|
|
18
|
+
*/
|
|
19
|
+
export interface PromptHandler {
|
|
20
|
+
pattern: RegExp;
|
|
21
|
+
action: (cx: CertStepContext, promptText: string) => Promise<string>;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Runs a CHIP python test script that drives its own multi-party scenario and prompts for out-of-band
|
|
25
|
+
* action instead of letting the harness commission/act on its behalf — see `TC_SC_3_5.py`'s
|
|
26
|
+
* `wait_for_user_input` calls, one per CASE-handshake attempt it wants a real commissioner to make.
|
|
27
|
+
*
|
|
28
|
+
* Reuses {@link PythonTest}'s command construction ({@link createCommand}, so the same argument/PICS
|
|
29
|
+
* rules apply) but keeps the container exec's stdin open and answers matching prompt lines through
|
|
30
|
+
* `handlers` instead of running fully unattended. Commissioning happens interactively, driven by
|
|
31
|
+
* `handlers` reacting to prompts, so there is no subject to pre-pair — {@link initializeSubject} is a
|
|
32
|
+
* no-op.
|
|
33
|
+
*/
|
|
34
|
+
export declare class PromptDrivenPythonTest extends PythonTest {
|
|
35
|
+
#private;
|
|
36
|
+
constructor(descriptor: TestFileDescriptor, container: Container, handlers: PromptHandler[], cx: CertStepContext);
|
|
37
|
+
initializeSubject(_subject: Subject): Promise<void>;
|
|
38
|
+
invoke(subject: Subject, step: (title: string) => void, args: string[], uncommissioned: boolean): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=prompt-driven-python-test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt-driven-python-test.d.ts","sourceRoot":"","sources":["../../../../src/chip/cert/prompt-driven-python-test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAGnE,OAAO,EAAiB,UAAU,EAAU,MAAM,mBAAmB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAEzD;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,CAAC,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxE;AAED;;;;;;;;;;GAUG;AACH,qBAAa,sBAAuB,SAAQ,UAAU;;IAIlD,YAAY,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,eAAe,EAI/G;IAEc,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAG;IAEtD,MAAM,CACjB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAC7B,IAAI,EAAE,MAAM,EAAE,EACd,cAAc,EAAE,OAAO,GACxB,OAAO,CAAC,IAAI,CAAC,CA8Cf;CACJ"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var prompt_driven_python_test_exports = {};
|
|
20
|
+
__export(prompt_driven_python_test_exports, {
|
|
21
|
+
PromptDrivenPythonTest: () => PromptDrivenPythonTest
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(prompt_driven_python_test_exports);
|
|
24
|
+
var import_terminal = require("../../docker/terminal.js");
|
|
25
|
+
var import_chip_test_common = require("../chip-test-common.js");
|
|
26
|
+
var import_container_command_pipe = require("../container-command-pipe.js");
|
|
27
|
+
var import_python_test = require("../python-test.js");
|
|
28
|
+
/**
|
|
29
|
+
* @license
|
|
30
|
+
* Copyright 2022-2026 Matter.js Authors
|
|
31
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
32
|
+
*/
|
|
33
|
+
class PromptDrivenPythonTest extends import_python_test.PythonTest {
|
|
34
|
+
#handlers;
|
|
35
|
+
#cx;
|
|
36
|
+
constructor(descriptor, container, handlers, cx) {
|
|
37
|
+
super(descriptor, container);
|
|
38
|
+
this.#handlers = handlers;
|
|
39
|
+
this.#cx = cx;
|
|
40
|
+
}
|
|
41
|
+
async initializeSubject(_subject) {
|
|
42
|
+
}
|
|
43
|
+
async invoke(subject, step, args, uncommissioned) {
|
|
44
|
+
await this.container.exec(["bash", "-c", `test -p ${import_container_command_pipe.FIFO_PATH} || mkfifo ${import_container_command_pipe.FIFO_PATH}`]);
|
|
45
|
+
const terminal = await this.container.exec(
|
|
46
|
+
await (0, import_python_test.createCommand)(this.descriptor, this.container, subject, args, uncommissioned),
|
|
47
|
+
import_terminal.Terminal.Line,
|
|
48
|
+
{ cwd: "/tmp", stdin: true }
|
|
49
|
+
);
|
|
50
|
+
let passed = false;
|
|
51
|
+
try {
|
|
52
|
+
for await (let line of terminal) {
|
|
53
|
+
line = (0, import_chip_test_common.parseStep)(line, step);
|
|
54
|
+
const handler = this.#handlers.find((h) => h.pattern.test(line));
|
|
55
|
+
if (handler) {
|
|
56
|
+
const answer = await handler.action(this.#cx, line);
|
|
57
|
+
await terminal.write(answer);
|
|
58
|
+
}
|
|
59
|
+
if (line.indexOf("Final result: PASS") !== -1) {
|
|
60
|
+
passed = true;
|
|
61
|
+
} else if (line.match(/\[Test\]\s+\S+\s+PASS$/)) {
|
|
62
|
+
passed = true;
|
|
63
|
+
}
|
|
64
|
+
MockLogger.injectExternalMessage("CHIP", (0, import_python_test.spiffy)(line));
|
|
65
|
+
}
|
|
66
|
+
} catch (e) {
|
|
67
|
+
await terminal.close().catch((closeError) => {
|
|
68
|
+
console.warn("Error closing prompt-driven python test terminal:", closeError);
|
|
69
|
+
});
|
|
70
|
+
throw e;
|
|
71
|
+
}
|
|
72
|
+
if (!passed) {
|
|
73
|
+
throw new Error("Python test exited without error but did not indicate successful test");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=prompt-driven-python-test.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/chip/cert/prompt-driven-python-test.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,sBAAyB;AAEzB,8BAA0B;AAC1B,oCAA0B;AAC1B,yBAAkD;AAZlD;AAAA;AAAA;AAAA;AAAA;AAuCO,MAAM,+BAA+B,8BAAW;AAAA,EACnD;AAAA,EACA;AAAA,EAEA,YAAY,YAAgC,WAAsB,UAA2B,IAAqB;AAC9G,UAAM,YAAY,SAAS;AAC3B,SAAK,YAAY;AACjB,SAAK,MAAM;AAAA,EACf;AAAA,EAEA,MAAe,kBAAkB,UAAkC;AAAA,EAAC;AAAA,EAEpE,MAAe,OACX,SACA,MACA,MACA,gBACa;AAIb,UAAM,KAAK,UAAU,KAAK,CAAC,QAAQ,MAAM,WAAW,uCAAS,cAAc,uCAAS,EAAE,CAAC;AAEvF,UAAM,WAAW,MAAM,KAAK,UAAU;AAAA,MAClC,UAAM,kCAAc,KAAK,YAAY,KAAK,WAAW,SAAS,MAAM,cAAc;AAAA,MAClF,yBAAS;AAAA,MACT,EAAE,KAAK,QAAQ,OAAO,KAAK;AAAA,IAC/B;AAEA,QAAI,SAAS;AACb,QAAI;AACA,qBAAe,QAAQ,UAAU;AAC7B,mBAAO,mCAAU,MAAM,IAAI;AAE3B,cAAM,UAAU,KAAK,UAAU,KAAK,OAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAC7D,YAAI,SAAS;AACT,gBAAM,SAAS,MAAM,QAAQ,OAAO,KAAK,KAAK,IAAI;AAClD,gBAAM,SAAS,MAAM,MAAM;AAAA,QAC/B;AAEA,YAAI,KAAK,QAAQ,oBAAoB,MAAM,IAAI;AAE3C,mBAAS;AAAA,QACb,WAAW,KAAK,MAAM,wBAAwB,GAAG;AAE7C,mBAAS;AAAA,QACb;AAEA,mBAAW,sBAAsB,YAAQ,2BAAO,IAAI,CAAC;AAAA,MACzD;AAAA,IACJ,SAAS,GAAG;AAIR,YAAM,SAAS,MAAM,EAAE,MAAM,gBAAc;AACvC,gBAAQ,KAAK,qDAAqD,UAAU;AAAA,MAChF,CAAC;AACD,YAAM;AAAA,IACV;AAEA,QAAI,CAAC,QAAQ;AACT,YAAM,IAAI,MAAM,uEAAuE;AAAA,IAC3F;AAAA,EACJ;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Which build of CHIP example-app/chip-tool binaries a test run uses.
|
|
8
|
+
*
|
|
9
|
+
* `"matterjs"` is matter.js's own image/build (`ghcr.io/matter-js/chip*`, or a directory the user
|
|
10
|
+
* built themselves). `"cert-bins"` selects project-chip's official `connectedhomeip/chip-cert-bins`
|
|
11
|
+
* image — the same binaries the official Matter Test Harness certifies against.
|
|
12
|
+
*/
|
|
13
|
+
export type ChipBinsSource = "matterjs" | "cert-bins";
|
|
14
|
+
/** Docker Hub repository publishing the official CHIP certification binaries. */
|
|
15
|
+
export declare const CERT_BINS_IMAGE = "connectedhomeip/chip-cert-bins";
|
|
16
|
+
/**
|
|
17
|
+
* Maintainer-vetted default tag: the connectedhomeip commit SHA `chip-cert-bins` publishes for
|
|
18
|
+
* Matter 1.6.1, verified pullable and `linux/arm64`-inventoried at the time this integration was
|
|
19
|
+
* built. Override with `MATTER_CHIP_BINS_TAG`.
|
|
20
|
+
*/
|
|
21
|
+
export declare const DEFAULT_CERT_BINS_TAG = "df8bd0308caa0680e2a78cda724a959e5b385205";
|
|
22
|
+
/**
|
|
23
|
+
* `chip-cert-bins` publishes `linux/arm64` only, at every tag on Docker Hub (no `amd64` manifest
|
|
24
|
+
* has ever existed) — the official Test Harness targets Raspberry Pi hardware. Extraction always
|
|
25
|
+
* requests this platform regardless of host architecture; on non-arm64 hosts Docker runs it under
|
|
26
|
+
* emulation (QEMU), which is fine here since extraction only ever runs `cp`, never the app binaries
|
|
27
|
+
* themselves.
|
|
28
|
+
*/
|
|
29
|
+
export declare const CERT_BINS_PLATFORM = "linux/arm64";
|
|
30
|
+
/**
|
|
31
|
+
* Whether a container platform string (as used for `Container.Configuration.platform`, e.g.
|
|
32
|
+
* `"linux/amd64"`) can run `chip-cert-bins` binaries bind-mounted into it. Verified directly: a
|
|
33
|
+
* platform mismatch doesn't fail at pull/extract time, only later at `exec` — `chip/state.ts`'s
|
|
34
|
+
* `configureContainer()` calls this up front so a mismatch fails fast with a clear error instead.
|
|
35
|
+
*/
|
|
36
|
+
export declare function chipBinsPlatformSupported(platform: string): boolean;
|
|
37
|
+
/**
|
|
38
|
+
* Resolve which binary source a test run uses, from `MATTER_CHIP_BINS_SOURCE`. Unset (or empty)
|
|
39
|
+
* means unchanged default behavior: matter.js's own build.
|
|
40
|
+
*/
|
|
41
|
+
export declare function resolveChipBinsSource(): ChipBinsSource;
|
|
42
|
+
/** The tag requested via `MATTER_CHIP_BINS_TAG`, before resolving a possible `"latest"`. */
|
|
43
|
+
export declare function requestedChipBinsTag(): string;
|
|
44
|
+
/** Base host directory under which `chip-cert-bins` binaries are extracted, one subdirectory per tag. */
|
|
45
|
+
export declare function chipBinsDir(): string;
|
|
46
|
+
/**
|
|
47
|
+
* Directory a given tag's binaries extract into and are cached under, one level below
|
|
48
|
+
* {@link chipBinsDir}. Scoping by tag means two runs against different tags can never clobber each
|
|
49
|
+
* other's `rm -rf`/`cp -a`/stamp-write, even sharing one `MATTER_CHIP_BINS_DIR` — each tag gets its own
|
|
50
|
+
* subtree, created fresh on first use.
|
|
51
|
+
*
|
|
52
|
+
* This does not make same-tag concurrency safe: two runs racing to extract the *same* tag into the
|
|
53
|
+
* same base directory at once can still interleave their `rm -rf`/`cp -a`/stamp-write (no cross-process
|
|
54
|
+
* lock exists). Point concurrent runs at different `MATTER_CHIP_BINS_DIR` values if they might extract
|
|
55
|
+
* the same tag at the same time — see the README's "Choosing a CHIP binary source" section.
|
|
56
|
+
*/
|
|
57
|
+
export declare function chipBinsExtractionDir(tag: string, baseDir?: string): string;
|
|
58
|
+
/** Injectable so `"latest"` resolution is unit-testable without a network call. */
|
|
59
|
+
export type LatestTagResolver = () => Promise<string>;
|
|
60
|
+
interface DockerHubTag {
|
|
61
|
+
name: string;
|
|
62
|
+
tag_last_pushed: string;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Narrows Docker Hub's tags-list response to the shape this integration depends on
|
|
66
|
+
* (`{ results?: [{ name, tag_last_pushed }, ...] }`), so a shape drift on their end throws a clear,
|
|
67
|
+
* named error here instead of a `TypeError` from deep inside the later `.sort()`/`.name` access.
|
|
68
|
+
*/
|
|
69
|
+
export declare function parseDockerHubTagsResponse(body: unknown): DockerHubTag[];
|
|
70
|
+
/**
|
|
71
|
+
* Resolve a requested tag to a concrete one. Anything other than the literal string `"latest"`
|
|
72
|
+
* passes through unchanged (a pinned SHA, or a maintainer-curated default) — reproducible, no
|
|
73
|
+
* network access. `"latest"` is a live lookup, gated behind this explicit opt-in rather than made
|
|
74
|
+
* the default so ordinary runs stay reproducible without depending on network access.
|
|
75
|
+
*/
|
|
76
|
+
export declare function resolveChipBinsTag(requested: string, fetchLatest?: LatestTagResolver): Promise<string>;
|
|
77
|
+
/** The subset of {@link Docker} extraction needs, narrowed so tests can substitute a fake. */
|
|
78
|
+
export interface ChipBinsDockerHandle {
|
|
79
|
+
pull(imageRef: string, platform: string): Promise<void>;
|
|
80
|
+
extractApps(imageRef: string, platform: string, targetDir: string): Promise<void>;
|
|
81
|
+
}
|
|
82
|
+
export interface EnsureChipBinsResult {
|
|
83
|
+
tag: string;
|
|
84
|
+
dir: string;
|
|
85
|
+
/** False when the target directory already held this exact tag's binaries; extraction was skipped. */
|
|
86
|
+
extracted: boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Thrown when `targetDir` is not writable by the host after a `chip-cert-bins` extraction
|
|
90
|
+
* otherwise succeeded — the extraction container's UID mapping left files the host user cannot
|
|
91
|
+
* write, most often on rootless Docker/Podman (see the message for what to do about it).
|
|
92
|
+
*/
|
|
93
|
+
export declare class ChipBinsPermissionError extends Error {
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Thrown when an existing chip-cert-bins extraction directory is owned by a different host user —
|
|
97
|
+
* on a multi-user host that user could have pre-created it and planted binaries this harness later
|
|
98
|
+
* spawns.
|
|
99
|
+
*/
|
|
100
|
+
export declare class ChipBinsOwnershipError extends Error {
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Refuse to trust an existing extraction directory this host user does not own, before any stamp
|
|
104
|
+
* read or extraction relies on its contents. Skipped when `process.getuid` is unavailable
|
|
105
|
+
* (Windows has no POSIX ownership) or when `MATTER_CHIP_BINS_DIR` was set explicitly — that
|
|
106
|
+
* directory is the caller's own responsibility.
|
|
107
|
+
*/
|
|
108
|
+
export declare function assertChipBinsDirOwnership(dir: string): Promise<void>;
|
|
109
|
+
/**
|
|
110
|
+
* Ensure `targetDir` holds `chip-<app>-app`/`chip-tool` binaries extracted from
|
|
111
|
+
* `connectedhomeip/chip-cert-bins:<tag>`. Lazy and cached: if `targetDir`'s stamp file already
|
|
112
|
+
* records `tag`, this is a no-op. A stamp mismatch (different tag, or no stamp at all — including a
|
|
113
|
+
* prior extraction that crashed before writing one) triggers a fresh pull + extract, so a partial
|
|
114
|
+
* failure self-heals on the next call rather than wedging the cache.
|
|
115
|
+
*/
|
|
116
|
+
export declare function ensureChipBins(tag: string, targetDir: string, docker?: ChipBinsDockerHandle): Promise<EnsureChipBinsResult>;
|
|
117
|
+
/**
|
|
118
|
+
* Resolve the configured tag and ensure it's extracted, memoized process-wide so the classic
|
|
119
|
+
* yaml/python harness (`chip/state.ts`) and cert-test `chip-local` subjects
|
|
120
|
+
* (`chip/cert/chip-app-subject.ts`) — both of which may call this once per process — share a single
|
|
121
|
+
* pull/extract rather than racing each other. `docker` is injectable for tests only; production
|
|
122
|
+
* callers always take the default.
|
|
123
|
+
*
|
|
124
|
+
* A failed attempt clears the memo so the next call retries instead of being stuck replaying the
|
|
125
|
+
* same rejection for the rest of the process — matching `ensureChipBins()`'s own self-healing
|
|
126
|
+
* behavior on a failed extraction.
|
|
127
|
+
*/
|
|
128
|
+
export declare function prepareChipBins(docker?: ChipBinsDockerHandle): Promise<EnsureChipBinsResult>;
|
|
129
|
+
/** Test-only: clears the process-wide memoization so each test starts from a clean slate. */
|
|
130
|
+
export declare function resetChipBinsPrepareCacheForTesting(): void;
|
|
131
|
+
export {};
|
|
132
|
+
//# sourceMappingURL=chip-bins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chip-bins.d.ts","sourceRoot":"","sources":["../../../src/chip/chip-bins.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,WAAW,CAAC;AAEtD,iFAAiF;AACjF,eAAO,MAAM,eAAe,mCAAmC,CAAC;AAEhE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,6CAA6C,CAAC;AAEhF;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,gBAAgB,CAAC;AAEhD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnE;AAaD;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,cAAc,CAYtD;AAED,4FAA4F;AAC5F,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAYD,yGAAyG;AACzG,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAcD;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,MAAsB,GAAG,MAAM,CAG1F;AAED,mFAAmF;AACnF,MAAM,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;AAEtD,UAAU,YAAY;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,EAAE,MAAM,CAAC;CAC3B;AAYD;;;;GAIG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE,OAAO,GAAG,YAAY,EAAE,CAqBxE;AAqBD;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACpC,SAAS,EAAE,MAAM,EACjB,WAAW,GAAE,iBAA0C,GACxD,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,8FAA8F;AAC9F,MAAM,WAAW,oBAAoB;IACjC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACrF;AAqCD,MAAM,WAAW,oBAAoB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,sGAAsG;IACtG,SAAS,EAAE,OAAO,CAAC;CACtB;AAcD;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,KAAK;CAAG;AAqBrD;;;;GAIG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;CAAG;AAEpD;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyB3E;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAChC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,EACjB,MAAM,GAAE,oBAAiD,GAC1D,OAAO,CAAC,oBAAoB,CAAC,CAmB/B;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC3B,MAAM,GAAE,oBAAiD,GAC1D,OAAO,CAAC,oBAAoB,CAAC,CAc/B;AAED,6FAA6F;AAC7F,wBAAgB,mCAAmC,IAAI,IAAI,CAE1D"}
|