@matter/testing 0.14.1-alpha.0-20250607-a93593303 → 0.15.0-alpha.0-20250612-ddd428561
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/cli.d.ts.map +1 -1
- package/dist/cjs/cli.js +10 -0
- package/dist/cjs/cli.js.map +1 -1
- package/dist/cjs/global-declarations.d.ts +9 -2
- package/dist/cjs/global-declarations.d.ts.map +1 -1
- package/dist/cjs/global-definitions.js +5 -1
- package/dist/cjs/global-definitions.js.map +1 -1
- package/dist/cjs/mocha.d.ts.map +1 -1
- package/dist/cjs/mocha.js +10 -6
- package/dist/cjs/mocha.js.map +1 -1
- package/dist/cjs/mocks/boot.d.ts +4 -1
- package/dist/cjs/mocks/boot.d.ts.map +1 -1
- package/dist/cjs/mocks/boot.js +5 -5
- package/dist/cjs/mocks/boot.js.map +1 -1
- package/dist/cjs/mocks/crypto.d.ts +27 -1
- package/dist/cjs/mocks/crypto.d.ts.map +1 -1
- package/dist/cjs/mocks/crypto.js +56 -43
- package/dist/cjs/mocks/crypto.js.map +1 -1
- package/dist/cjs/mocks/logging.d.ts +1 -1
- package/dist/cjs/mocks/logging.d.ts.map +1 -1
- package/dist/cjs/mocks/logging.js +5 -5
- package/dist/cjs/mocks/logging.js.map +1 -1
- package/dist/cjs/mocks/time.d.ts +16 -1
- package/dist/cjs/mocks/time.d.ts.map +1 -1
- package/dist/cjs/mocks/time.js +48 -9
- package/dist/cjs/mocks/time.js.map +2 -2
- package/dist/cjs/nodejs.d.ts.map +1 -1
- package/dist/cjs/nodejs.js +2 -0
- package/dist/cjs/nodejs.js.map +1 -1
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +11 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/global-declarations.d.ts +9 -2
- package/dist/esm/global-declarations.d.ts.map +1 -1
- package/dist/esm/global-definitions.js +7 -3
- package/dist/esm/global-definitions.js.map +1 -1
- package/dist/esm/mocha.d.ts.map +1 -1
- package/dist/esm/mocha.js +10 -6
- package/dist/esm/mocha.js.map +1 -1
- package/dist/esm/mocks/boot.d.ts +4 -1
- package/dist/esm/mocks/boot.d.ts.map +1 -1
- package/dist/esm/mocks/boot.js +5 -5
- package/dist/esm/mocks/boot.js.map +1 -1
- package/dist/esm/mocks/crypto.d.ts +27 -1
- package/dist/esm/mocks/crypto.d.ts.map +1 -1
- package/dist/esm/mocks/crypto.js +56 -43
- package/dist/esm/mocks/crypto.js.map +1 -1
- package/dist/esm/mocks/logging.d.ts +1 -1
- package/dist/esm/mocks/logging.d.ts.map +1 -1
- package/dist/esm/mocks/logging.js +5 -5
- package/dist/esm/mocks/logging.js.map +1 -1
- package/dist/esm/mocks/time.d.ts +16 -1
- package/dist/esm/mocks/time.d.ts.map +1 -1
- package/dist/esm/mocks/time.js +48 -9
- package/dist/esm/mocks/time.js.map +2 -2
- package/dist/esm/nodejs.d.ts.map +1 -1
- package/dist/esm/nodejs.js +2 -0
- package/dist/esm/nodejs.js.map +1 -1
- package/package.json +4 -4
- package/src/cli.ts +13 -1
- package/src/global-declarations.ts +10 -2
- package/src/global-definitions.ts +10 -3
- package/src/mocha.ts +14 -9
- package/src/mocks/boot.ts +15 -5
- package/src/mocks/crypto.ts +95 -49
- package/src/mocks/logging.ts +4 -4
- package/src/mocks/time.ts +56 -11
- package/src/nodejs.ts +3 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/mocks/time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,KAAK,aAAa,GAAG,MAAM,GAAG,CAAC;AAE/B,KAAK,YAAY,GAAG,OAAO,QAAQ,CAAC;AACpC,MAAM,WAAW,QAAS,SAAQ,YAAY;CAAG;AASjD,cAAM,SAAS;;IACX,IAAI,SAAU;IACd,QAAQ,SAAK;IACb,UAAU,SAAK;IACf,UAAU,UAAS;IAKnB,SAAS,UAAS;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAE7B,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IAgBzF,KAAK;IAOL,IAAI;CAMP;AAYD,KAAK,eAAe,CAAC,CAAC,IAClB,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,GACd;IAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,OAAO,CAAC,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,EAAE,CAAA;CAAE,GACjF;IAAE,OAAO,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,OAAO,CAAC,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,EAAE,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../../../src/mocks/time.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,KAAK,aAAa,GAAG,MAAM,GAAG,CAAC;AAE/B,KAAK,YAAY,GAAG,OAAO,QAAQ,CAAC;AACpC,MAAM,WAAW,QAAS,SAAQ,YAAY;CAAG;AASjD,cAAM,SAAS;;IACX,IAAI,SAAU;IACd,QAAQ,SAAK;IACb,UAAU,SAAK;IACf,UAAU,UAAS;IAKnB,SAAS,UAAS;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;gBAE7B,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa;IAgBzF,KAAK;IAOL,IAAI;CAMP;AAYD,KAAK,eAAe,CAAC,CAAC,IAClB,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,GACd;IAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,OAAO,CAAC,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,EAAE,CAAA;CAAE,GACjF;IAAE,OAAO,EAAE,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,SAAS,CAAA;CAAE,GAAG;IAAE,OAAO,CAAC,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,EAAE,CAAA;CAAE,CAAC;AAkB9E,eAAO,MAAM,QAAQ;;mCAGW,OAAO;IAInC;;OAEG;;IAMH;;OAEG;;IAMH;;OAEG;iBACS,qBAAqB,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAMjD;;OAEG;;WAOI,CAAC,QAAQ,MAAM,GAAG,IAAI,SAAS,MAAM,CAAC,GAAG,CAAC;WAoB1C,IAAI;;mBAQI,MAAM,cAAc,MAAM,YAAY,aAAa,GAAG,SAAS;2BAIvD,MAAM,cAAc,MAAM,YAAY,aAAa,GAAG,SAAS;IAItF;;;;OAIG;YACW,CAAC,WAAW,WAAW,CAAC,CAAC,CAAC,2BAA0B;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE;IAgE3G;;OAEG;gBACe,MAAM;IAcxB;;;OAGG;;IAKH;;;;;OAKG;;IAOH;;;;;;;OAOG;kBACW,KAAK,SAAS,MAAM,EAAE,OAAO,EAAE,IAAI,SAAS,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,OAAO,GAAE,OAC5F,IAAI,UACD,KAAK,eACA,CACT,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,KAC/B,IAAI,GAAG,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;IA0C5F;;OAEG;wBACiB,MAAM;yBAIL,MAAM,YAAY,aAAa;qCAKnB,aAAa;CAKjD,CAAC;AAIF,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAC5B,OAAO,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACjD,GAAG,IAAI,OAAO,CAAC;IACf,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACjC,UAAU,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACnC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;CAC1B,QASA"}
|
package/dist/esm/mocks/time.js
CHANGED
|
@@ -61,23 +61,61 @@ function isAsync(fn) {
|
|
|
61
61
|
let callbacks = new Array();
|
|
62
62
|
let nowMs = 0;
|
|
63
63
|
let real = void 0;
|
|
64
|
-
let enabled =
|
|
64
|
+
let enabled = false;
|
|
65
|
+
const epoch = /* @__PURE__ */ new Date("2025-01-01 12:34:56Z");
|
|
65
66
|
const MockTime = {
|
|
67
|
+
epoch,
|
|
66
68
|
get activeImplementation() {
|
|
67
69
|
return enabled ? this : real ?? this;
|
|
68
70
|
},
|
|
71
|
+
/**
|
|
72
|
+
* Revert to standard time implementation.
|
|
73
|
+
*/
|
|
69
74
|
disable() {
|
|
70
75
|
enabled = false;
|
|
71
|
-
|
|
76
|
+
installActiveImplementation?.();
|
|
72
77
|
},
|
|
78
|
+
/**
|
|
79
|
+
* Enable time mocking. Reverts to disabled for each test file.
|
|
80
|
+
*/
|
|
73
81
|
enable() {
|
|
74
82
|
enabled = true;
|
|
75
|
-
|
|
83
|
+
installActiveImplementation?.();
|
|
76
84
|
},
|
|
77
|
-
|
|
85
|
+
/**
|
|
86
|
+
* Sets mock time to specific time and enable the mock.
|
|
87
|
+
*/
|
|
88
|
+
reset(time = epoch) {
|
|
78
89
|
callbacks = [];
|
|
79
|
-
nowMs = time;
|
|
80
|
-
|
|
90
|
+
nowMs = new Date(time).getTime();
|
|
91
|
+
MockTime.enable();
|
|
92
|
+
},
|
|
93
|
+
/**
|
|
94
|
+
* Enable and reset if not already enabled.
|
|
95
|
+
*/
|
|
96
|
+
init() {
|
|
97
|
+
if (!enabled) {
|
|
98
|
+
MockTime.enable();
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
atTime(time, actor) {
|
|
102
|
+
const revertTo = nowMs;
|
|
103
|
+
let isAsync2 = false;
|
|
104
|
+
try {
|
|
105
|
+
nowMs = typeof time === "number" ? time : time.getTime();
|
|
106
|
+
const result = actor();
|
|
107
|
+
if (typeof result?.then === "function") {
|
|
108
|
+
isAsync2 = true;
|
|
109
|
+
return Promise.resolve(result).finally(() => {
|
|
110
|
+
nowMs = revertTo;
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
return result;
|
|
114
|
+
} finally {
|
|
115
|
+
if (!isAsync2) {
|
|
116
|
+
nowMs = revertTo;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
81
119
|
},
|
|
82
120
|
now() {
|
|
83
121
|
return new Date(nowMs);
|
|
@@ -237,7 +275,7 @@ const MockTime = {
|
|
|
237
275
|
callbacks.splice(index, 1);
|
|
238
276
|
}
|
|
239
277
|
};
|
|
240
|
-
let
|
|
278
|
+
let installActiveImplementation;
|
|
241
279
|
function timeSetup(Time) {
|
|
242
280
|
registry.register = Time.register;
|
|
243
281
|
registry.unregister = Time.unregister;
|
|
@@ -245,12 +283,13 @@ function timeSetup(Time) {
|
|
|
245
283
|
Time.startup.systemMs = Time.startup.processMs = 0;
|
|
246
284
|
real = Time.get();
|
|
247
285
|
MockTime.sleep = real.sleep;
|
|
248
|
-
|
|
249
|
-
|
|
286
|
+
installActiveImplementation = () => Time.get = () => MockTime.activeImplementation;
|
|
287
|
+
installActiveImplementation();
|
|
250
288
|
}
|
|
251
289
|
Object.assign(globalThis, { MockTime });
|
|
252
290
|
Boot.init(() => {
|
|
253
291
|
MockTime.reset();
|
|
292
|
+
MockTime.disable();
|
|
254
293
|
});
|
|
255
294
|
export {
|
|
256
295
|
MockTime,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/mocks/time.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,YAAY;AAOrB,MAAM,WAAW;AAAA,EACb,QAAQ,oBAAI,IAAe;AAAA,EAC3B,SAAS,QAAmB;AAAA,EAAC;AAAA,EAC7B,WAAW,QAAmB;AAAA,EAAC;AACnC;AAGA,MAAM,UAAU;AAAA,EACZ,OAAO;AAAA,EACP,WAAW;AAAA,EACX,aAAa;AAAA,EACb,aAAa;AAAA,EAEb;AAAA,EACA;AAAA,EAEA,YAAY;AAAA,EACK;AAAA,EAEjB,YAAY,UAAoB,MAAc,YAAoB,UAAyB;AACvF,SAAK,OAAO;AAEZ,SAAK,YAAY;AACjB,SAAK,cAAc;AAEnB,QAAI,gBAAgB,cAAc;AAC9B,WAAK,WAAW;AAAA,IACpB,OAAO;AACH,WAAK,WAAW,MAAM;AAClB,aAAK,YAAY;AACjB,iBAAS;AAAA,MACb;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,QAAQ;AACJ,aAAS,SAAS,IAAI;AACtB,SAAK,UAAU,eAAe,KAAK,UAAU,MAAM,IAAI,KAAK,aAAa,KAAK,QAAQ;AACtF,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AAAA,EAEA,OAAO;AACH,aAAS,WAAW,IAAI;AACxB,SAAK,UAAU,eAAe,KAAK,QAAQ;AAC3C,SAAK,YAAY;AACjB,WAAO;AAAA,EACX;AACJ;AAEA,MAAM,qBAAqB,UAAU;AAAA,EACjC,YAAY,UAAoB,MAAc,YAAoB,UAAyB;AACvF,UAAM,mBAAmB,YAAY;AACjC,eAAS,eAAe,SAAS,MAAM,IAAI,YAAY,gBAAgB;AACvE,YAAM,SAAS;AAAA,IACnB;AACA,UAAM,UAAU,MAAM,YAAY,gBAAgB;AAAA,EACtD;AACJ;AAOA,SAAS,QAAQ,IAAiE;AAC9E,SAAO,GAAG,YAAY,SAAS;AACnC;AAEA,IAAI,YAAY,IAAI,MAAiD;AACrE,IAAI,QAAQ;AACZ,IAAI,OAAO;AACX,IAAI,UAAU;
|
|
5
|
-
"names": []
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["isAsync"]
|
|
6
6
|
}
|
package/dist/esm/nodejs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nodejs.d.ts","sourceRoot":"","sources":["../../src/nodejs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,OAAO,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"nodejs.d.ts","sourceRoot":"","sources":["../../src/nodejs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAI9C,OAAO,yBAAyB,CAAC;AAMjC,wBAAsB,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,+DAkDzE;AAID,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,kBA0BhF;AAED,wBAAgB,qBAAqB,UAKpC"}
|
package/dist/esm/nodejs.js
CHANGED
|
@@ -10,9 +10,11 @@ import { adaptReporter, afterRun, beforeRun, extendApi, generalSetup, runMocha }
|
|
|
10
10
|
import { TestOptions } from "./options.js";
|
|
11
11
|
import { FailureDetail } from "./failure-detail.js";
|
|
12
12
|
import "./global-definitions.js";
|
|
13
|
+
import { Boot } from "./mocks/boot.js";
|
|
13
14
|
import { TestDescriptor } from "./test-descriptor.js";
|
|
14
15
|
extendApi(Mocha);
|
|
15
16
|
async function testNodejs(runner, format) {
|
|
17
|
+
Boot.format = format;
|
|
16
18
|
function unhandledRejection(e) {
|
|
17
19
|
if (process.listenerCount("unhandledRejection") === 1) {
|
|
18
20
|
const error = new Error("Unhandled rejection (ignored by mocha)");
|
package/dist/esm/nodejs.js.map
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/nodejs.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,OAAO,WAAW;AAClB,SAAS,OAAO,iBAAiB;AAEjC,SAAS,gBAAgB;AACzB,SAAS,eAAe,UAAU,WAAW,WAAW,cAAc,gBAAgB;AACtF,SAAS,mBAAmB;AAI5B,SAAS,qBAAqB;AAC9B,OAAO;AACP,SAAS,sBAAsB;AAE/B,UAAU,KAAK;AAEf,eAAsB,WAAW,QAAoB,QAAuB;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/testing",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0-alpha.0-20250612-ddd428561",
|
|
4
4
|
"description": "Test harness for running JavaScript and Matter certification tests",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"scripts": {
|
|
@@ -45,12 +45,12 @@
|
|
|
45
45
|
"#tools/ansi-text": "@matter/tools/ansi-text"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@matter/tools": "0.
|
|
49
|
-
"@types/express": "^5.0.
|
|
48
|
+
"@matter/tools": "0.15.0-alpha.0-20250612-ddd428561",
|
|
49
|
+
"@types/express": "^5.0.3",
|
|
50
50
|
"ansi-colors": "^4.1.3",
|
|
51
51
|
"chai": "^4.5.0",
|
|
52
52
|
"chai-as-promised": "^7.1.2",
|
|
53
|
-
"dockerode": "^4.0.
|
|
53
|
+
"dockerode": "^4.0.7",
|
|
54
54
|
"express": "^5.1.0",
|
|
55
55
|
"mocha": "^11.5.0",
|
|
56
56
|
"playwright": "^1.51.1",
|
package/src/cli.ts
CHANGED
|
@@ -9,7 +9,7 @@ import "./util/node-shims.js";
|
|
|
9
9
|
|
|
10
10
|
import "./global-definitions.js";
|
|
11
11
|
|
|
12
|
-
import { Graph, JsonNotFoundError, Package, Project, ProjectBuilder } from "#tools";
|
|
12
|
+
import { ansi, Graph, JsonNotFoundError, Package, Project, ProjectBuilder } from "#tools";
|
|
13
13
|
import { clear } from "node:console";
|
|
14
14
|
import yargs from "yargs";
|
|
15
15
|
import { hideBin } from "yargs/helpers";
|
|
@@ -34,6 +34,9 @@ interface Config {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export async function main(argv = process.argv) {
|
|
37
|
+
process.on("SIGINT", interrupt);
|
|
38
|
+
process.on("SIGTERM", interrupt);
|
|
39
|
+
|
|
37
40
|
const testTypes = new Set<TestType>();
|
|
38
41
|
|
|
39
42
|
let ls = false;
|
|
@@ -217,3 +220,12 @@ function supportsWebTests(pkg: Package) {
|
|
|
217
220
|
}
|
|
218
221
|
return testScript.split(" ").includes("-w");
|
|
219
222
|
}
|
|
223
|
+
|
|
224
|
+
function interrupt() {
|
|
225
|
+
process.stderr.write(`💥 ${ansi.red("Aborted")}\n`);
|
|
226
|
+
process.exit(1);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
if (typeof MatterHooks !== "undefined") {
|
|
230
|
+
MatterHooks.interrupt = interrupt;
|
|
231
|
+
}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
|
|
7
7
|
import type Chai from "chai";
|
|
8
8
|
import "chai-as-promised";
|
|
9
|
-
import type {
|
|
9
|
+
import type { MockCrypto } from "./mocks/crypto.js";
|
|
10
10
|
import type { DiagnosticMessageLike, MockLogger } from "./mocks/logging.js";
|
|
11
11
|
import type { MockTime } from "./mocks/time.js";
|
|
12
12
|
import type { TestDescriptor, TestSuiteDescriptor } from "./test-descriptor.js";
|
|
@@ -21,6 +21,9 @@ declare global {
|
|
|
21
21
|
// Expose API for controlling logging
|
|
22
22
|
let MockLogger: MockLogger;
|
|
23
23
|
|
|
24
|
+
// Expose API for controlling crypto
|
|
25
|
+
let MockCrypto: MockCrypto;
|
|
26
|
+
|
|
24
27
|
/**
|
|
25
28
|
* If present, the following hooks are engaged by matter.js packages to enable mocking. We use globals rather than
|
|
26
29
|
* imports so we can hook the modules regardless of whether they're loaded as CommonJS or ESM.
|
|
@@ -28,10 +31,15 @@ declare global {
|
|
|
28
31
|
let MatterHooks:
|
|
29
32
|
| undefined
|
|
30
33
|
| {
|
|
34
|
+
/**
|
|
35
|
+
* Abort test run.
|
|
36
|
+
*/
|
|
37
|
+
interrupt(): void;
|
|
38
|
+
|
|
31
39
|
/**
|
|
32
40
|
* Set boot manager.
|
|
33
41
|
*/
|
|
34
|
-
bootSetup(boot:
|
|
42
|
+
bootSetup(boot: { reboot(): void | Promise<void> }): void;
|
|
35
43
|
|
|
36
44
|
/**
|
|
37
45
|
* Configure time.
|
|
@@ -11,8 +11,8 @@ import Chai from "chai";
|
|
|
11
11
|
import ChaiAsPromised from "chai-as-promised";
|
|
12
12
|
import { browserSetup, extendApi, generalSetup } from "./mocha.js";
|
|
13
13
|
import { bootSetup } from "./mocks/boot.js";
|
|
14
|
-
import { cryptoSetup } from "./mocks/crypto.js";
|
|
15
|
-
import {
|
|
14
|
+
import { MockCrypto, cryptoSetup } from "./mocks/crypto.js";
|
|
15
|
+
import { MockLogger, loggerSetup } from "./mocks/logging.js";
|
|
16
16
|
import { timeSetup } from "./mocks/time.js";
|
|
17
17
|
|
|
18
18
|
Chai.config.truncateThreshold = 200;
|
|
@@ -22,13 +22,16 @@ Object.assign(globalThis, {
|
|
|
22
22
|
expect: Chai.expect,
|
|
23
23
|
|
|
24
24
|
MatterHooks: {
|
|
25
|
+
interrupt,
|
|
25
26
|
bootSetup,
|
|
26
27
|
loggerSetup,
|
|
27
28
|
timeSetup,
|
|
28
29
|
cryptoSetup,
|
|
29
30
|
},
|
|
30
31
|
|
|
31
|
-
MockLogger
|
|
32
|
+
MockLogger,
|
|
33
|
+
|
|
34
|
+
MockCrypto,
|
|
32
35
|
});
|
|
33
36
|
|
|
34
37
|
if (globalThis === (globalThis as any).window) {
|
|
@@ -36,3 +39,7 @@ if (globalThis === (globalThis as any).window) {
|
|
|
36
39
|
generalSetup(mocha);
|
|
37
40
|
browserSetup(mocha);
|
|
38
41
|
}
|
|
42
|
+
|
|
43
|
+
function interrupt() {
|
|
44
|
+
// Interrupt handling is platform dependent
|
|
45
|
+
}
|
package/src/mocha.ts
CHANGED
|
@@ -72,15 +72,6 @@ export function generalSetup(mocha: Mocha) {
|
|
|
72
72
|
filterLogs("beforeEach");
|
|
73
73
|
filterLogs("afterEach");
|
|
74
74
|
|
|
75
|
-
for (const suite of mocha.suite.suites) {
|
|
76
|
-
suite.beforeAll(beforeEachFile);
|
|
77
|
-
|
|
78
|
-
// Move our beforeAll hook so it runs before the suite's beforeAll hooks
|
|
79
|
-
const hooks = (suite as any)._beforeAll as unknown[];
|
|
80
|
-
const myHook = hooks.pop();
|
|
81
|
-
hooks.unshift(myHook);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
75
|
mocha.suite.beforeEach(function (done) {
|
|
85
76
|
this.timeout(TEST_HOOK_TIMEOUT);
|
|
86
77
|
return (this.currentTest as HookableTest)[beforeOneHook]?.call(this, done);
|
|
@@ -168,7 +159,20 @@ export function extendApi(Mocha: typeof MochaType) {
|
|
|
168
159
|
});
|
|
169
160
|
}
|
|
170
161
|
|
|
162
|
+
function instrumentSuites(mocha: Mocha) {
|
|
163
|
+
for (const suite of mocha.suite.suites) {
|
|
164
|
+
suite.beforeAll(beforeEachFile);
|
|
165
|
+
|
|
166
|
+
// Move our beforeAll hook so it runs before the suite's beforeAll hooks
|
|
167
|
+
const hooks = (suite as any)._beforeAll as unknown[];
|
|
168
|
+
const myHook = hooks.pop();
|
|
169
|
+
hooks.unshift(myHook);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
171
173
|
export async function runMocha(mocha: Mocha) {
|
|
174
|
+
instrumentSuites(mocha);
|
|
175
|
+
|
|
172
176
|
await onlyLogFailure(async () => {
|
|
173
177
|
for (const hook of beforeRunHooks) {
|
|
174
178
|
await hook();
|
|
@@ -278,6 +282,7 @@ export function browserSetup(mocha: BrowserMocha) {
|
|
|
278
282
|
(globalThis as any).MatterTest = {
|
|
279
283
|
// Starts Mocha (called by clicking link)
|
|
280
284
|
start: () => {
|
|
285
|
+
instrumentSuites(mocha);
|
|
281
286
|
const root = document.querySelector("#mocha");
|
|
282
287
|
if (root) {
|
|
283
288
|
root.innerHTML = "";
|
package/src/mocks/boot.ts
CHANGED
|
@@ -4,14 +4,24 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* On test reboot, also reboot application environment. We install this as the first initializer so application
|
|
9
|
+
* initializers run before test harness initializers that may mock the application components.
|
|
10
|
+
*
|
|
11
|
+
* The test harness may load multiple test environments (e.g. ESM vs CJS) so we must track the current environment to
|
|
12
|
+
* ensure we boot the correct version of the code.
|
|
13
|
+
*/
|
|
14
|
+
const appBooters = {} as Record<string, () => void>;
|
|
8
15
|
|
|
9
16
|
export interface Boot {
|
|
17
|
+
format: string;
|
|
10
18
|
init(fn: () => void): void;
|
|
11
19
|
reboot(): void;
|
|
12
20
|
}
|
|
13
21
|
|
|
14
22
|
export const Boot: Boot = {
|
|
23
|
+
format: "unknown",
|
|
24
|
+
|
|
15
25
|
init(fn) {
|
|
16
26
|
fn();
|
|
17
27
|
initializers.push(fn);
|
|
@@ -24,8 +34,8 @@ export const Boot: Boot = {
|
|
|
24
34
|
},
|
|
25
35
|
};
|
|
26
36
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
37
|
+
const initializers = [() => appBooters[Boot.format]?.()];
|
|
38
|
+
|
|
39
|
+
export function bootSetup(AppBoot: { reboot(): () => void }) {
|
|
40
|
+
appBooters[Boot.format] = AppBoot.reboot.bind(Boot);
|
|
31
41
|
}
|
package/src/mocks/crypto.ts
CHANGED
|
@@ -4,67 +4,113 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
import { Boot } from "./boot.js";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
|
-
* An
|
|
11
|
-
*
|
|
12
|
-
* Only supports those subsets of crypto required to complete matter.js tests.
|
|
10
|
+
* An arbitrary fill byte for mock random data. At some point a pseudo-random function may make sense but for now this
|
|
11
|
+
* suffices. Do not choose 0 or 0xff because that will interfere with logic that disallows 0 or -1.
|
|
13
12
|
*/
|
|
14
|
-
const
|
|
15
|
-
getRandomData: (length: number) => {
|
|
16
|
-
// Make random data deterministic
|
|
17
|
-
const bytes = new Uint8Array(length);
|
|
13
|
+
const FILL_BYTE = 0x80;
|
|
18
14
|
|
|
19
|
-
|
|
15
|
+
interface CryptoInstance {
|
|
16
|
+
getRandomData(length: number): Uint8Array;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
interface CryptoNamespace {
|
|
20
|
+
default: CryptoInstance;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let RealCrypto: undefined | CryptoNamespace;
|
|
24
|
+
|
|
25
|
+
let restoreRandomness: undefined | (() => void);
|
|
26
|
+
|
|
27
|
+
export const MockCrypto: MockCrypto = {
|
|
28
|
+
set random(value: boolean) {
|
|
29
|
+
if (RealCrypto === undefined) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (value === this.random) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
restoreRandomness?.();
|
|
38
|
+
if (!value) {
|
|
39
|
+
const instance = RealCrypto.default;
|
|
40
|
+
|
|
41
|
+
const realGetRandomData = instance.getRandomData;
|
|
42
|
+
instance.getRandomData = length => {
|
|
43
|
+
const result = new Uint8Array(length);
|
|
44
|
+
result.fill(FILL_BYTE);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
restoreRandomness = () => {
|
|
49
|
+
instance.getRandomData = realGetRandomData;
|
|
50
|
+
restoreRandomness = undefined;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
20
53
|
},
|
|
21
54
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
const bits = await subtle.deriveBits(
|
|
25
|
-
{
|
|
26
|
-
name: "PBKDF2",
|
|
27
|
-
hash: "SHA-256",
|
|
28
|
-
salt: salt,
|
|
29
|
-
iterations: iteration,
|
|
30
|
-
},
|
|
31
|
-
key,
|
|
32
|
-
keyLength * 8,
|
|
33
|
-
);
|
|
34
|
-
return new Uint8Array(bits);
|
|
55
|
+
get random() {
|
|
56
|
+
return !restoreRandomness;
|
|
35
57
|
},
|
|
36
58
|
|
|
37
|
-
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
59
|
+
withRandom<T>(value: boolean, actor: () => T): T {
|
|
60
|
+
const revertTo = !!restoreRandomness;
|
|
61
|
+
let isAsync = false;
|
|
62
|
+
try {
|
|
63
|
+
MockCrypto.random = value;
|
|
64
|
+
const result = actor();
|
|
65
|
+
if (typeof (result as any)?.then === "function") {
|
|
66
|
+
isAsync = true;
|
|
67
|
+
return Promise.resolve(result).finally(() => {
|
|
68
|
+
MockCrypto.random = revertTo;
|
|
69
|
+
}) as T;
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
} finally {
|
|
73
|
+
if (!isAsync) {
|
|
74
|
+
MockCrypto.random = revertTo;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
51
77
|
},
|
|
52
78
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
return;
|
|
79
|
+
enable() {
|
|
80
|
+
MockCrypto.random = false;
|
|
56
81
|
},
|
|
57
82
|
|
|
58
|
-
|
|
83
|
+
init() {
|
|
84
|
+
if (MockCrypto.random) {
|
|
85
|
+
MockCrypto.enable();
|
|
86
|
+
}
|
|
87
|
+
},
|
|
59
88
|
};
|
|
60
89
|
|
|
61
|
-
export function cryptoSetup(Crypto:
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
90
|
+
export function cryptoSetup(Crypto: CryptoNamespace) {
|
|
91
|
+
RealCrypto = Crypto;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
Boot.init(() => (MockCrypto.random = true));
|
|
95
|
+
|
|
96
|
+
export interface MockCrypto {
|
|
97
|
+
/**
|
|
98
|
+
* If false, crypto functions return all zeros instead of random data. Resets to true for each test file.
|
|
99
|
+
*/
|
|
100
|
+
random: boolean;
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Set {@link random} to false.
|
|
104
|
+
*/
|
|
105
|
+
enable(): void;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Enabled if not already enabled.
|
|
109
|
+
*/
|
|
110
|
+
init(): void;
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Perform an operation with altered {@link random} then revert.
|
|
114
|
+
*/
|
|
115
|
+
withRandom<T>(value: boolean, actor: () => T): T;
|
|
70
116
|
}
|
package/src/mocks/logging.ts
CHANGED
|
@@ -25,7 +25,7 @@ export interface MockLogger {
|
|
|
25
25
|
injectExternalMessage: (source: string, text: string) => void;
|
|
26
26
|
}
|
|
27
27
|
|
|
28
|
-
export const
|
|
28
|
+
export const MockLogger: MockLogger = {
|
|
29
29
|
emitAll: false,
|
|
30
30
|
injectExternalMessage: (source: string, text: string) => console.log(formatExternalMessage(source, text)),
|
|
31
31
|
};
|
|
@@ -67,7 +67,7 @@ export function loggerSetup(Logger: LoggerLike) {
|
|
|
67
67
|
}
|
|
68
68
|
|
|
69
69
|
function interceptingWriter(...args: [string, DiagnosticMessageLike]) {
|
|
70
|
-
let emitAll =
|
|
70
|
+
let emitAll = MockLogger.emitAll;
|
|
71
71
|
if (MatterHooks?.loggerSink) {
|
|
72
72
|
MatterHooks.loggerSink(...args);
|
|
73
73
|
} else if (!emitAll) {
|
|
@@ -83,14 +83,14 @@ export function loggerSetup(Logger: LoggerLike) {
|
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
|
|
86
|
-
|
|
86
|
+
MockLogger.injectExternalMessage = (source, text) =>
|
|
87
87
|
interceptingWriter(formatExternalMessage(source, text), { level: 0 });
|
|
88
88
|
|
|
89
89
|
Logger.destinations.default.write = interceptingWriter;
|
|
90
90
|
|
|
91
91
|
// Divert log messages for test duration
|
|
92
92
|
LoggerHooks.beforeEach.push(function () {
|
|
93
|
-
if (!
|
|
93
|
+
if (!MockLogger.emitAll) {
|
|
94
94
|
messageBuffer = [];
|
|
95
95
|
}
|
|
96
96
|
});
|