@browsercore/testing 0.1.0

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 (99) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/dist/bench/bench.d.ts +21 -0
  4. package/dist/bench/bench.d.ts.map +1 -0
  5. package/dist/bench/bench.js +19 -0
  6. package/dist/bench/bench.js.map +1 -0
  7. package/dist/captures/manifest.d.ts +18 -0
  8. package/dist/captures/manifest.d.ts.map +1 -0
  9. package/dist/captures/manifest.js +62 -0
  10. package/dist/captures/manifest.js.map +1 -0
  11. package/dist/categories/capture.d.ts +8 -0
  12. package/dist/categories/capture.d.ts.map +1 -0
  13. package/dist/categories/capture.js +31 -0
  14. package/dist/categories/capture.js.map +1 -0
  15. package/dist/categories/compression.d.ts +8 -0
  16. package/dist/categories/compression.d.ts.map +1 -0
  17. package/dist/categories/compression.js +15 -0
  18. package/dist/categories/compression.js.map +1 -0
  19. package/dist/categories/cookies.d.ts +8 -0
  20. package/dist/categories/cookies.d.ts.map +1 -0
  21. package/dist/categories/cookies.js +20 -0
  22. package/dist/categories/cookies.js.map +1 -0
  23. package/dist/categories/errors.d.ts +11 -0
  24. package/dist/categories/errors.d.ts.map +1 -0
  25. package/dist/categories/errors.js +41 -0
  26. package/dist/categories/errors.js.map +1 -0
  27. package/dist/categories/http.d.ts +9 -0
  28. package/dist/categories/http.d.ts.map +1 -0
  29. package/dist/categories/http.js +46 -0
  30. package/dist/categories/http.js.map +1 -0
  31. package/dist/categories/index.d.ts +17 -0
  32. package/dist/categories/index.d.ts.map +1 -0
  33. package/dist/categories/index.js +17 -0
  34. package/dist/categories/index.js.map +1 -0
  35. package/dist/categories/redirects.d.ts +8 -0
  36. package/dist/categories/redirects.d.ts.map +1 -0
  37. package/dist/categories/redirects.js +21 -0
  38. package/dist/categories/redirects.js.map +1 -0
  39. package/dist/categories/regression.d.ts +8 -0
  40. package/dist/categories/regression.d.ts.map +1 -0
  41. package/dist/categories/regression.js +28 -0
  42. package/dist/categories/regression.js.map +1 -0
  43. package/dist/categories/session.d.ts +8 -0
  44. package/dist/categories/session.d.ts.map +1 -0
  45. package/dist/categories/session.js +23 -0
  46. package/dist/categories/session.js.map +1 -0
  47. package/dist/categories/tls.d.ts +10 -0
  48. package/dist/categories/tls.d.ts.map +1 -0
  49. package/dist/categories/tls.js +48 -0
  50. package/dist/categories/tls.js.map +1 -0
  51. package/dist/categories/transport.d.ts +8 -0
  52. package/dist/categories/transport.d.ts.map +1 -0
  53. package/dist/categories/transport.js +22 -0
  54. package/dist/categories/transport.js.map +1 -0
  55. package/dist/errors.d.ts +22 -0
  56. package/dist/errors.d.ts.map +1 -0
  57. package/dist/errors.js +28 -0
  58. package/dist/errors.js.map +1 -0
  59. package/dist/fingerprint/index.d.ts +5 -0
  60. package/dist/fingerprint/index.d.ts.map +1 -0
  61. package/dist/fingerprint/index.js +4 -0
  62. package/dist/fingerprint/index.js.map +1 -0
  63. package/dist/fingerprint/ja3.d.ts +36 -0
  64. package/dist/fingerprint/ja3.d.ts.map +1 -0
  65. package/dist/fingerprint/ja3.js +141 -0
  66. package/dist/fingerprint/ja3.js.map +1 -0
  67. package/dist/fingerprint/ja4.d.ts +109 -0
  68. package/dist/fingerprint/ja4.d.ts.map +1 -0
  69. package/dist/fingerprint/ja4.js +325 -0
  70. package/dist/fingerprint/ja4.js.map +1 -0
  71. package/dist/golden/golden.d.ts +45 -0
  72. package/dist/golden/golden.d.ts.map +1 -0
  73. package/dist/golden/golden.js +216 -0
  74. package/dist/golden/golden.js.map +1 -0
  75. package/dist/index.d.ts +25 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +25 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/reference/node-reference.d.ts +83 -0
  80. package/dist/reference/node-reference.d.ts.map +1 -0
  81. package/dist/reference/node-reference.js +161 -0
  82. package/dist/reference/node-reference.js.map +1 -0
  83. package/dist/reference/reference.d.ts +143 -0
  84. package/dist/reference/reference.d.ts.map +1 -0
  85. package/dist/reference/reference.js +323 -0
  86. package/dist/reference/reference.js.map +1 -0
  87. package/dist/rfc/rfcTests.d.ts +14 -0
  88. package/dist/rfc/rfcTests.d.ts.map +1 -0
  89. package/dist/rfc/rfcTests.js +22 -0
  90. package/dist/rfc/rfcTests.js.map +1 -0
  91. package/dist/types.d.ts +140 -0
  92. package/dist/types.d.ts.map +1 -0
  93. package/dist/types.js +34 -0
  94. package/dist/types.js.map +1 -0
  95. package/dist/utils.d.ts +29 -0
  96. package/dist/utils.d.ts.map +1 -0
  97. package/dist/utils.js +102 -0
  98. package/dist/utils.js.map +1 -0
  99. package/package.json +53 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Jens Verneuer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # @browsercore/testing
