node/test/parallel/test-vm-cached-data.js
Fedor Indutny b4ece1b7ec contextify: use offset/length from Uint8Array
Do not blindly take data from underlying `ArrayBuffer`, use
`ByteOffset`/`ByteLength` of `Uint8Array` itself.

Additionally, fix tests that weren't actually properly running because
of V8's internal code cache. The code should be different, otherwise the
cached data won't be used at all.

Fix: #4939
PR-URL: https://github.com/nodejs/node/pull/4947
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
2016-01-29 17:16:20 -05:00

66 lines
1.4 KiB
JavaScript

'use strict';
require('../common');
const assert = require('assert');
const vm = require('vm');
const Buffer = require('buffer').Buffer;
function getSource(tag) {
return `(function ${tag}() { return \'${tag}\'; })`;
}
function produce(source) {
const script = new vm.Script(source, {
produceCachedData: true
});
assert(script.cachedData instanceof Buffer);
return script.cachedData;
}
function testProduceConsume() {
const source = getSource('original');
const data = produce(source);
// It should consume code cache
const script = new vm.Script(source, {
cachedData: data
});
assert(!script.cachedDataRejected);
assert.equal(script.runInThisContext()(), 'original');
}
testProduceConsume();
function testRejectInvalid() {
const source = getSource('invalid');
const data = produce(source);
// It should reject invalid code cache
const script = new vm.Script(getSource('invalid_1'), {
cachedData: data
});
assert(script.cachedDataRejected);
assert.equal(script.runInThisContext()(), 'invalid_1');
}
testRejectInvalid();
function testRejectSlice() {
const source = getSource('slice');
const data = produce(source).slice(4);
const script = new vm.Script(source, {
cachedData: data
});
assert(script.cachedDataRejected);
}
testRejectSlice();
// It should throw on non-Buffer cachedData
assert.throws(() => {
new vm.Script('function abc() {}', {
cachedData: 'ohai'
});
});