@zenfs/core
Version:
A filesystem, anywhere
87 lines (70 loc) • 2.47 kB
text/typescript
// SPDX-License-Identifier: LGPL-3.0-or-later
import { defaultContext, Stats } from '@zenfs/core';
import assert from 'node:assert/strict';
import { suite, test } from 'node:test';
import { fs } from '../common.js';
suite('Stats', () => {
const existing_file = 'x.txt';
test('stat empty path', async () => {
await assert.rejects(fs.promises.stat(''));
});
test('stat directory', async () => {
const stats = await fs.promises.stat('/');
assert(stats instanceof Stats);
});
test('lstat directory', async () => {
const stats = await fs.promises.lstat('/');
assert(stats instanceof Stats);
});
test('FileHandle.stat', async () => {
const handle = await fs.promises.open(existing_file, 'r');
const stats = await handle.stat();
assert(stats instanceof Stats);
await handle.close();
});
test('fstatSync file', () => {
const fd = fs.openSync(existing_file, 'r');
const stats = fs.fstatSync(fd);
assert(stats instanceof Stats);
fs.close(fd);
});
test('hasAccess for non-root access', () => {
const newFile = 'new.txt';
fs.writeFileSync(newFile, 'hello', { mode: 0o640 });
const prevCredentials = { ...defaultContext.credentials };
const uid = 33;
const nonRootCredentials = {
uid,
gid: uid,
euid: uid,
egid: uid,
suid: uid,
sgid: uid,
};
fs.chownSync(newFile, 0, nonRootCredentials.gid); // creating with root-user so that non-root user can access
Object.assign(defaultContext.credentials, nonRootCredentials);
const stat = fs.statSync(newFile);
assert.equal(stat.gid, nonRootCredentials.gid);
assert.equal(stat.uid, 0);
assert.equal(stat.hasAccess(fs.constants.R_OK), true);
assert.equal(stat.hasAccess(fs.constants.W_OK), false);
assert.equal(stat.hasAccess(fs.constants.X_OK), false);
// changing group
Object.assign(defaultContext.credentials, { ...nonRootCredentials, gid: 44 });
assert.equal(stat.hasAccess(fs.constants.R_OK), false);
assert.equal(stat.hasAccess(fs.constants.W_OK), false);
assert.equal(stat.hasAccess(fs.constants.X_OK), false);
Object.assign(defaultContext.credentials, prevCredentials);
});
test('stat file', async () => {
const stats = await fs.promises.stat(existing_file);
assert(!stats.isDirectory());
assert(stats.isFile());
assert(!stats.isSocket());
assert(!stats.isBlockDevice());
assert(!stats.isCharacterDevice());
assert(!stats.isFIFO());
assert(!stats.isSymbolicLink());
assert(stats instanceof Stats);
});
});