|
|
|
'use strict';
|
|
|
|
const childProcess = require('child_process');
|
|
|
|
const path = require('path');
|
|
|
|
const fs = require('fs');
|
|
|
|
const arrify = require('arrify');
|
|
|
|
const mkdirp = require('mkdirp');
|
|
|
|
const branch = require('git-branch').sync(path.join(__dirname, '..'));
|
|
|
|
|
|
|
|
const cliPath = require.resolve('../cli');
|
|
|
|
|
|
|
|
function runTests(_args) {
|
|
|
|
return new Promise(resolve => {
|
|
|
|
const args = [cliPath].concat(arrify(_args));
|
|
|
|
const start = Date.now();
|
|
|
|
|
|
|
|
childProcess.execFile(process.execPath, args, {
|
|
|
|
cwd: __dirname,
|
|
|
|
maxBuffer: 100000 * 200
|
|
|
|
}, (err, stdout, stderr) => {
|
|
|
|
const end = Date.now();
|
|
|
|
resolve({
|
|
|
|
args: arrify(_args),
|
|
|
|
time: end - start,
|
|
|
|
err,
|
|
|
|
stdout,
|
|
|
|
stderr
|
|
|
|
});
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
let list;
|
|
|
|
|
|
|
|
if (process.argv.length === 2) {
|
|
|
|
list = [
|
|
|
|
{
|
|
|
|
args: 'other/failures.js',
|
|
|
|
shouldFail: true
|
|
|
|
},
|
|
|
|
'serial/alternating-sync-async.js',
|
|
|
|
'serial/async-immediate.js',
|
|
|
|
'serial/async-timeout.js',
|
|
|
|
'serial/sync.js',
|
|
|
|
'concurrent/alternating-sync-async.js',
|
|
|
|
'concurrent/async-immediate.js',
|
|
|
|
'concurrent/async-timeout.js',
|
|
|
|
'concurrent/sync.js',
|
|
|
|
['concurrent/*.js', 'serial/*.js']
|
|
|
|
].map(definition => {
|
|
|
|
if (Array.isArray(definition) || typeof definition === 'string') {
|
|
|
|
definition = {
|
|
|
|
shouldFail: false,
|
|
|
|
args: definition
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
return definition;
|
|
|
|
});
|
|
|
|
} else {
|
|
|
|
list = [];
|
|
|
|
let currentArgs = [];
|
|
|
|
let shouldFail = false;
|
|
|
|
|
|
|
|
for (const arg of process.argv.slice(2)) {
|
|
|
|
if (arg === '--') {
|
|
|
|
list.push({
|
|
|
|
args: currentArgs,
|
|
|
|
shouldFail
|
|
|
|
});
|
|
|
|
currentArgs = [];
|
|
|
|
shouldFail = false;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (arg === '--should-fail') {
|
|
|
|
shouldFail = true;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
currentArgs.push(arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (currentArgs.length > 0) {
|
|
|
|
list.push({
|
|
|
|
args: currentArgs,
|
|
|
|
shouldFail
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
for (const definition of list) {
|
|
|
|
definition.args = ['--verbose'].concat(definition.args);
|
|
|
|
}
|
|
|
|
|
|
|
|
let combined = [];
|
|
|
|
for (let i = 0; i < 11; i++) {
|
|
|
|
combined = combined.concat(list);
|
|
|
|
}
|
|
|
|
|
|
|
|
const results = {};
|
|
|
|
|
|
|
|
Promise.each(combined, definition => {
|
|
|
|
const args = definition.args;
|
|
|
|
|
|
|
|
return runTests(args).then(result => {
|
|
|
|
const key = result.args.join(' ');
|
|
|
|
const passedOrFaild = result.err ? 'failed' : 'passed';
|
|
|
|
const seconds = result.time / 1000;
|
|
|
|
|
|
|
|
console.log('%s %s in %d seconds', key, passedOrFaild, seconds);
|
|
|
|
|
|
|
|
if (result.err && !definition.shouldFail) {
|
|
|
|
console.log(result.stdout);
|
|
|
|
console.log(result.stderr);
|
|
|
|
throw result.err;
|
|
|
|
}
|
|
|
|
|
|
|
|
results[key] = results[key] || [];
|
|
|
|
|
|
|
|
results[key].push({
|
|
|
|
passed: !results.err,
|
|
|
|
shouldFail: definition.shouldFail,
|
|
|
|
time: seconds
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}).then(() => {
|
|
|
|
mkdirp.sync(path.join(__dirname, '.results'));
|
|
|
|
results['.time'] = Date.now();
|
|
|
|
|
|
|
|
fs.writeFileSync(
|
|
|
|
path.join(__dirname, '.results', `${branch}.json`),
|
|
|
|
JSON.stringify(results, null, 4)
|
|
|
|
);
|
|
|
|
});
|