Speed up some more tests (#25892)

### What does this PR do?

### How did you verify your code works?
This commit is contained in:
Jarred Sumner
2026-01-07 23:39:10 -08:00
committed by GitHub
parent fbf47d0256
commit bf1e4922b4
3 changed files with 177 additions and 152 deletions

View File

@@ -1,25 +1,20 @@
import { spawn, spawnSync } from "bun"; import { spawn } from "bun";
import { upgrade_test_helpers } from "bun:internal-for-testing"; import { upgrade_test_helpers } from "bun:internal-for-testing";
import { beforeAll, beforeEach, expect, it, setDefaultTimeout } from "bun:test"; import { beforeAll, describe, expect, it, setDefaultTimeout } from "bun:test";
import { bunExe, bunEnv as env, tls, tmpdirSync } from "harness"; import { bunExe, bunEnv as env, tls, tmpdirSync } from "harness";
import { copyFileSync } from "node:fs"; import { copyFile } from "node:fs/promises";
import { basename, join } from "path"; import { basename, join } from "path";
const { openTempDirWithoutSharingDelete, closeTempDirHandle } = upgrade_test_helpers; const { openTempDirWithoutSharingDelete, closeTempDirHandle } = upgrade_test_helpers;
let cwd: string;
let execPath: string;
beforeAll(() => { beforeAll(() => {
setDefaultTimeout(1000 * 60 * 5); setDefaultTimeout(1000 * 60 * 5);
}); });
beforeEach(async () => { describe.concurrent(() => {
cwd = tmpdirSync(); it("two invalid arguments, should display error message and suggest command", async () => {
execPath = join(cwd, basename(bunExe())); const cwd = tmpdirSync();
copyFileSync(bunExe(), execPath); const execPath = join(cwd, basename(bunExe()));
}); await copyFile(bunExe(), execPath);
it("two invalid arguments, should display error message and suggest command", async () => {
const { stderr } = spawn({ const { stderr } = spawn({
cmd: [execPath, "upgrade", "bun-types", "--dev"], cmd: [execPath, "upgrade", "bun-types", "--dev"],
cwd, cwd,
@@ -32,9 +27,12 @@ it("two invalid arguments, should display error message and suggest command", as
const err = await stderr.text(); const err = await stderr.text();
expect(err.split(/\r?\n/)).toContain("error: This command updates Bun itself, and does not take package names."); expect(err.split(/\r?\n/)).toContain("error: This command updates Bun itself, and does not take package names.");
expect(err.split(/\r?\n/)).toContain("note: Use `bun update bun-types --dev` instead."); expect(err.split(/\r?\n/)).toContain("note: Use `bun update bun-types --dev` instead.");
}); });
it("two invalid arguments flipped, should display error message and suggest command", async () => { it("two invalid arguments flipped, should display error message and suggest command", async () => {
const cwd = tmpdirSync();
const execPath = join(cwd, basename(bunExe()));
await copyFile(bunExe(), execPath);
const { stderr } = spawn({ const { stderr } = spawn({
cmd: [execPath, "upgrade", "--dev", "bun-types"], cmd: [execPath, "upgrade", "--dev", "bun-types"],
cwd, cwd,
@@ -47,9 +45,12 @@ it("two invalid arguments flipped, should display error message and suggest comm
const err = await stderr.text(); const err = await stderr.text();
expect(err.split(/\r?\n/)).toContain("error: This command updates Bun itself, and does not take package names."); expect(err.split(/\r?\n/)).toContain("error: This command updates Bun itself, and does not take package names.");
expect(err.split(/\r?\n/)).toContain("note: Use `bun update --dev bun-types` instead."); expect(err.split(/\r?\n/)).toContain("note: Use `bun update --dev bun-types` instead.");
}); });
it("one invalid argument, should display error message and suggest command", async () => { it("one invalid argument, should display error message and suggest command", async () => {
const cwd = tmpdirSync();
const execPath = join(cwd, basename(bunExe()));
await copyFile(bunExe(), execPath);
const { stderr } = spawn({ const { stderr } = spawn({
cmd: [execPath, "upgrade", "bun-types"], cmd: [execPath, "upgrade", "bun-types"],
cwd, cwd,
@@ -62,9 +63,12 @@ it("one invalid argument, should display error message and suggest command", asy
const err = await stderr.text(); const err = await stderr.text();
expect(err.split(/\r?\n/)).toContain("error: This command updates Bun itself, and does not take package names."); expect(err.split(/\r?\n/)).toContain("error: This command updates Bun itself, and does not take package names.");
expect(err.split(/\r?\n/)).toContain("note: Use `bun update bun-types` instead."); expect(err.split(/\r?\n/)).toContain("note: Use `bun update bun-types` instead.");
}); });
it("one valid argument, should succeed", async () => { it("one valid argument, should succeed", async () => {
const cwd = tmpdirSync();
const execPath = join(cwd, basename(bunExe()));
await copyFile(bunExe(), execPath);
const { stderr } = spawn({ const { stderr } = spawn({
cmd: [execPath, "upgrade", "--help"], cmd: [execPath, "upgrade", "--help"],
cwd, cwd,
@@ -76,11 +80,16 @@ it("one valid argument, should succeed", async () => {
const err = await stderr.text(); const err = await stderr.text();
// Should not contain error message // Should not contain error message
expect(err.split(/\r?\n/)).not.toContain("error: This command updates bun itself, and does not take package names."); expect(err.split(/\r?\n/)).not.toContain(
"error: This command updates bun itself, and does not take package names.",
);
expect(err.split(/\r?\n/)).not.toContain("note: Use `bun update --help` instead."); expect(err.split(/\r?\n/)).not.toContain("note: Use `bun update --help` instead.");
}); });
it("two valid argument, should succeed", async () => { it("two valid argument, should succeed", async () => {
const cwd = tmpdirSync();
const execPath = join(cwd, basename(bunExe()));
await copyFile(bunExe(), execPath);
const { stderr } = spawn({ const { stderr } = spawn({
cmd: [execPath, "upgrade", "--stable", "--profile"], cmd: [execPath, "upgrade", "--stable", "--profile"],
cwd, cwd,
@@ -92,11 +101,13 @@ it("two valid argument, should succeed", async () => {
const err = await stderr.text(); const err = await stderr.text();
// Should not contain error message // Should not contain error message
expect(err.split(/\r?\n/)).not.toContain("error: This command updates Bun itself, and does not take package names."); expect(err.split(/\r?\n/)).not.toContain(
"error: This command updates Bun itself, and does not take package names.",
);
expect(err.split(/\r?\n/)).not.toContain("note: Use `bun update --stable --profile` instead."); expect(err.split(/\r?\n/)).not.toContain("note: Use `bun update --stable --profile` instead.");
}); });
it("zero arguments, should succeed", async () => { it("zero arguments, should succeed", async () => {
const tagName = bunExe().includes("-debug") ? "canary" : `bun-v${Bun.version}`; const tagName = bunExe().includes("-debug") ? "canary" : `bun-v${Bun.version}`;
using server = Bun.serve({ using server = Bun.serve({
tls: tls, tls: tls,
@@ -157,8 +168,11 @@ it("zero arguments, should succeed", async () => {
// On windows, open the temporary directory without FILE_SHARE_DELETE before spawning // On windows, open the temporary directory without FILE_SHARE_DELETE before spawning
// the upgrade process. This is to test for EBUSY errors // the upgrade process. This is to test for EBUSY errors
openTempDirWithoutSharingDelete(); openTempDirWithoutSharingDelete();
const cwd = tmpdirSync();
const execPath = join(cwd, basename(bunExe()));
await copyFile(bunExe(), execPath);
const { stderr } = spawnSync({ const { stderr } = Bun.spawn({
cmd: [execPath, "upgrade"], cmd: [execPath, "upgrade"],
cwd, cwd,
stdout: null, stdout: null,
@@ -174,5 +188,6 @@ it("zero arguments, should succeed", async () => {
closeTempDirHandle(); closeTempDirHandle();
// Should not contain error message // Should not contain error message
expect(stderr.toString()).not.toContain("error:"); expect(await stderr.text()).not.toContain("error:");
});
}); });

View File

@@ -811,6 +811,16 @@ export async function toBeWorkspaceLink(actual: string, expectedLinkPath: string
return { pass, message }; return { pass, message };
} }
export function getFDCount(): number {
if (isMacOS || isLinux) {
return fs.readdirSync(isMacOS ? "/dev/fd" : "/proc/self/fd").length;
}
const maxFD = openSync("/dev/null", "r");
closeSync(maxFD);
return maxFD;
}
export function getMaxFD(): number { export function getMaxFD(): number {
if (isMacOS || isLinux) { if (isMacOS || isLinux) {
let max = -1; let max = -1;

View File

@@ -3,7 +3,7 @@ import { describe, test } from "bun:test";
import { bunEnv, bunExe, isASAN, isBroken, isLinux, nodeExe } from "harness"; import { bunEnv, bunExe, isASAN, isBroken, isLinux, nodeExe } from "harness";
import { basename, join } from "path"; import { basename, join } from "path";
describe("AsyncLocalStorage passes context to callbacks", () => { describe.concurrent("AsyncLocalStorage passes context to callbacks", () => {
let files = [...new Glob(join(import.meta.dir, "async-context", "async-context-*.js")).scanSync()]; let files = [...new Glob(join(import.meta.dir, "async-context", "async-context-*.js")).scanSync()];
let todos = ["async-context-worker_threads-message.js"]; let todos = ["async-context-worker_threads-message.js"];