@lodestar/spec-test-util 1.35.0-dev.e9dd48f165 → 1.35.0-dev.fcf8d024ea

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.
@@ -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"}
@@ -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
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"downloadTests.js","sourceRoot":"","sources":["../src/downloadTests.ts"],"names":[],"mappings":"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"}
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"}
package/lib/single.d.ts CHANGED
@@ -52,7 +52,7 @@ export interface SpecTestOptions<TestCase extends {
52
52
  }
53
53
  export declare function describeDirectorySpecTest<TestCase extends {
54
54
  meta?: any;
55
- }, Result>(name: string, testCaseDirectoryPath: string, testFunction: (testCase: TestCase, directoryName: string) => Result | Promise<Result>, options: Partial<SpecTestOptions<TestCase, Result>>): void;
55
+ }, Result>(name: string, testCaseDirectoryPath: string, testFunction: (testCase: TestCase, directoryName: string, testCaseName: string) => Result | Promise<Result>, options: Partial<SpecTestOptions<TestCase, Result>>): void;
56
56
  export declare function loadYamlFile(path: string): Record<string, unknown>;
57
57
  export {};
58
58
  //# sourceMappingURL=single.d.ts.map
@@ -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";
@@ -59,14 +59,14 @@ export function describeDirectorySpecTest(name, testCaseDirectoryPath, testFunct
59
59
  }
60
60
  if (options.shouldError?.(testCase)) {
61
61
  try {
62
- await testFunction(testCase, name);
62
+ await testFunction(testCase, name, testSubDirname);
63
63
  }
64
64
  catch (_e) {
65
65
  return;
66
66
  }
67
67
  }
68
68
  else {
69
- const result = await testFunction(testCase, name);
69
+ const result = await testFunction(testCase, name, testSubDirname);
70
70
  if (!options.getExpected)
71
71
  throw Error("getExpected is not defined");
72
72
  if (!options.expectFunc)
package/lib/single.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"single.js","sourceRoot":"","sources":["../src/single.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"single.js","sourceRoot":"","sources":["../src/single.ts"],"names":[],"mappings":"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"}
@@ -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: Buffer<ArrayBufferLike>;
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
@@ -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,QAAQ,EAAC,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAC,UAAU,EAAC,MAAM,UAAU,CAAC;AAQpC,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"}
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.e9dd48f165",
3
+ "version": "1.35.0-dev.fcf8d024ea",
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
- "lib/**/*.js",
32
- "lib/**/*.js.map",
33
- "lib/**/*.d.ts",
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.e9dd48f165",
65
+ "@lodestar/utils": "1.35.0-dev.fcf8d024ea",
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": "82df91624346f748ec7695eb2caf4160417c989f"
73
+ "gitHead": "d72abda1a1607ce062febfcfc4528b9e9848c288"
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
@@ -0,0 +1,3 @@
1
+ export * from "./downloadTests.js";
2
+ export * from "./single.js";
3
+ export * from "./sszGeneric.js";
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
+ }