test262-harness
Version:
Node-based harness for test262
92 lines (74 loc) • 2.17 kB
JavaScript
;
const {Subject} = require('rxjs');
const eshost = require('eshost');
const internal = new WeakMap();
class AgentPool extends Subject {
constructor(agentCount, hostType, hostArguments, hostPath, options = { timeout: 10000 }) {
super();
this.options = options;
this.agents = [];
for (let i = 0; i < agentCount; i++) {
eshost.createAgent(hostType, {
hostArguments,
hostPath,
shortName: '$262',
transform: options.transform,
out: options.tempDir,
})
.then(agent => {
this.agents.push(agent);
this.next(agent);
})
.catch(error => displayErrorAndExit(error));
}
}
destroy() {
this.agents.forEach(agent => agent.destroy());
}
async runTest(record) {
const [agent, test] = record;
const {async = false, module = false} = test.attrs.flags || {};
let result;
let stopPromise;
if (test.result) {
result = Promise.resolve(test.result);
} else {
result = agent.evalScript(test, {async, module});
}
const timeout = setTimeout(() => {
stopPromise = agent.stop();
}, this.options.timeout);
return result.then(result => {
clearTimeout(timeout);
this.next(agent);
test.rawResult = result;
test.compiled = agent.compile(test.contents);
if (stopPromise) {
test.rawResult.timeout = true;
// wait for the host to stop, then return the test
return stopPromise.then(() => test);
}
const doneError = result.stdout.match(/^Test262:AsyncTestFailure:(.*)$/gm);
if (doneError) {
const lastErrorString = doneError[doneError.length - 1];
const [
/* ignored */,
name,
message
] = lastErrorString.match(/Test262:AsyncTestFailure:([^:]+): (.*)/);
test.rawResult.error = {
name,
message,
};
}
return test;
})
.catch(error => displayErrorAndExit(error));
}
}
function displayErrorAndExit(error) {
console.error('Error running test: ');
console.error(error);
process.exit(1);
}
module.exports = AgentPool;