| Index: test/browser.js | 
| =================================================================== | 
| rename from test_runner.js | 
| rename to test/browser.js | 
| --- a/test_runner.js | 
| +++ b/test/browser.js | 
| @@ -14,30 +14,29 @@ | 
| * You should have received a copy of the GNU General Public License | 
| * along with Adblock Plus. If not, see <http://www.gnu.org/licenses/>. | 
| */ | 
| /* eslint-env node */ | 
| "use strict"; | 
| -const fs = require("fs"); | 
| +const assert = require("assert"); | 
| const path = require("path"); | 
| const MemoryFS = require("memory-fs"); | 
| -const nodeunit = require("nodeunit"); | 
| const webpack = require("webpack"); | 
| -const chromiumRemoteProcess = require("./test/runners/chromium_remote_process"); | 
| -const chromiumProcess = require("./test/runners/chromium_process"); | 
| -const edgeProcess = require("./test/runners/edge_process"); | 
| -const firefoxProcess = require("./test/runners/firefox_process"); | 
| +const chromiumRemoteProcess = require("./runners/chromium_remote_process"); | 
| +const chromiumProcess = require("./runners/chromium_process"); | 
| +const edgeProcess = require("./runners/edge_process"); | 
| +const firefoxProcess = require("./runners/firefox_process"); | 
| -let unitFiles = []; | 
| -let browserFiles = []; | 
| +// Path are to be from the top-level directory | 
| +let browserFiles = ["./test/browser/elemHideEmulation.js", "./test/browser/snippets.js"]; | 
| let runnerDefinitions = { | 
| // Chromium with chrome-remote-interface | 
| chromium_remote: chromiumRemoteProcess, | 
| // Chromium with WebDriver (requires Chromium >= 63.0.3239) | 
| chromium: chromiumProcess, | 
| edge: edgeProcess, | 
| firefox: firefoxProcess | 
| @@ -57,42 +56,16 @@ | 
| return ["chromium_remote", "firefox"]; | 
| } | 
| return runners.filter(runner => runnerDefinitions.hasOwnProperty(runner)); | 
| } | 
| let runnerProcesses = configureRunners(); | 
| -function addTestPaths(testPaths, recurse) | 
| -{ | 
| - for (let testPath of testPaths) | 
| - { | 
| - let stat = fs.statSync(testPath); | 
| - if (stat.isDirectory()) | 
| - { | 
| - if (recurse) | 
| - { | 
| - addTestPaths(fs.readdirSync(testPath).map( | 
| - file => path.join(testPath, file))); | 
| - } | 
| - continue; | 
| - } | 
| - if (path.basename(testPath).startsWith("_")) | 
| - continue; | 
| - if (path.extname(testPath) == ".js") | 
| - { | 
| - if (testPath.split(path.sep).includes("browser")) | 
| - browserFiles.push(testPath); | 
| - else | 
| - unitFiles.push(testPath); | 
| - } | 
| - } | 
| -} | 
| - | 
| function webpackInMemory(bundleFilename, options) | 
| { | 
| return new Promise((resolve, reject) => | 
| { | 
| // Based on this example | 
| // https://webpack.js.org/api/node/#custom-file-systems | 
| let memoryFS = new MemoryFS(); | 
| @@ -119,77 +92,58 @@ | 
| let bundle = memoryFS.readFileSync("/" + bundleFilename, "utf-8"); | 
| memoryFS.unlinkSync("/" + bundleFilename); | 
| resolve(bundle); | 
| } | 
| }); | 
| }); | 
| } | 
| -function runBrowserTests(processes) | 
| +describe("Browser tests", function() | 
| { | 
| - if (!browserFiles.length) | 
| - return Promise.resolve(); | 
| + assert.ok(browserFiles.length); | 
| - let nodeunitPath = path.join(__dirname, "node_modules", "nodeunit", | 
| - "examples", "browser", "nodeunit.js"); | 
| + this.timeout(0); | 
| + | 
| let bundleFilename = "bundle.js"; | 
| - return webpackInMemory(bundleFilename, { | 
| - entry: path.join(__dirname, "test", "browser", "_bootstrap.js"), | 
| - module: { | 
| - rules: [{ | 
| - resource: nodeunitPath, | 
| - // I would have rather used exports-loader here, to avoid treating | 
| - // nodeunit as a global. Unfortunately the nodeunit browser example | 
| - // script is quite slopily put together, if exports isn't falsey it | 
| - // breaks! As a workaround we need to use script-loader, which means | 
| - // that exports is falsey for that script as a side-effect. | 
| - use: ["script-loader"] | 
| - }] | 
| - }, | 
| - resolve: { | 
| - alias: { | 
| - nodeunit$: nodeunitPath | 
| + let bundle; | 
| + let mochaPath = path.join(__dirname, "..", "node_modules", "mocha", | 
| + "mocha.js"); | 
| + before(async() => | 
| + { | 
| + bundle = await webpackInMemory(bundleFilename, { | 
| + entry: path.join(__dirname, "browser", "_bootstrap.js"), | 
| + module: { | 
| + rules: [{ | 
| + // we use the browser version of mocha | 
| + resource: mochaPath, | 
| + use: ["script-loader"] | 
| + }] | 
| }, | 
| - modules: [path.resolve(__dirname, "lib")] | 
| - } | 
| - }).then(bundle => | 
| - Promise.all( | 
| - processes.map(currentProcess => | 
| - runnerDefinitions[currentProcess]( | 
| - bundle, bundleFilename, | 
| - browserFiles.map( | 
| - file => path.relative(path.join(__dirname, "test", "browser"), | 
| - file).replace(/\.js$/, "") | 
| - ) | 
| - ) | 
| - // We need to convert rejected promise to a resolved one | 
| - // or the test will not let close the webdriver. | 
| - .catch(e => e) | 
| - )).then(results => | 
| - { | 
| - let errors = results.filter(e => typeof e != "undefined"); | 
| - if (errors.length) | 
| - throw `Browser unit test failed: ${errors.join(", ")}`; | 
| - }) | 
| - ); | 
| -} | 
| + resolve: { | 
| + alias: { | 
| + mocha$: mochaPath | 
| + }, | 
| + modules: [path.resolve(__dirname, "..", "lib")] | 
| + } | 
| + }); | 
| + }); | 
| -if (process.argv.length > 2) | 
| - addTestPaths(process.argv.slice(2), true); | 
| -else | 
| -{ | 
| - addTestPaths( | 
| - [path.join(__dirname, "test"), path.join(__dirname, "test", "browser")], | 
| - true | 
| - ); | 
| -} | 
| + it("Runner prerequisites", () => | 
| + { | 
| + assert.ok(bundle); | 
| + assert.notEqual(runnerProcesses.length, 0, "No runners was found"); | 
| + }); | 
| -runBrowserTests(runnerProcesses).then(() => | 
| -{ | 
| - if (unitFiles.length) | 
| - nodeunit.reporters.default.run(unitFiles); | 
| -}).catch(error => | 
| -{ | 
| - console.error(error); | 
| - process.exit(1); | 
| + runnerProcesses.map(currentProcess => | 
| + { | 
| + it(currentProcess, () => | 
| + runnerDefinitions[currentProcess]( | 
| + bundle, bundleFilename, | 
| + browserFiles.map( | 
| + file => path.relative(path.join(__dirname, "browser"), | 
| + file).replace(/\.js$/, "") | 
| + ) | 
| + ) | 
| + ); | 
| + }); | 
| }); |