Files
discourse/test/run-qunit.js
T

215 lines
5.0 KiB
JavaScript
Raw Normal View History

// Chrome QUnit Test Runner
// Author: David Taylor
// Requires chrome-launcher and chrome-remote-interface from npm
// An up-to-date version of chrome is also required
2013-06-18 13:44:20 -04:00
/* globals Promise */
2013-06-18 13:44:20 -04:00
var args = process.argv.slice(2);
2015-08-25 10:42:19 +02:00
2018-04-23 14:41:29 +10:00
if (args.length < 1 || args.length > 3) {
console.log("Usage: node run-qunit.js <URL> <timeout> <result_file>");
process.exit(1);
2013-06-18 13:44:20 -04:00
}
2018-11-27 17:40:55 +11:00
const chromeLauncher = require("chrome-launcher");
const CDP = require("chrome-remote-interface");
2013-06-18 13:44:20 -04:00
2018-04-23 14:41:29 +10:00
const QUNIT_RESULT = args[2];
2018-11-27 17:40:55 +11:00
const fs = require("fs");
2018-04-23 14:41:29 +10:00
if (QUNIT_RESULT) {
(async () => {
await fs.stat(QUNIT_RESULT, (err, stats) => {
if (stats && stats.isFile()) fs.unlink(QUNIT_RESULT);
});
})();
}
async function runAllTests() {
function launchChrome() {
const options = {
2018-11-27 17:40:55 +11:00
chromeFlags: ["--disable-gpu", "--headless", "--no-sandbox"]
2018-04-23 14:41:29 +10:00
};
if (process.env.REMOTE_DEBUG) {
options.port = 9222;
}
return chromeLauncher.launch(options);
2013-06-18 13:44:20 -04:00
}
2018-04-23 14:41:29 +10:00
let chrome = await launchChrome();
2018-11-27 17:40:55 +11:00
let protocol = await CDP({ port: chrome.port });
2018-04-23 14:41:29 +10:00
2018-11-27 17:40:55 +11:00
const { Page, Runtime } = protocol;
2018-04-23 14:41:29 +10:00
await Promise.all([Page.enable(), Runtime.enable()]);
2018-11-27 17:40:55 +11:00
Runtime.consoleAPICalled(response => {
const message = response["args"][0].value;
2018-04-23 14:41:29 +10:00
// If it's a simple test result, write without newline
2018-11-27 17:40:55 +11:00
if (message === "." || message === "F") {
2018-04-23 14:41:29 +10:00
process.stdout.write(message);
2018-11-27 17:40:55 +11:00
} else if (
message &&
message.startsWith &&
message.startsWith("AUTOSPEC:")
) {
2018-04-23 14:41:29 +10:00
fs.appendFileSync(QUNIT_RESULT, `${message.slice(10)}\n`);
} else {
console.log(message);
}
});
console.log("navigate to " + args[0]);
2018-11-27 17:40:55 +11:00
Page.navigate({ url: args[0] });
2018-04-23 14:41:29 +10:00
Page.loadEventFired(async () => {
2018-11-27 17:40:55 +11:00
await Runtime.evaluate({ expression: `(${qunit_script})()` });
2018-04-23 14:41:29 +10:00
const timeout = parseInt(args[1] || 300000, 10);
var start = Date.now();
var interval;
let runTests = async function() {
if (Date.now() > start + timeout) {
console.error("Tests timed out");
protocol.close();
chrome.kill();
process.exit(124);
}
2018-11-27 17:40:55 +11:00
let numFails = await Runtime.evaluate({
expression: `(${check_script})()`
});
2018-04-23 14:41:29 +10:00
2018-11-27 17:40:55 +11:00
if (numFails && numFails.result && numFails.result.type !== "undefined") {
2018-04-23 14:41:29 +10:00
clearInterval(interval);
protocol.close();
chrome.kill();
if (numFails.result.value > 0) {
process.exit(1);
} else {
process.exit();
}
}
};
interval = setInterval(runTests, 250);
});
}
try {
runAllTests();
2018-11-27 17:40:55 +11:00
} catch (e) {
2018-04-23 14:41:29 +10:00
console.log("Failed to run tests: " + e);
process.exit(1);
}
// The following functions are converted to strings
// And then sent to chrome to be evalaluated
2013-06-18 13:44:20 -04:00
function logQUnit() {
var moduleErrors = [];
var testErrors = [];
var assertionErrors = [];
console.log("\nRunning: " + JSON.stringify(QUnit.urlParams) + "\n");
2016-11-16 18:02:16 +08:00
QUnit.config.testTimeout = 10000;
2013-06-18 13:44:20 -04:00
QUnit.moduleDone(function(context) {
if (context.failed) {
var msg = "Module Failed: " + context.name + "\n" + testErrors.join("\n");
moduleErrors.push(msg);
testErrors = [];
}
});
2018-04-23 14:41:29 +10:00
let durations = {};
2013-06-18 13:44:20 -04:00
QUnit.testDone(function(context) {
2018-04-23 14:41:29 +10:00
durations[context.module + "::" + context.name] = context.runtime;
2013-06-18 13:44:20 -04:00
if (context.failed) {
var msg = " Test Failed: " + context.name + assertionErrors.join(" ");
2018-04-23 14:41:29 +10:00
/* QUNIT_RESULT */
2013-06-18 13:44:20 -04:00
testErrors.push(msg);
assertionErrors = [];
console.log("F");
2013-06-18 13:44:20 -04:00
} else {
console.log(".");
2013-06-18 13:44:20 -04:00
}
});
QUnit.log(function(context) {
2018-11-27 17:40:55 +11:00
if (context.result) {
return;
}
2013-06-18 13:44:20 -04:00
var msg = "\n Assertion Failed:";
if (context.message) {
msg += " " + context.message;
}
if (context.expected) {
2018-11-27 17:40:55 +11:00
msg +=
"\n Expected: " + context.expected + ", Actual: " + context.actual;
2013-06-18 13:44:20 -04:00
}
assertionErrors.push(msg);
});
QUnit.done(function(context) {
2015-08-25 10:42:19 +02:00
console.log("\n");
2013-06-18 13:44:20 -04:00
if (moduleErrors.length > 0) {
2018-11-27 17:40:55 +11:00
for (var idx = 0; idx < moduleErrors.length; idx++) {
console.error(moduleErrors[idx] + "\n");
2013-06-18 13:44:20 -04:00
}
}
2018-04-23 14:41:29 +10:00
console.log("Slowest tests");
console.log("----------------------------------------------");
2018-11-27 17:40:55 +11:00
let ary = Object.keys(durations).map(key => ({
key: key,
value: durations[key]
}));
ary.sort((p1, p2) => p2.value - p1.value);
2018-04-23 14:41:29 +10:00
ary.slice(0, 30).forEach(pair => {
console.log(pair.key + ": " + pair.value + "ms");
});
2013-06-18 13:44:20 -04:00
var stats = [
"Time: " + context.runtime + "ms",
"Total: " + context.total,
"Passed: " + context.passed,
"Failed: " + context.failed
];
console.log(stats.join(", "));
2018-04-23 14:41:29 +10:00
2013-06-18 13:44:20 -04:00
window.qunitDone = context;
});
}
2018-04-23 14:41:29 +10:00
let qunit_script = logQUnit.toString();
if (QUNIT_RESULT) {
2018-11-27 17:40:55 +11:00
qunit_script = qunit_script.replace(
"/* QUNIT_RESULT */",
"console.log(`AUTOSPEC: ${context.module}:::${context.testId}:::${context.name}`);"
);
2018-04-23 14:41:29 +10:00
}
function check() {
2018-11-27 17:40:55 +11:00
if (window.qunitDone) {
return window.qunitDone.failed;
}
}
2018-04-23 14:41:29 +10:00
const check_script = check.toString();