@secure-exec/core 0.2.1 → 0.3.0-rc.1
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/README.md +5 -5
- package/dist/binary.d.ts +4 -0
- package/dist/binary.js +25 -0
- package/dist/bytes.d.ts +2 -0
- package/dist/bytes.js +6 -0
- package/dist/callbacks.d.ts +41 -0
- package/dist/callbacks.js +94 -0
- package/dist/cargo.d.ts +2 -0
- package/dist/cargo.js +142 -0
- package/dist/correlation.d.ts +10 -0
- package/dist/correlation.js +49 -0
- package/dist/descriptors.d.ts +34 -0
- package/dist/descriptors.js +37 -0
- package/dist/event-buffer.d.ts +90 -0
- package/dist/event-buffer.js +313 -0
- package/dist/ext.d.ts +7 -0
- package/dist/ext.js +13 -0
- package/dist/filesystem.d.ts +41 -0
- package/dist/filesystem.js +70 -0
- package/dist/frame-payload-codec.d.ts +8 -0
- package/dist/frame-payload-codec.js +14 -0
- package/dist/frame-rpc.d.ts +38 -0
- package/dist/frame-rpc.js +73 -0
- package/dist/frame-stream.d.ts +27 -0
- package/dist/frame-stream.js +99 -0
- package/dist/framing.d.ts +7 -0
- package/dist/framing.js +22 -0
- package/dist/generated/AcpLimitsConfig.d.ts +4 -0
- package/dist/generated/AcpLimitsConfig.js +2 -0
- package/dist/generated/CreateVmConfig.d.ts +19 -0
- package/dist/generated/FsPermissionRule.d.ts +6 -0
- package/dist/generated/FsPermissionRuleSet.d.ts +6 -0
- package/dist/generated/FsPermissionRuleSet.js +1 -0
- package/dist/generated/FsPermissionScope.d.ts +3 -0
- package/dist/generated/FsPermissionScope.js +1 -0
- package/dist/generated/HttpLimitsConfig.d.ts +3 -0
- package/dist/generated/HttpLimitsConfig.js +2 -0
- package/dist/generated/JsModuleResolution.d.ts +1 -0
- package/dist/generated/JsModuleResolution.js +2 -0
- package/dist/generated/JsRuntimeConfig.d.ts +26 -0
- package/dist/generated/JsRuntimeConfig.js +1 -0
- package/dist/generated/JsRuntimeLimitsConfig.d.ts +7 -0
- package/dist/generated/JsRuntimeLimitsConfig.js +2 -0
- package/dist/generated/JsRuntimePlatform.d.ts +1 -0
- package/dist/generated/JsRuntimePlatform.js +2 -0
- package/dist/generated/MountPluginDescriptor.d.ts +4 -0
- package/dist/generated/MountPluginDescriptor.js +2 -0
- package/dist/generated/NativeRootFilesystemConfig.d.ts +5 -0
- package/dist/generated/NativeRootFilesystemConfig.js +1 -0
- package/dist/generated/PatternPermissionRule.d.ts +6 -0
- package/dist/generated/PatternPermissionRule.js +1 -0
- package/dist/generated/PatternPermissionRuleSet.d.ts +6 -0
- package/dist/generated/PatternPermissionRuleSet.js +1 -0
- package/dist/generated/PatternPermissionScope.d.ts +3 -0
- package/dist/generated/PatternPermissionScope.js +1 -0
- package/dist/generated/PermissionMode.d.ts +1 -0
- package/dist/generated/PermissionMode.js +2 -0
- package/dist/generated/PermissionsPolicy.d.ts +10 -0
- package/dist/generated/PermissionsPolicy.js +1 -0
- package/dist/generated/PluginLimitsConfig.d.ts +4 -0
- package/dist/generated/PluginLimitsConfig.js +2 -0
- package/dist/generated/PythonLimitsConfig.d.ts +5 -0
- package/dist/generated/PythonLimitsConfig.js +2 -0
- package/dist/generated/ResourceLimitsConfig.d.ts +22 -0
- package/dist/generated/ResourceLimitsConfig.js +2 -0
- package/dist/generated/RootFilesystemConfig.d.ts +9 -0
- package/dist/generated/RootFilesystemConfig.js +1 -0
- package/dist/generated/RootFilesystemEntry.d.ts +13 -0
- package/dist/generated/RootFilesystemEntry.js +1 -0
- package/dist/generated/RootFilesystemEntryEncoding.d.ts +1 -0
- package/dist/generated/RootFilesystemEntryEncoding.js +2 -0
- package/dist/generated/RootFilesystemEntryKind.d.ts +1 -0
- package/dist/generated/RootFilesystemEntryKind.js +2 -0
- package/dist/generated/RootFilesystemLowerDescriptor.d.ts +7 -0
- package/dist/generated/RootFilesystemLowerDescriptor.js +1 -0
- package/dist/generated/RootFilesystemMode.d.ts +1 -0
- package/dist/generated/RootFilesystemMode.js +2 -0
- package/dist/generated/ToolLimitsConfig.d.ts +10 -0
- package/dist/generated/ToolLimitsConfig.js +2 -0
- package/dist/generated/VmDnsConfig.d.ts +6 -0
- package/dist/generated/VmDnsConfig.js +2 -0
- package/dist/generated/VmLimitsConfig.d.ts +18 -0
- package/dist/generated/VmLimitsConfig.js +1 -0
- package/dist/generated/VmListenPolicyConfig.d.ts +5 -0
- package/dist/generated/VmListenPolicyConfig.js +2 -0
- package/dist/generated/WasmLimitsConfig.d.ts +5 -0
- package/dist/generated/WasmLimitsConfig.js +2 -0
- package/dist/generated-protocol.d.ts +1037 -0
- package/dist/generated-protocol.js +2887 -0
- package/dist/index.d.ts +24 -62
- package/dist/index.js +24 -53
- package/dist/json.d.ts +2 -0
- package/dist/json.js +20 -0
- package/dist/kernel-proxy.d.ts +149 -0
- package/dist/kernel-proxy.js +1733 -0
- package/dist/native-client.d.ts +41 -0
- package/dist/native-client.js +124 -0
- package/dist/node-runtime.d.ts +443 -0
- package/dist/node-runtime.js +569 -0
- package/dist/numbers.d.ts +1 -0
- package/dist/numbers.js +8 -0
- package/dist/ownership.d.ts +18 -0
- package/dist/ownership.js +77 -0
- package/dist/permissions.d.ts +29 -0
- package/dist/permissions.js +68 -0
- package/dist/process.d.ts +35 -0
- package/dist/process.js +125 -0
- package/dist/protocol-client.d.ts +46 -0
- package/dist/protocol-client.js +180 -0
- package/dist/protocol-frames.d.ts +68 -0
- package/dist/protocol-frames.js +139 -0
- package/dist/protocol-maps.d.ts +28 -0
- package/dist/protocol-maps.js +217 -0
- package/dist/protocol-schema.d.ts +10 -0
- package/dist/protocol-schema.js +11 -0
- package/dist/request-payloads.d.ts +137 -0
- package/dist/request-payloads.js +210 -0
- package/dist/response-payloads.d.ts +107 -0
- package/dist/response-payloads.js +161 -0
- package/dist/sidecar-client.d.ts +242 -0
- package/dist/sidecar-client.js +797 -0
- package/dist/state.d.ts +40 -0
- package/dist/state.js +44 -0
- package/dist/test-runtime.d.ts +526 -0
- package/dist/test-runtime.js +2119 -0
- package/dist/vm-config.d.ts +31 -0
- package/dist/vm-config.js +1 -0
- package/fixtures/alpine-defaults.json +520 -0
- package/fixtures/base-filesystem.json +528 -0
- package/package.json +193 -115
- package/LICENSE +0 -191
- package/dist/bridge-setup.d.ts +0 -6
- package/dist/bridge-setup.js +0 -9
- package/dist/esm-compiler.d.ts +0 -18
- package/dist/esm-compiler.js +0 -72
- package/dist/fs-helpers.d.ts +0 -23
- package/dist/fs-helpers.js +0 -41
- package/dist/generated/isolate-runtime.d.ts +0 -19
- package/dist/generated/isolate-runtime.js +0 -21
- package/dist/generated/polyfills.d.ts +0 -82
- package/dist/generated/polyfills.js +0 -82
- package/dist/isolate-runtime/apply-custom-global-policy.js +0 -53
- package/dist/isolate-runtime/apply-timing-mitigation-freeze.js +0 -130
- package/dist/isolate-runtime/apply-timing-mitigation-off.js +0 -14
- package/dist/isolate-runtime/bridge-attach.js +0 -29
- package/dist/isolate-runtime/bridge-initial-globals.js +0 -385
- package/dist/isolate-runtime/eval-script-result.js +0 -8
- package/dist/isolate-runtime/global-exposure-helpers.js +0 -36
- package/dist/isolate-runtime/init-commonjs-module-globals.js +0 -28
- package/dist/isolate-runtime/override-process-cwd.js +0 -8
- package/dist/isolate-runtime/override-process-env.js +0 -8
- package/dist/isolate-runtime/require-setup.js +0 -4153
- package/dist/isolate-runtime/set-commonjs-file-globals.js +0 -36
- package/dist/isolate-runtime/set-stdin-data.js +0 -10
- package/dist/isolate-runtime/setup-dynamic-import.js +0 -123
- package/dist/isolate-runtime/setup-fs-facade.js +0 -87
- package/dist/kernel/command-registry.d.ts +0 -44
- package/dist/kernel/command-registry.js +0 -114
- package/dist/kernel/device-backend.d.ts +0 -14
- package/dist/kernel/device-backend.js +0 -251
- package/dist/kernel/device-layer.d.ts +0 -12
- package/dist/kernel/device-layer.js +0 -271
- package/dist/kernel/dns-cache.d.ts +0 -29
- package/dist/kernel/dns-cache.js +0 -52
- package/dist/kernel/fd-table.d.ts +0 -84
- package/dist/kernel/fd-table.js +0 -278
- package/dist/kernel/file-lock.d.ts +0 -34
- package/dist/kernel/file-lock.js +0 -122
- package/dist/kernel/host-adapter.d.ts +0 -50
- package/dist/kernel/host-adapter.js +0 -8
- package/dist/kernel/index.d.ts +0 -36
- package/dist/kernel/index.js +0 -34
- package/dist/kernel/kernel.d.ts +0 -9
- package/dist/kernel/kernel.js +0 -1415
- package/dist/kernel/mount-table.d.ts +0 -75
- package/dist/kernel/mount-table.js +0 -353
- package/dist/kernel/permissions.d.ts +0 -36
- package/dist/kernel/permissions.js +0 -150
- package/dist/kernel/pipe-manager.d.ts +0 -64
- package/dist/kernel/pipe-manager.js +0 -267
- package/dist/kernel/proc-backend.d.ts +0 -30
- package/dist/kernel/proc-backend.js +0 -428
- package/dist/kernel/proc-layer.d.ts +0 -11
- package/dist/kernel/proc-layer.js +0 -507
- package/dist/kernel/process-table.d.ts +0 -126
- package/dist/kernel/process-table.js +0 -651
- package/dist/kernel/pty.d.ts +0 -109
- package/dist/kernel/pty.js +0 -552
- package/dist/kernel/socket-table.d.ts +0 -312
- package/dist/kernel/socket-table.js +0 -1188
- package/dist/kernel/timer-table.d.ts +0 -54
- package/dist/kernel/timer-table.js +0 -108
- package/dist/kernel/types.d.ts +0 -541
- package/dist/kernel/types.js +0 -98
- package/dist/kernel/user.d.ts +0 -29
- package/dist/kernel/user.js +0 -35
- package/dist/kernel/vfs.d.ts +0 -82
- package/dist/kernel/vfs.js +0 -25
- package/dist/kernel/wait.d.ts +0 -45
- package/dist/kernel/wait.js +0 -112
- package/dist/kernel/wstatus.d.ts +0 -21
- package/dist/kernel/wstatus.js +0 -33
- package/dist/module-resolver.d.ts +0 -29
- package/dist/module-resolver.js +0 -314
- package/dist/package-bundler.d.ts +0 -41
- package/dist/package-bundler.js +0 -497
- package/dist/runtime-driver.d.ts +0 -66
- package/dist/shared/api-types.d.ts +0 -83
- package/dist/shared/bridge-contract.d.ts +0 -772
- package/dist/shared/bridge-contract.js +0 -169
- package/dist/shared/console-formatter.d.ts +0 -22
- package/dist/shared/console-formatter.js +0 -161
- package/dist/shared/constants.d.ts +0 -3
- package/dist/shared/constants.js +0 -3
- package/dist/shared/errors.d.ts +0 -16
- package/dist/shared/errors.js +0 -21
- package/dist/shared/esm-utils.d.ts +0 -28
- package/dist/shared/esm-utils.js +0 -97
- package/dist/shared/global-exposure.d.ts +0 -38
- package/dist/shared/global-exposure.js +0 -876
- package/dist/shared/in-memory-fs.d.ts +0 -16
- package/dist/shared/in-memory-fs.js +0 -115
- package/dist/shared/permissions.d.ts +0 -36
- package/dist/shared/permissions.js +0 -314
- package/dist/shared/require-setup.d.ts +0 -6
- package/dist/shared/require-setup.js +0 -9
- package/dist/test/block-store-conformance.d.ts +0 -34
- package/dist/test/block-store-conformance.js +0 -251
- package/dist/test/metadata-store-conformance.d.ts +0 -37
- package/dist/test/metadata-store-conformance.js +0 -646
- package/dist/test/vfs-conformance.d.ts +0 -65
- package/dist/test/vfs-conformance.js +0 -842
- package/dist/types.d.ts +0 -98
- package/dist/types.js +0 -6
- package/dist/vfs/chunked-vfs.d.ts +0 -66
- package/dist/vfs/chunked-vfs.js +0 -1290
- package/dist/vfs/host-block-store.d.ts +0 -19
- package/dist/vfs/host-block-store.js +0 -97
- package/dist/vfs/memory-block-store.d.ts +0 -16
- package/dist/vfs/memory-block-store.js +0 -45
- package/dist/vfs/memory-metadata.d.ts +0 -75
- package/dist/vfs/memory-metadata.js +0 -528
- package/dist/vfs/sqlite-metadata.d.ts +0 -91
- package/dist/vfs/sqlite-metadata.js +0 -582
- package/dist/vfs/types.d.ts +0 -210
- package/dist/vfs/types.js +0 -8
- /package/dist/{runtime-driver.js → generated/CreateVmConfig.js} +0 -0
- /package/dist/{shared/api-types.js → generated/FsPermissionRule.js} +0 -0
|
@@ -1,251 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared FsBlockStore conformance test suite.
|
|
3
|
-
*
|
|
4
|
-
* Every FsBlockStore implementation must pass the tests in this suite.
|
|
5
|
-
* Optional test groups are gated on capability flags declared in the config.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
*
|
|
9
|
-
* ```typescript
|
|
10
|
-
* import { defineBlockStoreTests } from "@secure-exec/core/test/block-store-conformance";
|
|
11
|
-
*
|
|
12
|
-
* defineBlockStoreTests({
|
|
13
|
-
* name: "InMemoryBlockStore",
|
|
14
|
-
* createStore: () => new InMemoryBlockStore(),
|
|
15
|
-
* capabilities: { copy: true },
|
|
16
|
-
* });
|
|
17
|
-
* ```
|
|
18
|
-
*/
|
|
19
|
-
import { describe, beforeEach, afterEach, expect, test } from "vitest";
|
|
20
|
-
// ---------------------------------------------------------------------------
|
|
21
|
-
// Error code helper
|
|
22
|
-
// ---------------------------------------------------------------------------
|
|
23
|
-
function hasErrorCode(err, code) {
|
|
24
|
-
if (typeof err !== "object" || err === null)
|
|
25
|
-
return false;
|
|
26
|
-
const e = err;
|
|
27
|
-
if (e.code === code)
|
|
28
|
-
return true;
|
|
29
|
-
if (typeof e.message === "string" && e.message.startsWith(`${code}:`))
|
|
30
|
-
return true;
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
function expectErrorCode(err, code) {
|
|
34
|
-
expect(err).toBeInstanceOf(Error);
|
|
35
|
-
expect(hasErrorCode(err, code)).toBe(true);
|
|
36
|
-
}
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
// Helpers
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
/** Create a Uint8Array of the given size filled with a repeating byte pattern. */
|
|
41
|
-
function makeData(size, seed = 0x42) {
|
|
42
|
-
const buf = new Uint8Array(size);
|
|
43
|
-
for (let i = 0; i < size; i++) {
|
|
44
|
-
buf[i] = (seed + i) & 0xff;
|
|
45
|
-
}
|
|
46
|
-
return buf;
|
|
47
|
-
}
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
// Test suite
|
|
50
|
-
// ---------------------------------------------------------------------------
|
|
51
|
-
export function defineBlockStoreTests(config) {
|
|
52
|
-
const { name, capabilities } = config;
|
|
53
|
-
describe(name, () => {
|
|
54
|
-
let store;
|
|
55
|
-
beforeEach(async () => {
|
|
56
|
-
store = await config.createStore();
|
|
57
|
-
});
|
|
58
|
-
afterEach(async () => {
|
|
59
|
-
if (config.cleanup)
|
|
60
|
-
await config.cleanup();
|
|
61
|
-
});
|
|
62
|
-
// ---------------------------------------------------------------
|
|
63
|
-
// write + read round-trip
|
|
64
|
-
// ---------------------------------------------------------------
|
|
65
|
-
describe("write + read", () => {
|
|
66
|
-
test("round-trip small data", async () => {
|
|
67
|
-
const data = makeData(64);
|
|
68
|
-
await store.write("key1", data);
|
|
69
|
-
const result = await store.read("key1");
|
|
70
|
-
expect(result).toEqual(data);
|
|
71
|
-
});
|
|
72
|
-
test("round-trip large data (>4MB)", async () => {
|
|
73
|
-
const data = makeData(4 * 1024 * 1024 + 1, 0xab);
|
|
74
|
-
await store.write("large", data);
|
|
75
|
-
const result = await store.read("large");
|
|
76
|
-
expect(result).toEqual(data);
|
|
77
|
-
});
|
|
78
|
-
test("write overwrites existing key", async () => {
|
|
79
|
-
const data1 = makeData(32, 0x11);
|
|
80
|
-
const data2 = makeData(64, 0x22);
|
|
81
|
-
await store.write("key", data1);
|
|
82
|
-
await store.write("key", data2);
|
|
83
|
-
const result = await store.read("key");
|
|
84
|
-
expect(result).toEqual(data2);
|
|
85
|
-
});
|
|
86
|
-
});
|
|
87
|
-
// ---------------------------------------------------------------
|
|
88
|
-
// readRange
|
|
89
|
-
// ---------------------------------------------------------------
|
|
90
|
-
describe("readRange", () => {
|
|
91
|
-
test("partial read from start", async () => {
|
|
92
|
-
const data = makeData(100);
|
|
93
|
-
await store.write("key", data);
|
|
94
|
-
const result = await store.readRange("key", 0, 10);
|
|
95
|
-
expect(result).toEqual(data.slice(0, 10));
|
|
96
|
-
});
|
|
97
|
-
test("partial read from middle", async () => {
|
|
98
|
-
const data = makeData(100);
|
|
99
|
-
await store.write("key", data);
|
|
100
|
-
const result = await store.readRange("key", 20, 30);
|
|
101
|
-
expect(result).toEqual(data.slice(20, 50));
|
|
102
|
-
});
|
|
103
|
-
test("partial read at end", async () => {
|
|
104
|
-
const data = makeData(100);
|
|
105
|
-
await store.write("key", data);
|
|
106
|
-
const result = await store.readRange("key", 90, 10);
|
|
107
|
-
expect(result).toEqual(data.slice(90, 100));
|
|
108
|
-
});
|
|
109
|
-
test("readRange beyond block size returns short read", async () => {
|
|
110
|
-
const data = makeData(50);
|
|
111
|
-
await store.write("key", data);
|
|
112
|
-
const result = await store.readRange("key", 40, 100);
|
|
113
|
-
expect(result).toEqual(data.slice(40, 50));
|
|
114
|
-
expect(result.length).toBe(10);
|
|
115
|
-
});
|
|
116
|
-
test("readRange nonexistent key throws ENOENT", async () => {
|
|
117
|
-
try {
|
|
118
|
-
await store.readRange("missing", 0, 10);
|
|
119
|
-
expect.fail("should have thrown");
|
|
120
|
-
}
|
|
121
|
-
catch (err) {
|
|
122
|
-
expectErrorCode(err, "ENOENT");
|
|
123
|
-
}
|
|
124
|
-
});
|
|
125
|
-
test("readRange with offset exactly at block size returns empty Uint8Array", async () => {
|
|
126
|
-
const data = makeData(50);
|
|
127
|
-
await store.write("key", data);
|
|
128
|
-
const result = await store.readRange("key", 50, 10);
|
|
129
|
-
expect(result.length).toBe(0);
|
|
130
|
-
});
|
|
131
|
-
test("readRange with offset=0, length=0 returns empty Uint8Array", async () => {
|
|
132
|
-
const data = makeData(50);
|
|
133
|
-
await store.write("key", data);
|
|
134
|
-
const result = await store.readRange("key", 0, 0);
|
|
135
|
-
expect(result.length).toBe(0);
|
|
136
|
-
});
|
|
137
|
-
});
|
|
138
|
-
// ---------------------------------------------------------------
|
|
139
|
-
// read errors
|
|
140
|
-
// ---------------------------------------------------------------
|
|
141
|
-
describe("read errors", () => {
|
|
142
|
-
test("read nonexistent key throws ENOENT", async () => {
|
|
143
|
-
try {
|
|
144
|
-
await store.read("nonexistent");
|
|
145
|
-
expect.fail("should have thrown");
|
|
146
|
-
}
|
|
147
|
-
catch (err) {
|
|
148
|
-
expectErrorCode(err, "ENOENT");
|
|
149
|
-
}
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
// ---------------------------------------------------------------
|
|
153
|
-
// delete
|
|
154
|
-
// ---------------------------------------------------------------
|
|
155
|
-
describe("delete", () => {
|
|
156
|
-
test("delete then read throws ENOENT", async () => {
|
|
157
|
-
const data = makeData(16);
|
|
158
|
-
await store.write("key", data);
|
|
159
|
-
await store.delete("key");
|
|
160
|
-
try {
|
|
161
|
-
await store.read("key");
|
|
162
|
-
expect.fail("should have thrown");
|
|
163
|
-
}
|
|
164
|
-
catch (err) {
|
|
165
|
-
expectErrorCode(err, "ENOENT");
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
test("delete nonexistent key is no-op", async () => {
|
|
169
|
-
// Should not throw.
|
|
170
|
-
await store.delete("nonexistent");
|
|
171
|
-
});
|
|
172
|
-
});
|
|
173
|
-
// ---------------------------------------------------------------
|
|
174
|
-
// deleteMany
|
|
175
|
-
// ---------------------------------------------------------------
|
|
176
|
-
describe("deleteMany", () => {
|
|
177
|
-
test("deleteMany removes multiple keys", async () => {
|
|
178
|
-
await store.write("a", makeData(8, 0x01));
|
|
179
|
-
await store.write("b", makeData(8, 0x02));
|
|
180
|
-
await store.write("c", makeData(8, 0x03));
|
|
181
|
-
await store.deleteMany(["a", "b"]);
|
|
182
|
-
// a and b should be gone.
|
|
183
|
-
try {
|
|
184
|
-
await store.read("a");
|
|
185
|
-
expect.fail("should have thrown");
|
|
186
|
-
}
|
|
187
|
-
catch (err) {
|
|
188
|
-
expectErrorCode(err, "ENOENT");
|
|
189
|
-
}
|
|
190
|
-
try {
|
|
191
|
-
await store.read("b");
|
|
192
|
-
expect.fail("should have thrown");
|
|
193
|
-
}
|
|
194
|
-
catch (err) {
|
|
195
|
-
expectErrorCode(err, "ENOENT");
|
|
196
|
-
}
|
|
197
|
-
// c should still exist.
|
|
198
|
-
const result = await store.read("c");
|
|
199
|
-
expect(result).toEqual(makeData(8, 0x03));
|
|
200
|
-
});
|
|
201
|
-
test("deleteMany with nonexistent keys is no-op", async () => {
|
|
202
|
-
await store.write("x", makeData(4));
|
|
203
|
-
// Should not throw even if some keys don't exist.
|
|
204
|
-
await store.deleteMany(["x", "nonexistent1", "nonexistent2"]);
|
|
205
|
-
try {
|
|
206
|
-
await store.read("x");
|
|
207
|
-
expect.fail("should have thrown");
|
|
208
|
-
}
|
|
209
|
-
catch (err) {
|
|
210
|
-
expectErrorCode(err, "ENOENT");
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
test("deleteMany empty array is no-op", async () => {
|
|
214
|
-
// Should not throw.
|
|
215
|
-
await store.deleteMany([]);
|
|
216
|
-
});
|
|
217
|
-
});
|
|
218
|
-
// ---------------------------------------------------------------
|
|
219
|
-
// copy (gated)
|
|
220
|
-
// ---------------------------------------------------------------
|
|
221
|
-
describe.skipIf(!capabilities.copy)("copy", () => {
|
|
222
|
-
test("copy round-trip", async () => {
|
|
223
|
-
const data = makeData(128, 0xcc);
|
|
224
|
-
await store.write("src", data);
|
|
225
|
-
await store.copy("src", "dst");
|
|
226
|
-
const result = await store.read("dst");
|
|
227
|
-
expect(result).toEqual(data);
|
|
228
|
-
});
|
|
229
|
-
test("copy creates independent data", async () => {
|
|
230
|
-
const data = makeData(64, 0xdd);
|
|
231
|
-
await store.write("src", data);
|
|
232
|
-
await store.copy("src", "dst");
|
|
233
|
-
// Overwrite source.
|
|
234
|
-
const newData = makeData(32, 0xee);
|
|
235
|
-
await store.write("src", newData);
|
|
236
|
-
// Destination should still have original data.
|
|
237
|
-
const result = await store.read("dst");
|
|
238
|
-
expect(result).toEqual(data);
|
|
239
|
-
});
|
|
240
|
-
test("copy nonexistent source throws ENOENT", async () => {
|
|
241
|
-
try {
|
|
242
|
-
await store.copy("missing", "dst");
|
|
243
|
-
expect.fail("should have thrown");
|
|
244
|
-
}
|
|
245
|
-
catch (err) {
|
|
246
|
-
expectErrorCode(err, "ENOENT");
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
});
|
|
250
|
-
});
|
|
251
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Shared FsMetadataStore conformance test suite.
|
|
3
|
-
*
|
|
4
|
-
* Every FsMetadataStore implementation must pass the tests in this suite.
|
|
5
|
-
* Optional test groups are gated on capability flags declared in the config.
|
|
6
|
-
*
|
|
7
|
-
* Usage:
|
|
8
|
-
*
|
|
9
|
-
* ```typescript
|
|
10
|
-
* import { defineMetadataStoreTests } from "@secure-exec/core/test/metadata-store-conformance";
|
|
11
|
-
*
|
|
12
|
-
* defineMetadataStoreTests({
|
|
13
|
-
* name: "InMemoryMetadataStore",
|
|
14
|
-
* createStore: () => new InMemoryMetadataStore(),
|
|
15
|
-
* capabilities: { versioning: false },
|
|
16
|
-
* });
|
|
17
|
-
* ```
|
|
18
|
-
*
|
|
19
|
-
* The `versioning` capability flag gates tests for the optional
|
|
20
|
-
* FsMetadataStoreVersioning interface (deferred to US-013).
|
|
21
|
-
*/
|
|
22
|
-
import type { FsMetadataStore } from "../vfs/types.js";
|
|
23
|
-
export interface MetadataStoreConformanceCapabilities {
|
|
24
|
-
/** Whether the store implements FsMetadataStoreVersioning. */
|
|
25
|
-
versioning: boolean;
|
|
26
|
-
}
|
|
27
|
-
export interface MetadataStoreConformanceConfig {
|
|
28
|
-
/** Human-readable name shown in the describe block. */
|
|
29
|
-
name: string;
|
|
30
|
-
/** Create a fresh metadata store instance for each test. */
|
|
31
|
-
createStore: () => Promise<FsMetadataStore> | FsMetadataStore;
|
|
32
|
-
/** Optional teardown called after each test. */
|
|
33
|
-
cleanup?: () => Promise<void>;
|
|
34
|
-
/** Which optional capabilities the store supports. */
|
|
35
|
-
capabilities: MetadataStoreConformanceCapabilities;
|
|
36
|
-
}
|
|
37
|
-
export declare function defineMetadataStoreTests(config: MetadataStoreConformanceConfig): void;
|