Node polyfill for fs.chown and fs.close (#4377)

This commit is contained in:
Chris Knight 2020-03-15 03:01:34 +00:00 committed by GitHub
parent 6cc40b0865
commit a159165fe5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 155 additions and 0 deletions

37
std/node/_fs/_fs_chown.ts Normal file
View file

@ -0,0 +1,37 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
import { CallbackWithError } from "./_fs_common.ts";
/**
* TODO: Also accept 'path' parameter as a Node polyfill Buffer or URL type once these
* are implemented. See https://github.com/denoland/deno/issues/3403
*/
export function chown(
path: string,
uid: number,
gid: number,
callback: CallbackWithError
): void {
new Promise(async (resolve, reject) => {
try {
await Deno.chown(path, uid, gid);
resolve();
} catch (err) {
reject(err);
}
})
.then(() => {
callback();
})
.catch(err => {
callback(err);
});
}
/**
* TODO: Also accept 'path' parameter as a Node polyfill Buffer or URL type once these
* are implemented. See https://github.com/denoland/deno/issues/3403
*/
export function chownSync(path: string, uid: number, gid: number): void {
Deno.chownSync(path, uid, gid);
}

View file

@ -0,0 +1,50 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
const { test } = Deno;
import { fail, assertEquals } from "../../testing/asserts.ts";
import { chown, chownSync } from "./_fs_chown.ts";
if (Deno.build.os !== "win") {
//chown is difficult to test. Best we can do is set the existing user id/group id again
test({
name: "ASYNC: setting existing uid/gid works as expected (non-Windows)",
async fn() {
const tempFile: string = await Deno.makeTempFile();
const originalUserId: number | null = (await Deno.lstat(tempFile)).uid;
const originalGroupId: number | null = (await Deno.lstat(tempFile)).gid;
await new Promise((resolve, reject) => {
chown(tempFile, originalUserId!, originalGroupId!, err => {
if (err) reject(err);
else resolve();
});
})
.then(() => {
const newUserId: number | null = Deno.lstatSync(tempFile).uid;
const newGroupId: number | null = Deno.lstatSync(tempFile).gid;
assertEquals(newUserId, originalUserId);
assertEquals(newGroupId, originalGroupId);
})
.catch(() => {
fail();
})
.finally(() => {
Deno.removeSync(tempFile);
});
}
});
test({
name: "SYNC: setting existing uid/gid works as expected (non-Windows)",
fn() {
const tempFile: string = Deno.makeTempFileSync();
const originalUserId: number | null = Deno.lstatSync(tempFile).uid;
const originalGroupId: number | null = Deno.lstatSync(tempFile).gid;
chownSync(tempFile, originalUserId!, originalGroupId!);
const newUserId: number | null = Deno.lstatSync(tempFile).uid;
const newGroupId: number | null = Deno.lstatSync(tempFile).gid;
assertEquals(newUserId, originalUserId);
assertEquals(newGroupId, originalGroupId);
Deno.removeSync(tempFile);
}
});
}

24
std/node/_fs/_fs_close.ts Normal file
View file

@ -0,0 +1,24 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
import { CallbackWithError } from "./_fs_common.ts";
export function close(fd: number, callback: CallbackWithError): void {
new Promise(async (resolve, reject) => {
try {
Deno.close(fd);
resolve();
} catch (err) {
reject(err);
}
})
.then(() => {
callback();
})
.catch(err => {
callback(err);
});
}
export function closeSync(fd: number): void {
Deno.close(fd);
}

View file

@ -0,0 +1,42 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
const { test } = Deno;
import { fail, assert } from "../../testing/asserts.ts";
import { close, closeSync } from "./_fs_close.ts";
test({
name: "ASYNC: File is closed",
async fn() {
const tempFile: string = await Deno.makeTempFile();
const file: Deno.File = await Deno.open(tempFile);
assert(Deno.resources()[file.rid]);
await new Promise((resolve, reject) => {
close(file.rid, err => {
if (err) reject();
else resolve();
});
})
.then(async () => {
assert(!Deno.resources()[file.rid]);
})
.catch(() => {
fail("No error expected");
})
.finally(async () => {
await Deno.remove(tempFile);
});
}
});
test({
name: "SYNC: File is closed",
fn() {
const tempFile: string = Deno.makeTempFileSync();
const file: Deno.File = Deno.openSync(tempFile);
assert(Deno.resources()[file.rid]);
closeSync(file.rid);
assert(!Deno.resources()[file.rid]);
Deno.removeSync(tempFile);
}
});

View file

@ -1,3 +1,5 @@
// Copyright 2018-2020 the Deno authors. All rights reserved. MIT license.
interface ParseOptions {
decodeURIComponent?: (string: string) => string;
maxKeys?: number;