diff options
author | 2023-08-20 21:29:09 -0700 | |
---|---|---|
committer | 2023-08-20 21:29:09 -0700 | |
commit | f75b949524ac4a41e0f015cb981f356444fab331 (patch) | |
tree | ec901a54d34e04daf146a8d6d96ef2b7d95b91d2 /test/js | |
parent | 3de9ce5f30ad3a2a5615acb62a25cecdd2ddef33 (diff) | |
download | bun-f75b949524ac4a41e0f015cb981f356444fab331.tar.gz bun-f75b949524ac4a41e0f015cb981f356444fab331.tar.zst bun-f75b949524ac4a41e0f015cb981f356444fab331.zip |
Fixes #1675 (#4230)
* Fixes https://github.com/oven-sh/bun/issues/1675
* Add fallback for Bun.write
* Update blob.zig
* Fix test
---------
Co-authored-by: Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com>
Diffstat (limited to 'test/js')
-rw-r--r-- | test/js/bun/io/bun-write-exdev-fixture.js | 1 | ||||
-rw-r--r-- | test/js/bun/io/bun-write.test.js | 78 | ||||
-rw-r--r-- | test/js/node/fs/fs-fixture-copyFile-no-copy_file_range.js | 3 | ||||
-rw-r--r-- | test/js/node/fs/fs.test.ts | 73 |
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", () => { |