test: improve multiple vm tests
PR-URL: https://github.com/nodejs/node/pull/14458 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Michaël Zasso <targos@protonmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de> Reviewed-By: Franziska Hinkelmann <franziska.hinkelmann@gmail.com>
This commit is contained in:
parent
d41423fe72
commit
4b23b42981
@ -20,16 +20,16 @@
|
|||||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
require('../common');
|
const common = require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const vm = require('vm');
|
const vm = require('vm');
|
||||||
|
|
||||||
const sandbox = { setTimeout: setTimeout };
|
const sandbox = { setTimeout };
|
||||||
|
|
||||||
const ctx = vm.createContext(sandbox);
|
const ctx = vm.createContext(sandbox);
|
||||||
|
|
||||||
vm.runInContext('setTimeout(function() { x = 3; }, 0);', ctx);
|
vm.runInContext('setTimeout(function() { x = 3; }, 0);', ctx);
|
||||||
setTimeout(function() {
|
setTimeout(common.mustCall(() => {
|
||||||
assert.strictEqual(sandbox.x, 3);
|
assert.strictEqual(sandbox.x, 3);
|
||||||
assert.strictEqual(ctx.x, 3);
|
assert.strictEqual(ctx.x, 3);
|
||||||
}, 1);
|
}), 1);
|
||||||
|
@ -27,29 +27,29 @@ const vm = require('vm');
|
|||||||
const Script = vm.Script;
|
const Script = vm.Script;
|
||||||
let script = new Script('"passed";');
|
let script = new Script('"passed";');
|
||||||
|
|
||||||
console.error('run in a new empty context');
|
// Run in a new empty context
|
||||||
let context = vm.createContext();
|
let context = vm.createContext();
|
||||||
let result = script.runInContext(context);
|
let result = script.runInContext(context);
|
||||||
assert.strictEqual('passed', result);
|
assert.strictEqual('passed', result);
|
||||||
|
|
||||||
console.error('create a new pre-populated context');
|
// Create a new pre-populated context
|
||||||
context = vm.createContext({ 'foo': 'bar', 'thing': 'lala' });
|
context = vm.createContext({ 'foo': 'bar', 'thing': 'lala' });
|
||||||
assert.strictEqual('bar', context.foo);
|
assert.strictEqual('bar', context.foo);
|
||||||
assert.strictEqual('lala', context.thing);
|
assert.strictEqual('lala', context.thing);
|
||||||
|
|
||||||
console.error('test updating context');
|
// Test updating context
|
||||||
script = new Script('foo = 3;');
|
script = new Script('foo = 3;');
|
||||||
result = script.runInContext(context);
|
result = script.runInContext(context);
|
||||||
assert.strictEqual(3, context.foo);
|
assert.strictEqual(3, context.foo);
|
||||||
assert.strictEqual('lala', context.thing);
|
assert.strictEqual('lala', context.thing);
|
||||||
|
|
||||||
// Issue GH-227:
|
// Issue GH-227:
|
||||||
assert.throws(function() {
|
assert.throws(() => {
|
||||||
vm.runInNewContext('', null, 'some.js');
|
vm.runInNewContext('', null, 'some.js');
|
||||||
}, /^TypeError: sandbox must be an object$/);
|
}, /^TypeError: sandbox must be an object$/);
|
||||||
|
|
||||||
// Issue GH-1140:
|
// Issue GH-1140:
|
||||||
console.error('test runInContext signature');
|
// Test runInContext signature
|
||||||
let gh1140Exception;
|
let gh1140Exception;
|
||||||
try {
|
try {
|
||||||
vm.runInContext('throw new Error()', context, 'expected-filename.js');
|
vm.runInContext('throw new Error()', context, 'expected-filename.js');
|
||||||
@ -77,7 +77,7 @@ const contextifiedSandboxErrorMsg =
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Issue GH-693:
|
// Issue GH-693:
|
||||||
console.error('test RegExp as argument to assert.throws');
|
// Test RegExp as argument to assert.throws
|
||||||
script = vm.createScript('const assert = require(\'assert\'); assert.throws(' +
|
script = vm.createScript('const assert = require(\'assert\'); assert.throws(' +
|
||||||
'function() { throw "hello world"; }, /hello/);',
|
'function() { throw "hello world"; }, /hello/);',
|
||||||
'some.js');
|
'some.js');
|
||||||
@ -92,13 +92,13 @@ assert.strictEqual(script.runInContext(ctx), false);
|
|||||||
|
|
||||||
// Error on the first line of a module should
|
// Error on the first line of a module should
|
||||||
// have the correct line and column number
|
// have the correct line and column number
|
||||||
assert.throws(function() {
|
assert.throws(() => {
|
||||||
vm.runInContext('throw new Error()', context, {
|
vm.runInContext('throw new Error()', context, {
|
||||||
filename: 'expected-filename.js',
|
filename: 'expected-filename.js',
|
||||||
lineOffset: 32,
|
lineOffset: 32,
|
||||||
columnOffset: 123
|
columnOffset: 123
|
||||||
});
|
});
|
||||||
}, function(err) {
|
}, (err) => {
|
||||||
return /expected-filename\.js:33:130/.test(err.stack);
|
return /expected-filename\.js:33:130/.test(err.stack);
|
||||||
}, 'Expected appearance of proper offset in Error stack');
|
}, 'Expected appearance of proper offset in Error stack');
|
||||||
|
|
||||||
|
@ -26,23 +26,23 @@ const assert = require('assert');
|
|||||||
|
|
||||||
const vm = require('vm');
|
const vm = require('vm');
|
||||||
|
|
||||||
console.error('run in a new empty context');
|
// Run in a new empty context
|
||||||
let context = vm.createContext();
|
let context = vm.createContext();
|
||||||
let result = vm.runInContext('"passed";', context);
|
let result = vm.runInContext('"passed";', context);
|
||||||
assert.strictEqual('passed', result);
|
assert.strictEqual('passed', result);
|
||||||
|
|
||||||
console.error('create a new pre-populated context');
|
// Create a new pre-populated context
|
||||||
context = vm.createContext({ 'foo': 'bar', 'thing': 'lala' });
|
context = vm.createContext({ 'foo': 'bar', 'thing': 'lala' });
|
||||||
assert.strictEqual('bar', context.foo);
|
assert.strictEqual('bar', context.foo);
|
||||||
assert.strictEqual('lala', context.thing);
|
assert.strictEqual('lala', context.thing);
|
||||||
|
|
||||||
console.error('test updating context');
|
// Test updating context
|
||||||
result = vm.runInContext('var foo = 3;', context);
|
result = vm.runInContext('var foo = 3;', context);
|
||||||
assert.strictEqual(3, context.foo);
|
assert.strictEqual(3, context.foo);
|
||||||
assert.strictEqual('lala', context.thing);
|
assert.strictEqual('lala', context.thing);
|
||||||
|
|
||||||
// https://github.com/nodejs/node/issues/5768
|
// https://github.com/nodejs/node/issues/5768
|
||||||
console.error('run in contextified sandbox without referencing the context');
|
// Run in contextified sandbox without referencing the context
|
||||||
const sandbox = { x: 1 };
|
const sandbox = { x: 1 };
|
||||||
vm.createContext(sandbox);
|
vm.createContext(sandbox);
|
||||||
global.gc();
|
global.gc();
|
||||||
|
@ -42,5 +42,3 @@ assert.strictEqual(res.name, 'b', 'res should be named b');
|
|||||||
assert.strictEqual(typeof o.a, 'function', 'a should be function');
|
assert.strictEqual(typeof o.a, 'function', 'a should be function');
|
||||||
assert.strictEqual(typeof o.b, 'function', 'b should be function');
|
assert.strictEqual(typeof o.b, 'function', 'b should be function');
|
||||||
assert.strictEqual(res, o.b, 'result should be global b function');
|
assert.strictEqual(res, o.b, 'result should be global b function');
|
||||||
|
|
||||||
console.log('ok');
|
|
||||||
|
@ -36,14 +36,14 @@ const Script = require('vm').Script;
|
|||||||
|
|
||||||
{
|
{
|
||||||
const script = new Script('throw new Error(\'test\');');
|
const script = new Script('throw new Error(\'test\');');
|
||||||
assert.throws(function() {
|
assert.throws(() => {
|
||||||
script.runInNewContext();
|
script.runInNewContext();
|
||||||
}, /^Error: test$/);
|
}, /^Error: test$/);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const script = new Script('foo.bar = 5;');
|
const script = new Script('foo.bar = 5;');
|
||||||
assert.throws(function() {
|
assert.throws(() => {
|
||||||
script.runInNewContext();
|
script.runInNewContext();
|
||||||
}, /^ReferenceError: foo is not defined$/);
|
}, /^ReferenceError: foo is not defined$/);
|
||||||
}
|
}
|
||||||
@ -94,14 +94,14 @@ const Script = require('vm').Script;
|
|||||||
script.runInNewContext({ f: f });
|
script.runInNewContext({ f: f });
|
||||||
assert.strictEqual(f.a, 2);
|
assert.strictEqual(f.a, 2);
|
||||||
|
|
||||||
assert.throws(function() {
|
assert.throws(() => {
|
||||||
script.runInNewContext();
|
script.runInNewContext();
|
||||||
}, /^ReferenceError: f is not defined$/);
|
}, /^ReferenceError: f is not defined$/);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
const script = new Script('');
|
const script = new Script('');
|
||||||
assert.throws(function() {
|
assert.throws(() => {
|
||||||
script.runInNewContext.call('\'hello\';');
|
script.runInNewContext.call('\'hello\';');
|
||||||
}, /^TypeError: this\.runInContext is not a function$/);
|
}, /^TypeError: this\.runInContext is not a function$/);
|
||||||
}
|
}
|
||||||
|
@ -26,14 +26,14 @@ const Script = require('vm').Script;
|
|||||||
|
|
||||||
common.globalCheck = false;
|
common.globalCheck = false;
|
||||||
|
|
||||||
console.error('run a string');
|
// Run a string
|
||||||
let script = new Script('\'passed\';');
|
let script = new Script('\'passed\';');
|
||||||
const result = script.runInThisContext(script);
|
const result = script.runInThisContext(script);
|
||||||
assert.strictEqual('passed', result);
|
assert.strictEqual('passed', result);
|
||||||
|
|
||||||
console.error('thrown error');
|
// Thrown error
|
||||||
script = new Script('throw new Error(\'test\');');
|
script = new Script('throw new Error(\'test\');');
|
||||||
assert.throws(function() {
|
assert.throws(() => {
|
||||||
script.runInThisContext(script);
|
script.runInThisContext(script);
|
||||||
}, /^Error: test$/);
|
}, /^Error: test$/);
|
||||||
|
|
||||||
@ -43,7 +43,7 @@ script.runInThisContext(script);
|
|||||||
assert.strictEqual(2, global.hello);
|
assert.strictEqual(2, global.hello);
|
||||||
|
|
||||||
|
|
||||||
console.error('pass values');
|
// Pass values
|
||||||
global.code = 'foo = 1;' +
|
global.code = 'foo = 1;' +
|
||||||
'bar = 2;' +
|
'bar = 2;' +
|
||||||
'if (typeof baz !== "undefined") throw new Error("test fail");';
|
'if (typeof baz !== "undefined") throw new Error("test fail");';
|
||||||
@ -55,7 +55,7 @@ assert.strictEqual(0, global.obj.foo);
|
|||||||
assert.strictEqual(2, global.bar);
|
assert.strictEqual(2, global.bar);
|
||||||
assert.strictEqual(1, global.foo);
|
assert.strictEqual(1, global.foo);
|
||||||
|
|
||||||
console.error('call a function');
|
// Call a function
|
||||||
global.f = function() { global.foo = 100; };
|
global.f = function() { global.foo = 100; };
|
||||||
script = new Script('f()');
|
script = new Script('f()');
|
||||||
script.runInThisContext(script);
|
script.runInThisContext(script);
|
||||||
|
@ -31,12 +31,12 @@ assert.strictEqual(typeof global.gc, 'function',
|
|||||||
|
|
||||||
common.globalCheck = false;
|
common.globalCheck = false;
|
||||||
|
|
||||||
console.error('run a string');
|
// Run a string
|
||||||
const result = vm.runInNewContext('\'passed\';');
|
const result = vm.runInNewContext('\'passed\';');
|
||||||
assert.strictEqual('passed', result);
|
assert.strictEqual('passed', result);
|
||||||
|
|
||||||
console.error('thrown error');
|
// Thrown error
|
||||||
assert.throws(function() {
|
assert.throws(() => {
|
||||||
vm.runInNewContext('throw new Error(\'test\');');
|
vm.runInNewContext('throw new Error(\'test\');');
|
||||||
}, /^Error: test$/);
|
}, /^Error: test$/);
|
||||||
|
|
||||||
@ -45,7 +45,7 @@ vm.runInNewContext('hello = 2');
|
|||||||
assert.strictEqual(5, global.hello);
|
assert.strictEqual(5, global.hello);
|
||||||
|
|
||||||
|
|
||||||
console.error('pass values in and out');
|
// Pass values in and out
|
||||||
global.code = 'foo = 1;' +
|
global.code = 'foo = 1;' +
|
||||||
'bar = 2;' +
|
'bar = 2;' +
|
||||||
'if (baz !== 3) throw new Error(\'test fail\');';
|
'if (baz !== 3) throw new Error(\'test fail\');';
|
||||||
@ -58,17 +58,17 @@ assert.strictEqual(1, global.obj.foo);
|
|||||||
assert.strictEqual(2, global.obj.bar);
|
assert.strictEqual(2, global.obj.bar);
|
||||||
assert.strictEqual(2, global.foo);
|
assert.strictEqual(2, global.foo);
|
||||||
|
|
||||||
console.error('call a function by reference');
|
// Call a function by reference
|
||||||
function changeFoo() { global.foo = 100; }
|
function changeFoo() { global.foo = 100; }
|
||||||
vm.runInNewContext('f()', { f: changeFoo });
|
vm.runInNewContext('f()', { f: changeFoo });
|
||||||
assert.strictEqual(global.foo, 100);
|
assert.strictEqual(global.foo, 100);
|
||||||
|
|
||||||
console.error('modify an object by reference');
|
// Modify an object by reference
|
||||||
const f = { a: 1 };
|
const f = { a: 1 };
|
||||||
vm.runInNewContext('f.a = 2', { f: f });
|
vm.runInNewContext('f.a = 2', { f: f });
|
||||||
assert.strictEqual(f.a, 2);
|
assert.strictEqual(f.a, 2);
|
||||||
|
|
||||||
console.error('use function in context without referencing context');
|
// Use function in context without referencing context
|
||||||
const fn = vm.runInNewContext('(function() { obj.p = {}; })', { obj: {} });
|
const fn = vm.runInNewContext('(function() { obj.p = {}; })', { obj: {} });
|
||||||
global.gc();
|
global.gc();
|
||||||
fn();
|
fn();
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
require('../common');
|
const common = require('../common');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const child_process = require('child_process');
|
const child_process = require('child_process');
|
||||||
|
|
||||||
@ -11,16 +11,12 @@ const p = child_process.spawn(process.execPath, [
|
|||||||
'catch (e) { console.log(e.message); }'
|
'catch (e) { console.log(e.message); }'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
p.stderr.on('data', function(data) {
|
p.stderr.on('data', common.mustNotCall());
|
||||||
assert.fail(`Unexpected stderr data: ${data}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
let output = '';
|
let output = '';
|
||||||
|
|
||||||
p.stdout.on('data', function(data) {
|
p.stdout.on('data', (data) => output += data);
|
||||||
output += data;
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on('exit', function() {
|
p.stdout.on('end', common.mustCall(() => {
|
||||||
assert.strictEqual(output.replace(/[\r\n]+/g, ''), 'boo');
|
assert.strictEqual(output.replace(/[\r\n]+/g, ''), 'boo');
|
||||||
});
|
}));
|
||||||
|
@ -12,18 +12,14 @@ const p = child_process.spawn(process.execPath, [
|
|||||||
wrong_script
|
wrong_script
|
||||||
]);
|
]);
|
||||||
|
|
||||||
p.stdout.on('data', function(data) {
|
p.stdout.on('data', common.mustNotCall());
|
||||||
assert.fail(`Unexpected stdout data: ${data}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
let output = '';
|
let output = '';
|
||||||
|
|
||||||
p.stderr.on('data', function(data) {
|
p.stderr.on('data', (data) => output += data);
|
||||||
output += data;
|
|
||||||
});
|
|
||||||
|
|
||||||
process.on('exit', function() {
|
p.stderr.on('end', common.mustCall(() => {
|
||||||
assert(/BEGIN CERT/.test(output));
|
assert(/BEGIN CERT/.test(output));
|
||||||
assert(/^\s+\^/m.test(output));
|
assert(/^\s+\^/m.test(output));
|
||||||
assert(/Invalid left-hand side expression in prefix operation/.test(output));
|
assert(/Invalid left-hand side expression in prefix operation/.test(output));
|
||||||
});
|
}));
|
||||||
|
Loading…
x
Reference in New Issue
Block a user