// Flags: --experimental-vfs
'use strict';
const common = require('../common');
const assert = require('assert');
const fs = require('fs');
const path = require('path');
const vfs = require('node:vfs');
// VirtualFileSystem API
{
const myVfs = vfs.create();
const first = myVfs.mkstempSync('/tmp-');
const second = myVfs.mkstempSync('/tmp-');
assert.notStrictEqual(first.path, second.path);
assert.ok(first.path.startsWith('/tmp-'));
assert.strictEqual(first.path.length, '/tmp-'.length + 6);
assert.ok(myVfs.statSync(first.path).isFile());
myVfs.writeSync(first.fd, Buffer.from('hello'), 0, 5, 0);
myVfs.closeSync(first.fd);
myVfs.closeSync(second.fd);
assert.strictEqual(myVfs.readFileSync(first.path, 'utf8'), 'hello');
myVfs.mkstemp('/tmp-', common.mustSucceed(({ path, fd }) => {
assert.ok(path.startsWith('/tmp-'));
myVfs.closeSync(fd);
}));
myVfs.mkstemp('/tmp-', {}, common.mustSucceed(({ fd }) => myVfs.closeSync(fd)));
myVfs.mkstemp('/missing/prefix-', common.expectsError({ code: 'ENOENT' }));
myVfs.promises.mkstemp('/tmp-').then(common.mustCall(({ path, fd }) => {
assert.ok(path.startsWith('/tmp-'));
myVfs.closeSync(fd);
}));
assert.rejects(myVfs.promises.mkstemp('/missing/prefix-'), { code: 'ENOENT' })
.then(common.mustCall());
}
// node:fs on a mounted path
{
const layer = vfs.create();
layer.mkdirSync('/d');
const dir = path.join(layer.mount(), 'd');
const prefix = path.join(dir, 'f-');
function check(file) {
assert.strictEqual(path.dirname(file), dir);
assert.strictEqual(path.basename(file).length, 'f-'.length + 6);
assert.strictEqual(fs.readFileSync(file, 'utf8'), 'hello');
}
{
const { path: file, fd } = fs.mkstempSync(prefix);
fs.writeSync(fd, 'hello');
fs.closeSync(fd);
check(file);
}
for (const args of [[prefix, 'buffer'], [prefix, { encoding: 'buffer' }], [Buffer.from(prefix)]]) {
const { path: file, fd } = fs.mkstempSync(...args);
assert.ok(Buffer.isBuffer(file));
fs.writeSync(fd, 'hello');
fs.closeSync(fd);
check(file.toString());
}
fs.mkstemp(prefix, common.mustSucceed(({ path: file, fd }) => {
fs.writeSync(fd, 'hello');
fs.closeSync(fd);
check(file);
}));
fs.mkstemp(prefix, 'buffer', common.mustSucceed(({ path: file, fd }) => {
assert.ok(Buffer.isBuffer(file));
fs.closeSync(fd);
}));
(async () => {
const { path: file, handle } = await fs.promises.mkstemp(prefix);
await handle.writeFile('hello');
await handle.close();
check(file);
const result = await fs.promises.mkstemp(Buffer.from(prefix));
assert.ok(Buffer.isBuffer(result.path));
await result.handle.close();
})().then(common.mustCall());
const missing = path.join(dir, 'missing', 'f-');
assert.throws(() => fs.mkstempSync(missing), { code: 'ENOENT' });
fs.mkstemp(missing, common.expectsError({ code: 'ENOENT' }));
assert.rejects(fs.promises.mkstemp(missing), { code: 'ENOENT' }).then(common.mustCall());
}