Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: browsertests.js

Issue 29373596: Issue 4838 - Use nodeunit framework for integration tests running in browser (Closed) Base URL: https://hg.adblockplus.org/adblockpluscore
Patch Set: Created Jan. 24, 2017, 4:35 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | package.json » ('j') | test/browser/elemHideEmulation.js » ('J')
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: browsertests.js
===================================================================
new file mode 100644
--- /dev/null
+++ b/browsertests.js
@@ -0,0 +1,228 @@
+/*
+ * This file is part of Adblock Plus <https://adblockplus.org/>,
+ * Copyright (C) 2006-2016 Eyeo GmbH
+ *
+ * Adblock Plus is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
+ *
+ * Adblock Plus is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+"use strict";
+
+try
+{
+ var fs = require("fs");
+ var system = require("system");
+ var webpage = require("webpage");
+
+ var nodeunitUrl = system.args[1];
+ var urls = system.args.slice(2);
+
+ // No need to load anything, about:blank will do for us
+ var page = webpage.create();
+ page.evaluate(initPage, nodeunitUrl);
+ window.setTimeout(function()
+ {
+ runTests(urls, function()
+ {
+ phantom.exit();
+ });
+ }, 0);
+}
+catch(e)
+{
+ console.error(e);
+ phantom.exit();
+}
+
+function runTests(urls, callback)
+{
+ page.onError = function(msg, trace)
+ {
+ var message = "Error: " + msg + "\n";
+ if (trace)
+ {
+ for (var i = 0; i < trace.length; i++)
+ {
+ message += "\n " + trace[i].file + ":" + trace[i].line +
+ (trace[i].function ? " in function " + trace[i].function
+ : " in global code");
+ }
+ }
+ console.error(message);
+ };
+
+ page.onCallback = function(data)
+ {
+ function bold(str)
+ {
+ return "\u001B[1m" + str + "\u001B[22m";
+ }
+
+ function ok(str)
+ {
+ return "\u001B[32m" + str + "\u001B[39m";
+ }
+
+ function error(str)
+ {
+ return "\u001B[31m" + str + "\u001B[39m";
+ }
+
+ if (data.type == "moduleStart")
+ console.log(bold(data.name));
+ else if (data.type == "testDone")
+ {
+ if (data.failures.length == 0)
+ console.log("\u2714 " + data.name);
+ else
+ {
+ console.log(error("\u2716 " + data.name) + "\n");
+ data.failures.forEach(function(failure)
+ {
+ console.log(failure.join("\n") + "\n");
+ })
+ }
+ }
+ else if (data.type == "done")
+ {
+ if (data.failures)
+ {
+ console.log(
+ "\n" +
+ bold(error("FAILURES: ")) +
+ data.failures + "/" + data.assertions + " assertions failed"
+ );
+ }
+ else
+ {
+ console.log("\n" + bold(ok("OK: ")) + data.assertions + " assertions");
+ }
+
+ page.close();
+ callback();
+ }
+ else if (data.type == "log")
+ {
+ console.log(data.args.join(" "));
+ }
+ else if (data.type == "error")
+ {
+ console.error(data.args.join(" "));
+ }
+ };
+
+ page.evaluate(runTestsContent, urls);
+}
+
+function initPage(nodeunitUrl)
+{
+ function normalizeArgs(args)
+ {
+ var normalized = [];
+ for (var i = 0; i < args.length; i++)
+ {
+ try
+ {
+ if (typeof args[i] == "string")
+ normalized.push(args[i]);
+ else
+ normalized.push(JSON.stringify(args[i]));
+ }
+ catch (e)
+ {
+ normalized.push(String(args[i]));
+ }
+ }
+ return normalized;
+ }
+
+ window.console = {
+ log: function()
+ {
+ window.callPhantom({type: "log", args: normalizeArgs(arguments)});
+ },
+ error: function()
+ {
+ window.callPhantom({type: "error", args: normalizeArgs(arguments)});
+ }
+ };
+
+ window.loadScript = function(url, callback)
+ {
+ var script = document.createElement("script");
+ script.src = url;
+ script.async = false;
+ document.head.appendChild(script);
+ if (callback)
+ window.setTimeout(callback, 0);
+ };
+
+ loadScript(nodeunitUrl);
+}
+
+function runTestsContent(urls)
+{
+ var modules = {};
+
+ var loadNext = function()
+ {
+ if (urls.length)
+ {
+ window.exports = {};
+ window.module = {exports: window.exports};
+
+ var url = urls.shift();
+ var name = url.split("/").pop();
+ loadScript(url, function()
+ {
+ modules[name] = nodeunit.testCase(window.module.exports);
+ loadNext();
+ });
+ }
+ else
+ {
+ nodeunit.runModules(modules, {
+ moduleStart: function(name)
+ {
+ window.callPhantom({type: "moduleStart", name: name});
+ },
+ testDone: function(name, assertions)
+ {
+ var failures = assertions.filter(function(assertion)
+ {
+ return assertion.failed();
+ }).map(function(assertion)
+ {
+ return [String(assertion.error), assertion.error.stack];
+ });
+ window.callPhantom({
+ type: "testDone",
+ name: name,
+ failures: failures
+ });
+ },
+ done: function(assertions)
+ {
+ window.callPhantom({
+ type: "done",
+ assertions: assertions.length,
+ failures: assertions.filter(function(assertion)
+ {
+ return assertion.failed();
+ }).length
+ });
+ }
+ });
+ }
+ }
+ loadNext();
+}
« no previous file with comments | « no previous file | package.json » ('j') | test/browser/elemHideEmulation.js » ('J')

Powered by Google App Engine
This is Rietveld