Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Do not run shell tests outside test scope #10199

Merged
merged 6 commits into from
Apr 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/js/private.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ declare module "bun" {
var TOML: {
parse(contents: string): any;
};
function jest(): typeof import("bun:test");
function jest(path: string): typeof import("bun:test");
var main: string;
var tty: Array<{ hasColors: boolean }>;
var FFI: any;
Expand Down
20 changes: 11 additions & 9 deletions src/shell/interpreter.zig
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ const stderr_no = 2;

pub fn OOM(e: anyerror) noreturn {
if (comptime bun.Environment.allow_assert) {
if (e != error.OutOfMemory) @panic("Ruh roh");
if (e != error.OutOfMemory) bun.outOfMemory();
}
@panic("Out of memory");
}
Expand Down Expand Up @@ -2123,7 +2123,7 @@ pub const Interpreter = struct {
return;
}

unreachable;
@panic("Invalid child to Expansion, this indicates a bug in Bun. Please file a report on Github.");
}

fn onGlobWalkDone(this: *Expansion, task: *ShellGlobTask) void {
Expand Down Expand Up @@ -2742,7 +2742,7 @@ pub const Interpreter = struct {
return;
}

unreachable;
@panic("Invalid child to Assigns expression, this indicates a bug in Bun. Please file a report on Github.");
}
};

Expand Down Expand Up @@ -2910,7 +2910,7 @@ pub const Interpreter = struct {
parent: ParentPtr,
io: IO,
) *Binary {
var binary = interpreter.allocator.create(Binary) catch |err| std.debug.panic("Ruh roh: {any}\n", .{err});
var binary = interpreter.allocator.create(Binary) catch bun.outOfMemory();
binary.node = node;
binary.base = .{ .kind = .binary, .interpreter = interpreter, .shell = shell_state };
binary.parent = parent;
Expand Down Expand Up @@ -3234,7 +3234,7 @@ pub const Interpreter = struct {
if (ptr == @as(usize, @intCast(child.ptr.repr._ptr))) break :brk i;
}
}
unreachable;
@panic("Invalid pipeline state");
};

