Browse Source

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>
v6.x
James M Snell 8 years ago
committed by Myles Borins
parent
commit
f35f06d04c
No known key found for this signature in database GPG Key ID: 933B01F40B5CA946
  1. 8
      test/parallel/test-vm-context-async-script.js
  2. 22
      test/parallel/test-vm-context.js
  3. 12
      test/parallel/test-vm-create-and-run-in-context.js
  4. 2
      test/parallel/test-vm-function-declaration.js
  5. 8
      test/parallel/test-vm-new-script-new-context.js
  6. 10
      test/parallel/test-vm-new-script-this-context.js
  7. 14
      test/parallel/test-vm-run-in-new-context.js
  8. 14
      test/parallel/test-vm-syntax-error-message.js
  9. 12
      test/parallel/test-vm-syntax-error-stderr.js

8
test/parallel/test-vm-context-async-script.js

@ -1,14 +1,14 @@
'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);

22
test/parallel/test-vm-context.js

@ -6,29 +6,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');
@ -56,8 +56,8 @@ 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('var 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');
script.runInNewContext({ require: require }); script.runInNewContext({ require: require });
@ -71,14 +71,14 @@ 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');
// https://github.com/nodejs/node/issues/6158 // https://github.com/nodejs/node/issues/6158

12
test/parallel/test-vm-create-and-run-in-context.js

@ -5,24 +5,24 @@ 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();
vm.runInContext('x = 2', sandbox); vm.runInContext('x = 2', sandbox);

2
test/parallel/test-vm-function-declaration.js

@ -21,5 +21,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');

8
test/parallel/test-vm-new-script-new-context.js

@ -15,14 +15,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$/);
} }
@ -73,14 +73,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$/);
} }

10
test/parallel/test-vm-new-script-this-context.js

@ -5,14 +5,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$/);
@ -22,7 +22,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");';
@ -34,7 +34,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);

14
test/parallel/test-vm-run-in-new-context.js

@ -10,12 +10,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$/);
@ -24,7 +24,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\');';
@ -37,17 +37,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();

14
test/parallel/test-vm-syntax-error-message.js

@ -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(false, '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
test/parallel/test-vm-syntax-error-stderr.js

@ -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());
common.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…
Cancel
Save