Files
bun.sh/test/js/node/zlib/leak.test.ts
2025-07-02 21:48:24 -07:00

134 lines
3.9 KiB
TypeScript

import { beforeAll, describe, expect, test } from "bun:test";
import { isASAN } from "harness";
import { promisify } from "node:util";
import zlib from "node:zlib";
const input = Buffer.alloc(50000);
for (let i = 0; i < input.length; i++) input[i] = Math.random();
const upper = 1024 * 1024 * (isASAN ? 20 : 10);
describe("zlib compression does not leak memory", () => {
beforeAll(() => {
for (let index = 0; index < 10_000; index++) {
zlib.deflateSync(input);
}
Bun.gc(true);
console.log("beforeAll done");
});
for (const compress of ["deflate", "gzip"] as const) {
test(
compress,
async () => {
for (let index = 0; index < 10_000; index++) {
await promisify(zlib[compress])(input);
}
const baseline = process.memoryUsage.rss();
console.log(baseline);
for (let index = 0; index < 10_000; index++) {
await promisify(zlib[compress])(input);
}
Bun.gc(true);
const after = process.memoryUsage.rss();
console.log(after);
console.log("-", after - baseline);
console.log("-", upper);
expect(after - baseline).toBeLessThan(upper);
},
0,
);
}
for (const compress of ["deflateSync", "gzipSync"] as const) {
test(
compress,
async () => {
for (let index = 0; index < 10_000; index++) {
zlib[compress](input);
}
const baseline = process.memoryUsage.rss();
console.log(baseline);
for (let index = 0; index < 10_000; index++) {
zlib[compress](input);
}
Bun.gc(true);
const after = process.memoryUsage.rss();
console.log(after);
console.log("-", after - baseline);
console.log("-", upper);
expect(after - baseline).toBeLessThan(upper);
},
0,
);
}
test("brotliCompress", async () => {
for (let index = 0; index < 1_000; index++) {
await promisify(zlib.brotliCompress)(input);
}
const baseline = process.memoryUsage.rss();
console.log(baseline);
for (let index = 0; index < 1_000; index++) {
await promisify(zlib.brotliCompress)(input);
}
Bun.gc(true);
const after = process.memoryUsage.rss();
console.log(after);
console.log("-", after - baseline);
console.log("-", upper);
expect(after - baseline).toBeLessThan(upper);
}, 0);
test("brotliCompressSync", async () => {
for (let index = 0; index < 1_000; index++) {
zlib.brotliCompressSync(input);
}
const baseline = process.memoryUsage.rss();
console.log(baseline);
for (let index = 0; index < 1_000; index++) {
zlib.brotliCompressSync(input);
}
Bun.gc(true);
const after = process.memoryUsage.rss();
console.log(after);
console.log("-", after - baseline);
console.log("-", upper);
expect(after - baseline).toBeLessThan(upper);
}, 0);
test("zstdCompress", async () => {
for (let index = 0; index < 1_000; index++) {
await promisify(zlib.zstdCompress)(input);
}
const baseline = process.memoryUsage.rss();
console.log(baseline);
for (let index = 0; index < 1_000; index++) {
await promisify(zlib.zstdCompress)(input);
}
Bun.gc(true);
const after = process.memoryUsage.rss();
console.log(after);
console.log("-", after - baseline);
console.log("-", upper);
expect(after - baseline).toBeLessThan(upper);
}, 0);
test("zstdCompressSync", async () => {
for (let index = 0; index < 1_000; index++) {
zlib.zstdCompressSync(input);
}
const baseline = process.memoryUsage.rss();
console.log(baseline);
for (let index = 0; index < 1_000; index++) {
zlib.zstdCompressSync(input);
}
Bun.gc(true);
const after = process.memoryUsage.rss();
console.log(after);
console.log("-", after - baseline);
console.log("-", upper);
expect(after - baseline).toBeLessThan(upper);
}, 0);
});