summaryrefslogtreecommitdiffstats
path: root/browser/components/newtab/bin/try-runner.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/newtab/bin/try-runner.js')
-rw-r--r--browser/components/newtab/bin/try-runner.js200
1 files changed, 200 insertions, 0 deletions
diff --git a/browser/components/newtab/bin/try-runner.js b/browser/components/newtab/bin/try-runner.js
new file mode 100644
index 0000000000..8b240465b6
--- /dev/null
+++ b/browser/components/newtab/bin/try-runner.js
@@ -0,0 +1,200 @@
+/* eslint-disable no-console */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at <http://mozilla.org/MPL/2.0/>. */
+
+/*
+ * A small test runner/reporter for node-based tests,
+ * which are run via taskcluster node(debugger).
+ *
+ * Forked from
+ * https://searchfox.org/mozilla-central/source/devtools/client/debugger/bin/try-runner.js
+ */
+
+const { execFileSync } = require("child_process");
+const { readFileSync } = require("fs");
+const path = require("path");
+
+function logErrors(tool, errors) {
+ for (const error of errors) {
+ console.log(`TEST-UNEXPECTED-FAIL ${tool} | ${error}`);
+ }
+ return errors;
+}
+
+function execOut(...args) {
+ let exitCode = 0;
+ let out;
+ let err;
+
+ try {
+ out = execFileSync(...args, {
+ silent: false,
+ });
+ } catch (e) {
+ // For debugging on (eg) try server...
+ //
+ // if (e) {
+ // logErrors("execOut", ["execFileSync returned exception: ", e]);
+ // }
+
+ out = e && e.stdout;
+ err = e && e.stderr;
+ exitCode = e && e.status;
+ }
+ return { exitCode, out: out && out.toString(), err: err && err.toString() };
+}
+
+function logStart(name) {
+ console.log(`TEST START | ${name}`);
+}
+
+function checkBundles() {
+ logStart("checkBundles");
+
+ const ASbundle = path.join("data", "content", "activity-stream.bundle.js");
+ const AWbundle = path.join(
+ "aboutwelcome",
+ "content",
+ "aboutwelcome.bundle.js"
+ );
+ let errors = [];
+
+ let ASbefore = readFileSync(ASbundle, "utf8");
+ let AWbefore = readFileSync(AWbundle, "utf8");
+
+ execOut("npm", ["run", "bundle"]);
+
+ let ASafter = readFileSync(ASbundle, "utf8");
+ let AWafter = readFileSync(AWbundle, "utf8");
+
+ if (ASbefore !== ASafter) {
+ errors.push("Activity Stream bundle out of date");
+ }
+
+ if (AWbefore !== AWafter) {
+ errors.push("About:welcome bundle out of date");
+ }
+
+ logErrors("checkBundles", errors);
+ return errors.length === 0;
+}
+
+function karma() {
+ logStart("karma");
+
+ const errors = [];
+ const { exitCode, out } = execOut("npm", [
+ "run",
+ "testmc:unit",
+ // , "--", "--log-level", "--verbose",
+ // to debug the karma integration, uncomment the above line
+ ]);
+
+ // karma spits everything to stdout, not stderr, so if nothing came back on
+ // stdout, give up now.
+ if (!out) {
+ return false;
+ }
+
+ // Detect mocha failures
+ let jsonContent;
+ try {
+ // Note that this will be overwritten at each run, but that shouldn't
+ // matter.
+ jsonContent = readFileSync(path.join("logs", "karma-run-results.json"));
+ } catch (ex) {
+ console.error("exception reading karma-run-results.json: ", ex);
+ return false;
+ }
+ const results = JSON.parse(jsonContent);
+ // eslint-disable-next-line guard-for-in
+ for (let testArray in results.result) {
+ let failedTests = Array.from(results.result[testArray]).filter(
+ test => !test.success && !test.skipped
+ );
+
+ errors.push(
+ ...failedTests.map(
+ test => `${test.suite.join(":")} ${test.description}: ${test.log[0]}`
+ )
+ );
+ }
+
+ // Detect istanbul failures (coverage thresholds set in karma config)
+ const coverage = out.match(/ERROR.+coverage-istanbul.+/g);
+ if (coverage) {
+ errors.push(...coverage.map(line => line.match(/Coverage.+/)[0]));
+ }
+
+ logErrors("karma", errors);
+
+ console.log("-----karma stdout below this line---");
+ console.log(out);
+ console.log("-----karma stdout above this line---");
+
+ // Pass if there's no detected errors and nothing unexpected.
+ return errors.length === 0 && !exitCode;
+}
+
+function sasslint() {
+ logStart("sasslint");
+ const { exitCode, out } = execOut("npm", [
+ "run",
+ "--silent",
+ "lint:sasslint",
+ "--",
+ "--format",
+ "json",
+ ]);
+
+ // Successful exit and no output means sasslint passed.
+ if (!exitCode && !out.length) {
+ return true;
+ }
+
+ let fileObjects = JSON.parse(out);
+ let filesWithIssues = fileObjects.filter(
+ file => file.warningCount || file.errorCount
+ );
+
+ let errs = [];
+ let errorString;
+ filesWithIssues.forEach(file => {
+ file.messages.forEach(messageObj => {
+ errorString = `${file.filePath}(${messageObj.line}, ${messageObj.column}): ${messageObj.message} (${messageObj.ruleId})`;
+ errs.push(errorString);
+ });
+ });
+
+ const errors = logErrors("sasslint", errs);
+
+ // Pass if there's no detected errors and nothing unexpected.
+ return errors.length === 0 && !exitCode;
+}
+
+function zipCodeCoverage() {
+ logStart("zipCodeCoverage");
+ const { exitCode, out } = execOut("zip", [
+ "-j",
+ "logs/coverage/code-coverage-grcov",
+ "logs/coverage/lcov.info",
+ ]);
+
+ console.log("zipCodeCoverage log output: ", out);
+
+ if (!exitCode) {
+ return true;
+ }
+
+ return false;
+}
+
+const tests = {};
+const success = [checkBundles, karma, zipCodeCoverage, sasslint].every(
+ t => (tests[t.name] = t())
+);
+console.log(tests);
+
+process.exitCode = success ? 0 : 1;
+console.log("CODE", process.exitCode);