


























@@ -82,6 +82,7 @@ import {
82828383type SandboxBrowserRegistryEntry = import("./registry.js").SandboxBrowserRegistryEntry;
8484type SandboxRegistryEntry = import("./registry.js").SandboxRegistryEntry;
85+type MigrationResult = Awaited<ReturnType<typeof migrateLegacySandboxRegistryFiles>>[number];
85868687function payloadMentionsContainer(payload: string, containerName: string): boolean {
8788return (
@@ -189,7 +190,24 @@ async function seedStaleLock(lockPath: string) {
189190}
190191191192async function expectPathMissing(targetPath: string): Promise<void> {
192-await expect(fs.access(targetPath)).rejects.toMatchObject({ code: "ENOENT" });
193+try {
194+await fs.access(targetPath);
195+throw new Error(`expected ${targetPath} to be missing`);
196+} catch (error) {
197+const code = error && typeof error === "object" && "code" in error ? error.code : undefined;
198+expect(code).toBe("ENOENT");
199+}
200+}
201+202+function requireMigrationResult(
203+results: readonly MigrationResult[],
204+kind: MigrationResult["kind"],
205+): MigrationResult {
206+const result = results.find((candidate) => candidate.kind === kind);
207+if (!result) {
208+throw new Error(`expected migration result for ${kind}`);
209+}
210+return result;
193211}
194212195213describe("registry race safety", () => {
@@ -214,14 +232,12 @@ describe("registry race safety", () => {
214232215233await migrateLegacySandboxRegistryFiles();
216234const registry = await readRegistry();
217-expect(registry.entries).toEqual([
218-expect.objectContaining({
219-containerName: "legacy-container",
220-backendId: "docker",
221-runtimeLabel: "legacy-container",
222-configLabelKind: "Image",
223-}),
224-]);
235+expect(registry.entries).toHaveLength(1);
236+const [entry] = registry.entries;
237+expect(entry?.containerName).toBe("legacy-container");
238+expect(entry?.backendId).toBe("docker");
239+expect(entry?.runtimeLabel).toBe("legacy-container");
240+expect(entry?.configLabelKind).toBe("Image");
225241});
226242227243it("migrates legacy container and browser registry files after explicit repair", async () => {
@@ -245,37 +261,34 @@ describe("registry race safety", () => {
245261await seedStaleLock(`${SANDBOX_REGISTRY_PATH}.lock`);
246262await seedStaleLock(`${SANDBOX_BROWSER_REGISTRY_PATH}.lock`);
247263248-await expect(migrateLegacySandboxRegistryFiles()).resolves.toEqual([
249-expect.objectContaining({ kind: "containers", status: "migrated", entries: 1 }),
250-expect.objectContaining({ kind: "browsers", status: "migrated", entries: 1 }),
251-]);
264+const migrationResults = await migrateLegacySandboxRegistryFiles();
265+const containerMigration = requireMigrationResult(migrationResults, "containers");
266+const browserMigration = requireMigrationResult(migrationResults, "browsers");
267+expect(containerMigration.status).toBe("migrated");
268+expect(containerMigration.entries).toBe(1);
269+expect(browserMigration.status).toBe("migrated");
270+expect(browserMigration.entries).toBe(1);
252271253272await expectPathMissing(SANDBOX_REGISTRY_PATH);
254273await expectPathMissing(SANDBOX_BROWSER_REGISTRY_PATH);
255274await expectPathMissing(`${SANDBOX_REGISTRY_PATH}.lock`);
256275await expectPathMissing(`${SANDBOX_BROWSER_REGISTRY_PATH}.lock`);
257-await expect(readRegistry()).resolves.toEqual({
258-entries: [
259-expect.objectContaining({
260-containerName: "legacy-container",
261-backendId: "docker",
262-runtimeLabel: "legacy-container",
263-sessionKey: "agent:legacy",
264-configHash: "legacy-container-hash",
265-}),
266-],
267-});
268-await expect(readBrowserRegistry()).resolves.toEqual({
269-entries: [
270-expect.objectContaining({
271-containerName: "legacy-browser",
272-sessionKey: "agent:legacy",
273-cdpPort: 9333,
274-noVncPort: 6081,
275-configHash: "legacy-browser-hash",
276-}),
277-],
278-});
276+const containerRegistry = await readRegistry();
277+expect(containerRegistry.entries).toHaveLength(1);
278+const [container] = containerRegistry.entries;
279+expect(container?.containerName).toBe("legacy-container");
280+expect(container?.backendId).toBe("docker");
281+expect(container?.runtimeLabel).toBe("legacy-container");
282+expect(container?.sessionKey).toBe("agent:legacy");
283+expect(container?.configHash).toBe("legacy-container-hash");
284+const browserRegistry = await readBrowserRegistry();
285+expect(browserRegistry.entries).toHaveLength(1);
286+const [browser] = browserRegistry.entries;
287+expect(browser?.containerName).toBe("legacy-browser");
288+expect(browser?.sessionKey).toBe("agent:legacy");
289+expect(browser?.cdpPort).toBe(9333);
290+expect(browser?.noVncPort).toBe(6081);
291+expect(browser?.configHash).toBe("legacy-browser-hash");
279292});
280293281294it("does not overwrite newer sharded entries during legacy migration", async () => {
@@ -297,25 +310,17 @@ describe("registry race safety", () => {
297310await migrateLegacySandboxRegistryFiles();
298311299312const entry = await readRegistryEntry("container-a");
300-expect(entry).toEqual(
301-expect.objectContaining({
302-sessionKey: "new-session",
303-lastUsedAtMs: 10,
304-}),
305-);
313+expect(entry?.sessionKey).toBe("new-session");
314+expect(entry?.lastUsedAtMs).toBe(10);
306315});
307316308317it("reads a single sharded entry without scanning the full registry", async () => {
309318await updateRegistry(containerEntry({ containerName: "container-x", sessionKey: "sess:x" }));
310319await updateRegistry(containerEntry({ containerName: "container-y", sessionKey: "sess:y" }));
311320312321const entry = await readRegistryEntry("container-x");
313-expect(entry).toEqual(
314-expect.objectContaining({
315-containerName: "container-x",
316-sessionKey: "sess:x",
317-}),
318-);
322+expect(entry?.containerName).toBe("container-x");
323+expect(entry?.sessionKey).toBe("sess:x");
319324await expect(readRegistryEntry("missing-container")).resolves.toBeNull();
320325});
321326@@ -424,9 +429,10 @@ describe("registry race safety", () => {
424429const invalidEntries = `{"entries":[{"sessionKey":"agent:main"}]}`;
425430await seedMalformedContainerRegistry(invalidEntries);
426431await seedMalformedBrowserRegistry(invalidEntries);
427-await expect(migrateLegacySandboxRegistryFiles()).resolves.toEqual([
428-expect.objectContaining({ kind: "containers", status: "quarantined-invalid" }),
429-expect.objectContaining({ kind: "browsers", status: "quarantined-invalid" }),
430-]);
432+const migrationResults = await migrateLegacySandboxRegistryFiles();
433+expect(requireMigrationResult(migrationResults, "containers").status).toBe(
434+"quarantined-invalid",
435+);
436+expect(requireMigrationResult(migrationResults, "browsers").status).toBe("quarantined-invalid");
431437});
432438});
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。