Skip to content

Commit 8f295f1

Browse files
committed
refactor(test): dedupe zip central directory fixture
1 parent 00a06ea commit 8f295f1

3 files changed

Lines changed: 27 additions & 50 deletions

File tree

src/infra/archive.test.ts

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import * as tar from "tar";
66
import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
77
import { createSuiteTempRootTracker } from "../test-helpers/temp-dir.js";
88
import { withRealpathSymlinkRebindRace } from "../test-utils/symlink-rebind-race.js";
9+
import { createZipCentralDirectoryArchive } from "../test-utils/zip-central-directory-fixture.js";
910
import type { ArchiveSecurityError } from "./archive.js";
1011
import {
1112
extractArchive,
@@ -91,31 +92,6 @@ async function expectExtractedSizeBudgetExceeded(params: {
9192
).rejects.toThrow("archive extracted size exceeds limit");
9293
}
9394

94-
function createZipCentralDirectoryArchive(params: {
95-
actualEntryCount: number;
96-
declaredEntryCount?: number;
97-
declaredCentralDirectorySize?: number;
98-
}): Buffer {
99-
const centralDirectory = Buffer.concat(
100-
Array.from({ length: params.actualEntryCount }, (_, index) => {
101-
const name = Buffer.from(`file-${index}.txt`);
102-
const header = Buffer.alloc(46 + name.byteLength);
103-
header.writeUInt32LE(0x02014b50, 0);
104-
header.writeUInt16LE(name.byteLength, 28);
105-
name.copy(header, 46);
106-
return header;
107-
}),
108-
);
109-
const declaredEntryCount = params.declaredEntryCount ?? params.actualEntryCount;
110-
const eocd = Buffer.alloc(22);
111-
eocd.writeUInt32LE(0x06054b50, 0);
112-
eocd.writeUInt16LE(Math.min(declaredEntryCount, 0xffff), 8);
113-
eocd.writeUInt16LE(Math.min(declaredEntryCount, 0xffff), 10);
114-
eocd.writeUInt32LE(params.declaredCentralDirectorySize ?? centralDirectory.byteLength, 12);
115-
eocd.writeUInt32LE(0, 16);
116-
return Buffer.concat([centralDirectory, eocd]);
117-
}
118-
11995
beforeAll(async () => {
12096
await fixtureRootTracker.setup();
12197
});

src/plugins/clawhub.test.ts

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import path from "node:path";
66
import { Readable } from "node:stream";
77
import JSZip from "jszip";
88
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
9+
import { createZipCentralDirectoryArchive } from "../test-utils/zip-central-directory-fixture.js";
910

1011
const parseClawHubPluginSpecMock = vi.fn();
1112
const fetchClawHubPackageDetailMock = vi.fn();
@@ -107,31 +108,6 @@ function createLoggerSpies() {
107108
};
108109
}
109110

110-
function createZipCentralDirectoryArchive(params: {
111-
actualEntryCount: number;
112-
declaredEntryCount?: number;
113-
declaredCentralDirectorySize?: number;
114-
}): Buffer {
115-
const centralDirectory = Buffer.concat(
116-
Array.from({ length: params.actualEntryCount }, (_, index) => {
117-
const name = Buffer.from(`file-${index}.txt`);
118-
const header = Buffer.alloc(46 + name.byteLength);
119-
header.writeUInt32LE(0x02014b50, 0);
120-
header.writeUInt16LE(name.byteLength, 28);
121-
name.copy(header, 46);
122-
return header;
123-
}),
124-
);
125-
const declaredEntryCount = params.declaredEntryCount ?? params.actualEntryCount;
126-
const eocd = Buffer.alloc(22);
127-
eocd.writeUInt32LE(0x06054b50, 0);
128-
eocd.writeUInt16LE(Math.min(declaredEntryCount, 0xffff), 8);
129-
eocd.writeUInt16LE(Math.min(declaredEntryCount, 0xffff), 10);
130-
eocd.writeUInt32LE(params.declaredCentralDirectorySize ?? centralDirectory.byteLength, 12);
131-
eocd.writeUInt32LE(0, 16);
132-
return Buffer.concat([centralDirectory, eocd]);
133-
}
134-
135111
function expectClawHubInstallFlow(params: {
136112
baseUrl: string;
137113
version: string;
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Builds minimal ZIP central-directory-only archives for archive limit tests.
2+
export function createZipCentralDirectoryArchive(params: {
3+
actualEntryCount: number;
4+
declaredEntryCount?: number;
5+
declaredCentralDirectorySize?: number;
6+
}): Buffer {
7+
const centralDirectory = Buffer.concat(
8+
Array.from({ length: params.actualEntryCount }, (_, index) => {
9+
const name = Buffer.from(`file-${index}.txt`);
10+
const header = Buffer.alloc(46 + name.byteLength);
11+
header.writeUInt32LE(0x02014b50, 0);
12+
header.writeUInt16LE(name.byteLength, 28);
13+
name.copy(header, 46);
14+
return header;
15+
}),
16+
);
17+
const declaredEntryCount = params.declaredEntryCount ?? params.actualEntryCount;
18+
const eocd = Buffer.alloc(22);
19+
eocd.writeUInt32LE(0x06054b50, 0);
20+
eocd.writeUInt16LE(Math.min(declaredEntryCount, 0xffff), 8);
21+
eocd.writeUInt16LE(Math.min(declaredEntryCount, 0xffff), 10);
22+
eocd.writeUInt32LE(params.declaredCentralDirectorySize ?? centralDirectory.byteLength, 12);
23+
eocd.writeUInt32LE(0, 16);
24+
return Buffer.concat([centralDirectory, eocd]);
25+
}

0 commit comments

Comments
 (0)