forked from firefox-devtools/debugger
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathintermitents.js
More file actions
117 lines (104 loc) · 3.19 KB
/
intermitents.js
File metadata and controls
117 lines (104 loc) · 3.19 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
const shell = require("shelljs");
const chalk = require("chalk");
const path = require("path");
const _ = require("lodash");
const minimist = require("minimist");
const emoji = require("node-emoji");
/**
* Checks for intermittents with one of two strategies:
* 1. runs each test a number of times
* 2. groups tests until failing tests are isolated
*
* params:
* --group enable test grouping
* --runs <number> set the number of test runs (default: 10)
* --path filters tests given a path
*/
const args = minimist(process.argv.slice(2), {
boolean: ["group"],
number: ["runs"],
string: ["path"]
});
const runs = args.runs || 10;
const testPath = args.path ? `--testPathPattern ${args.path}` : "";
shell.env.PATH += `${path.delimiter}${__dirname}/../node_modules/jest-cli/bin`;
const child = shell.exec(`jest.js --listTests ${testPath}`, { silent: true });
const tests = JSON.parse(child.stdout);
const log = require("single-line-log").stdout;
const write = msg => process.stdout.write(msg);
function runTest(test) {
const file = path.basename(test);
log(`${emoji.get("sweat_smile")} ${file} `);
const startTime = Date.now();
let failed = false;
let elapsedTime = 0;
let progress = [];
_.times(runs).forEach(() => {
const out = shell.exec(`jest.js ${test}`, { silent: true });
const hasFailed = out.code !== 0;
failed = failed || hasFailed;
if (hasFailed) {
console.log(out.stderr);
}
const endTime = Date.now();
elapsedTime = Math.round((endTime - startTime) / 1000);
if (failed) {
progress.push(chalk.red("."));
} else {
progress.push(".");
}
const status = failed ? emoji.get("rage") : emoji.get("sweat_smile");
const dots = progress.join("");
log(`${status} ${file} ${dots}`);
});
const dots = progress.join("");
const status = failed ? emoji.get("rage") : emoji.get("sweat_smile");
log(`${status} ${file} ${dots} (${elapsedTime}s)`);
console.log("");
nextTest();
}
let queue = tests;
function nextTest() {
const test = queue.pop();
if (test) {
runTest(test);
}
}
function split(list) {
return [list.slice(0, list.length / 2), list.slice(list.length / 2)];
}
function runTestGroup(tests) {
const files = tests.map(test => path.basename(test)).join(", ");
console.log(`${chalk.yellow(`starting`)} ${files}`);
const startTime = Date.now();
shell.exec(
`for i in \`seq 1 ${runs}\`; do jest ${tests.join(" ")} ; done`,
{ silent: true },
(code, stdout, stderr) => {
const failed = stderr.match(/removeEvent/gi);
const endTime = Date.now();
const elapsedTime = Math.round((endTime - startTime) / 1000);
if (failed) {
console.log(`${chalk.red("failed")} (${elapsedTime}s) ${files}`);
nextGroup(tests);
} else {
console.log(`${chalk.blue("passed")} (${elapsedTime}s) ${files}`);
}
}
);
}
function nextGroup(_tests) {
const [first, second] = split(_.shuffle(_tests));
if (first.length > 0) {
runTestGroup(first);
}
if (second.length > 0) {
runTestGroup(second);
}
}
if (args.group) {
nextGroup(tests);
} else {
// we start with 5 files so we don't overwhelm your computer
new Array(5).fill().forEach(() => nextTest());
}