@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.
Files changed (277) hide show
  1. package/dist/cjs/chai.js +4 -4
  2. package/dist/cjs/chai.js.map +2 -2
  3. package/dist/cjs/chip/cert/cert-context.d.ts +115 -0
  4. package/dist/cjs/chip/cert/cert-context.d.ts.map +1 -0
  5. package/dist/cjs/chip/cert/cert-context.js +22 -0
  6. package/dist/cjs/chip/cert/cert-context.js.map +6 -0
  7. package/dist/cjs/chip/cert/cert-dsl.d.ts +48 -0
  8. package/dist/cjs/chip/cert/cert-dsl.d.ts.map +1 -0
  9. package/dist/cjs/chip/cert/cert-dsl.js +308 -0
  10. package/dist/cjs/chip/cert/cert-dsl.js.map +6 -0
  11. package/dist/cjs/chip/cert/cert-test.d.ts +46 -0
  12. package/dist/cjs/chip/cert/cert-test.d.ts.map +1 -0
  13. package/dist/cjs/chip/cert/cert-test.js +250 -0
  14. package/dist/cjs/chip/cert/cert-test.js.map +6 -0
  15. package/dist/cjs/chip/cert/chip-app-subject.d.ts +80 -0
  16. package/dist/cjs/chip/cert/chip-app-subject.d.ts.map +1 -0
  17. package/dist/cjs/chip/cert/chip-app-subject.js +337 -0
  18. package/dist/cjs/chip/cert/chip-app-subject.js.map +6 -0
  19. package/dist/cjs/chip/cert/controller-adapter.d.ts +119 -0
  20. package/dist/cjs/chip/cert/controller-adapter.d.ts.map +1 -0
  21. package/dist/cjs/chip/cert/controller-adapter.js +45 -0
  22. package/dist/cjs/chip/cert/controller-adapter.js.map +6 -0
  23. package/dist/cjs/chip/cert/device-config.d.ts +15 -0
  24. package/dist/cjs/chip/cert/device-config.d.ts.map +1 -0
  25. package/dist/cjs/chip/cert/device-config.js +43 -0
  26. package/dist/cjs/chip/cert/device-config.js.map +6 -0
  27. package/dist/cjs/chip/cert/evidence.d.ts +70 -0
  28. package/dist/cjs/chip/cert/evidence.d.ts.map +1 -0
  29. package/dist/cjs/chip/cert/evidence.js +128 -0
  30. package/dist/cjs/chip/cert/evidence.js.map +6 -0
  31. package/dist/cjs/chip/cert/log-follower.d.ts +96 -0
  32. package/dist/cjs/chip/cert/log-follower.d.ts.map +1 -0
  33. package/dist/cjs/chip/cert/log-follower.js +209 -0
  34. package/dist/cjs/chip/cert/log-follower.js.map +6 -0
  35. package/dist/cjs/chip/cert/matterjs-subject-registry.d.ts +22 -0
  36. package/dist/cjs/chip/cert/matterjs-subject-registry.d.ts.map +1 -0
  37. package/dist/cjs/chip/cert/matterjs-subject-registry.js +40 -0
  38. package/dist/cjs/chip/cert/matterjs-subject-registry.js.map +6 -0
  39. package/dist/cjs/chip/cert/prompt-driven-python-test.d.ts +40 -0
  40. package/dist/cjs/chip/cert/prompt-driven-python-test.d.ts.map +1 -0
  41. package/dist/cjs/chip/cert/prompt-driven-python-test.js +77 -0
  42. package/dist/cjs/chip/cert/prompt-driven-python-test.js.map +6 -0
  43. package/dist/cjs/chip/chip-bins.d.ts +132 -0
  44. package/dist/cjs/chip/chip-bins.d.ts.map +1 -0
  45. package/dist/cjs/chip/chip-bins.js +232 -0
  46. package/dist/cjs/chip/chip-bins.js.map +6 -0
  47. package/dist/cjs/chip/chip-test-common.d.ts.map +1 -1
  48. package/dist/cjs/chip/chip-test-common.js +1 -1
  49. package/dist/cjs/chip/chip-test-common.js.map +1 -1
  50. package/dist/cjs/chip/chip.d.ts.map +1 -1
  51. package/dist/cjs/chip/chip.js +1 -1
  52. package/dist/cjs/chip/chip.js.map +1 -1
  53. package/dist/cjs/chip/config.d.ts +26 -0
  54. package/dist/cjs/chip/config.d.ts.map +1 -1
  55. package/dist/cjs/chip/config.js +11 -3
  56. package/dist/cjs/chip/config.js.map +1 -1
  57. package/dist/cjs/chip/index.d.ts +26 -0
  58. package/dist/cjs/chip/index.d.ts.map +1 -1
  59. package/dist/cjs/chip/index.js +49 -0
  60. package/dist/cjs/chip/index.js.map +2 -2
  61. package/dist/cjs/chip/pics/file.d.ts +8 -0
  62. package/dist/cjs/chip/pics/file.d.ts.map +1 -1
  63. package/dist/cjs/chip/pics/file.js +4 -1
  64. package/dist/cjs/chip/pics/file.js.map +1 -1
  65. package/dist/cjs/chip/pics/source.d.ts +8 -5
  66. package/dist/cjs/chip/pics/source.d.ts.map +1 -1
  67. package/dist/cjs/chip/pics/source.js +25 -17
  68. package/dist/cjs/chip/pics/source.js.map +1 -1
  69. package/dist/cjs/chip/python-test.d.ts +12 -0
  70. package/dist/cjs/chip/python-test.d.ts.map +1 -1
  71. package/dist/cjs/chip/python-test.js +6 -4
  72. package/dist/cjs/chip/python-test.js.map +1 -1
  73. package/dist/cjs/chip/state.d.ts.map +1 -1
  74. package/dist/cjs/chip/state.js +24 -7
  75. package/dist/cjs/chip/state.js.map +1 -1
  76. package/dist/cjs/chip/yaml-test.js +1 -1
  77. package/dist/cjs/chip/yaml-test.js.map +1 -1
  78. package/dist/cjs/cli.d.ts.map +1 -1
  79. package/dist/cjs/cli.js +33 -2
  80. package/dist/cjs/cli.js.map +1 -1
  81. package/dist/cjs/device/backchannel.d.ts.map +1 -1
  82. package/dist/cjs/device/subject.d.ts.map +1 -1
  83. package/dist/cjs/device/test.d.ts.map +1 -1
  84. package/dist/cjs/docker/container.d.ts.map +1 -1
  85. package/dist/cjs/docker/docker.d.ts.map +1 -1
  86. package/dist/cjs/docker/edit.d.ts.map +1 -1
  87. package/dist/cjs/docker/errors.d.ts.map +1 -1
  88. package/dist/cjs/docker/network.d.ts.map +1 -1
  89. package/dist/cjs/docker/terminal.d.ts.map +1 -1
  90. package/dist/cjs/failure-reporter.d.ts.map +1 -1
  91. package/dist/cjs/global-declarations.d.js +0 -1
  92. package/dist/cjs/global-declarations.d.js.map +1 -1
  93. package/dist/cjs/global-declarations.d.ts +2 -2
  94. package/dist/cjs/global-definitions.js +17 -4
  95. package/dist/cjs/global-definitions.js.map +2 -2
  96. package/dist/cjs/index.d.js +2 -0
  97. package/dist/cjs/index.d.js.map +1 -1
  98. package/dist/cjs/index.d.ts +3 -0
  99. package/dist/cjs/index.js +2 -0
  100. package/dist/cjs/index.js.map +1 -1
  101. package/dist/cjs/mocha.d.ts.map +1 -1
  102. package/dist/cjs/mocha.js +5 -0
  103. package/dist/cjs/mocha.js.map +1 -1
  104. package/dist/cjs/mocharc.cjs +4 -3
  105. package/dist/cjs/options.d.ts.map +1 -1
  106. package/dist/cjs/print-report.js +1 -1
  107. package/dist/cjs/print-report.js.map +1 -1
  108. package/dist/cjs/test-descriptor.d.ts +1 -1
  109. package/dist/cjs/test-descriptor.d.ts.map +1 -1
  110. package/dist/cjs/text-diff.d.ts.map +1 -1
  111. package/dist/cjs/util/async.d.ts +30 -0
  112. package/dist/cjs/util/async.d.ts.map +1 -0
  113. package/dist/cjs/util/async.js +85 -0
  114. package/dist/cjs/util/async.js.map +6 -0
  115. package/dist/cjs/util/trace-unhandled.d.ts.map +1 -1
  116. package/dist/cjs/util/wtf.d.ts.map +1 -1
  117. package/dist/cjs/util/wtf.js +1 -1
  118. package/dist/cjs/util/wtf.js.map +1 -1
  119. package/dist/cjs/web.d.ts.map +1 -1
  120. package/dist/cjs/web.js +5 -1
  121. package/dist/cjs/web.js.map +1 -1
  122. package/dist/esm/chai.js +1 -1
  123. package/dist/esm/chai.js.map +1 -1
  124. package/dist/esm/chip/cert/cert-context.d.ts +115 -0
  125. package/dist/esm/chip/cert/cert-context.d.ts.map +1 -0
  126. package/dist/esm/chip/cert/cert-context.js +6 -0
  127. package/dist/esm/chip/cert/cert-context.js.map +6 -0
  128. package/dist/esm/chip/cert/cert-dsl.d.ts +48 -0
  129. package/dist/esm/chip/cert/cert-dsl.d.ts.map +1 -0
  130. package/dist/esm/chip/cert/cert-dsl.js +288 -0
  131. package/dist/esm/chip/cert/cert-dsl.js.map +6 -0
  132. package/dist/esm/chip/cert/cert-test.d.ts +46 -0
  133. package/dist/esm/chip/cert/cert-test.d.ts.map +1 -0
  134. package/dist/esm/chip/cert/cert-test.js +230 -0
  135. package/dist/esm/chip/cert/cert-test.js.map +6 -0
  136. package/dist/esm/chip/cert/chip-app-subject.d.ts +80 -0
  137. package/dist/esm/chip/cert/chip-app-subject.d.ts.map +1 -0
  138. package/dist/esm/chip/cert/chip-app-subject.js +317 -0
  139. package/dist/esm/chip/cert/chip-app-subject.js.map +6 -0
  140. package/dist/esm/chip/cert/controller-adapter.d.ts +119 -0
  141. package/dist/esm/chip/cert/controller-adapter.d.ts.map +1 -0
  142. package/dist/esm/chip/cert/controller-adapter.js +25 -0
  143. package/dist/esm/chip/cert/controller-adapter.js.map +6 -0
  144. package/dist/esm/chip/cert/device-config.d.ts +15 -0
  145. package/dist/esm/chip/cert/device-config.d.ts.map +1 -0
  146. package/dist/esm/chip/cert/device-config.js +23 -0
  147. package/dist/esm/chip/cert/device-config.js.map +6 -0
  148. package/dist/esm/chip/cert/evidence.d.ts +70 -0
  149. package/dist/esm/chip/cert/evidence.d.ts.map +1 -0
  150. package/dist/esm/chip/cert/evidence.js +108 -0
  151. package/dist/esm/chip/cert/evidence.js.map +6 -0
  152. package/dist/esm/chip/cert/log-follower.d.ts +96 -0
  153. package/dist/esm/chip/cert/log-follower.d.ts.map +1 -0
  154. package/dist/esm/chip/cert/log-follower.js +189 -0
  155. package/dist/esm/chip/cert/log-follower.js.map +6 -0
  156. package/dist/esm/chip/cert/matterjs-subject-registry.d.ts +22 -0
  157. package/dist/esm/chip/cert/matterjs-subject-registry.d.ts.map +1 -0
  158. package/dist/esm/chip/cert/matterjs-subject-registry.js +20 -0
  159. package/dist/esm/chip/cert/matterjs-subject-registry.js.map +6 -0
  160. package/dist/esm/chip/cert/prompt-driven-python-test.d.ts +40 -0
  161. package/dist/esm/chip/cert/prompt-driven-python-test.d.ts.map +1 -0
  162. package/dist/esm/chip/cert/prompt-driven-python-test.js +57 -0
  163. package/dist/esm/chip/cert/prompt-driven-python-test.js.map +6 -0
  164. package/dist/esm/chip/chip-bins.d.ts +132 -0
  165. package/dist/esm/chip/chip-bins.d.ts.map +1 -0
  166. package/dist/esm/chip/chip-bins.js +212 -0
  167. package/dist/esm/chip/chip-bins.js.map +6 -0
  168. package/dist/esm/chip/chip-test-common.d.ts.map +1 -1
  169. package/dist/esm/chip/chip-test-common.js +1 -1
  170. package/dist/esm/chip/chip-test-common.js.map +1 -1
  171. package/dist/esm/chip/chip.d.ts.map +1 -1
  172. package/dist/esm/chip/chip.js +1 -1
  173. package/dist/esm/chip/chip.js.map +1 -1
  174. package/dist/esm/chip/config.d.ts +26 -0
  175. package/dist/esm/chip/config.d.ts.map +1 -1
  176. package/dist/esm/chip/config.js +11 -3
  177. package/dist/esm/chip/config.js.map +1 -1
  178. package/dist/esm/chip/index.d.ts +26 -0
  179. package/dist/esm/chip/index.d.ts.map +1 -1
  180. package/dist/esm/chip/index.js +60 -0
  181. package/dist/esm/chip/index.js.map +1 -1
  182. package/dist/esm/chip/pics/file.d.ts +8 -0
  183. package/dist/esm/chip/pics/file.d.ts.map +1 -1
  184. package/dist/esm/chip/pics/file.js +4 -1
  185. package/dist/esm/chip/pics/file.js.map +1 -1
  186. package/dist/esm/chip/pics/source.d.ts +8 -5
  187. package/dist/esm/chip/pics/source.d.ts.map +1 -1
  188. package/dist/esm/chip/pics/source.js +24 -16
  189. package/dist/esm/chip/pics/source.js.map +1 -1
  190. package/dist/esm/chip/python-test.d.ts +12 -0
  191. package/dist/esm/chip/python-test.d.ts.map +1 -1
  192. package/dist/esm/chip/python-test.js +6 -4
  193. package/dist/esm/chip/python-test.js.map +1 -1
  194. package/dist/esm/chip/state.d.ts.map +1 -1
  195. package/dist/esm/chip/state.js +25 -8
  196. package/dist/esm/chip/state.js.map +1 -1
  197. package/dist/esm/chip/yaml-test.js +1 -1
  198. package/dist/esm/chip/yaml-test.js.map +1 -1
  199. package/dist/esm/cli.d.ts.map +1 -1
  200. package/dist/esm/cli.js +33 -2
  201. package/dist/esm/cli.js.map +1 -1
  202. package/dist/esm/device/backchannel.d.ts.map +1 -1
  203. package/dist/esm/device/subject.d.ts.map +1 -1
  204. package/dist/esm/device/test.d.ts.map +1 -1
  205. package/dist/esm/docker/container.d.ts.map +1 -1
  206. package/dist/esm/docker/docker.d.ts.map +1 -1
  207. package/dist/esm/docker/edit.d.ts.map +1 -1
  208. package/dist/esm/docker/errors.d.ts.map +1 -1
  209. package/dist/esm/docker/network.d.ts.map +1 -1
  210. package/dist/esm/docker/terminal.d.ts.map +1 -1
  211. package/dist/esm/failure-reporter.d.ts.map +1 -1
  212. package/dist/esm/global-declarations.d.js +0 -1
  213. package/dist/esm/global-declarations.d.js.map +1 -1
  214. package/dist/esm/global-declarations.d.ts +2 -2
  215. package/dist/esm/global-definitions.js +16 -3
  216. package/dist/esm/global-definitions.js.map +1 -1
  217. package/dist/esm/index.d.js +2 -0
  218. package/dist/esm/index.d.js.map +1 -1
  219. package/dist/esm/index.d.ts +3 -0
  220. package/dist/esm/index.js +2 -0
  221. package/dist/esm/index.js.map +1 -1
  222. package/dist/esm/mocha.d.ts.map +1 -1
  223. package/dist/esm/mocha.js +5 -0
  224. package/dist/esm/mocha.js.map +1 -1
  225. package/dist/esm/mocharc.cjs +4 -3
  226. package/dist/esm/options.d.ts.map +1 -1
  227. package/dist/esm/print-report.js +1 -1
  228. package/dist/esm/print-report.js.map +1 -1
  229. package/dist/esm/test-descriptor.d.ts +1 -1
  230. package/dist/esm/test-descriptor.d.ts.map +1 -1
  231. package/dist/esm/text-diff.d.ts.map +1 -1
  232. package/dist/esm/util/async.d.ts +30 -0
  233. package/dist/esm/util/async.d.ts.map +1 -0
  234. package/dist/esm/util/async.js +65 -0
  235. package/dist/esm/util/async.js.map +6 -0
  236. package/dist/esm/util/trace-unhandled.d.ts.map +1 -1
  237. package/dist/esm/util/wtf.d.ts.map +1 -1
  238. package/dist/esm/util/wtf.js +1 -1
  239. package/dist/esm/util/wtf.js.map +1 -1
  240. package/dist/esm/web.d.ts.map +1 -1
  241. package/dist/esm/web.js +5 -1
  242. package/dist/esm/web.js.map +1 -1
  243. package/package.json +9 -9
  244. package/src/chai.ts +3 -3
  245. package/src/chip/cert/cert-context.ts +126 -0
  246. package/src/chip/cert/cert-dsl.ts +451 -0
  247. package/src/chip/cert/cert-test.ts +360 -0
  248. package/src/chip/cert/chip-app-subject.ts +457 -0
  249. package/src/chip/cert/controller-adapter.ts +142 -0
  250. package/src/chip/cert/device-config.ts +33 -0
  251. package/src/chip/cert/evidence.ts +170 -0
  252. package/src/chip/cert/log-follower.ts +266 -0
  253. package/src/chip/cert/matterjs-subject-registry.ts +33 -0
  254. package/src/chip/cert/prompt-driven-python-test.ts +104 -0
  255. package/src/chip/chip-bins.ts +401 -0
  256. package/src/chip/chip-test-common.ts +3 -1
  257. package/src/chip/chip.ts +1 -1
  258. package/src/chip/config.ts +28 -1
  259. package/src/chip/index.ts +67 -0
  260. package/src/chip/pics/file.ts +8 -0
  261. package/src/chip/pics/source.ts +39 -19
  262. package/src/chip/python-test.ts +5 -4
  263. package/src/chip/state.ts +39 -8
  264. package/src/chip/yaml-test.ts +1 -1
  265. package/src/cli.ts +40 -2
  266. package/src/global-declarations.d.ts +2 -2
  267. package/src/global-definitions.ts +27 -3
  268. package/src/index.d.ts +3 -0
  269. package/src/index.js +1 -0
  270. package/src/mocha.ts +13 -0
  271. package/src/mocharc.cjs +4 -3
  272. package/src/print-report.ts +1 -1
  273. package/src/test-descriptor.ts +1 -1
  274. package/src/util/async.ts +83 -0
  275. package/src/util/wtf.ts +3 -1
  276. package/src/web.ts +5 -1
  277. package/test/util/AsyncTest.ts +68 -0
