node/test/wasi/test-wasi-symlinks.js
Antoine du Hamel 1277ffcb55
test: add lint rule to enforce trailing commas
Only activated on some subfolders to minimize the diff, ideally this
rule would be applied gradually to the entire codebase in follow-up
commits.

PR-URL: https://github.com/nodejs/node/pull/45468
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
2022-11-21 15:16:25 -05:00

84 lines
2.9 KiB
JavaScript

'use strict';
const common = require('../common');
const fs = require('fs');
const path = require('path');
if (process.argv[2] === 'wasi-child') {
common.expectWarning('ExperimentalWarning',
'WASI is an experimental feature and might change at any time');
const { WASI } = require('wasi');
const wasmDir = path.join(__dirname, 'wasm');
const wasi = new WASI({
args: [],
env: process.env,
preopens: {
'/sandbox': process.argv[4],
'/tmp': process.argv[5],
},
});
const importObject = { wasi_snapshot_preview1: wasi.wasiImport };
const modulePath = path.join(wasmDir, `${process.argv[3]}.wasm`);
const buffer = fs.readFileSync(modulePath);
(async () => {
const { instance } = await WebAssembly.instantiate(buffer, importObject);
wasi.start(instance);
})().then(common.mustCall());
} else {
if (!common.canCreateSymLink()) {
common.skip('insufficient privileges');
}
const assert = require('assert');
const cp = require('child_process');
const tmpdir = require('../common/tmpdir');
// Setup the sandbox environment.
tmpdir.refresh();
const sandbox = path.join(tmpdir.path, 'sandbox');
const sandboxedFile = path.join(sandbox, 'input.txt');
const externalFile = path.join(tmpdir.path, 'outside.txt');
const sandboxedDir = path.join(sandbox, 'subdir');
const sandboxedSymlink = path.join(sandboxedDir, 'input_link.txt');
const escapingSymlink = path.join(sandboxedDir, 'outside.txt');
const loopSymlink1 = path.join(sandboxedDir, 'loop1');
const loopSymlink2 = path.join(sandboxedDir, 'loop2');
const sandboxedTmp = path.join(tmpdir.path, 'tmp');
fs.mkdirSync(sandbox);
fs.mkdirSync(sandboxedDir);
fs.mkdirSync(sandboxedTmp);
fs.writeFileSync(sandboxedFile, 'hello from input.txt', 'utf8');
fs.writeFileSync(externalFile, 'this should be inaccessible', 'utf8');
fs.symlinkSync(path.join('.', 'input.txt'), sandboxedSymlink, 'file');
fs.symlinkSync(path.join('..', 'outside.txt'), escapingSymlink, 'file');
fs.symlinkSync(path.join('subdir', 'loop2'),
loopSymlink1, 'file');
fs.symlinkSync(path.join('subdir', 'loop1'),
loopSymlink2, 'file');
function runWASI(options) {
console.log('executing', options.test);
const opts = { env: { ...process.env, NODE_DEBUG_NATIVE: 'wasi' } };
const child = cp.spawnSync(process.execPath, [
'--experimental-wasi-unstable-preview1',
__filename,
'wasi-child',
options.test,
sandbox,
sandboxedTmp,
], opts);
console.log(child.stderr.toString());
assert.strictEqual(child.status, 0);
assert.strictEqual(child.signal, null);
assert.strictEqual(child.stdout.toString(), options.stdout || '');
}
runWASI({ test: 'create_symlink', stdout: 'hello from input.txt' });
runWASI({ test: 'follow_symlink', stdout: 'hello from input.txt' });
runWASI({ test: 'link' });
runWASI({ test: 'symlink_escape' });
runWASI({ test: 'symlink_loop' });
}