node/test/wasi/test-wasi-symlinks.js
Richard Lau 039f64f249
test: fix WASI link test
The WASI link test attempts to create a link in the temporary directory
to a file in the fixtures directory and can fail if those directories
are on different devices. Update the test so that both the source and
target of the link reside on the same device.

PR-URL: https://github.com/nodejs/node/pull/39485
Fixes: https://github.com/nodejs/node/issues/39484
Reviewed-By: Tobias Nießen <tniessen@tnie.de>
Reviewed-By: Colin Ihrig <cjihrig@gmail.com>
Reviewed-By: James M Snell <jasnell@gmail.com>
2021-07-29 17:14:24 +01:00

85 lines
3 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. This feature could ' +
'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' });
}