@@ -0,0 +1,115 @@
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 { ControllerAdapter } from "./controller-adapter.js";
8
+ import type { LogFollower } from "./log-follower.js";
9
+ /**
10
+ * Access to a single device's log stream.
11
+ */
12
+ export interface LogSource {
13
+ follow(): AsyncIterable<string>;
14
+ }
15
+ /**
16
+ * Kind of implementation backing a {@link CertDevice}.
17
+ */
18
+ export type DeviceFlavor = "chip-docker" | "chip-local" | "matterjs";
19
+ /**
20
+ * How a {@link CertDevice}'s backing process or container ended.
21
+ */
22
+ export interface DeviceExitInfo {
23
+ code: number | null;
24
+ signal: NodeJS.Signals | null;
25
+ }
26
+ /**
27
+ * A device participating in a cert test — a {@link Subject} plus the identity a step needs to
28
+ * distinguish backing implementations and detect a process/container crash.
29
+ */
30
+ export interface CertDevice extends Subject {
31
+ readonly log: LogFollower;
32
+ readonly flavor: DeviceFlavor;
33
+ readonly exit: Promise<DeviceExitInfo>;
34
+ }
35
+ /**
36
+ * A {@link Subject.Factory} that's known to produce {@link CertDevice}s, not just plain
37
+ * {@link Subject}s. Lets cert-test wiring consume a factory's result without narrowing at every call
38
+ * site (see {@link ChipLocalSubject}/{@link ChipDockerSubject}/`registerMatterJsCertSubject`, all of
39
+ * which only ever construct {@link CertDevice}-conforming instances).
40
+ */
41
+ export interface CertDeviceFactory extends Subject.Factory {
42
+ (domain: string, options?: Subject.Options): CertDevice;
43
+ }
44
+ /**
45
+ * Outcome of a single cert-test step.
46
+ */
47
+ export type StepVerdict = "pass" | "fail" | "skipped" | "aborted";
48
+ /**
49
+ * A single piece of evidence a step recorded while running.
50
+ */
51
+ export interface CheckRecord {
52
+ type: "response" | "device-log" | "network";
53
+ verdict: "pass" | "fail" | "unverified";
54
+ detail?: string;
55
+ pattern?: string;
56
+ matched?: string;
57
+ logLine?: number;
58
+ }
59
+ /**
60
+ * Evidence hooks a {@link CertTest} step engine reports to. See {@link EvidenceRecorder} for the
61
+ * implementation that persists this to disk.
62
+ */
63
+ export interface StepRecorder {
64
+ beginStep(step: CertStepDefinition): void;
65
+ /**
66
+ * Records evidence only; a failed check does not itself change the step's {@link StepVerdict}.
67
+ * A step signals failure by having its `run` throw, not by calling `check` with a failing verdict.
68
+ */
69
+ check(record: CheckRecord): void;
70
+ /** Returns the checks recorded for `step` (empty if it never began), for the caller's own end-of-step reporting. */
71
+ endStep(step: CertStepDefinition, verdict: StepVerdict, skipReason?: string): CheckRecord[];
72
+ /**
73
+ * Records that a device exited unexpectedly while the run was in progress. {@link CertTest}
74
+ * calls this and then fails the run itself; a recorder need only persist the information (see
75
+ * {@link EvidenceRecorder.deviceExited}).
76
+ */
77
+ deviceExited?(info: DeviceExitInfo): void;
78
+ /**
79
+ * Persists whatever evidence was recorded. Returns an implementation-defined locator for it
80
+ * (e.g. {@link EvidenceRecorder} returns the directory it wrote to); a recorder with nothing to
81
+ * persist returns an empty string.
82
+ */
83
+ flush(): Promise<string>;
84
+ }
85
+ /**
86
+ * Context passed to a {@link CertStepDefinition.run} implementation.
87
+ */
88
+ export interface CertStepContext {
89
+ controllers: Record<string, ControllerAdapter>;
90
+ devices: Record<string, CertDevice>;
91
+ recorder: StepRecorder;
92
+ }
93
+ /**
94
+ * A single step of a cert test plan.
95
+ */
96
+ export interface CertStepDefinition {
97
+ number: number | string;
98
+ text: string;
99
+ expected?: string;
100
+ pics?: string;
101
+ /** Device flavors this step supports; absent runs on every flavor (see `cert-dsl.ts`'s `certTest`/`.step`). */
102
+ flavors?: DeviceFlavor[];
103
+ run: (cx: CertStepContext) => Promise<void>;
104
+ }
105
+ /**
106
+ * A cert test plan translated to executable steps.
107
+ */
108
+ export interface CertTestDefinition {
109
+ tc: string;
110
+ plan: string;
111
+ pics: string[];
112
+ app: string;
113
+ steps: CertStepDefinition[];
114
+ }
115
+ //# sourceMappingURL=cert-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cert-context.d.ts","sourceRoot":"","sources":["../../../../src/chip/cert/cert-context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ //# sourceMappingURL=cert-context.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/chip/cert/cert-context.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;",
5
+ "names": []
6
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { CertStepContext, DeviceFlavor } from "./cert-context.js";
7
+ export interface CertTestOptions {
8
+ plan: string;
9
+ pics: string[];
10
+ app: string;
11
+ /** Role name → "dut" (device under test) or "helper" (auxiliary controller). Default: `{ dut: "dut" }`. */
12
+ controllers?: Record<string, "dut" | "helper">;
13
+ /** Role name → app name. Default: `{ th: options.app }`. */
14
+ devices?: Record<string, string>;
15
+ }
16
+ export interface CertStepOptions {
17
+ pics?: string;
18
+ expected?: string;
19
+ /**
20
+ * Restricts this step to the listed device flavors — the minimal declaration mechanism for a TC
21
+ * whose TH app lacks a cluster/command on some flavors (see `TC-ACT-3.2.test.ts`'s AGENTS.md
22
+ * entry). Absent runs the step on every flavor, matching prior behavior.
23
+ */
24
+ flavors?: DeviceFlavor[];
25
+ }
26
+ export interface CertTestBuilder {
27
+ step(number: number | string, text: string, run: (cx: CertStepContext) => Promise<void>, opts?: CertStepOptions): CertTestBuilder;
28
+ }
29
+ /**
30
+ * Thrown by {@link certTest} when `options.devices` declares more than one device. Every device
31
+ * flavor (`ChipDockerSubject`/`ChipLocalSubject`/the matterjs registry) currently starts every
32
+ * device with the same hardcoded discriminator (3840), passcode (20202021), and operational port
33
+ * — fine for one device per run, but two devices in the same run would advertise identical mDNS
34
+ * commissionable records and (for chip flavors) contend for the same UDP port. Multi-device cert
35
+ * tests need per-role discriminator/passcode/port assignment before this can work; until then this
36
+ * throws instead of silently producing a flaky, ambiguous run.
37
+ */
38
+ export declare class MultiDeviceUnsupportedError extends Error {
39
+ constructor(tc: string, roles: string[]);
40
+ }
41
+ /**
42
+ * Declares a cert test. Registers a mocha `it()` for `tc` immediately (mirroring
43
+ * `chip.ts`'s `defineTest`); the returned builder's `.step()` calls append to the step list that
44
+ * `it()`'s test body reads once mocha actually runs it, so step declarations may continue after
45
+ * this call returns.
46
+ */
47
+ export declare function certTest(tc: string, options: CertTestOptions): CertTestBuilder;
48
+ //# sourceMappingURL=cert-dsl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cert-dsl.d.ts","sourceRoot":"","sources":["../../../../src/chip/cert/cert-dsl.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgBH,OAAO,EAGH,eAAe,EAGf,YAAY,EACf,MAAM,mBAAmB,CAAC;AAS3B,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;IAC/C,4DAA4D;IAC5D,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;CAC5B;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,CACA,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,CAAC,EAAE,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,EAC3C,IAAI,CAAC,EAAE,eAAe,GACvB,eAAe,CAAC;CACtB;AAED;;;;;;;;GAQG;AACH,qBAAa,2BAA4B,SAAQ,KAAK;IAClD,YAAY,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAQtC;CACJ;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,eAAe,CAoD9E"}
@@ -0,0 +1,288 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2026 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import { execFile } from "node:child_process";
7
+ import { readFile } from "node:fs/promises";
8
+ import { join } from "node:path";
9
+ import { env } from "node:process";
10
+ import { promisify } from "node:util";
11
+ import { Docker } from "../../docker/docker.js";
12
+ import { Image } from "../../docker/image.js";
13
+ import { afterOne, beforeOne } from "../../mocha.js";
14
+ import { chip } from "../chip.js";
15
+ import { State } from "../state.js";
16
+ import { chipImageBase, ChipDockerSubject, ChipLocalSubject, resolveChipLocalAppDir } from "./chip-app-subject.js";
17
+ import { CertTest, registerCertTestFactory } from "./cert-test.js";
18
+ import { createControllerAdapter } from "./controller-adapter.js";
19
+ import { resolveDeviceFlavor } from "./device-config.js";
20
+ import { EvidenceRecorder } from "./evidence.js";
21
+ import { matterJsCertSubjectFor } from "./matterjs-subject-registry.js";
22
+ const execFileAsync = promisify(execFile);
23
+ class MultiDeviceUnsupportedError extends Error {
24
+ constructor(tc, roles) {
25
+ super(
26
+ `certTest "${tc}" declares ${roles.length} devices (${roles.join(", ")}) via options.devices; every device flavor hardcodes discriminator 3840/passcode 20202021 (and, for chip flavors, a fixed operational port), so more than one device in a single run collides on mDNS advertisement and likely UDP port contention. Multi-device cert tests need per-role discriminator/passcode/port assignment in the device flavors before this can be supported.`
27
+ );
28
+ }
29
+ }
30
+ function certTest(tc, options) {
31
+ const controllerRoles = options.controllers ?? { dut: "dut" };
32
+ const deviceRoles = options.devices ?? { th: options.app };
33
+ const deviceRoleNames = Object.keys(deviceRoles);
34
+ if (deviceRoleNames.length > 1) {
35
+ throw new MultiDeviceUnsupportedError(tc, deviceRoleNames);
36
+ }
37
+ const definition = {
38
+ tc,
39
+ plan: options.plan,
40
+ pics: options.pics,
41
+ app: options.app,
42
+ steps: new Array()
43
+ };
44
+ const descriptor = {
45
+ kind: "cert",
46
+ name: tc,
47
+ path: tc,
48
+ app: options.app,
49
+ // PicsExpression's grammar conjoins with a single "&"; "&&" fails to parse
50
+ pics: options.pics.length ? options.pics.join(" & ") : void 0
51
+ };
52
+ defineCertTest(descriptor, definition, controllerRoles, deviceRoles);
53
+ const builder = {
54
+ step(number, text, run, opts) {
55
+ if (opts?.flavors !== void 0 && opts.flavors.length === 0) {
56
+ throw new Error(
57
+ `certTest "${tc}" step ${number} declares an empty "flavors" list, which would skip it on every flavor \u2014 omit the option instead if that's genuinely intended`
58
+ );
59
+ }
60
+ definition.steps.push({
61
+ number,
62
+ text,
63
+ run,
64
+ pics: opts?.pics,
65
+ expected: opts?.expected,
66
+ flavors: opts?.flavors
67
+ });
68
+ return builder;
69
+ }
70
+ };
71
+ return builder;
72
+ }
73
+ function primaryDeviceRole(deviceRoles, app) {
74
+ for (const [role, roleApp] of Object.entries(deviceRoles)) {
75
+ if (roleApp === app) {
76
+ return role;
77
+ }
78
+ }
79
+ throw new Error(`certTest options.devices has no role for app "${app}" (the app the harness activates)`);
80
+ }
81
+ function subjectFactoryFor(flavor, app) {
82
+ switch (flavor) {
83
+ case "chip-docker":
84
+ return ChipDockerSubject(app);
85
+ case "chip-local":
86
+ return ChipLocalSubject(app);
87
+ case "matterjs": {
88
+ const factory = matterJsCertSubjectFor(app);
89
+ if (!factory) {
90
+ throw new Error(
91
+ `No matterjs cert subject registered for app "${app}"; a consumer (e.g. support/chip-testing/src/cert/index.ts) must call registerMatterJsCertSubject(...) first`
92
+ );
93
+ }
94
+ return factory;
95
+ }
96
+ }
97
+ }
98
+ function defineCertTest(descriptor, definition, controllerRoles, deviceRoles) {
99
+ describe(descriptor.name, () => {
100
+ const flavor = resolveDeviceFlavor();
101
+ const primaryRole = primaryDeviceRole(deviceRoles, definition.app);
102
+ const factory = subjectFactoryFor(flavor, definition.app);
103
+ registerCertTestFactory(
104
+ descriptor,
105
+ () => new WiredCertTest(
106
+ definition,
107
+ descriptor,
108
+ State.container,
109
+ flavor,
110
+ primaryRole,
111
+ controllerRoles,
112
+ deviceRoles
113
+ )
114
+ );
115
+ State.install();
116
+ const test = chip.testFor(descriptor);
117
+ const mochaTest = it(descriptor.name, function() {
118
+ this.timeout(descriptor.timeoutMs ?? chip.defaultTimeoutMs);
119
+ return State.run(test, [], async () => {
120
+ });
121
+ });
122
+ beforeOne(mochaTest, async function() {
123
+ await State.activateSubject(factory, false, test);
124
+ });
125
+ mochaTest.descriptor = test.descriptor;
126
+ afterOne(mochaTest, State.deactivateSubject);
127
+ });
128
+ }
129
+ let matterJsCommitPromise;
130
+ function matterJsCommit() {
131
+ matterJsCommitPromise ??= execFileAsync("git", ["rev-parse", "HEAD"]).then(({ stdout }) => stdout.trim()).catch(() => "(unknown)");
132
+ return matterJsCommitPromise;
133
+ }
134
+ async function chipRefFor(flavor, app) {
135
+ try {
136
+ switch (flavor) {
137
+ case "chip-docker":
138
+ return await chipDockerImageRevision(app);
139
+ case "chip-local":
140
+ return await chipLocalMarkerRevision();
141
+ case "matterjs":
142
+ return void 0;
143
+ }
144
+ } catch {
145
+ return void 0;
146
+ }
147
+ }
148
+ async function chipDockerImageRevision(app) {
149
+ const docker = new Docker();
150
+ const image = Image(docker, `${chipImageBase()}-${app}:latest`);
151
+ const info = await image.inspect();
152
+ return info.Config.Labels?.["org.opencontainers.image.revision"];
153
+ }
154
+ async function chipLocalMarkerRevision() {
155
+ const dir = await resolveChipLocalAppDir();
156
+ const text = await readFile(join(dir, "CHIP_REF"), "utf-8");
157
+ const trimmed = text.trim();
158
+ return trimmed === "" ? void 0 : trimmed;
159
+ }
160
+ function evidenceOutDir() {
161
+ return env.MATTER_CERT_EVIDENCE_DIR || join(process.cwd(), "cert-evidence");
162
+ }
163
+ function isCertDevice(subject) {
164
+ return "flavor" in subject && "log" in subject && "exit" in subject;
165
+ }
166
+ class WiredCertTest extends CertTest {
167
+ #flavor;
168
+ #primaryRole;
169
+ #controllerRoles;
170
+ #deviceRoles;
171
+ #cx;
172
+ #extraDevices = new Array();
173
+ #recorder;
174
+ constructor(definition, descriptor, container, flavor, primaryRole, controllerRoles, deviceRoles) {
175
+ super(definition, descriptor, container);
176
+ this.#flavor = flavor;
177
+ this.#primaryRole = primaryRole;
178
+ this.#controllerRoles = controllerRoles;
179
+ this.#deviceRoles = deviceRoles;
180
+ }
181
+ async invoke(subject, step, args, uncommissioned) {
182
+ const cx = await this.#buildContext(subject);
183
+ this.#cx = cx;
184
+ try {
185
+ await super.invoke(subject, step, args, uncommissioned);
186
+ } finally {
187
+ this.#cx = void 0;
188
+ await this.#teardown(cx.controllers);
189
+ }
190
+ }
191
+ contextFor(_subject) {
192
+ if (!this.#cx) {
193
+ throw new Error("WiredCertTest.contextFor() called outside invoke()");
194
+ }
195
+ return this.#cx;
196
+ }
197
+ async #buildContext(subject) {
198
+ if (!isCertDevice(subject)) {
199
+ throw new Error(
200
+ `Cert-test subject for "${this.descriptor.name}" does not implement CertDevice (missing log/flavor/exit) \u2014 its Subject.Factory must come from subjectFactoryFor()`
201
+ );
202
+ }
203
+ const devices = { [this.#primaryRole]: subject };
204
+ const extra = new Array();
205
+ const controllers = {};
206
+ try {
207
+ for (const [role, app] of Object.entries(this.#deviceRoles)) {
208
+ if (role === this.#primaryRole) {
209
+ continue;
210
+ }
211
+ const factory = subjectFactoryFor(this.#flavor, app);
212
+ const device = factory(`${this.descriptor.name}-${role}`);
213
+ extra.push(device);
214
+ await device.initialize();
215
+ await device.start();
216
+ devices[role] = device;
217
+ }
218
+ for (const name of Object.keys(this.#controllerRoles)) {
219
+ const controller = createControllerAdapter(name);
220
+ controllers[name] = controller;
221
+ await controller.start();
222
+ }
223
+ } catch (e) {
224
+ this.#extraDevices = extra;
225
+ await this.#teardown(controllers);
226
+ throw e;
227
+ }
228
+ const [matterJsRef, chipRef] = await Promise.all([
229
+ matterJsCommit(),
230
+ chipRefFor(this.#flavor, this.definition.app)
231
+ ]);
232
+ const recorder = new EvidenceRecorder(evidenceOutDir(), {
233
+ tc: this.definition.tc,
234
+ plan: this.definition.plan,
235
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
236
+ controller: Object.keys(this.#controllerRoles).join(","),
237
+ device: `${this.#flavor}:${this.definition.app}`,
238
+ matterJsCommit: matterJsRef,
239
+ chipRef
240
+ });
241
+ this.#extraDevices = extra;
242
+ this.#recorder = recorder;
243
+ return { controllers, devices, recorder };
244
+ }
245
+ /**
246
+ * Attaches every device's and controller's accumulated log before {@link EvidenceRecorder.flush}
247
+ * writes it to disk. `cx.recorder` is typed as the generic `StepRecorder` (no `attachLog`), so
248
+ * this uses the concrete instance `#buildContext` kept a reference to instead.
249
+ */
250
+ async beforeFlush(cx) {
251
+ if (!this.#recorder) {
252
+ return;
253
+ }
254
+ for (const [role, device] of Object.entries(cx.devices)) {
255
+ this.#recorder.attachLog(`device-${role}`, device.log.lines);
256
+ }
257
+ for (const [name, controller] of Object.entries(cx.controllers)) {
258
+ this.#recorder.attachLog(`controller-${name}`, controller.log.lines);
259
+ }
260
+ }
261
+ async #teardown(controllers) {
262
+ const errors = new Array();
263
+ for (const controller of Object.values(controllers)) {
264
+ try {
265
+ await controller.close();
266
+ } catch (e) {
267
+ errors.push(e);
268
+ }
269
+ }
270
+ for (const device of this.#extraDevices) {
271
+ try {
272
+ await device.close();
273
+ } catch (e) {
274
+ errors.push(e);
275
+ }
276
+ }
277
+ this.#extraDevices = [];
278
+ this.#recorder = void 0;
279
+ for (const error of errors) {
280
+ console.warn("Error tearing down cert-test controller/device:", error);
281
+ }
282
+ }
283
+ }
284
+ export {
285
+ MultiDeviceUnsupportedError,
286
+ certTest
287
+ };
288
+ //# sourceMappingURL=cert-dsl.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/chip/cert/cert-dsl.ts"],
4
+ "mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,gBAAgB;AACzB,SAAS,gBAAgB;AACzB,SAAS,YAAY;AACrB,SAAS,WAAW;AACpB,SAAS,iBAAiB;AAG1B,SAAS,cAAc;AACvB,SAAS,aAAa;AACtB,SAAS,UAAU,iBAAiB;AAEpC,SAAS,YAAY;AACrB,SAAS,aAAa;AACtB,SAAS,eAAe,mBAAmB,kBAAkB,8BAA8B;AAS3F,SAAS,UAAU,+BAA+B;AAClD,SAA4B,+BAA+B;AAC3D,SAAS,2BAA2B;AACpC,SAAS,wBAAwB;AACjC,SAAS,8BAA8B;AAEvC,MAAM,gBAAgB,UAAU,QAAQ;AAyCjC,MAAM,oCAAoC,MAAM;AAAA,EACnD,YAAY,IAAY,OAAiB;AACrC;AAAA,MACI,aAAa,EAAE,cAAc,MAAM,MAAM,aAAa,MAAM,KAAK,IAAI,CAAC;AAAA,IAK1E;AAAA,EACJ;AACJ;AAQO,SAAS,SAAS,IAAY,SAA2C;AAC5E,QAAM,kBAAkB,QAAQ,eAAe,EAAE,KAAK,MAAM;AAC5D,QAAM,cAAc,QAAQ,WAAW,EAAE,IAAI,QAAQ,IAAI;AAEzD,QAAM,kBAAkB,OAAO,KAAK,WAAW;AAC/C,MAAI,gBAAgB,SAAS,GAAG;AAC5B,UAAM,IAAI,4BAA4B,IAAI,eAAe;AAAA,EAC7D;AAEA,QAAM,aAAiC;AAAA,IACnC;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ;AAAA,IACd,KAAK,QAAQ;AAAA,IACb,OAAO,IAAI,MAA0B;AAAA,EACzC;AAEA,QAAM,aAAiC;AAAA,IACnC,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,KAAK,QAAQ;AAAA;AAAA,IAEb,MAAM,QAAQ,KAAK,SAAS,QAAQ,KAAK,KAAK,KAAK,IAAI;AAAA,EAC3D;AAEA,iBAAe,YAAY,YAAY,iBAAiB,WAAW;AAEnE,QAAM,UAA2B;AAAA,IAC7B,KAAK,QAAQ,MAAM,KAAK,MAAM;AAG1B,UAAI,MAAM,YAAY,UAAa,KAAK,QAAQ,WAAW,GAAG;AAC1D,cAAM,IAAI;AAAA,UACN,aAAa,EAAE,UAAU,MAAM;AAAA,QAEnC;AAAA,MACJ;AAEA,iBAAW,MAAM,KAAK;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,MAAM;AAAA,QACZ,UAAU,MAAM;AAAA,QAChB,SAAS,MAAM;AAAA,MACnB,CAAC;AACD,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,SAAO;AACX;AAEA,SAAS,kBAAkB,aAAqC,KAAqB;AACjF,aAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,WAAW,GAAG;AACvD,QAAI,YAAY,KAAK;AACjB,aAAO;AAAA,IACX;AAAA,EACJ;AACA,QAAM,IAAI,MAAM,iDAAiD,GAAG,mCAAmC;AAC3G;AAEA,SAAS,kBAAkB,QAAsB,KAAgC;AAC7E,UAAQ,QAAQ;AAAA,IACZ,KAAK;AACD,aAAO,kBAAkB,GAAG;AAAA,IAEhC,KAAK;AACD,aAAO,iBAAiB,GAAG;AAAA,IAE/B,KAAK,YAAY;AACb,YAAM,UAAU,uBAAuB,GAAG;AAC1C,UAAI,CAAC,SAAS;AACV,cAAM,IAAI;AAAA,UACN,gDAAgD,GAAG;AAAA,QAEvD;AAAA,MACJ;AACA,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;AAmBA,SAAS,eACL,YACA,YACA,iBACA,aACF;AACE,WAAS,WAAW,MAAM,MAAM;AAC5B,UAAM,SAAS,oBAAoB;AACnC,UAAM,cAAc,kBAAkB,aAAa,WAAW,GAAG;AACjE,UAAM,UAAU,kBAAkB,QAAQ,WAAW,GAAG;AAExD;AAAA,MACI;AAAA,MACA,MACI,IAAI;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAAA,IACR;AAEA,UAAM,QAAQ;AACd,UAAM,OAAO,KAAK,QAAQ,UAAU;AAEpC,UAAM,YAAY,GAAG,WAAW,MAAM,WAAY;AAC9C,WAAK,QAAQ,WAAW,aAAa,KAAK,gBAAgB;AAC1D,aAAO,MAAM,IAAI,MAAM,CAAC,GAAG,YAAY;AAAA,MAAC,CAAC;AAAA,IAC7C,CAAC;AAED,cAAU,WAAW,iBAAkB;AACnC,YAAM,MAAM,gBAAgB,SAAS,OAAO,IAAI;AAAA,IACpD,CAAC;AAED,cAAU,aAAa,KAAK;AAE5B,aAAS,WAAW,MAAM,iBAAiB;AAAA,EAC/C,CAAC;AACL;AAEA,IAAI;AAGJ,SAAS,iBAAkC;AACvC,4BAA0B,cAAc,OAAO,CAAC,aAAa,MAAM,CAAC,EAC/D,KAAK,CAAC,EAAE,OAAO,MAAM,OAAO,KAAK,CAAC,EAClC,MAAM,MAAM,WAAW;AAC5B,SAAO;AACX;AAGA,eAAe,WAAW,QAAsB,KAA0C;AACtF,MAAI;AACA,YAAQ,QAAQ;AAAA,MACZ,KAAK;AACD,eAAO,MAAM,wBAAwB,GAAG;AAAA,MAC5C,KAAK;AACD,eAAO,MAAM,wBAAwB;AAAA,MACzC,KAAK;AACD,eAAO;AAAA,IACf;AAAA,EACJ,QAAQ;AACJ,WAAO;AAAA,EACX;AACJ;AAEA,eAAe,wBAAwB,KAA0C;AAC7E,QAAM,SAAS,IAAI,OAAO;AAC1B,QAAM,QAAQ,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,GAAG,SAAS;AAC9D,QAAM,OAAO,MAAM,MAAM,QAAQ;AACjC,SAAO,KAAK,OAAO,SAAS,mCAAmC;AACnE;AAEA,eAAe,0BAAuD;AAClE,QAAM,MAAM,MAAM,uBAAuB;AACzC,QAAM,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU,GAAG,OAAO;AAC1D,QAAM,UAAU,KAAK,KAAK;AAC1B,SAAO,YAAY,KAAK,SAAY;AACxC;AAQA,SAAS,iBAAyB;AAC9B,SAAO,IAAI,4BAA4B,KAAK,QAAQ,IAAI,GAAG,eAAe;AAC9E;AAOA,SAAS,aAAa,SAAyC;AAC3D,SAAO,YAAY,WAAW,SAAS,WAAW,UAAU;AAChE;AAOA,MAAM,sBAAsB,SAAS;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,gBAAgB,IAAI,MAAkB;AAAA,EACtC;AAAA,EAEA,YACI,YACA,YACA,WACA,QACA,aACA,iBACA,aACF;AACE,UAAM,YAAY,YAAY,SAAS;AACvC,SAAK,UAAU;AACf,SAAK,eAAe;AACpB,SAAK,mBAAmB;AACxB,SAAK,eAAe;AAAA,EACxB;AAAA,EAEA,MAAe,OACX,SACA,MACA,MACA,gBACa;AACb,UAAM,KAAK,MAAM,KAAK,cAAc,OAAO;AAC3C,SAAK,MAAM;AACX,QAAI;AACA,YAAM,MAAM,OAAO,SAAS,MAAM,MAAM,cAAc;AAAA,IAC1D,UAAE;AACE,WAAK,MAAM;AACX,YAAM,KAAK,UAAU,GAAG,WAAW;AAAA,IACvC;AAAA,EACJ;AAAA,EAEmB,WAAW,UAAoC;AAC9D,QAAI,CAAC,KAAK,KAAK;AACX,YAAM,IAAI,MAAM,oDAAoD;AAAA,IACxE;AACA,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,MAAM,cAAc,SAA4C;AAC5D,QAAI,CAAC,aAAa,OAAO,GAAG;AACxB,YAAM,IAAI;AAAA,QACN,0BAA0B,KAAK,WAAW,IAAI;AAAA,MAElD;AAAA,IACJ;AAEA,UAAM,UAAsC,EAAE,CAAC,KAAK,YAAY,GAAG,QAAQ;AAC3E,UAAM,QAAQ,IAAI,MAAkB;AACpC,UAAM,cAAiD,CAAC;AAIxD,QAAI;AACA,iBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,KAAK,YAAY,GAAG;AACzD,YAAI,SAAS,KAAK,cAAc;AAC5B;AAAA,QACJ;AACA,cAAM,UAAU,kBAAkB,KAAK,SAAS,GAAG;AACnD,cAAM,SAAS,QAAQ,GAAG,KAAK,WAAW,IAAI,IAAI,IAAI,EAAE;AACxD,cAAM,KAAK,MAAM;AACjB,cAAM,OAAO,WAAW;AACxB,cAAM,OAAO,MAAM;AACnB,gBAAQ,IAAI,IAAI;AAAA,MACpB;AAEA,iBAAW,QAAQ,OAAO,KAAK,KAAK,gBAAgB,GAAG;AACnD,cAAM,aAAa,wBAAwB,IAAI;AAC/C,oBAAY,IAAI,IAAI;AACpB,cAAM,WAAW,MAAM;AAAA,MAC3B;AAAA,IACJ,SAAS,GAAG;AACR,WAAK,gBAAgB;AACrB,YAAM,KAAK,UAAU,WAAW;AAChC,YAAM;AAAA,IACV;AAEA,UAAM,CAAC,aAAa,OAAO,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7C,eAAe;AAAA,MACf,WAAW,KAAK,SAAS,KAAK,WAAW,GAAG;AAAA,IAChD,CAAC;AAED,UAAM,WAAW,IAAI,iBAAiB,eAAe,GAAG;AAAA,MACpD,IAAI,KAAK,WAAW;AAAA,MACpB,MAAM,KAAK,WAAW;AAAA,MACtB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,YAAY,OAAO,KAAK,KAAK,gBAAgB,EAAE,KAAK,GAAG;AAAA,MACvD,QAAQ,GAAG,KAAK,OAAO,IAAI,KAAK,WAAW,GAAG;AAAA,MAC9C,gBAAgB;AAAA,MAChB;AAAA,IACJ,CAAC;AAED,SAAK,gBAAgB;AACrB,SAAK,YAAY;AAEjB,WAAO,EAAE,aAAa,SAAS,SAAS;AAAA,EAC5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAyB,YAAY,IAAoC;AACrE,QAAI,CAAC,KAAK,WAAW;AACjB;AAAA,IACJ;AACA,eAAW,CAAC,MAAM,MAAM,KAAK,OAAO,QAAQ,GAAG,OAAO,GAAG;AACrD,WAAK,UAAU,UAAU,UAAU,IAAI,IAAI,OAAO,IAAI,KAAK;AAAA,IAC/D;AACA,eAAW,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,GAAG,WAAW,GAAG;AAC7D,WAAK,UAAU,UAAU,cAAc,IAAI,IAAI,WAAW,IAAI,KAAK;AAAA,IACvE;AAAA,EACJ;AAAA,EAEA,MAAM,UAAU,aAA+D;AAC3E,UAAM,SAAS,IAAI,MAAe;AAElC,eAAW,cAAc,OAAO,OAAO,WAAW,GAAG;AACjD,UAAI;AACA,cAAM,WAAW,MAAM;AAAA,MAC3B,SAAS,GAAG;AACR,eAAO,KAAK,CAAC;AAAA,MACjB;AAAA,IACJ;AAEA,eAAW,UAAU,KAAK,eAAe;AACrC,UAAI;AACA,cAAM,OAAO,MAAM;AAAA,MACvB,SAAS,GAAG;AACR,eAAO,KAAK,CAAC;AAAA,MACjB;AAAA,IACJ;AACA,SAAK,gBAAgB,CAAC;AACtB,SAAK,YAAY;AAEjB,eAAW,SAAS,QAAQ;AACxB,cAAQ,KAAK,mDAAmD,KAAK;AAAA,IACzE;AAAA,EACJ;AACJ;",
5
+ "names": []
6
+ }
@@ -0,0 +1,46 @@
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 { BaseTest } from "../../device/test.js";
8
+ import type { Container } from "../../docker/container.js";
9
+ import { TestDescriptor, TestFileDescriptor } from "../../test-descriptor.js";
10
+ import { CertStepContext, CertTestDefinition } from "./cert-context.js";
11
+ /**
12
+ * Runs a cert test plan translated into {@link CertStepDefinition}s.
13
+ *
14
+ * Per-step PICS are evaluated at run time against {@link Subject.pics}, since
15
+ * {@link TestDescriptor.filter} only filters whole descriptors at registration time.
16
+ */
17
+ export declare class CertTest extends BaseTest {
18
+ #private;
19
+ constructor(definition: CertTestDefinition, descriptor: TestFileDescriptor, container: Container);
20
+ get definition(): CertTestDefinition;
21
+ initializeSubject(_subject: Subject): Promise<void>;
22
+ invoke(subject: Subject, step: (title: string) => void, _args: string[], _uncommissioned: boolean): Promise<void>;
23
+ /**
24
+ * Build the step context for a run. Overridable so controller/device wiring can be layered on in
25
+ * later tasks without changing {@link invoke}'s public contract.
26
+ */
27
+ protected contextFor(_subject: Subject): CertStepContext;
28
+ /**
29
+ * Runs immediately before {@link StepRecorder.flush}, after every step has settled. Overridable
30
+ * so wiring that built its own concrete recorder (see `WiredCertTest` in `cert-dsl.ts`) can attach
31
+ * final device/controller logs — `contextFor`'s generic `StepRecorder` type doesn't expose that,
32
+ * only the concrete recorder implementation does.
33
+ */
34
+ protected beforeFlush(_cx: CertStepContext): Promise<void>;
35
+ }
36
+ /**
37
+ * Registers the factory {@link state.ts}'s `createTest` calls when it first encounters a
38
+ * `"cert"`-kind descriptor. `certTest()` (`cert-dsl.ts`) calls this before the corresponding
39
+ * `chip.testFor(descriptor)`, so the factory is always present by the time `createTest` looks it up.
40
+ */
41
+ export declare function registerCertTestFactory(descriptor: TestDescriptor, factory: () => CertTest): void;
42
+ /**
43
+ * Constructs the {@link CertTest} registered for `descriptor` via {@link registerCertTestFactory}.
44
+ */
45
+ export declare function createRegisteredCertTest(descriptor: TestDescriptor): CertTest;
46
+ //# sourceMappingURL=cert-test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cert-test.d.ts","sourceRoot":"","sources":["../../../../src/chip/cert/cert-test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AACvD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAG9E,OAAO,EAEH,eAAe,EAEf,kBAAkB,EAMrB,MAAM,mBAAmB,CAAC;AAa3B;;;;;GAKG;AACH,qBAAa,QAAS,SAAQ,QAAQ;;IAGlC,YAAY,UAAU,EAAE,kBAAkB,EAAE,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,SAAS,EAG/F;IAED,IAAI,UAAU,uBAEb;IAEK,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAExD;IAEK,MAAM,CACR,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,EAC7B,KAAK,EAAE,MAAM,EAAE,EACf,eAAe,EAAE,OAAO,GACzB,OAAO,CAAC,IAAI,CAAC,CAyFf;IAED;;;OAGG;IACH,SAAS,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,GAAG,eAAe,CAMvD;IAED;;;;;OAKG;IACH,UAAgB,WAAW,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAG;CACtE;AAyKD;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,UAAU,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,QAAQ,GAAG,IAAI,CAEjG;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,cAAc,GAAG,QAAQ,CAM7E"}