aboutsummaryrefslogtreecommitdiff
path: root/test/js
diff options
context:
space:
mode:
Diffstat (limited to 'test/js')
-rw-r--r--test/js/bun/io/bun-write-exdev-fixture.js1
-rw-r--r--test/js/bun/io/bun-write.test.js78
-rw-r--r--test/js/node/fs/fs-fixture-copyFile-no-copy_file_range.js3
-rw-r--r--test/js/node/fs/fs.test.ts73
4 files changed, 153 insertions, 2 deletions
diff --git a/test/js/bun/io/bun-write-exdev-fixture.js b/test/js/bun/io/bun-write-exdev-fixture.js
new file mode 100644
index 000000000..81cd263e3
--- /dev/null
+++ b/test/js/bun/io/bun-write-exdev-fixture.js
@@ -0,0 +1 @@
+await Bun.write(Bun.file(process.argv.at(-1)), Bun.file(process.argv.at(-2)));
diff --git a/test/js/bun/io/bun-write.test.js b/test/js/bun/io/bun-write.test.js
index 120ba396d..b67df9405 100644
--- a/test/js/bun/io/bun-write.test.js
+++ b/test/js/bun/io/bun-write.test.js
@@ -1,6 +1,6 @@
-import fs from "fs";
+import fs, { mkdirSync } from "fs";
import { it, expect, describe } from "bun:test";
-import path from "path";
+import path, { join } from "path";
import { gcTick, withoutAggressiveGC, bunExe, bunEnv } from "harness";
import { tmpdir } from "os";
@@ -307,3 +307,77 @@ it("#2674", async () => {
expect(error?.length).toBeFalsy();
expect(exitCode).toBe(0);
});
+
+if (process.platform === "linux") {
+ describe("should work when copyFileRange is not available", () => {
+ it("on large files", () => {
+ var tempdir = `${tmpdir()}/fs.test.js/${Date.now()}-1/bun-write/large`;
+ expect(fs.existsSync(tempdir)).toBe(false);
+ expect(tempdir.includes(mkdirSync(tempdir, { recursive: true }))).toBe(true);
+ var buffer = new Int32Array(1024 * 1024 * 64);
+ for (let i = 0; i < buffer.length; i++) {
+ buffer[i] = i % 256;
+ }
+
+ const hash = Bun.hash(buffer.buffer);
+ const src = join(tempdir, "Bun.write.src.blob");
+ const dest = join(tempdir, "Bun.write.dest.blob");
+
+ try {
+ fs.writeFileSync(src, buffer.buffer);
+
+ expect(fs.existsSync(dest)).toBe(false);
+
+ const { exitCode } = Bun.spawnSync({
+ stdio: ["inherit", "inherit", "inherit"],
+ cmd: [bunExe(), join(import.meta.dir, "./bun-write-exdev-fixture.js"), src, dest],
+ env: {
+ ...bunEnv,
+ BUN_CONFIG_DISABLE_COPY_FILE_RANGE: "1",
+ },
+ });
+ expect(exitCode).toBe(0);
+
+ expect(Bun.hash(fs.readFileSync(dest))).toBe(hash);
+ } finally {
+ fs.rmSync(src, { force: true });
+ fs.rmSync(dest, { force: true });
+ }
+ });
+
+ it("on small files", () => {
+ const tempdir = `${tmpdir()}/fs.test.js/${Date.now()}-1/bun-write/small`;
+ expect(fs.existsSync(tempdir)).toBe(false);
+ expect(tempdir.includes(mkdirSync(tempdir, { recursive: true }))).toBe(true);
+ var buffer = new Int32Array(1 * 1024);
+ for (let i = 0; i < buffer.length; i++) {
+ buffer[i] = i % 256;
+ }
+
+ const hash = Bun.hash(buffer.buffer);
+ const src = join(tempdir, "Bun.write.src.blob");
+ const dest = join(tempdir, "Bun.write.dest.blob");
+
+ try {
+ fs.writeFileSync(src, buffer.buffer);
+
+ expect(fs.existsSync(dest)).toBe(false);
+
+ const { exitCode } = Bun.spawnSync({
+ stdio: ["inherit", "inherit", "inherit"],
+ cmd: [bunExe(), join(import.meta.dir, "./bun-write-exdev-fixture.js"), src, dest],
+ env: {
+ ...bunEnv,
+ BUN_CONFIG_DISABLE_COPY_FILE_RANGE: "1",
+ },
+ });
+ expect(exitCode).toBe(0);
+
+ expect(Bun.hash(fs.readFileSync(dest))).toBe(hash);
+ } finally {
+ fs.rmSync(src, { force: true });
+ fs.rmSync(dest, { force: true });
+ }
+ });
+ });
+}
diff --git a/test/js/node/fs/fs-fixture-copyFile-no-copy_file_range.js b/test/js/node/fs/fs-fixture-copyFile-no-copy_file_range.js
new file mode 100644
index 000000000..4e990e1c7
--- /dev/null
+++ b/test/js/node/fs/fs-fixture-copyFile-no-copy_file_range.js
@@ -0,0 +1,3 @@
+const { copyFileSync } = require("node:fs");
+
+copyFileSync(process.argv.at(-2), process.argv.at(-1));
diff --git a/test/js/node/fs/fs.test.ts b/test/js/node/fs/fs.test.ts
index 58fb455fc..fac7c2b57 100644
--- a/test/js/node/fs/fs.test.ts
+++ b/test/js/node/fs/fs.test.ts
@@ -134,6 +134,79 @@ describe("copyFileSync", () => {
copyFileSync(tempdir + "/copyFileSync.src.blob", tempdir + "/copyFileSync.dest.blob");
expect(Bun.hash(readFileSync(tempdir + "/copyFileSync.dest.blob"))).toBe(Bun.hash(buffer.buffer));
});
+
+ if (process.platform === "linux") {
+ describe("should work when copyFileRange is not available", () => {
+ it("on large files", () => {
+ const tempdir = `${tmpdir()}/fs.test.js/${Date.now()}-1/1234/large`;
+ expect(existsSync(tempdir)).toBe(false);
+ expect(tempdir.includes(mkdirSync(tempdir, { recursive: true })!)).toBe(true);
+ var buffer = new Int32Array(128 * 1024);
+ for (let i = 0; i < buffer.length; i++) {
+ buffer[i] = i % 256;
+ }
+
+ const hash = Bun.hash(buffer.buffer);
+ const src = tempdir + "/copyFileSync.src.blob";
+ const dest = tempdir + "/copyFileSync.dest.blob";
+
+ writeFileSync(src, buffer.buffer);
+ try {
+ expect(existsSync(dest)).toBe(false);
+
+ const { exitCode } = spawnSync({
+ stdio: ["inherit", "inherit", "inherit"],
+ cmd: [bunExe(), join(import.meta.dir, "./fs-fixture-copyFile-no-copy_file_range.js"), src, dest],
+ env: {
+ ...bunEnv,
+ BUN_CONFIG_DISABLE_COPY_FILE_RANGE: "1",
+ },
+ });
+ expect(exitCode).toBe(0);
+
+ expect(Bun.hash(readFileSync(dest))).toBe(hash);
+ } finally {
+ rmSync(src, { force: true });
+ rmSync(dest, { force: true });
+ }
+ });
+
+ it("on small files", () => {
+ const tempdir = `${tmpdir()}/fs.test.js/${Date.now()}-1/1234/small`;
+ expect(existsSync(tempdir)).toBe(false);
+ expect(tempdir.includes(mkdirSync(tempdir, { recursive: true })!)).toBe(true);
+ var buffer = new Int32Array(1 * 1024);
+ for (let i = 0; i < buffer.length; i++) {
+ buffer[i] = i % 256;
+ }
+
+ const hash = Bun.hash(buffer.buffer);
+ const src = tempdir + "/copyFileSync.src.blob";
+ const dest = tempdir + "/copyFileSync.dest.blob";
+
+ try {
+ writeFileSync(src, buffer.buffer);
+
+ expect(existsSync(dest)).toBe(false);
+
+ const { exitCode } = spawnSync({
+ stdio: ["inherit", "inherit", "inherit"],
+ cmd: [bunExe(), join(import.meta.dir, "./fs-fixture-copyFile-no-copy_file_range.js"), src, dest],
+ env: {
+ ...bunEnv,
+ BUN_CONFIG_DISABLE_COPY_FILE_RANGE: "1",
+ },
+ });
+ expect(exitCode).toBe(0);
+
+ expect(Bun.hash(readFileSync(dest))).toBe(hash);
+ } finally {
+ rmSync(src, { force: true });
+ rmSync(dest, { force: true });
+ }
+ });
+ });
+ }
});
describe("mkdirSync", () => {