@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
package/dist/cjs/chai.js CHANGED
@@ -24,14 +24,14 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
24
24
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
25
25
  var chai_exports = {};
26
26
  module.exports = __toCommonJS(chai_exports);
27
- var import_chai = __toESM(require("chai"), 1);
27
+ var Chai = __toESM(require("chai"), 1);
28
28
  var import_global_definitions = require("./global-definitions.js");
29
29
  /**
30
30
  * @license
31
31
  * Copyright 2022-2026 Matter.js Authors
32
32
  * SPDX-License-Identifier: Apache-2.0
33
33
  */
34
- import_chai.default.config.truncateThreshold = 200;
34
+ Chai.config.truncateThreshold = 200;
35
35
  function createDiffMarker(title) {
36
36
  return {
37
37
  toString() {
@@ -44,8 +44,8 @@ expect.BIGINT = createDiffMarker("bigint");
44
44
  expect.BYTES = createDiffMarker("bytes");
45
45
  expect.NUMBER = createDiffMarker("number");
46
46
  expect.STRING = createDiffMarker("string");
47
- import_chai.default.config.deepEqual = (expected, actual) => {
48
- return import_chai.default.util.eql(expected, actual, {
47
+ Chai.config.deepEqual = (expected, actual) => {
48
+ return Chai.util.eql(expected, actual, {
49
49
  comparator(expected2, actual2) {
50
50
  switch (expected2) {
51
51
  case expect.IGNORE:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/chai.ts"],
4
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAMA,kBAAiB;AACjB,gCAAO;AAPP;AAAA;AAAA;AAAA;AAAA;AAWA,YAAAA,QAAK,OAAO,oBAAoB;AAEhC,SAAS,iBAAiB,OAAe;AACrC,SAAO;AAAA,IACH,WAAW;AACP,aAAO,KAAK,KAAK;AAAA,IACrB;AAAA,EACJ;AACJ;AAEA,OAAO,SAAS,iBAAiB,QAAQ;AACzC,OAAO,SAAS,iBAAiB,QAAQ;AACzC,OAAO,QAAQ,iBAAiB,OAAO;AACvC,OAAO,SAAS,iBAAiB,QAAQ;AACzC,OAAO,SAAS,iBAAiB,QAAQ;AAExC,YAAAA,QAAK,OAAe,YAAY,CAAC,UAAmB,WAAoB;AACrE,SAAQ,YAAAA,QAAK,KAAa,IAAI,UAAU,QAAQ;AAAA,IAC5C,WAAWC,WAAmBC,SAAiB;AAE3C,cAAQD,WAAU;AAAA,QACd,KAAK,OAAO;AACR,iBAAO;AAAA,QAEX,KAAK,OAAO;AACR,iBAAO,OAAOC,YAAW;AAAA,QAE7B,KAAK,OAAO;AACR,iBAAO,OAAOA,YAAW;AAAA,QAE7B,KAAK,OAAO;AACR,iBAAO,OAAOA,YAAW;AAAA,QAE7B,KAAK,OAAO;AACR,iBAAOA,mBAAkB;AAAA,MACjC;AAGA,UAAI,OAAOA,YAAW,YAAYA,SAAQ,YAAY,SAAS,cAAc,QAAQA,SAAQ;AACzF,YAAI,OAAOD,cAAa,UAAU;AAC9B,iBAAOC,QAAO,OAAOD;AAAA,QACzB;AACA,YAAI,OAAOA,cAAa,YAAYA,cAAa,QAAQ,QAAQA,WAAU;AACvE,iBAAOC,QAAO,OAAOD,UAAS;AAAA,QAClC;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACL;",
5
- "names": ["Chai", "expected", "actual"]
4
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAMA,WAAsB;AACtB,gCAAO;AAPP;AAAA;AAAA;AAAA;AAAA;AAWA,KAAK,OAAO,oBAAoB;AAEhC,SAAS,iBAAiB,OAAe;AACrC,SAAO;AAAA,IACH,WAAW;AACP,aAAO,KAAK,KAAK;AAAA,IACrB;AAAA,EACJ;AACJ;AAEA,OAAO,SAAS,iBAAiB,QAAQ;AACzC,OAAO,SAAS,iBAAiB,QAAQ;AACzC,OAAO,QAAQ,iBAAiB,OAAO;AACvC,OAAO,SAAS,iBAAiB,QAAQ;AACzC,OAAO,SAAS,iBAAiB,QAAQ;AAEzC,KAAK,OAAO,YAAY,CAAC,UAAmB,WAAoB;AAC5D,SAAO,KAAK,KAAK,IAAI,UAAU,QAAQ;AAAA,IACnC,WAAWA,WAAmBC,SAAiB;AAE3C,cAAQD,WAAU;AAAA,QACd,KAAK,OAAO;AACR,iBAAO;AAAA,QAEX,KAAK,OAAO;AACR,iBAAO,OAAOC,YAAW;AAAA,QAE7B,KAAK,OAAO;AACR,iBAAO,OAAOA,YAAW;AAAA,QAE7B,KAAK,OAAO;AACR,iBAAO,OAAOA,YAAW;AAAA,QAE7B,KAAK,OAAO;AACR,iBAAOA,mBAAkB;AAAA,MACjC;AAGA,UAAI,OAAOA,YAAW,YAAYA,SAAQ,YAAY,SAAS,cAAc,QAAQA,SAAQ;AACzF,YAAI,OAAOD,cAAa,UAAU;AAC9B,iBAAOC,QAAO,OAAOD;AAAA,QACzB;AACA,YAAI,OAAOA,cAAa,YAAYA,cAAa,QAAQ,QAAQA,WAAU;AACvE,iBAAOC,QAAO,OAAOD,UAAS;AAAA,QAClC;AAAA,MACJ;AAEA,aAAO;AAAA,IACX;AAAA,EACJ,CAAC;AACL;",
5
+ "names": ["expected", "actual"]
6
6
  }
@@ -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,22 @@
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 __copyProps = (to, from, except, desc) => {
7
+ if (from && typeof from === "object" || typeof from === "function") {
8
+ for (let key of __getOwnPropNames(from))
9
+ if (!__hasOwnProp.call(to, key) && key !== except)
10
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
11
+ }
12
+ return to;
13
+ };
14
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
15
+ var cert_context_exports = {};
16
+ module.exports = __toCommonJS(cert_context_exports);
17
+ /**
18
+ * @license
19
+ * Copyright 2022-2026 Matter.js Authors
20
+ * SPDX-License-Identifier: Apache-2.0
21
+ */
22
+ //# 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;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,308 @@
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 cert_dsl_exports = {};
20
+ __export(cert_dsl_exports, {
21
+ MultiDeviceUnsupportedError: () => MultiDeviceUnsupportedError,
22
+ certTest: () => certTest
23
+ });
24
+ module.exports = __toCommonJS(cert_dsl_exports);
25
+ var import_node_child_process = require("node:child_process");
26
+ var import_promises = require("node:fs/promises");
27
+ var import_node_path = require("node:path");
28
+ var import_node_process = require("node:process");
29
+ var import_node_util = require("node:util");
30
+ var import_docker = require("../../docker/docker.js");
31
+ var import_image = require("../../docker/image.js");
32
+ var import_mocha = require("../../mocha.js");
33
+ var import_chip = require("../chip.js");
34
+ var import_state = require("../state.js");
35
+ var import_chip_app_subject = require("./chip-app-subject.js");
36
+ var import_cert_test = require("./cert-test.js");
37
+ var import_controller_adapter = require("./controller-adapter.js");
38
+ var import_device_config = require("./device-config.js");
39
+ var import_evidence = require("./evidence.js");
40
+ var import_matterjs_subject_registry = require("./matterjs-subject-registry.js");
41
+ /**
42
+ * @license
43
+ * Copyright 2022-2026 Matter.js Authors
44
+ * SPDX-License-Identifier: Apache-2.0
45
+ */
46
+ const execFileAsync = (0, import_node_util.promisify)(import_node_child_process.execFile);
47
+ class MultiDeviceUnsupportedError extends Error {
48
+ constructor(tc, roles) {
49
+ super(
50
+ `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.`
51
+ );
52
+ }
53
+ }
54
+ function certTest(tc, options) {
55
+ const controllerRoles = options.controllers ?? { dut: "dut" };
56
+ const deviceRoles = options.devices ?? { th: options.app };
57
+ const deviceRoleNames = Object.keys(deviceRoles);
58
+ if (deviceRoleNames.length > 1) {
59
+ throw new MultiDeviceUnsupportedError(tc, deviceRoleNames);
60
+ }
61
+ const definition = {
62
+ tc,
63
+ plan: options.plan,
64
+ pics: options.pics,
65
+ app: options.app,
66
+ steps: new Array()
67
+ };
68
+ const descriptor = {
69
+ kind: "cert",
70
+ name: tc,
71
+ path: tc,
72
+ app: options.app,
73
+ // PicsExpression's grammar conjoins with a single "&"; "&&" fails to parse
74
+ pics: options.pics.length ? options.pics.join(" & ") : void 0
75
+ };
76
+ defineCertTest(descriptor, definition, controllerRoles, deviceRoles);
77
+ const builder = {
78
+ step(number, text, run, opts) {
79
+ if (opts?.flavors !== void 0 && opts.flavors.length === 0) {
80
+ throw new Error(
81
+ `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`
82
+ );
83
+ }
84
+ definition.steps.push({
85
+ number,
86
+ text,
87
+ run,
88
+ pics: opts?.pics,
89
+ expected: opts?.expected,
90
+ flavors: opts?.flavors
91
+ });
92
+ return builder;
93
+ }
94
+ };
95
+ return builder;
96
+ }
97
+ function primaryDeviceRole(deviceRoles, app) {
98
+ for (const [role, roleApp] of Object.entries(deviceRoles)) {
99
+ if (roleApp === app) {
100
+ return role;
101
+ }
102
+ }
103
+ throw new Error(`certTest options.devices has no role for app "${app}" (the app the harness activates)`);
104
+ }
105
+ function subjectFactoryFor(flavor, app) {
106
+ switch (flavor) {
107
+ case "chip-docker":
108
+ return (0, import_chip_app_subject.ChipDockerSubject)(app);
109
+ case "chip-local":
110
+ return (0, import_chip_app_subject.ChipLocalSubject)(app);
111
+ case "matterjs": {
112
+ const factory = (0, import_matterjs_subject_registry.matterJsCertSubjectFor)(app);
113
+ if (!factory) {
114
+ throw new Error(
115
+ `No matterjs cert subject registered for app "${app}"; a consumer (e.g. support/chip-testing/src/cert/index.ts) must call registerMatterJsCertSubject(...) first`
116
+ );
117
+ }
118
+ return factory;
119
+ }
120
+ }
121
+ }
122
+ function defineCertTest(descriptor, definition, controllerRoles, deviceRoles) {
123
+ describe(descriptor.name, () => {
124
+ const flavor = (0, import_device_config.resolveDeviceFlavor)();
125
+ const primaryRole = primaryDeviceRole(deviceRoles, definition.app);
126
+ const factory = subjectFactoryFor(flavor, definition.app);
127
+ (0, import_cert_test.registerCertTestFactory)(
128
+ descriptor,
129
+ () => new WiredCertTest(
130
+ definition,
131
+ descriptor,
132
+ import_state.State.container,
133
+ flavor,
134
+ primaryRole,
135
+ controllerRoles,
136
+ deviceRoles
137
+ )
138
+ );
139
+ import_state.State.install();
140
+ const test = import_chip.chip.testFor(descriptor);
141
+ const mochaTest = it(descriptor.name, function() {
142
+ this.timeout(descriptor.timeoutMs ?? import_chip.chip.defaultTimeoutMs);
143
+ return import_state.State.run(test, [], async () => {
144
+ });
145
+ });
146
+ (0, import_mocha.beforeOne)(mochaTest, async function() {
147
+ await import_state.State.activateSubject(factory, false, test);
148
+ });
149
+ mochaTest.descriptor = test.descriptor;
150
+ (0, import_mocha.afterOne)(mochaTest, import_state.State.deactivateSubject);
151
+ });
152
+ }
153
+ let matterJsCommitPromise;
154
+ function matterJsCommit() {
155
+ matterJsCommitPromise ??= execFileAsync("git", ["rev-parse", "HEAD"]).then(({ stdout }) => stdout.trim()).catch(() => "(unknown)");
156
+ return matterJsCommitPromise;
157
+ }
158
+ async function chipRefFor(flavor, app) {
159
+ try {
160
+ switch (flavor) {
161
+ case "chip-docker":
162
+ return await chipDockerImageRevision(app);
163
+ case "chip-local":
164
+ return await chipLocalMarkerRevision();
165
+ case "matterjs":
166
+ return void 0;
167
+ }
168
+ } catch {
169
+ return void 0;
170
+ }
171
+ }
172
+ async function chipDockerImageRevision(app) {
173
+ const docker = new import_docker.Docker();
174
+ const image = (0, import_image.Image)(docker, `${(0, import_chip_app_subject.chipImageBase)()}-${app}:latest`);
175
+ const info = await image.inspect();
176
+ return info.Config.Labels?.["org.opencontainers.image.revision"];
177
+ }
178
+ async function chipLocalMarkerRevision() {
179
+ const dir = await (0, import_chip_app_subject.resolveChipLocalAppDir)();
180
+ const text = await (0, import_promises.readFile)((0, import_node_path.join)(dir, "CHIP_REF"), "utf-8");
181
+ const trimmed = text.trim();
182
+ return trimmed === "" ? void 0 : trimmed;
183
+ }
184
+ function evidenceOutDir() {
185
+ return import_node_process.env.MATTER_CERT_EVIDENCE_DIR || (0, import_node_path.join)(process.cwd(), "cert-evidence");
186
+ }
187
+ function isCertDevice(subject) {
188
+ return "flavor" in subject && "log" in subject && "exit" in subject;
189
+ }
190
+ class WiredCertTest extends import_cert_test.CertTest {
191
+ #flavor;
192
+ #primaryRole;
193
+ #controllerRoles;
194
+ #deviceRoles;
195
+ #cx;
196
+ #extraDevices = new Array();
197
+ #recorder;
198
+ constructor(definition, descriptor, container, flavor, primaryRole, controllerRoles, deviceRoles) {
199
+ super(definition, descriptor, container);
200
+ this.#flavor = flavor;
201
+ this.#primaryRole = primaryRole;
202
+ this.#controllerRoles = controllerRoles;
203
+ this.#deviceRoles = deviceRoles;
204
+ }
205
+ async invoke(subject, step, args, uncommissioned) {
206
+ const cx = await this.#buildContext(subject);
207
+ this.#cx = cx;
208
+ try {
209
+ await super.invoke(subject, step, args, uncommissioned);
210
+ } finally {
211
+ this.#cx = void 0;
212
+ await this.#teardown(cx.controllers);
213
+ }
214
+ }
215
+ contextFor(_subject) {
216
+ if (!this.#cx) {
217
+ throw new Error("WiredCertTest.contextFor() called outside invoke()");
218
+ }
219
+ return this.#cx;
220
+ }
221
+ async #buildContext(subject) {
222
+ if (!isCertDevice(subject)) {
223
+ throw new Error(
224
+ `Cert-test subject for "${this.descriptor.name}" does not implement CertDevice (missing log/flavor/exit) \u2014 its Subject.Factory must come from subjectFactoryFor()`
225
+ );
226
+ }
227
+ const devices = { [this.#primaryRole]: subject };
228
+ const extra = new Array();
229
+ const controllers = {};
230
+ try {
231
+ for (const [role, app] of Object.entries(this.#deviceRoles)) {
232
+ if (role === this.#primaryRole) {
233
+ continue;
234
+ }
235
+ const factory = subjectFactoryFor(this.#flavor, app);
236
+ const device = factory(`${this.descriptor.name}-${role}`);
237
+ extra.push(device);
238
+ await device.initialize();
239
+ await device.start();
240
+ devices[role] = device;
241
+ }
242
+ for (const name of Object.keys(this.#controllerRoles)) {
243
+ const controller = (0, import_controller_adapter.createControllerAdapter)(name);
244
+ controllers[name] = controller;
245
+ await controller.start();
246
+ }
247
+ } catch (e) {
248
+ this.#extraDevices = extra;
249
+ await this.#teardown(controllers);
250
+ throw e;
251
+ }
252
+ const [matterJsRef, chipRef] = await Promise.all([
253
+ matterJsCommit(),
254
+ chipRefFor(this.#flavor, this.definition.app)
255
+ ]);
256
+ const recorder = new import_evidence.EvidenceRecorder(evidenceOutDir(), {
257
+ tc: this.definition.tc,
258
+ plan: this.definition.plan,
259
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
260
+ controller: Object.keys(this.#controllerRoles).join(","),
261
+ device: `${this.#flavor}:${this.definition.app}`,
262
+ matterJsCommit: matterJsRef,
263
+ chipRef
264
+ });
265
+ this.#extraDevices = extra;
266
+ this.#recorder = recorder;
267
+ return { controllers, devices, recorder };
268
+ }
269
+ /**
270
+ * Attaches every device's and controller's accumulated log before {@link EvidenceRecorder.flush}
271
+ * writes it to disk. `cx.recorder` is typed as the generic `StepRecorder` (no `attachLog`), so
272
+ * this uses the concrete instance `#buildContext` kept a reference to instead.
273
+ */
274
+ async beforeFlush(cx) {
275
+ if (!this.#recorder) {
276
+ return;
277
+ }
278
+ for (const [role, device] of Object.entries(cx.devices)) {
279
+ this.#recorder.attachLog(`device-${role}`, device.log.lines);
280
+ }
281
+ for (const [name, controller] of Object.entries(cx.controllers)) {
282
+ this.#recorder.attachLog(`controller-${name}`, controller.log.lines);
283
+ }
284
+ }
285
+ async #teardown(controllers) {
286
+ const errors = new Array();
287
+ for (const controller of Object.values(controllers)) {
288
+ try {
289
+ await controller.close();
290
+ } catch (e) {
291
+ errors.push(e);
292
+ }
293
+ }
294
+ for (const device of this.#extraDevices) {
295
+ try {
296
+ await device.close();
297
+ } catch (e) {
298
+ errors.push(e);
299
+ }
300
+ }
301
+ this.#extraDevices = [];
302
+ this.#recorder = void 0;
303
+ for (const error of errors) {
304
+ console.warn("Error tearing down cert-test controller/device:", error);
305
+ }
306
+ }
307
+ }
308
+ //# sourceMappingURL=cert-dsl.js.map
@@ -0,0 +1,6 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../src/chip/cert/cert-dsl.ts"],
4
+ "mappings": "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",
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"}