diff options
Diffstat (limited to 'js')
-rw-r--r-- | js/chmod_test.ts | 8 | ||||
-rw-r--r-- | js/copy_file_test.ts | 2 | ||||
-rw-r--r-- | js/metrics_test.ts | 4 | ||||
-rw-r--r-- | js/remove_test.ts | 8 | ||||
-rw-r--r-- | js/write_file.ts | 37 | ||||
-rw-r--r-- | js/write_file_test.ts | 120 |
6 files changed, 160 insertions, 19 deletions
diff --git a/js/chmod_test.ts b/js/chmod_test.ts index 75f4524db..ceee5b065 100644 --- a/js/chmod_test.ts +++ b/js/chmod_test.ts @@ -9,7 +9,7 @@ testPerm({ write: true }, function chmodSyncSuccess() { const data = enc.encode("Hello"); const tempDir = deno.makeTempDirSync(); const filename = tempDir + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); // On windows no effect, but should not crash deno.chmodSync(filename, 0o777); @@ -29,7 +29,7 @@ if (isNotWindows) { const tempDir = deno.makeTempDirSync(); const filename = tempDir + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); const symlinkName = tempDir + "/test_symlink.txt"; deno.symlinkSync(filename, symlinkName); @@ -74,7 +74,7 @@ testPerm({ write: true }, async function chmodSuccess() { const data = enc.encode("Hello"); const tempDir = deno.makeTempDirSync(); const filename = tempDir + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); // On windows no effect, but should not crash await deno.chmod(filename, 0o777); @@ -94,7 +94,7 @@ if (isNotWindows) { const tempDir = deno.makeTempDirSync(); const filename = tempDir + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); const symlinkName = tempDir + "/test_symlink.txt"; deno.symlinkSync(filename, symlinkName); diff --git a/js/copy_file_test.ts b/js/copy_file_test.ts index 02f13c6f3..bdc455f45 100644 --- a/js/copy_file_test.ts +++ b/js/copy_file_test.ts @@ -11,7 +11,7 @@ function readFileString(filename: string): string { function writeFileString(filename: string, s: string) { const enc = new TextEncoder(); const data = enc.encode(s); - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); } function assertSameContent(filename1: string, filename2: string) { diff --git a/js/metrics_test.ts b/js/metrics_test.ts index d81f54c3e..77473a1d5 100644 --- a/js/metrics_test.ts +++ b/js/metrics_test.ts @@ -27,7 +27,7 @@ testPerm({ write: true }, function metricsUpdatedIfNoResponseSync() { const filename = deno.makeTempDirSync() + "/test.txt"; const data = new Uint8Array([41, 42, 43]); - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); const metrics = deno.metrics(); assert(metrics.opsDispatched === metrics.opsCompleted); @@ -37,7 +37,7 @@ testPerm({ write: true }, async function metricsUpdatedIfNoResponseAsync() { const filename = deno.makeTempDirSync() + "/test.txt"; const data = new Uint8Array([41, 42, 43]); - await deno.writeFile(filename, data, 0o666); + await deno.writeFile(filename, data, { perm: 0o666 }); const metrics = deno.metrics(); assert(metrics.opsDispatched === metrics.opsCompleted); diff --git a/js/remove_test.ts b/js/remove_test.ts index df4fe72d6..b0382c865 100644 --- a/js/remove_test.ts +++ b/js/remove_test.ts @@ -28,7 +28,7 @@ testPerm({ write: true }, function removeSyncFileSuccess() { const enc = new TextEncoder(); const data = enc.encode("Hello"); const filename = deno.makeTempDirSync() + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); const fileInfo = deno.statSync(filename); assert(fileInfo.isFile()); // check exist first deno.removeSync(filename); // remove @@ -129,7 +129,7 @@ testPerm({ write: true }, function removeAllSyncFileSuccess() { const enc = new TextEncoder(); const data = enc.encode("Hello"); const filename = deno.makeTempDirSync() + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); const fileInfo = deno.statSync(filename); assert(fileInfo.isFile()); // check exist first deno.removeSync(filename, { recursive: true }); // remove @@ -195,7 +195,7 @@ testPerm({ write: true }, async function removeFileSuccess() { const enc = new TextEncoder(); const data = enc.encode("Hello"); const filename = deno.makeTempDirSync() + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); const fileInfo = deno.statSync(filename); assert(fileInfo.isFile()); // check exist first await deno.remove(filename); // remove @@ -295,7 +295,7 @@ testPerm({ write: true }, async function removeAllFileSuccess() { const enc = new TextEncoder(); const data = enc.encode("Hello"); const filename = deno.makeTempDirSync() + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data, { perm: 0o666 }); const fileInfo = deno.statSync(filename); assert(fileInfo.isFile()); // check exist first await deno.remove(filename, { recursive: true }); // remove diff --git a/js/write_file.ts b/js/write_file.ts index dad22f8c2..12ba67130 100644 --- a/js/write_file.ts +++ b/js/write_file.ts @@ -3,6 +3,17 @@ import * as msg from "gen/msg_generated"; import * as flatbuffers from "./flatbuffers"; import * as dispatch from "./dispatch"; +/** Options for writing to a file. + * `perm` would change the file's permission if set. + * `create` decides if the file should be created if not exists (default: true) + * `append` decides if the file should be appended (default: false) + */ +export interface WriteFileOptions { + perm?: number; + create?: boolean; + append?: boolean; +} + /** Write a new file, with given filename and data synchronously. * * import { writeFileSync } from "deno"; @@ -14,9 +25,9 @@ import * as dispatch from "./dispatch"; export function writeFileSync( filename: string, data: Uint8Array, - perm = 0o666 + options: WriteFileOptions = {} ): void { - dispatch.sendSync(...req(filename, data, perm)); + dispatch.sendSync(...req(filename, data, options)); } /** Write a new file, with given filename and data. @@ -30,21 +41,35 @@ export function writeFileSync( export async function writeFile( filename: string, data: Uint8Array, - perm = 0o666 + options: WriteFileOptions = {} ): Promise<void> { - await dispatch.sendAsync(...req(filename, data, perm)); + await dispatch.sendAsync(...req(filename, data, options)); } function req( filename: string, data: Uint8Array, - perm: number + options: WriteFileOptions ): [flatbuffers.Builder, msg.Any, flatbuffers.Offset, Uint8Array] { const builder = flatbuffers.createBuilder(); const filename_ = builder.createString(filename); msg.WriteFile.startWriteFile(builder); msg.WriteFile.addFilename(builder, filename_); - msg.WriteFile.addPerm(builder, perm); + // Perm is not updated by default + if (options.perm !== undefined && options.perm !== null) { + msg.WriteFile.addUpdatePerm(builder, true); + msg.WriteFile.addPerm(builder, options.perm!); + } else { + msg.WriteFile.addUpdatePerm(builder, false); + msg.WriteFile.addPerm(builder, 0o666); + } + // Create is turned on by default + if (options.create !== undefined) { + msg.WriteFile.addIsCreate(builder, !!options.create); + } else { + msg.WriteFile.addIsCreate(builder, true); + } + msg.WriteFile.addIsAppend(builder, !!options.append); const inner = msg.WriteFile.endWriteFile(builder); return [builder, msg.Any.WriteFile, inner, data]; } diff --git a/js/write_file_test.ts b/js/write_file_test.ts index e9e620363..7a43dec62 100644 --- a/js/write_file_test.ts +++ b/js/write_file_test.ts @@ -6,7 +6,7 @@ testPerm({ write: true }, function writeFileSyncSuccess() { const enc = new TextEncoder(); const data = enc.encode("Hello"); const filename = deno.makeTempDirSync() + "/test.txt"; - deno.writeFileSync(filename, data, 0o666); + deno.writeFileSync(filename, data); const dataRead = deno.readFileSync(filename); const dec = new TextDecoder("utf-8"); const actual = dec.decode(dataRead); @@ -45,11 +45,69 @@ testPerm({ write: false }, function writeFileSyncPerm() { assert(caughtError); }); +testPerm({ write: true }, function writeFileSyncUpdatePerm() { + if (deno.platform.os !== "win") { + const enc = new TextEncoder(); + const data = enc.encode("Hello"); + const filename = deno.makeTempDirSync() + "/test.txt"; + deno.writeFileSync(filename, data, { perm: 0o755 }); + assertEqual(deno.statSync(filename).mode & 0o777, 0o755); + deno.writeFileSync(filename, data, { perm: 0o666 }); + assertEqual(deno.statSync(filename).mode & 0o777, 0o666); + } +}); + +testPerm({ write: true }, function writeFileSyncCreate() { + const enc = new TextEncoder(); + const data = enc.encode("Hello"); + const filename = deno.makeTempDirSync() + "/test.txt"; + let caughtError = false; + // if create turned off, the file won't be created + try { + deno.writeFileSync(filename, data, { create: false }); + } catch (e) { + caughtError = true; + assertEqual(e.kind, deno.ErrorKind.NotFound); + assertEqual(e.name, "NotFound"); + } + assert(caughtError); + + // Turn on create, should have no error + deno.writeFileSync(filename, data, { create: true }); + deno.writeFileSync(filename, data, { create: false }); + const dataRead = deno.readFileSync(filename); + const dec = new TextDecoder("utf-8"); + const actual = dec.decode(dataRead); + assertEqual("Hello", actual); +}); + +testPerm({ write: true }, function writeFileSyncAppend() { + const enc = new TextEncoder(); + const data = enc.encode("Hello"); + const filename = deno.makeTempDirSync() + "/test.txt"; + deno.writeFileSync(filename, data); + deno.writeFileSync(filename, data, { append: true }); + let dataRead = deno.readFileSync(filename); + const dec = new TextDecoder("utf-8"); + let actual = dec.decode(dataRead); + assertEqual("HelloHello", actual); + // Now attempt overwrite + deno.writeFileSync(filename, data, { append: false }); + dataRead = deno.readFileSync(filename); + actual = dec.decode(dataRead); + assertEqual("Hello", actual); + // append not set should also overwrite + deno.writeFileSync(filename, data); + dataRead = deno.readFileSync(filename); + actual = dec.decode(dataRead); + assertEqual("Hello", actual); +}); + testPerm({ write: true }, async function writeFileSuccess() { const enc = new TextEncoder(); const data = enc.encode("Hello"); const filename = deno.makeTempDirSync() + "/test.txt"; - await deno.writeFile(filename, data, 0o666); + await deno.writeFile(filename, data); const dataRead = deno.readFileSync(filename); const dec = new TextDecoder("utf-8"); const actual = dec.decode(dataRead); @@ -87,3 +145,61 @@ testPerm({ write: false }, async function writeFilePerm() { } assert(caughtError); }); + +testPerm({ write: true }, async function writeFileUpdatePerm() { + if (deno.platform.os !== "win") { + const enc = new TextEncoder(); + const data = enc.encode("Hello"); + const filename = deno.makeTempDirSync() + "/test.txt"; + await deno.writeFile(filename, data, { perm: 0o755 }); + assertEqual(deno.statSync(filename).mode & 0o777, 0o755); + await deno.writeFile(filename, data, { perm: 0o666 }); + assertEqual(deno.statSync(filename).mode & 0o777, 0o666); + } +}); + +testPerm({ write: true }, async function writeFileCreate() { + const enc = new TextEncoder(); + const data = enc.encode("Hello"); + const filename = deno.makeTempDirSync() + "/test.txt"; + let caughtError = false; + // if create turned off, the file won't be created + try { + await deno.writeFile(filename, data, { create: false }); + } catch (e) { + caughtError = true; + assertEqual(e.kind, deno.ErrorKind.NotFound); + assertEqual(e.name, "NotFound"); + } + assert(caughtError); + + // Turn on create, should have no error + await deno.writeFile(filename, data, { create: true }); + await deno.writeFile(filename, data, { create: false }); + const dataRead = deno.readFileSync(filename); + const dec = new TextDecoder("utf-8"); + const actual = dec.decode(dataRead); + assertEqual("Hello", actual); +}); + +testPerm({ write: true }, async function writeFileAppend() { + const enc = new TextEncoder(); + const data = enc.encode("Hello"); + const filename = deno.makeTempDirSync() + "/test.txt"; + await deno.writeFile(filename, data); + await deno.writeFile(filename, data, { append: true }); + let dataRead = deno.readFileSync(filename); + const dec = new TextDecoder("utf-8"); + let actual = dec.decode(dataRead); + assertEqual("HelloHello", actual); + // Now attempt overwrite + await deno.writeFile(filename, data, { append: false }); + dataRead = deno.readFileSync(filename); + actual = dec.decode(dataRead); + assertEqual("Hello", actual); + // append not set should also overwrite + await deno.writeFile(filename, data); + dataRead = deno.readFileSync(filename); + actual = dec.decode(dataRead); + assertEqual("Hello", actual); +}); |