2
+
3
+ Protocol verification — RFC compliance tests, browser golden packet captures,
4
+ integration tests, and benchmarking. Compares generated packets against
5
+ captures from real browsers.
6
+
7
+ ## Responsibility
8
+
9
+ Verify that the protocol stacks produce byte-identical output to real browsers
10
+ (RFC compliance) and measure their performance (benchmarking). Depends on every
11
+ other `@browsercore/*` package but is NOT required by them — purely a test/QA tool.
12
+
13
+ ## What it does
14
+
15
+ The full specification is in [`docs/TEST-SUITE.md`](../../docs/TEST-SUITE.md) —
16
+ 17 test categories, layered from unit checks up through real-world
17
+ interoperability:
18
+
19
+ | # | Category | Layer |
20
+ | --- | --- | --- |
21
+ | 1 | TCP Transport | unit / loopback |
22
+ | 2 | TLS Serialization | serialization |
23
+ | 3 | Browser Profile Comparison | golden |
24
+ | 4 | TLS Fingerprint | serialization |
25
+ | 5 | HTTP/1.1 | RFC compliance |
26
+ | 6 | HTTP/2 | serialization |
27
+ | 7 | Header Profiles | golden |
28
+ | 8 | Cookie Behavior | unit |
29
+ | 9 | Compression | unit |
30
+ | 10 | Redirect Handling | unit |
31
+ | 11 | Session Resumption | serialization |
32
+ | 12 | Connection Reuse | unit |
33
+ | 13 | Error Handling | unit |
34
+ | 14 | Packet Capture Comparison | golden / reference |
35
+ | 15 | Real World Compatibility | reference |
36
+ | 16 | Regression Tests | unit |
37
+ | 17 | Performance Benchmarks | benchmark |
38
+
39
+ In short:
40
+
41
+ - **Golden packet testing** — load `.bin` captures recorded from real browsers
42
+ (Chrome 140, Firefox 135, Safari 18, Edge 140) and compare our generated TLS
43
+ ClientHellos, HTTP/2 SETTINGS/HEADERS frames, etc. against them.
44
+ - **RFC compliance** — run focused test suites for TLS 1.3 (RFC 8446), HTTP/2
45
+ (RFC 9113), HTTP/1.1 (RFC 9110).
46
+ - **Benchmarking** — measure handshake latency and request throughput at
47
+ p50/p95/p99.
48
+
49
+ ## Public API
50
+
51
+ ```ts
52
+ import {
53
+ compareAgainstGolden,
54
+ runTlsCompliance,
55
+ benchmarkTlsHandshake,
56
+ GoldenMismatchError,
57
+ } from "@browsercore/testing";
58
+
59
+ // Compare our ClientHello against a Chrome 140 capture:
60
+ const result = compareAgainstGolden(myClientHello, "chrome-140:client-hello:1" as never);
61
+ console.log(result.matches);
62
+
63
+ // Run the TLS RFC compliance suite:
64
+ const tlsResult = runTlsCompliance();
65
+ console.log(tlsResult.pass);
66
+
67
+ // Benchmark a TLS handshake over 100 iterations:
68
+ const stats = benchmarkTlsHandshake(100);
69
+ console.log("p99:", stats.p99, "ms");
70
+ ```
71
+
72
+ ## Types
73
+
74
+ | Export | Kind | Purpose |
75
+ | --- | --- | --- |
76
+ | `compareAgainstGolden()` | function | Compare bytes against a golden capture |
77
+ | `loadGolden()` | function | Load a golden capture by id |
78
+ | `runTlsCompliance()` | function | TLS RFC 8446 compliance suite |
79
+ | `runHttp2Compliance()` | function | HTTP/2 RFC 9113 compliance suite |
80
+ | `runHttp1Compliance()` | function | HTTP/1.1 RFC 9110 compliance suite |
81
+ | `benchmarkTlsHandshake()` | function | TLS handshake benchmark |
82
+ | `benchmarkHttp2Request()` | function | HTTP/2 request benchmark |
83
+ | `GoldenCapture` | interface | A recorded packet capture |
84
+ | `ComparisonResult` | interface | Outcome of a golden comparison |
85
+ | `BenchStats` | interface | p50/p95/p99 latency stats |
86
+
87
+ ## Dependency graph
88
+
89
+ ```
90
+ @browsercore/testing
91
+ └─ @browsercore/fetch @browsercore/http2 @browsercore/http1 @browsercore/cookies
92
+ └─ @browsercore/profiles @browsercore/tls @browsercore/crypto
93
+ └─ @browsercore/transport
94
+ └─ node:net / node:crypto
95
+ ```
96
+
97
+ `@browsercore/testing` sits at the very top — it depends on everything and nothing
98
+ depends on it.
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Benchmark suite for protocol operations.
3
+ *
4
+ * Typed stubs for now — real benchmarks require live servers and the
5
+ * underlying protocol stacks.
6
+ */
7
+ import type { BenchStats } from "../types.js";
8
+ /** Benchmark a single TLS handshake over `iterations` runs. */
9
+ export declare function benchmarkTlsHandshake(_iterations: number, _options?: {
10
+ host?: string;
11
+ port?: number;
12
+ profile?: string;
13
+ }): BenchStats;
14
+ /** Benchmark an HTTP/2 request round-trip over `iterations` runs. */
15
+ export declare function benchmarkHttp2Request(_iterations: number, _options?: {
16
+ host?: string;
17
+ port?: number;
18
+ path?: string;
19
+ profile?: string;
20
+ }): BenchStats;
21
+ //# sourceMappingURL=bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bench.d.ts","sourceRoot":"","sources":["../../src/bench/bench.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,+DAA+D;AAC/D,wBAAgB,qBAAqB,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,UAAU,CAIZ;AAED,qEAAqE;AACrE,wBAAgB,qBAAqB,CACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7E,UAAU,CAIZ"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Benchmark suite for protocol operations.
3
+ *
4
+ * Typed stubs for now — real benchmarks require live servers and the
5
+ * underlying protocol stacks.
6
+ */
7
+ /** Benchmark a single TLS handshake over `iterations` runs. */
8
+ export function benchmarkTlsHandshake(_iterations, _options) {
9
+ void _iterations;
10
+ void _options;
11
+ throw new Error("not implemented — see PLAN.md");
12
+ }
13
+ /** Benchmark an HTTP/2 request round-trip over `iterations` runs. */
14
+ export function benchmarkHttp2Request(_iterations, _options) {
15
+ void _iterations;
16
+ void _options;
17
+ throw new Error("not implemented — see PLAN.md");
18
+ }
19
+ //# sourceMappingURL=bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bench.js","sourceRoot":"","sources":["../../src/bench/bench.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,+DAA+D;AAC/D,MAAM,UAAU,qBAAqB,CACjC,WAAmB,EACnB,QAA6D;IAE7D,KAAK,WAAW,CAAC;IACjB,KAAK,QAAQ,CAAC;IACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACrD,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,qBAAqB,CACjC,WAAmB,EACnB,QAA4E;IAE5E,KAAK,WAAW,CAAC;IACjB,KAAK,QAAQ,CAAC;IACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;AACrD,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * In-repo golden capture manifest (lives under src/ so it is in rootDir).
3
+ *
4
+ * Single source of truth for which captures exist on disk. Each entry pairs
5
+ * its typed {@link CaptureMeta} with the raw bytes read from the sibling
6
+ * `.bin` in the package-level `captures/` directory. Tests and reference
7
+ * providers discover captures through this array rather than hard-coding paths
8
+ * (no magic strings — see CODING_STANDARDS.md).
9
+ */
10
+ import type { CaptureMeta } from "../types.js";
11
+ /** A discovered capture: its typed metadata plus the raw on-disk bytes. */
12
+ export interface CaptureEntry {
13
+ readonly path: string;
14
+ readonly meta: CaptureMeta;
15
+ readonly bytes: Uint8Array;
16
+ }
17
+ export declare const captures: readonly CaptureEntry[];
18
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../src/captures/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAM/C,2EAA2E;AAC3E,MAAM,WAAW,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC9B;AAeD,eAAO,MAAM,QAAQ,EAAE,SAAS,YAAY,EA8C3C,CAAC"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * In-repo golden capture manifest (lives under src/ so it is in rootDir).
3
+ *
4
+ * Single source of truth for which captures exist on disk. Each entry pairs
5
+ * its typed {@link CaptureMeta} with the raw bytes read from the sibling
6
+ * `.bin` in the package-level `captures/` directory. Tests and reference
7
+ * providers discover captures through this array rather than hard-coding paths
8
+ * (no magic strings — see CODING_STANDARDS.md).
9
+ */
10
+ import { readFileSync } from "node:fs";
11
+ import { fileURLToPath } from "node:url";
12
+ import { dirname, join } from "node:path";
13
+ const here = dirname(fileURLToPath(import.meta.url));
14
+ // src/captures -> package root -> captures/
15
+ const capturesDir = join(here, "..", "..", "captures");
16
+ function id(s) {
17
+ return s;
18
+ }
19
+ function entry(relativePath, meta) {
20
+ const abs = join(capturesDir, relativePath);
21
+ return {
22
+ path: relativePath,
23
+ meta,
24
+ bytes: readFileSync(abs),
25
+ };
26
+ }
27
+ export const captures = [
28
+ entry("chrome-140/tls/client_hello.bin", {
29
+ source: "curl-impersonate",
30
+ profile: id("chrome-140"),
31
+ protocol: "tls",
32
+ record: "client_hello",
33
+ description: "TLS 1.3 ClientHello from curl-impersonate --chrome-140.",
34
+ randomizedFields: [
35
+ { byteOffset: 12, length: 32, reason: "random" },
36
+ { byteOffset: 49, length: 32, reason: "ephemeral_key" },
37
+ ],
38
+ createdAt: "2026-08-02T00:00:00Z",
39
+ }),
40
+ entry("chrome-140/http2/settings.bin", {
41
+ source: "curl-impersonate",
42
+ profile: id("chrome-140"),
43
+ protocol: "http2",
44
+ record: "settings",
45
+ description: "First HTTP/2 SETTINGS frame from curl-impersonate --chrome-140.",
46
+ randomizedFields: [],
47
+ createdAt: "2026-08-02T00:00:00Z",
48
+ }),
49
+ entry("firefox-128/tls/client_hello.bin", {
50
+ source: "curl-impersonate",
51
+ profile: id("firefox-128"),
52
+ protocol: "tls",
53
+ record: "client_hello",
54
+ description: "TLS 1.3 ClientHello from curl-impersonate --firefox-128.",
55
+ randomizedFields: [
56
+ { byteOffset: 12, length: 32, reason: "random" },
57
+ { byteOffset: 49, length: 32, reason: "ephemeral_key" },
58
+ ],
59
+ createdAt: "2026-08-02T00:00:00Z",
60
+ }),
61
+ ];
62
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/captures/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAI1C,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACrD,4CAA4C;AAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AASvD,SAAS,EAAE,CAAC,CAAS;IACjB,OAAO,CAAc,CAAC;AAC1B,CAAC;AAED,SAAS,KAAK,CAAC,YAAoB,EAAE,IAAiB;IAClD,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAC5C,OAAO;QACH,IAAI,EAAE,YAAY;QAClB,IAAI;QACJ,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC;KAC3B,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,QAAQ,GAA4B;IAC7C,KAAK,CACD,iCAAiC,EACjC;QACI,MAAM,EAAE,kBAAkB;QAC1B,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC;QACzB,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,cAAc;QACtB,WAAW,EACP,yDAAyD;QAC7D,gBAAgB,EAAE;YACd,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;YAChD,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;SAC1D;QACD,SAAS,EAAE,sBAAsB;KACpC,CACJ;IACD,KAAK,CACD,+BAA+B,EAC/B;QACI,MAAM,EAAE,kBAAkB;QAC1B,OAAO,EAAE,EAAE,CAAC,YAAY,CAAC;QACzB,QAAQ,EAAE,OAAO;QACjB,MAAM,EAAE,UAAU;QAClB,WAAW,EACP,iEAAiE;QACrE,gBAAgB,EAAE,EAAE;QACpB,SAAS,EAAE,sBAAsB;KACpC,CACJ;IACD,KAAK,CACD,kCAAkC,EAClC;QACI,MAAM,EAAE,kBAAkB;QAC1B,OAAO,EAAE,EAAE,CAAC,aAAa,CAAC;QAC1B,QAAQ,EAAE,KAAK;QACf,MAAM,EAAE,cAAc;QACtB,WAAW,EACP,0DAA0D;QAC9D,gBAAgB,EAAE;YACd,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE;YAChD,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE;SAC1D;QACD,SAAS,EAAE,sBAAsB;KACpC,CACJ;CACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Test Categories 14–15 — Packet Capture Comparison, Real World Compatibility.
3
+ *
4
+ * See docs/TEST-SUITE.md for the full acceptance criteria of each category.
5
+ */
6
+ export declare const CATEGORY_ID_CAPTURE: "packet-capture-comparison";
7
+ export declare const CATEGORY_ID_REALWORLD: "real-world-compatibility";
8
+ //# sourceMappingURL=capture.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"","sources":["../../src/categories/capture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,eAAO,MAAM,mBAAmB,6BAAuC,CAAC;AACxE,eAAO,MAAM,qBAAqB,4BAAsC,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Test Categories 14–15 — Packet Capture Comparison, Real World Compatibility.
3
+ *
4
+ * See docs/TEST-SUITE.md for the full acceptance criteria of each category.
5
+ */
6
+ import { describe, it } from "vitest";
7
+ import { TestCategory } from "../types.js";
8
+ export const CATEGORY_ID_CAPTURE = TestCategory.PacketCaptureComparison;
9
+ export const CATEGORY_ID_REALWORLD = TestCategory.RealWorldCompatibility;
10
+ describe(CATEGORY_ID_CAPTURE, () => {
11
+ it.todo("generate reference capture per supported browser profile");
12
+ it.todo("generate project capture per supported browser profile");
13
+ it.todo("compare TLS records");
14
+ it.todo("compare HTTP frames");
15
+ it.todo("compare header order");
16
+ it.todo("compare extension order");
17
+ it.todo("compare packet sizes");
18
+ it.todo("compare ALPN");
19
+ it.todo("compare timing-independent message sequence");
20
+ it.todo("ignore intentionally randomized fields (ephemeral keys, nonces, GREASE)");
21
+ });
22
+ describe(CATEGORY_ID_REALWORLD, () => {
23
+ it.todo("interoperate with static websites");
24
+ it.todo("interoperate with HTTP/2-only servers");
25
+ it.todo("interoperate with CDNs");
26
+ it.todo("interoperate with reverse proxies");
27
+ it.todo("interoperate with TLS 1.2-only servers");
28
+ it.todo("interoperate with TLS 1.3 servers");
29
+ it.todo("interoperate with servers with large certificate chains");
30
+ });
31
+ //# sourceMappingURL=capture.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../src/categories/capture.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC,uBAAuB,CAAC;AACxE,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC,sBAAsB,CAAC;AAEzE,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACpE,EAAE,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IAClE,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAC/B,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACnC,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACxB,EAAE,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IACvD,EAAE,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;AACvF,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7C,EAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACjD,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAClC,EAAE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7C,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAClD,EAAE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7C,EAAE,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC;AACvE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Test Category 9 — Compression.
3
+ *
4
+ * Verify gzip, brotli, deflate decoding behavior. See docs/TEST-SUITE.md
5
+ * ("Test Category 9 — Compression") for full acceptance criteria.
6
+ */
7
+ export declare const CATEGORY_ID: "compression";
8
+ //# sourceMappingURL=compression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.d.ts","sourceRoot":"","sources":["../../src/categories/compression.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,WAAW,eAA2B,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Test Category 9 — Compression.
3
+ *
4
+ * Verify gzip, brotli, deflate decoding behavior. See docs/TEST-SUITE.md
5
+ * ("Test Category 9 — Compression") for full acceptance criteria.
6
+ */
7
+ import { describe, it } from "vitest";
8
+ import { TestCategory } from "../types.js";
9
+ export const CATEGORY_ID = TestCategory.Compression;
10
+ describe(CATEGORY_ID, () => {
11
+ it.todo("gzip decoding matches reference");
12
+ it.todo("brotli decoding matches reference");
13
+ it.todo("deflate decoding matches reference");
14
+ });
15
+ //# sourceMappingURL=compression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compression.js","sourceRoot":"","sources":["../../src/categories/compression.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,WAAW,CAAC;AAEpD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC3C,EAAE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7C,EAAE,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Test Category 8 — Cookie Behavior.
3
+ *
4
+ * Verify cookie parsing and policy. See docs/TEST-SUITE.md
5
+ * ("Test Category 8 — Cookie Behavior") for full acceptance criteria.
6
+ */
7
+ export declare const CATEGORY_ID: "cookie-behavior";
8
+ //# sourceMappingURL=cookies.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.d.ts","sourceRoot":"","sources":["../../src/categories/cookies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,WAAW,mBAA8B,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Test Category 8 — Cookie Behavior.
3
+ *
4
+ * Verify cookie parsing and policy. See docs/TEST-SUITE.md
5
+ * ("Test Category 8 — Cookie Behavior") for full acceptance criteria.
6
+ */
7
+ import { describe, it } from "vitest";
8
+ import { TestCategory } from "../types.js";
9
+ export const CATEGORY_ID = TestCategory.CookieBehavior;
10
+ describe(CATEGORY_ID, () => {
11
+ it.todo("cookie parsing");
12
+ it.todo("cookie expiration");
13
+ it.todo("Secure cookies");
14
+ it.todo("HttpOnly cookies");
15
+ it.todo("SameSite cookies");
16
+ it.todo("domain matching");
17
+ it.todo("path matching");
18
+ it.todo("cookie ordering");
19
+ });
20
+ //# sourceMappingURL=cookies.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookies.js","sourceRoot":"","sources":["../../src/categories/cookies.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,cAAc,CAAC;AAEvD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1B,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC7B,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC1B,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3B,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACzB,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Test Category 13 — Error Handling.
3
+ *
4
+ * Verify behavior under invalid / adversarial conditions, and that the
5
+ * project's typed error classes instantiate correctly.
6
+ *
7
+ * See docs/TEST-SUITE.md ("Test Category 13 — Error Handling") for full
8
+ * acceptance criteria.
9
+ */
10
+ export declare const CATEGORY_ID: "error-handling";
11
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/categories/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,eAAO,MAAM,WAAW,kBAA6B,CAAC"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Test Category 13 — Error Handling.
3
+ *
4
+ * Verify behavior under invalid / adversarial conditions, and that the
5
+ * project's typed error classes instantiate correctly.
6
+ *
7
+ * See docs/TEST-SUITE.md ("Test Category 13 — Error Handling") for full
8
+ * acceptance criteria.
9
+ */
10
+ import { describe, expect, it } from "vitest";
11
+ import { GoldenMismatchError, TestingError } from "../errors.js";
12
+ import { TestCategory } from "../types.js";
13
+ export const CATEGORY_ID = TestCategory.ErrorHandling;
14
+ describe(CATEGORY_ID, () => {
15
+ // Trivially-testable: the typed error classes must instantiate and carry
16
+ // their discriminant + cause. These exercise existing utils (errors.ts).
17
+ it("TestingError instantiates with a kind discriminant and optional cause", () => {
18
+ const cause = new Error("underlying");
19
+ const err = new TestingError("boom", { cause });
20
+ expect(err).toBeInstanceOf(TestingError);
21
+ expect(err.kind).toBe("TestingError");
22
+ expect(err.message).toBe("boom");
23
+ expect(err.cause).toBe(cause);
24
+ });
25
+ it("GoldenMismatchError records the capture id and divergence index", () => {
26
+ const err = new GoldenMismatchError("chrome-140:client-hello:1", 42);
27
+ expect(err).toBeInstanceOf(GoldenMismatchError);
28
+ expect(err.kind).toBe("GoldenMismatchError");
29
+ expect(err.captureId).toBe("chrome-140:client-hello:1");
30
+ expect(err.divergenceByteIndex).toBe(42);
31
+ expect(err.message).toContain("diverges at byte 42");
32
+ });
33
+ it.todo("invalid certificates");
34
+ it.todo("unsupported cipher");
35
+ it.todo("unexpected alerts");
36
+ it.todo("truncated packets");
37
+ it.todo("invalid HTTP responses");
38
+ it.todo("timeout handling");
39
+ it.todo("broken TCP connections");
40
+ });
41
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/categories/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,aAAa,CAAC;AAEtD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,yEAAyE;IACzE,yEAAyE;IACzE,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC7E,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,GAAG,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAAC,2BAA2B,EAAE,EAAE,CAAC,CAAC;QACrE,MAAM,CAAC,GAAG,CAAC,CAAC,cAAc,CAAC,mBAAmB,CAAC,CAAC;QAChD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC7C,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;QACxD,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC9B,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC7B,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC7B,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IAClC,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Test Categories 5–7 — HTTP/1.1, HTTP/2, Header Profiles.
3
+ *
4
+ * See docs/TEST-SUITE.md for the full acceptance criteria of each category.
5
+ */
6
+ export declare const CATEGORY_ID_HTTP1: "http1";
7
+ export declare const CATEGORY_ID_HTTP2: "http2";
8
+ export declare const CATEGORY_ID_HEADERS: "header-profiles";
9
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/categories/http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,eAAO,MAAM,iBAAiB,SAAqB,CAAC;AACpD,eAAO,MAAM,iBAAiB,SAAqB,CAAC;AACpD,eAAO,MAAM,mBAAmB,mBAA8B,CAAC"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Test Categories 5–7 — HTTP/1.1, HTTP/2, Header Profiles.
3
+ *
4
+ * See docs/TEST-SUITE.md for the full acceptance criteria of each category.
5
+ */
6
+ import { describe, it } from "vitest";
7
+ import { TestCategory } from "../types.js";
8
+ export const CATEGORY_ID_HTTP1 = TestCategory.Http1;
9
+ export const CATEGORY_ID_HTTP2 = TestCategory.Http2;
10
+ export const CATEGORY_ID_HEADERS = TestCategory.HeaderProfiles;
11
+ describe(CATEGORY_ID_HTTP1, () => {
12
+ it.todo("header serialization");
13
+ it.todo("header ordering");
14
+ it.todo("connection reuse");
15
+ it.todo("chunked encoding");
16
+ it.todo("compression");
17
+ it.todo("redirect handling");
18
+ it.todo("cookie handling");
19
+ it.todo("Keep-Alive behavior");
20
+ });
21
+ describe(CATEGORY_ID_HTTP2, () => {
22
+ it.todo("SETTINGS values match reference");
23
+ it.todo("SETTINGS ordering matches reference");
24
+ it.todo("SETTINGS ACK timing matches reference");
25
+ it.todo("WINDOW_UPDATE values match reference");
26
+ it.todo("frame ordering matches reference");
27
+ it.todo("PING handling matches reference");
28
+ it.todo("GOAWAY handling matches reference");
29
+ it.todo("stream prioritization matches reference (where implemented)");
30
+ it.todo("HPACK behavior matches reference");
31
+ it.todo("pseudo-header ordering matches reference");
32
+ });
33
+ describe(CATEGORY_ID_HEADERS, () => {
34
+ it.todo("User-Agent header matches profile");
35
+ it.todo("Accept header matches profile");
36
+ it.todo("Accept-Language header matches profile");
37
+ it.todo("Accept-Encoding header matches profile");
38
+ it.todo("Cache-Control header matches profile");
39
+ it.todo("Upgrade-Insecure-Requests header matches profile");
40
+ it.todo("Sec-CH-UA header matches profile");
41
+ it.todo("Sec-CH-UA-Mobile header matches profile");
42
+ it.todo("Sec-CH-UA-Platform header matches profile");
43
+ it.todo("Fetch Metadata headers match profile");
44
+ it.todo("header ordering matches profile");
45
+ });
46
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/categories/http.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,CAAC;AACpD,MAAM,CAAC,MAAM,iBAAiB,GAAG,YAAY,CAAC,KAAK,CAAC;AACpD,MAAM,CAAC,MAAM,mBAAmB,GAAG,YAAY,CAAC,cAAc,CAAC;AAE/D,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAChC,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3B,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC5B,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACvB,EAAE,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC7B,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC3B,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AACnC,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC7B,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC3C,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC/C,EAAE,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;IACjD,EAAE,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAChD,EAAE,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC5C,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC3C,EAAE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7C,EAAE,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACvE,EAAE,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC5C,EAAE,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAC7C,EAAE,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACzC,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAClD,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IAClD,EAAE,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAChD,EAAE,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAC5D,EAAE,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC5C,EAAE,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;IACnD,EAAE,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IACrD,EAAE,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAChD,EAAE,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Barrel for the 17 test-category vitest suites (docs/TEST-SUITE.md).
3
+ *
4
+ * Each module exports its category id constant(s) alongside the `describe`
5
+ * block, so consumers can reference stable ids without magic strings.
6
+ */
7
+ export { CATEGORY_ID as tcpTransport } from "./transport.js";
8
+ export { CATEGORY_ID_TLS as tlsSerialization, CATEGORY_ID_PROFILE as browserProfileComparison, CATEGORY_ID_FINGERPRINT as tlsFingerprint } from "./tls.js";
9
+ export { CATEGORY_ID_HTTP1 as http1, CATEGORY_ID_HTTP2 as http2, CATEGORY_ID_HEADERS as headerProfiles } from "./http.js";
10
+ export { CATEGORY_ID as cookieBehavior } from "./cookies.js";
11
+ export { CATEGORY_ID as compression } from "./compression.js";
12
+ export { CATEGORY_ID as redirectHandling } from "./redirects.js";
13
+ export { CATEGORY_ID_SESSION as sessionResumption, CATEGORY_ID_REUSE as connectionReuse } from "./session.js";
14
+ export { CATEGORY_ID as errorHandling } from "./errors.js";
15
+ export { CATEGORY_ID_CAPTURE as packetCaptureComparison, CATEGORY_ID_REALWORLD as realWorldCompatibility } from "./capture.js";
16
+ export { CATEGORY_ID_REGRESSION as regression, CATEGORY_ID_BENCHMARKS as performanceBenchmarks } from "./regression.js";
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/categories/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,mBAAmB,IAAI,wBAAwB,EAAE,uBAAuB,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3J,OAAO,EAAE,iBAAiB,IAAI,KAAK,EAAE,iBAAiB,IAAI,KAAK,EAAE,mBAAmB,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1H,OAAO,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,mBAAmB,IAAI,iBAAiB,EAAE,iBAAiB,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,mBAAmB,IAAI,uBAAuB,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC/H,OAAO,EAAE,sBAAsB,IAAI,UAAU,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Barrel for the 17 test-category vitest suites (docs/TEST-SUITE.md).
3
+ *
4
+ * Each module exports its category id constant(s) alongside the `describe`
5
+ * block, so consumers can reference stable ids without magic strings.
6
+ */
7
+ export { CATEGORY_ID as tcpTransport } from "./transport.js";
8
+ export { CATEGORY_ID_TLS as tlsSerialization, CATEGORY_ID_PROFILE as browserProfileComparison, CATEGORY_ID_FINGERPRINT as tlsFingerprint } from "./tls.js";
9
+ export { CATEGORY_ID_HTTP1 as http1, CATEGORY_ID_HTTP2 as http2, CATEGORY_ID_HEADERS as headerProfiles } from "./http.js";
10
+ export { CATEGORY_ID as cookieBehavior } from "./cookies.js";
11
+ export { CATEGORY_ID as compression } from "./compression.js";
12
+ export { CATEGORY_ID as redirectHandling } from "./redirects.js";
13
+ export { CATEGORY_ID_SESSION as sessionResumption, CATEGORY_ID_REUSE as connectionReuse } from "./session.js";
14
+ export { CATEGORY_ID as errorHandling } from "./errors.js";
15
+ export { CATEGORY_ID_CAPTURE as packetCaptureComparison, CATEGORY_ID_REALWORLD as realWorldCompatibility } from "./capture.js";
16
+ export { CATEGORY_ID_REGRESSION as regression, CATEGORY_ID_BENCHMARKS as performanceBenchmarks } from "./regression.js";
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/categories/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,eAAe,IAAI,gBAAgB,EAAE,mBAAmB,IAAI,wBAAwB,EAAE,uBAAuB,IAAI,cAAc,EAAE,MAAM,UAAU,CAAC;AAC3J,OAAO,EAAE,iBAAiB,IAAI,KAAK,EAAE,iBAAiB,IAAI,KAAK,EAAE,mBAAmB,IAAI,cAAc,EAAE,MAAM,WAAW,CAAC;AAC1H,OAAO,EAAE,WAAW,IAAI,cAAc,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,IAAI,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,WAAW,IAAI,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,EAAE,mBAAmB,IAAI,iBAAiB,EAAE,iBAAiB,IAAI,eAAe,EAAE,MAAM,cAAc,CAAC;AAC9G,OAAO,EAAE,WAAW,IAAI,aAAa,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,mBAAmB,IAAI,uBAAuB,EAAE,qBAAqB,IAAI,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAC/H,OAAO,EAAE,sBAAsB,IAAI,UAAU,EAAE,sBAAsB,IAAI,qBAAqB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Test Category 10 — Redirect Handling.
3
+ *
4
+ * Verify 301, 302, 303, 307, 308 behavior. See docs/TEST-SUITE.md
5
+ * ("Test Category 10 — Redirect Handling") for full acceptance criteria.
6
+ */
7
+ export declare const CATEGORY_ID: "redirect-handling";
8
+ //# sourceMappingURL=redirects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.d.ts","sourceRoot":"","sources":["../../src/categories/redirects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,eAAO,MAAM,WAAW,qBAAgC,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Test Category 10 — Redirect Handling.
3
+ *
4
+ * Verify 301, 302, 303, 307, 308 behavior. See docs/TEST-SUITE.md
5
+ * ("Test Category 10 — Redirect Handling") for full acceptance criteria.
6
+ */
7
+ import { describe, it } from "vitest";
8
+ import { TestCategory } from "../types.js";
9
+ export const CATEGORY_ID = TestCategory.RedirectHandling;
10
+ describe(CATEGORY_ID, () => {
11
+ it.todo("301 redirect handling");
12
+ it.todo("302 redirect handling");
13
+ it.todo("303 redirect handling");
14
+ it.todo("307 redirect handling");
15
+ it.todo("308 redirect handling");
16
+ it.todo("method rewriting on redirect");
17
+ it.todo("header preservation across redirects");
18
+ it.todo("cookie persistence across redirects");
19
+ it.todo("maximum redirect count is enforced");
20
+ });
21
+ //# sourceMappingURL=redirects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redirects.js","sourceRoot":"","sources":["../../src/categories/redirects.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC,gBAAgB,CAAC;AAEzD,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACvB,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjC,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACjC,EAAE,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IACxC,EAAE,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IAChD,EAAE,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC/C,EAAE,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Test Categories 16–17 — Regression Tests, Performance Benchmarks.
3
+ *
4
+ * See docs/TEST-SUITE.md for the full acceptance criteria of each category.
5
+ */
6
+ export declare const CATEGORY_ID_REGRESSION: "regression";
7
+ export declare const CATEGORY_ID_BENCHMARKS: "performance-benchmarks";
8
+ //# sourceMappingURL=regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../src/categories/regression.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,eAAO,MAAM,sBAAsB,cAA0B,CAAC;AAC9D,eAAO,MAAM,sBAAsB,0BAAqC,CAAC"}