log("pipeline child done {x} ({d}) i={d}", .{ @intFromPtr(this), exit_code, idx });
Expand Down Expand Up @@ -4347,7 +4347,7 @@ pub const Interpreter = struct {
parent: ParentPtr,
io: IO,
) *Cmd {
var cmd = interpreter.allocator.create(Cmd) catch |err| std.debug.panic("Ruh roh: {any}\n", .{err});
var cmd = interpreter.allocator.create(Cmd) catch bun.outOfMemory();
cmd.* = .{
.base = .{ .kind = .cmd, .interpreter = interpreter, .shell = shell_state },
.node = node,
Expand Down Expand Up @@ -4522,7 +4522,8 @@ pub const Interpreter = struct {
this.next();
return;
}
unreachable;

@panic("Expected Cmd child to be Assigns or Expansion. This indicates a bug in Bun. Please file a GitHub issue. ");
}

fn initSubproc(this: *Cmd) void {
Expand Down Expand Up @@ -7115,7 +7116,8 @@ pub const Interpreter = struct {
while (!(this.state == .err or this.state == .done)) {
switch (this.state) {
.waiting_io => return,
.idle, .done, .err => unreachable,
.idle => @panic("Unexpected \"idle\" state in Pwd. This indicates a bug in Bun. Please file a GitHub issue."),
.done, .err => unreachable,
}
}

Expand Down Expand Up @@ -9680,7 +9682,7 @@ pub const Interpreter = struct {

pub fn next(this: *Exit) void {
switch (this.state) {
.idle => unreachable,
.idle => @panic("Unexpected \"idle\" state in Exit. This indicates a bug in Bun. Please file a GitHub issue."),
.waiting_io => {
return;
},
Expand Down
15 changes: 10 additions & 5 deletions test/js/bun/shell/bunshell.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import { mkdir, mkdtemp, realpath, rm, stat } from "fs/promises";
import { bunEnv, bunExe, runWithErrorPromise, tempDirWithFiles } from "harness";
import { tmpdir } from "os";
import { join, sep } from "path";
import { TestBuilder, sortedShellOutput } from "./util";
import { createTestBuilder, sortedShellOutput } from "./util";
const TestBuilder = createTestBuilder(import.meta.path);

$.env(bunEnv);
$.cwd(process.cwd());
Expand Down Expand Up @@ -797,9 +798,10 @@ describe("deno_task", () => {

TestBuilder.command`echo 1 | echo 2 && echo 3`.stdout("2\n3\n").runAsTest("pipe in conditional");

await TestBuilder.command`echo $(sleep 0.1 && echo 2 & echo 1) | BUN_DEBUG_QUIET_LOGS=1 BUN_TEST_VAR=1 ${BUN} -e 'await process.stdin.pipe(process.stdout)'`
TestBuilder.command`echo $(sleep 0.1 && echo 2 & echo 1) | BUN_DEBUG_QUIET_LOGS=1 BUN_TEST_VAR=1 ${BUN} -e 'await process.stdin.pipe(process.stdout)'`
.stdout("1 2\n")
.run();
.todo("& not supported")
.runAsTest("complicated pipeline");

TestBuilder.command`echo 2 | echo 1 | BUN_TEST_VAR=1 ${BUN} -e 'process.stdin.pipe(process.stdout)'`
.stdout("1\n")
Expand Down Expand Up @@ -834,9 +836,12 @@ describe("deno_task", () => {
});

describe("redirects", async function igodf() {
await TestBuilder.command`echo 5 6 7 > test.txt`.fileEquals("test.txt", "5 6 7\n").run();
TestBuilder.command`echo 5 6 7 > test.txt`.fileEquals("test.txt", "5 6 7\n").runAsTest("basic redirect");

await TestBuilder.command`echo 1 2 3 && echo 1 > test.txt`.stdout("1 2 3\n").fileEquals("test.txt", "1\n").run();
TestBuilder.command`echo 1 2 3 && echo 1 > test.txt`
.stdout("1 2 3\n")
.fileEquals("test.txt", "1\n")
.runAsTest("basic redirect with &&");

// subdir
TestBuilder.command`mkdir subdir && cd subdir && echo 1 2 3 > test.txt`
Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/commands/basename.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $ } from "bun";
import { describe, test, expect } from "bun:test";
import { TestBuilder } from "../test_builder";
import { createTestBuilder } from "../test_builder";
const TestBuilder = createTestBuilder(import.meta.path);

describe("basename", async () => {
TestBuilder.command`basename`.exitCode(1).stdout("").stderr("usage: basename string\n").runAsTest("shows usage");
Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/commands/dirname.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $ } from "bun";
import { describe, test, expect } from "bun:test";
import { TestBuilder } from "../test_builder";
import { createTestBuilder } from "../test_builder";
const TestBuilder = createTestBuilder(import.meta.path);

describe("dirname", async () => {
TestBuilder.command`dirname`.exitCode(1).stdout("").stderr("usage: dirname string\n").runAsTest("shows usage");
Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/commands/exit.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $ } from "bun";
import { describe, test, expect } from "bun:test";
import { TestBuilder } from "../test_builder";
import { createTestBuilder } from "../test_builder";
const TestBuilder = createTestBuilder(import.meta.path);
import { sortedShellOutput } from "../util";
import { join } from "path";

Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/commands/false.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $ } from "bun";
import { describe, test, expect } from "bun:test";
import { TestBuilder } from "../test_builder";
import { createTestBuilder } from "../test_builder";
const TestBuilder = createTestBuilder(import.meta.path);

describe("false", async () => {
TestBuilder.command`false`.exitCode(1).runAsTest("works");
Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/commands/mv.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $ } from "bun";
import { describe, test, expect } from "bun:test";
import { TestBuilder } from "../test_builder";
import { createTestBuilder } from "../test_builder";
const TestBuilder = createTestBuilder(import.meta.path);
import { sortedShellOutput } from "../util";
import { join } from "path";

Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/commands/rm.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import { $ } from "bun";
import path from "path";
import { mkdirSync, writeFileSync } from "node:fs";
import { ShellOutput } from "bun";
import { TestBuilder, sortedShellOutput } from "../util";
import { createTestBuilder, sortedShellOutput } from "../util";
const TestBuilder = createTestBuilder(import.meta.path);

const fileExists = async (path: string): Promise<boolean> =>
$`ls -d ${path}`.then(o => o.stdout.toString() === `${path}\n`);
Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/commands/seq.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $ } from "bun";
import { describe } from "bun:test";
import { TestBuilder } from "../test_builder";
import { createTestBuilder } from "../test_builder";
const TestBuilder = createTestBuilder(import.meta.path);

describe("seq", async () => {
TestBuilder.command`seq`
Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/commands/true.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $ } from "bun";
import { describe, test, expect } from "bun:test";
import { TestBuilder } from "../test_builder";
import { createTestBuilder } from "../test_builder";
const TestBuilder = createTestBuilder(import.meta.path);

describe("true", async () => {
TestBuilder.command`true`.exitCode(0).runAsTest("works");
Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/env.positionals.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $, spawn } from "bun";
import { describe, test, expect } from "bun:test";
import { TestBuilder } from "./test_builder";
import { createTestBuilder } from "./test_builder";
const TestBuilder = createTestBuilder(import.meta.path);
import { bunEnv, bunExe } from "harness";
import * as path from "node:path";

Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/exec.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { $ } from "bun";
import { describe, test, expect } from "bun:test";
import { TestBuilder } from "./test_builder";
import { createTestBuilder } from "./test_builder";
const TestBuilder = createTestBuilder(import.meta.path);
import { bunEnv } from "harness";

const BUN = process.argv0;
Expand Down
14 changes: 10 additions & 4 deletions test/js/bun/shell/leak.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@ import { bunEnv } from "harness";
import { appendFileSync, closeSync, openSync, writeFileSync } from "node:fs";
import { tmpdir, devNull } from "os";
import { join } from "path";
import { TestBuilder } from "./util";
import { createTestBuilder } from "./util";
const TestBuilder = createTestBuilder(import.meta.path);
type TestBuilder = InstanceType<typeof TestBuilder>;

$.env(bunEnv);
$.cwd(process.cwd());
Expand Down Expand Up @@ -50,7 +52,7 @@ const TESTS: [name: string, builder: () => TestBuilder, runs?: number][] = [
];

describe("fd leak", () => {
function fdLeakTest(name: string, builder: () => TestBuilder, runs: number = 500, threshold: number = 5) {
function fdLeakTest(name: string, builder: () => TestBuilder, runs: number = 1000, threshold: number = 5) {
test(`fdleak_${name}`, async () => {
Bun.gc(true);
const baseline = openSync(devNull, "r");
Expand Down Expand Up @@ -83,13 +85,15 @@ describe("fd leak", () => {
writeFileSync(tempfile, testcode);

const impl = /* ts */ `
const TestBuilder = createTestBuilder(import.meta.path);

const threshold = ${threshold}
let prev: number | undefined = undefined;
let prevprev: number | undefined = undefined;
for (let i = 0; i < ${runs}; i++) {
Bun.gc(true);
await (async function() {
await ${builder.toString().slice("() =>".length)}.quiet().run()
await ${builder.toString().slice("() =>".length)}.quiet().runAsTest('iter:', i)
})()
Bun.gc(true);
Bun.gc(true);
Expand All @@ -111,7 +115,9 @@ describe("fd leak", () => {
env: bunEnv,
});
// console.log('STDOUT:', stdout.toString(), '\n\nSTDERR:', stderr.toString());
console.log("\n\nSTDERR:", stderr.toString());
if (exitCode != 0) {
console.log("\n\nSTDERR:", stderr.toString());
}
expect(exitCode).toBe(0);
}, 100_000);
}
Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/lex.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { $ } from "bun";
import { TestBuilder, redirect } from "./util";
import { createTestBuilder, redirect } from "./util";
import { shellInternals } from "bun:internal-for-testing";
const { lex } = shellInternals;
const TestBuilder = createTestBuilder(import.meta.path);

const BUN = process.argv0;

Expand Down
3 changes: 2 additions & 1 deletion test/js/bun/shell/parse.test.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { TestBuilder, redirect } from "./util";
import { createTestBuilder, redirect } from "./util";
import { shellInternals } from "bun:internal-for-testing";
const { parse } = shellInternals;
const TestBuilder = createTestBuilder(import.meta.path);

describe("parse shell", () => {
test("basic", () => {
Expand Down
Loading
Loading