@lodestar/spec-test-util 1.35.0-dev.6e3c7ca8d0 → 1.35.0-dev.792fcea33a
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/lib/downloadTests.d.ts.map +1 -0
- package/lib/downloadTests.js +1 -1
- package/lib/downloadTests.js.map +1 -1
- package/lib/downloadTestsCli.d.ts.map +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/single.d.ts.map +1 -0
- package/lib/single.js +1 -1
- package/lib/single.js.map +1 -1
- package/lib/sszGeneric.d.ts +1 -1
- package/lib/sszGeneric.d.ts.map +1 -0
- package/lib/sszGeneric.js +1 -1
- package/lib/sszGeneric.js.map +1 -1
- package/package.json +8 -8
- package/src/downloadTests.ts +108 -0
- package/src/downloadTestsCli.ts +36 -0
- package/src/index.ts +3 -0
- package/src/single.ts +249 -0
- package/src/sszGeneric.ts +58 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloadTests.d.ts","sourceRoot":"","sources":["../src/downloadTests.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,uBAAuB,qDAAqD,CAAC;AAI1F,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,gBAAgB,EAAE,MAAM,CAAC;IACzB,yFAAyF;IACzF,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,2BAA2B,CAAC,SAAS,SAAS,MAAM;IACnE,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,SAAS,EAAE,CAAC;CAC9B;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,oBAAoB,EAAE,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpH;AAED;;;GAGG;AACH,wBAAsB,wBAAwB,CAAC,SAAS,SAAS,MAAM,EACrE,EAAC,WAAW,EAAE,gBAAgB,EAAE,SAAS,EAAE,eAAe,EAAC,EAAE,2BAA2B,CAAC,SAAS,CAAC,EACnG,GAAG,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAe,GACpC,OAAO,CAAC,IAAI,CAAC,CAgEf"}
|
package/lib/downloadTests.js
CHANGED
|
@@ -3,8 +3,8 @@ import fs from "node:fs";
|
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { pipeline } from "node:stream/promises";
|
|
5
5
|
import { promisify } from "node:util";
|
|
6
|
-
import { fetch, retry } from "@lodestar/utils";
|
|
7
6
|
import { rimraf } from "rimraf";
|
|
7
|
+
import { fetch, retry } from "@lodestar/utils";
|
|
8
8
|
export const defaultSpecTestsRepoUrl = "https://github.com/ethereum/consensus-spec-tests";
|
|
9
9
|
const logEmpty = () => { };
|
|
10
10
|
/**
|
package/lib/downloadTests.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"downloadTests.js","sourceRoot":"","sources":["../src/downloadTests.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAC,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAC,SAAS,EAAC,MAAM,WAAW,CAAC;AACpC,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"downloadTests.js","sourceRoot":"","sources":["../src/downloadTests.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"downloadTestsCli.d.ts","sourceRoot":"","sources":["../src/downloadTestsCli.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"single.d.ts","sourceRoot":"","sources":["../src/single.ts"],"names":[],"mappings":"AAMA,oBAAY,SAAS;IACnB,GAAG,QAAQ;IACX,UAAU,eAAe;IACzB,IAAI,SAAS;CACd;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;CACrB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;IAC5C,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC;CACtD,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,SAAS,GAAG,iBAAiB,GAAG,iBAAiB,CAQ/F;AAED,MAAM,WAAW,eAAe,CAAC,QAAQ,SAAS;IAAC,IAAI,CAAC,EAAE,GAAG,CAAA;CAAC,EAAE,MAAM;IACpE;;;OAGG;IACH,UAAU,CAAC,EAAE;SAAE,CAAC,IAAI,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,GAAG,iBAAiB;KAAC,CAAC;IAElF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAE1C;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEzE;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,QAAQ,CAAC;IAErD;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,MAAM,GAAG,SAAS,CAAC;IAEzD;;;OAGG;IAEH,eAAe,CAAC,EAAE;QAAC,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC,KAAK,EAAE,GAAG,KAAK,GAAG,CAAA;KAAC,CAAC;IAErD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC;IAE9C,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAE1E,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,IAAI,CAAC;IAEtE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD,wBAAgB,yBAAyB,CAAC,QAAQ,SAAS;IAAC,IAAI,CAAC,EAAE,GAAG,CAAA;CAAC,EAAE,MAAM,EAC7E,IAAI,EAAE,MAAM,EACZ,qBAAqB,EAAE,MAAM,EAC7B,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,EAC3G,OAAO,EAAE,OAAO,CAAC,eAAe,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,GAClD,IAAI,CAiDN;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAElE"}
|
package/lib/single.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { loadYaml } from "@lodestar/utils";
|
|
4
3
|
import { uncompress } from "snappyjs";
|
|
5
4
|
import { describe, expect, it, vi } from "vitest";
|
|
5
|
+
import { loadYaml } from "@lodestar/utils";
|
|
6
6
|
export var InputType;
|
|
7
7
|
(function (InputType) {
|
|
8
8
|
InputType["SSZ"] = "ssz";
|
package/lib/single.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"single.js","sourceRoot":"","sources":["../src/single.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"single.js","sourceRoot":"","sources":["../src/single.ts"],"names":[],"mappings":"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"}
|
package/lib/sszGeneric.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export declare function parseSszValidTestcase(dirpath: string, metaFilename: str
|
|
|
14
14
|
* Docs: https://github.com/ethereum/eth2.0-specs/blob/master/tests/formats/ssz_generic/README.md
|
|
15
15
|
*/
|
|
16
16
|
export declare function parseSszGenericInvalidTestcase(dirpath: string): {
|
|
17
|
-
serialized:
|
|
17
|
+
serialized: NonSharedBuffer;
|
|
18
18
|
};
|
|
19
19
|
export declare function readYamlNumbersAsStrings(yamlStr: string): unknown;
|
|
20
20
|
//# sourceMappingURL=sszGeneric.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sszGeneric.d.ts","sourceRoot":"","sources":["../src/sszGeneric.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,iBAAiB,CAwB9F;AAED;;;;;;;;GAQG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM;;EAO7D;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEjE"}
|
package/lib/sszGeneric.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
|
-
import { loadYaml } from "@lodestar/utils";
|
|
4
3
|
import { uncompress } from "snappyjs";
|
|
4
|
+
import { loadYaml } from "@lodestar/utils";
|
|
5
5
|
export function parseSszValidTestcase(dirpath, metaFilename) {
|
|
6
6
|
// The root is stored in meta.yml as:
|
|
7
7
|
// root: 0xDEADBEEF
|
package/lib/sszGeneric.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sszGeneric.js","sourceRoot":"","sources":["../src/sszGeneric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"sszGeneric.js","sourceRoot":"","sources":["../src/sszGeneric.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AACpC,OAAO,EAAC,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AAQzC,MAAM,UAAU,qBAAqB,CAAC,OAAe,EAAE,YAAoB;IACzE,qCAAqC;IACrC,qBAAqB;IACrB,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAmB,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,2BAA2B,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,0DAA0D;IAC1D,MAAM,UAAU,GAAG,UAAU,CAAa,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAExG,mCAAmC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAClD,MAAM,uBAAuB,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClE,MAAM,SAAS,GAAG,wBAAwB,CAAC,uBAAuB,CAAC,CAAC;IAEpE,8EAA8E;IAE9E,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,UAAU;QACV,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,8BAA8B,CAAC,OAAe;IAC5D,0DAA0D;IAC1D,MAAM,UAAU,GAAG,UAAU,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,CAAC;IAE5F,OAAO;QACL,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAAe;IACtD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC3B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lodestar/spec-test-util",
|
|
3
|
-
"version": "1.35.0-dev.
|
|
3
|
+
"version": "1.35.0-dev.792fcea33a",
|
|
4
4
|
"description": "Spec test suite generator from yaml test files",
|
|
5
5
|
"author": "ChainSafe Systems",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -11,9 +11,11 @@
|
|
|
11
11
|
"type": "module",
|
|
12
12
|
"exports": {
|
|
13
13
|
".": {
|
|
14
|
+
"bun": "./src/index.ts",
|
|
14
15
|
"import": "./lib/index.js"
|
|
15
16
|
},
|
|
16
17
|
"./downloadTests": {
|
|
18
|
+
"bun": "./src/downloadTests.ts",
|
|
17
19
|
"import": "./lib/downloadTests.js"
|
|
18
20
|
}
|
|
19
21
|
},
|
|
@@ -28,11 +30,9 @@
|
|
|
28
30
|
}
|
|
29
31
|
},
|
|
30
32
|
"files": [
|
|
31
|
-
"
|
|
32
|
-
"lib
|
|
33
|
-
"
|
|
34
|
-
"*.d.ts",
|
|
35
|
-
"*.js"
|
|
33
|
+
"src",
|
|
34
|
+
"lib",
|
|
35
|
+
"!**/*.tsbuildinfo"
|
|
36
36
|
],
|
|
37
37
|
"bin": {
|
|
38
38
|
"eth2-spec-test-download": "lib/downloadTestsCli.js"
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
"blockchain"
|
|
63
63
|
],
|
|
64
64
|
"dependencies": {
|
|
65
|
-
"@lodestar/utils": "1.35.0-dev.
|
|
65
|
+
"@lodestar/utils": "1.35.0-dev.792fcea33a",
|
|
66
66
|
"rimraf": "^4.4.1",
|
|
67
67
|
"snappyjs": "^0.7.0",
|
|
68
68
|
"vitest": "3.0.9"
|
|
@@ -70,5 +70,5 @@
|
|
|
70
70
|
"peerDependencies": {
|
|
71
71
|
"vitest": "3.0.9"
|
|
72
72
|
},
|
|
73
|
-
"gitHead": "
|
|
73
|
+
"gitHead": "5ca1808ccb7ea2b9e18aecf3fee56c84d02bb328"
|
|
74
74
|
}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import {execFile} from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
import {pipeline} from "node:stream/promises";
|
|
5
|
+
import {ReadableStream as NodeReadableStream} from "node:stream/web";
|
|
6
|
+
import {promisify} from "node:util";
|
|
7
|
+
import {rimraf} from "rimraf";
|
|
8
|
+
import {fetch, retry} from "@lodestar/utils";
|
|
9
|
+
|
|
10
|
+
export const defaultSpecTestsRepoUrl = "https://github.com/ethereum/consensus-spec-tests";
|
|
11
|
+
|
|
12
|
+
const logEmpty = (): void => {};
|
|
13
|
+
|
|
14
|
+
export type DownloadTestsOptions = {
|
|
15
|
+
specVersion: string;
|
|
16
|
+
outputDir: string;
|
|
17
|
+
/** Root Github URL `https://github.com/ethereum/consensus-spec-tests` */
|
|
18
|
+
specTestsRepoUrl: string;
|
|
19
|
+
/** Release files names to download without prefix `["general", "mainnet", "minimal"]` */
|
|
20
|
+
testsToDownload: string[];
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export interface DownloadGenericTestsOptions<TestNames extends string> {
|
|
24
|
+
specVersion: string;
|
|
25
|
+
outputDir: string;
|
|
26
|
+
specTestsRepoUrl: string;
|
|
27
|
+
testsToDownload: TestNames[];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Download spec tests
|
|
32
|
+
*/
|
|
33
|
+
export async function downloadTests(opts: DownloadTestsOptions, log: (msg: string) => void = logEmpty): Promise<void> {
|
|
34
|
+
await downloadGenericSpecTests(opts, log);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Generic Github release downloader.
|
|
39
|
+
* Used by spec tests and SlashingProtectionInterchangeTest
|
|
40
|
+
*/
|
|
41
|
+
export async function downloadGenericSpecTests<TestNames extends string>(
|
|
42
|
+
{specVersion, specTestsRepoUrl, outputDir, testsToDownload}: DownloadGenericTestsOptions<TestNames>,
|
|
43
|
+
log: (msg: string) => void = logEmpty
|
|
44
|
+
): Promise<void> {
|
|
45
|
+
log(`outputDir = ${outputDir}`);
|
|
46
|
+
|
|
47
|
+
// Use version.txt as a flag to prevent re-downloading the tests
|
|
48
|
+
const versionFile = path.join(outputDir, "version.txt");
|
|
49
|
+
const existingVersion = fs.existsSync(versionFile) && fs.readFileSync(versionFile, "utf8").trim();
|
|
50
|
+
|
|
51
|
+
if (existingVersion === specVersion) {
|
|
52
|
+
return log(`version ${specVersion} already downloaded`);
|
|
53
|
+
}
|
|
54
|
+
log(`Downloading new version ${specVersion}`);
|
|
55
|
+
|
|
56
|
+
if (fs.existsSync(outputDir)) {
|
|
57
|
+
log(`Cleaning existing version ${existingVersion} at ${outputDir}`);
|
|
58
|
+
rimraf.sync(outputDir);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
fs.mkdirSync(outputDir, {recursive: true});
|
|
62
|
+
|
|
63
|
+
await Promise.all(
|
|
64
|
+
testsToDownload.map(async (test) => {
|
|
65
|
+
const url = `${specTestsRepoUrl ?? defaultSpecTestsRepoUrl}/releases/download/${specVersion}/${test}.tar.gz`;
|
|
66
|
+
const tarball = path.join(outputDir, `${test}.tar.gz`);
|
|
67
|
+
|
|
68
|
+
await retry(
|
|
69
|
+
async () => {
|
|
70
|
+
const res = await fetch(url, {signal: AbortSignal.timeout(30 * 60 * 1000)});
|
|
71
|
+
|
|
72
|
+
if (!res.ok) {
|
|
73
|
+
throw new Error(`Failed to download file from ${url}: ${res.status} ${res.statusText}`);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (!res.body) {
|
|
77
|
+
throw new Error("Response body is null");
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const totalSize = res.headers.get("content-length");
|
|
81
|
+
log(`Downloading ${url} - ${totalSize} bytes`);
|
|
82
|
+
|
|
83
|
+
// stream download to local .tar.gz file
|
|
84
|
+
await pipeline(res.body as unknown as NodeReadableStream, fs.createWriteStream(tarball));
|
|
85
|
+
log(`Downloaded ${url} - ${fs.statSync(tarball).size} bytes`);
|
|
86
|
+
|
|
87
|
+
// extract tar into output directory
|
|
88
|
+
await promisify(execFile)("tar", ["-xzf", tarball, "-C", outputDir, "--exclude=._*", "--exclude=*/._*"], {
|
|
89
|
+
maxBuffer: 1000 * 1024 * 1024, // 1 GB
|
|
90
|
+
});
|
|
91
|
+
log(`Extracted ${tarball} to ${outputDir}`);
|
|
92
|
+
|
|
93
|
+
fs.unlinkSync(tarball);
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
retries: 3,
|
|
97
|
+
onRetry: (e, attempt) => {
|
|
98
|
+
log(`Download attempt ${attempt} for ${url} failed: ${e.message}`);
|
|
99
|
+
},
|
|
100
|
+
}
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
// download tar
|
|
104
|
+
})
|
|
105
|
+
);
|
|
106
|
+
|
|
107
|
+
fs.writeFileSync(versionFile, specVersion);
|
|
108
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#!/usr/bin/env ts-node
|
|
2
|
+
|
|
3
|
+
import {downloadTests} from "./downloadTests.js";
|
|
4
|
+
|
|
5
|
+
async function downloadTestsCli(): Promise<void> {
|
|
6
|
+
const [specVersion, outputDir, testsToDownloadCsv, specTestsRepoUrl] = process.argv.slice(2);
|
|
7
|
+
|
|
8
|
+
// Print help
|
|
9
|
+
if (specVersion === "--help" || !specVersion || !outputDir || !testsToDownloadCsv || !specTestsRepoUrl) {
|
|
10
|
+
return console.log(`
|
|
11
|
+
USAGE:
|
|
12
|
+
|
|
13
|
+
./downloadTestsCli.ts [specVersion] [outputDir] [testToDownload] [specTestsRepoUrl]
|
|
14
|
+
|
|
15
|
+
Downloads tests to $outputDir/$specVersion
|
|
16
|
+
|
|
17
|
+
EXAMPLE:
|
|
18
|
+
|
|
19
|
+
./downloadTestsCli.ts v1.0.0 ./spec-tests general,mainnet
|
|
20
|
+
|
|
21
|
+
Results in:
|
|
22
|
+
|
|
23
|
+
./spec-tests/tests/general/phase0/bls/aggregate
|
|
24
|
+
./spec-tests/tests/general/phase0/bls/aggregate_verify
|
|
25
|
+
./spec-tests/tests/general/phase0/bls/fast_aggregate_verify
|
|
26
|
+
`);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const testsToDownload = testsToDownloadCsv.split(",");
|
|
30
|
+
await downloadTests({specVersion, outputDir, testsToDownload, specTestsRepoUrl}, console.log);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
downloadTestsCli().catch((e: Error) => {
|
|
34
|
+
console.error(e);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
});
|
package/src/index.ts
ADDED
package/src/single.ts
ADDED
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import {uncompress} from "snappyjs";
|
|
4
|
+
import {describe, expect, it, vi} from "vitest";
|
|
5
|
+
import {loadYaml} from "@lodestar/utils";
|
|
6
|
+
|
|
7
|
+
export enum InputType {
|
|
8
|
+
SSZ = "ssz",
|
|
9
|
+
SSZ_SNAPPY = "ssz_snappy",
|
|
10
|
+
YAML = "yaml",
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export type ExpandedInputType = {
|
|
14
|
+
type: InputType;
|
|
15
|
+
treeBacked: boolean;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
type SszTypeGeneric = {
|
|
19
|
+
typeName: string;
|
|
20
|
+
deserialize: (bytes: Uint8Array) => unknown;
|
|
21
|
+
deserializeToViewDU?: (bytes: Uint8Array) => unknown;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
export function toExpandedInputType(inputType: InputType | ExpandedInputType): ExpandedInputType {
|
|
25
|
+
if ((inputType as ExpandedInputType).type !== undefined) {
|
|
26
|
+
return inputType as ExpandedInputType;
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
type: inputType as InputType,
|
|
30
|
+
treeBacked: false,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export interface SpecTestOptions<TestCase extends {meta?: any}, Result> {
|
|
35
|
+
/**
|
|
36
|
+
* If directory contains both ssz or yaml file version,
|
|
37
|
+
* you can choose which one to use. Default is ssz snappy.
|
|
38
|
+
*/
|
|
39
|
+
inputTypes?: {[K in keyof NonNullable<TestCase>]?: InputType | ExpandedInputType};
|
|
40
|
+
|
|
41
|
+
sszTypes?: Record<string, SszTypeGeneric>;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Some tests need to access the test case in order to generate ssz types for each input file.
|
|
45
|
+
*/
|
|
46
|
+
getSszTypes?: (meta: TestCase["meta"]) => Record<string, SszTypeGeneric>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* loadInputFiles sometimes not create TestCase due to abnormal input file names.
|
|
50
|
+
* Use this to map to real test case.
|
|
51
|
+
*/
|
|
52
|
+
mapToTestCase?: (t: Record<string, any>) => TestCase;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Optionally
|
|
56
|
+
* @param testCase
|
|
57
|
+
*/
|
|
58
|
+
getExpected?: (testCase: TestCase) => Result | undefined;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Optionally pass function to transform loaded values
|
|
62
|
+
* (values from input files)
|
|
63
|
+
*/
|
|
64
|
+
|
|
65
|
+
inputProcessing?: {[K: string]: (value: any) => any};
|
|
66
|
+
|
|
67
|
+
shouldError?: (testCase: TestCase) => boolean;
|
|
68
|
+
|
|
69
|
+
shouldSkip?: (testCase: TestCase, name: string, index: number) => boolean;
|
|
70
|
+
|
|
71
|
+
expectFunc?: (testCase: TestCase, expected: any, actual: any) => void;
|
|
72
|
+
|
|
73
|
+
timeout?: number;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const defaultOptions: SpecTestOptions<any, any> = {
|
|
77
|
+
inputTypes: {},
|
|
78
|
+
inputProcessing: {},
|
|
79
|
+
sszTypes: {},
|
|
80
|
+
getExpected: (testCase) => testCase,
|
|
81
|
+
shouldError: () => false,
|
|
82
|
+
shouldSkip: () => false,
|
|
83
|
+
expectFunc: (_testCase, expected, actual) => expect(actual).toEqual(expected),
|
|
84
|
+
timeout: 1000 * 60 * 15,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export function describeDirectorySpecTest<TestCase extends {meta?: any}, Result>(
|
|
88
|
+
name: string,
|
|
89
|
+
testCaseDirectoryPath: string,
|
|
90
|
+
testFunction: (testCase: TestCase, directoryName: string, testCaseName: string) => Result | Promise<Result>,
|
|
91
|
+
options: Partial<SpecTestOptions<TestCase, Result>>
|
|
92
|
+
): void {
|
|
93
|
+
options = {...defaultOptions, ...options};
|
|
94
|
+
if (!isDirectory(testCaseDirectoryPath)) {
|
|
95
|
+
throw new Error(`${testCaseDirectoryPath} is not directory`);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
describe(name, () => {
|
|
99
|
+
if (options.timeout) {
|
|
100
|
+
vi.setConfig({testTimeout: options.timeout, hookTimeout: options.timeout});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for (const testSubDirname of fs.readdirSync(testCaseDirectoryPath)) {
|
|
104
|
+
const testSubDirPath = path.join(testCaseDirectoryPath, testSubDirname);
|
|
105
|
+
if (!isDirectory(testSubDirPath)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Use full path here, not just `testSubDirname` to allow usage of `vitest -t`
|
|
110
|
+
const testName = `${name}/${testSubDirname}`;
|
|
111
|
+
it(testName, async (context) => {
|
|
112
|
+
// some tests require to load meta.yaml first in order to know respective ssz types.
|
|
113
|
+
const metaFilePath = path.join(testSubDirPath, "meta.yaml");
|
|
114
|
+
const meta: TestCase["meta"] = fs.existsSync(metaFilePath)
|
|
115
|
+
? loadYaml(fs.readFileSync(metaFilePath, "utf8"))
|
|
116
|
+
: undefined;
|
|
117
|
+
|
|
118
|
+
let testCase = loadInputFiles(testSubDirPath, options, meta);
|
|
119
|
+
if (options.mapToTestCase) testCase = options.mapToTestCase(testCase);
|
|
120
|
+
if (options.shouldSkip?.(testCase, testName, 0)) {
|
|
121
|
+
context.skip();
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if (options.shouldError?.(testCase)) {
|
|
126
|
+
try {
|
|
127
|
+
await testFunction(testCase, name, testSubDirname);
|
|
128
|
+
} catch (_e) {
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
const result = await testFunction(testCase, name, testSubDirname);
|
|
133
|
+
if (!options.getExpected) throw Error("getExpected is not defined");
|
|
134
|
+
if (!options.expectFunc) throw Error("expectFunc is not defined");
|
|
135
|
+
const expected = options.getExpected(testCase);
|
|
136
|
+
options.expectFunc(testCase, expected, result);
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export function loadYamlFile(path: string): Record<string, unknown> {
|
|
144
|
+
return loadYaml(fs.readFileSync(path, "utf8"));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function loadInputFiles<TestCase extends {meta?: any}, Result>(
|
|
148
|
+
directory: string,
|
|
149
|
+
options: SpecTestOptions<TestCase, Result>,
|
|
150
|
+
meta?: TestCase["meta"]
|
|
151
|
+
): TestCase {
|
|
152
|
+
const testCase: any = {};
|
|
153
|
+
const files = fs
|
|
154
|
+
.readdirSync(directory)
|
|
155
|
+
.map((name) => path.join(directory, name))
|
|
156
|
+
.filter((file) => {
|
|
157
|
+
if (isDirectory(file)) {
|
|
158
|
+
return false;
|
|
159
|
+
}
|
|
160
|
+
if (!options.inputTypes) throw Error("inputTypes is not defined");
|
|
161
|
+
const name = path.parse(file).name as keyof NonNullable<TestCase>;
|
|
162
|
+
const inputType = toExpandedInputType(options.inputTypes[name] ?? InputType.SSZ_SNAPPY);
|
|
163
|
+
// set options.inputTypes[name] with expanded input type
|
|
164
|
+
options.inputTypes[name] = inputType;
|
|
165
|
+
const extension = inputType.type as string;
|
|
166
|
+
return file.endsWith(extension);
|
|
167
|
+
});
|
|
168
|
+
for (const file of files) {
|
|
169
|
+
const inputName = path.basename(file).replace(".ssz_snappy", "").replace(".ssz", "").replace(".yaml", "");
|
|
170
|
+
const inputType = getInputType(file);
|
|
171
|
+
testCase[inputName] = deserializeInputFile(file, inputName, inputType, options, meta);
|
|
172
|
+
switch (inputType) {
|
|
173
|
+
case InputType.SSZ:
|
|
174
|
+
testCase[`${inputName}_raw`] = fs.readFileSync(file);
|
|
175
|
+
break;
|
|
176
|
+
case InputType.SSZ_SNAPPY:
|
|
177
|
+
testCase[`${inputName}_raw`] = uncompress(fs.readFileSync(file));
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
if (!options.inputProcessing) throw Error("inputProcessing is not defined");
|
|
181
|
+
if (options.inputProcessing[inputName] !== undefined) {
|
|
182
|
+
testCase[inputName] = options.inputProcessing[inputName](testCase[inputName]);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return testCase as TestCase;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function getInputType(filename: string): InputType {
|
|
189
|
+
if (filename.endsWith(InputType.YAML)) {
|
|
190
|
+
return InputType.YAML;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (filename.endsWith(InputType.SSZ_SNAPPY)) {
|
|
194
|
+
return InputType.SSZ_SNAPPY;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (filename.endsWith(InputType.SSZ)) {
|
|
198
|
+
return InputType.SSZ;
|
|
199
|
+
}
|
|
200
|
+
throw new Error(`Could not get InputType from ${filename}`);
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function deserializeInputFile<TestCase extends {meta?: any}, Result>(
|
|
204
|
+
file: string,
|
|
205
|
+
inputName: string,
|
|
206
|
+
inputType: InputType,
|
|
207
|
+
options: SpecTestOptions<TestCase, Result>,
|
|
208
|
+
meta?: TestCase["meta"]
|
|
209
|
+
): any {
|
|
210
|
+
if (inputType === InputType.YAML) {
|
|
211
|
+
return loadYaml(fs.readFileSync(file, "utf8"));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
if (inputType === InputType.SSZ || inputType === InputType.SSZ_SNAPPY) {
|
|
215
|
+
const sszTypes = options.getSszTypes ? options.getSszTypes(meta) : options.sszTypes;
|
|
216
|
+
if (!sszTypes) throw Error("sszTypes is not defined");
|
|
217
|
+
let data = fs.readFileSync(file);
|
|
218
|
+
if (inputType === InputType.SSZ_SNAPPY) {
|
|
219
|
+
data = uncompress(data);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
let sszType: SszTypeGeneric | undefined;
|
|
223
|
+
for (const key of Object.keys(sszTypes)) {
|
|
224
|
+
// most tests configure with exact match
|
|
225
|
+
// fork_choice tests configure with regex
|
|
226
|
+
if ((key.startsWith("^") && inputName.match(key)) || inputName === key) {
|
|
227
|
+
sszType = sszTypes[key];
|
|
228
|
+
break;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
if (!sszType) {
|
|
233
|
+
throw Error("Cannot find ssz type for inputName " + inputName);
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
// TODO: Refactor this to be typesafe
|
|
237
|
+
if (sszType.typeName === "BeaconState") {
|
|
238
|
+
if (!sszType.deserializeToViewDU) {
|
|
239
|
+
throw Error("BeaconState type has no deserializeToViewDU method");
|
|
240
|
+
}
|
|
241
|
+
return sszType.deserializeToViewDU(data);
|
|
242
|
+
}
|
|
243
|
+
return sszType.deserialize(data);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
function isDirectory(path: string): boolean {
|
|
248
|
+
return fs.lstatSync(path).isDirectory();
|
|
249
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import {uncompress} from "snappyjs";
|
|
4
|
+
import {loadYaml} from "@lodestar/utils";
|
|
5
|
+
|
|
6
|
+
export type ValidTestCaseData = {
|
|
7
|
+
root: string;
|
|
8
|
+
serialized: Uint8Array;
|
|
9
|
+
jsonValue: unknown;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export function parseSszValidTestcase(dirpath: string, metaFilename: string): ValidTestCaseData {
|
|
13
|
+
// The root is stored in meta.yml as:
|
|
14
|
+
// root: 0xDEADBEEF
|
|
15
|
+
const metaStr = fs.readFileSync(path.join(dirpath, metaFilename), "utf8");
|
|
16
|
+
const meta: {root: string} = loadYaml(metaStr);
|
|
17
|
+
if (typeof meta.root !== "string") {
|
|
18
|
+
throw Error(`meta.root not a string: ${meta.root}\n${metaStr}`);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// The serialized value is stored in serialized.ssz_snappy
|
|
22
|
+
const serialized = uncompress<Uint8Array>(fs.readFileSync(path.join(dirpath, "serialized.ssz_snappy")));
|
|
23
|
+
|
|
24
|
+
// The value is stored in value.yml
|
|
25
|
+
const yamlPath = path.join(dirpath, "value.yaml");
|
|
26
|
+
const yamlStrNumbersAsNumbers = fs.readFileSync(yamlPath, "utf8");
|
|
27
|
+
const jsonValue = readYamlNumbersAsStrings(yamlStrNumbersAsNumbers);
|
|
28
|
+
|
|
29
|
+
// type.fromJson(loadYamlFile(path.join(dirpath, "value.yaml")) as Json) as T;
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
root: meta.root,
|
|
33
|
+
serialized,
|
|
34
|
+
jsonValue,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* ssz_generic
|
|
40
|
+
* | basic_vector
|
|
41
|
+
* | invalid
|
|
42
|
+
* | vec_bool_0
|
|
43
|
+
* | serialized.ssz_snappy
|
|
44
|
+
*
|
|
45
|
+
* Docs: https://github.com/ethereum/eth2.0-specs/blob/master/tests/formats/ssz_generic/README.md
|
|
46
|
+
*/
|
|
47
|
+
export function parseSszGenericInvalidTestcase(dirpath: string) {
|
|
48
|
+
// The serialized value is stored in serialized.ssz_snappy
|
|
49
|
+
const serialized = uncompress(fs.readFileSync(path.join(dirpath, "serialized.ssz_snappy")));
|
|
50
|
+
|
|
51
|
+
return {
|
|
52
|
+
serialized,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function readYamlNumbersAsStrings(yamlStr: string): unknown {
|
|
57
|
+
return loadYaml(yamlStr);
|
|
58
|
+
}
|