| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * This file is part of Adblock Plus <https://adblockplus.org/>, |    2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
|    3  * Copyright (C) 2006-present eyeo GmbH |    3  * Copyright (C) 2006-present eyeo GmbH | 
|    4  * |    4  * | 
|    5  * Adblock Plus is free software: you can redistribute it and/or modify |    5  * Adblock Plus is free software: you can redistribute it and/or modify | 
|    6  * it under the terms of the GNU General Public License version 3 as |    6  * it under the terms of the GNU General Public License version 3 as | 
|    7  * published by the Free Software Foundation. |    7  * published by the Free Software Foundation. | 
|    8  * |    8  * | 
|    9  * Adblock Plus is distributed in the hope that it will be useful, |    9  * Adblock Plus is distributed in the hope that it will be useful, | 
|   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of |   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|   12  * GNU General Public License for more details. |   12  * GNU General Public License for more details. | 
|   13  * |   13  * | 
|   14  * You should have received a copy of the GNU General Public License |   14  * You should have received a copy of the GNU General Public License | 
|   15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. |   15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
|   16  */ |   16  */ | 
|   17  |   17  | 
|   18 /* eslint-env node */ |   18 /* eslint-env node */ | 
|   19  |   19  | 
|   20 "use strict"; |   20 "use strict"; | 
|   21  |   21  | 
|   22 const fs = require("fs"); |   22 const fs = require("fs"); | 
|   23 const path = require("path"); |   23 const path = require("path"); | 
|   24  |   24  | 
|   25 const MemoryFS = require("memory-fs"); |   25 const MemoryFS = require("memory-fs"); | 
|   26 const nodeunit = require("nodeunit"); |   26 const nodeunit = require("nodeunit"); | 
|   27 const webpack = require("webpack"); |   27 const webpack = require("webpack"); | 
|   28  |   28  | 
|   29 const chromiumProcess = require("./chromium_process"); |   29 const chromiumRemoteProcess = require("./test/runners/chromium_remote_process"); | 
 |   30 const chromiumProcess = require("./test/runners/chromium_process"); | 
 |   31 const firefoxProcess = require("./test/runners/firefox_process"); | 
|   30  |   32  | 
|   31 let unitFiles = []; |   33 let unitFiles = []; | 
|   32 let browserFiles = []; |   34 let browserFiles = []; | 
|   33  |   35  | 
 |   36 let runnerDefinitions = { | 
 |   37   // Chromium with chrome-remote-interface | 
 |   38   chromium_remote: chromiumRemoteProcess, | 
 |   39   // Chromium with WebDriver (requires Chromium >= 63.0.3239) | 
 |   40   chromium: chromiumProcess, | 
 |   41   firefox: firefoxProcess | 
 |   42 }; | 
 |   43  | 
 |   44 function configureRunners() | 
 |   45 { | 
 |   46   let runners = "BROWSER_TEST_RUNNERS" in process.env ? | 
 |   47       process.env.BROWSER_TEST_RUNNERS.split(",") : []; | 
 |   48  | 
 |   49   if (runners.length == 0) | 
 |   50     return ["chromium", "firefox"]; | 
 |   51  | 
 |   52   return runners.filter(runner => runnerDefinitions.hasOwnProperty(runner)); | 
 |   53 } | 
 |   54  | 
 |   55 let runnerProcesses = configureRunners(); | 
 |   56  | 
|   34 function addTestPaths(testPaths, recurse) |   57 function addTestPaths(testPaths, recurse) | 
|   35 { |   58 { | 
|   36   for (let testPath of testPaths) |   59   for (let testPath of testPaths) | 
|   37   { |   60   { | 
|   38     let stat = fs.statSync(testPath); |   61     let stat = fs.statSync(testPath); | 
|   39     if (stat.isDirectory()) |   62     if (stat.isDirectory()) | 
|   40     { |   63     { | 
|   41       if (recurse) |   64       if (recurse) | 
|   42       { |   65       { | 
|   43         addTestPaths(fs.readdirSync(testPath).map( |   66         addTestPaths(fs.readdirSync(testPath).map( | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   86       else |  109       else | 
|   87       { |  110       { | 
|   88         let bundle = memoryFS.readFileSync("/" + bundleFilename, "utf-8"); |  111         let bundle = memoryFS.readFileSync("/" + bundleFilename, "utf-8"); | 
|   89         memoryFS.unlinkSync("/" + bundleFilename); |  112         memoryFS.unlinkSync("/" + bundleFilename); | 
|   90         resolve(bundle); |  113         resolve(bundle); | 
|   91       } |  114       } | 
|   92     }); |  115     }); | 
|   93   }); |  116   }); | 
|   94 } |  117 } | 
|   95  |  118  | 
|   96 function runBrowserTests() |  119 function runBrowserTests(processes) | 
|   97 { |  120 { | 
|   98   if (!browserFiles.length) |  121   if (!browserFiles.length) | 
|   99     return; |  122     return; | 
|  100  |  123  | 
|  101   let nodeunitPath = path.join(__dirname, "node_modules", "nodeunit", |  124   let nodeunitPath = path.join(__dirname, "node_modules", "nodeunit", | 
|  102                                "examples", "browser", "nodeunit.js"); |  125                                "examples", "browser", "nodeunit.js"); | 
|  103   let bundleFilename = "bundle.js"; |  126   let bundleFilename = "bundle.js"; | 
|  104  |  127  | 
|  105   return webpackInMemory(bundleFilename, { |  128   return webpackInMemory(bundleFilename, { | 
|  106     entry: path.join(__dirname, "test", "browser", "_bootstrap.js"), |  129     entry: path.join(__dirname, "test", "browser", "_bootstrap.js"), | 
|  107     module: { |  130     module: { | 
|  108       rules: [{ |  131       rules: [{ | 
|  109         resource: nodeunitPath, |  132         resource: nodeunitPath, | 
|  110         // I would have rather used exports-loader here, to avoid treating |  133         // I would have rather used exports-loader here, to avoid treating | 
|  111         // nodeunit as a global. Unfortunately the nodeunit browser example |  134         // nodeunit as a global. Unfortunately the nodeunit browser example | 
|  112         // script is quite slopily put together, if exports isn't falsey it |  135         // script is quite slopily put together, if exports isn't falsey it | 
|  113         // breaks! As a workaround we need to use script-loader, which means |  136         // breaks! As a workaround we need to use script-loader, which means | 
|  114         // that exports is falsey for that script as a side-effect. |  137         // that exports is falsey for that script as a side-effect. | 
|  115         use: ["script-loader"] |  138         use: ["script-loader"] | 
|  116       }] |  139       }] | 
|  117     }, |  140     }, | 
|  118     resolve: { |  141     resolve: { | 
|  119       alias: { |  142       alias: { | 
|  120         nodeunit$: nodeunitPath |  143         nodeunit$: nodeunitPath | 
|  121       }, |  144       }, | 
|  122       modules: [path.resolve(__dirname, "lib")] |  145       modules: [path.resolve(__dirname, "lib")] | 
|  123     } |  146     } | 
|  124   }).then(bundle => |  147   }).then(bundle => | 
|  125   { |  148     Promise.all( | 
|  126     return chromiumProcess( |  149       processes.map(currentProcess => | 
|  127       bundle, bundleFilename, |  150         runnerDefinitions[currentProcess]( | 
|  128       browserFiles.map( |  151           bundle, bundleFilename, | 
|  129         file => path.relative(path.join(__dirname, "test", "browser"), |  152           browserFiles.map( | 
|  130                               file).replace(/\.js$/, "") |  153             file => path.relative(path.join(__dirname, "test", "browser"), | 
 |  154                                   file).replace(/\.js$/, "") | 
 |  155           ) | 
 |  156         ) | 
|  131       ) |  157       ) | 
|  132     ); |  158     ) | 
|  133   }); |  159   ); | 
|  134 } |  160 } | 
|  135  |  161  | 
|  136 if (process.argv.length > 2) |  162 if (process.argv.length > 2) | 
|  137   addTestPaths(process.argv.slice(2), true); |  163   addTestPaths(process.argv.slice(2), true); | 
|  138 else |  164 else | 
|  139 { |  165 { | 
|  140   addTestPaths( |  166   addTestPaths( | 
|  141     [path.join(__dirname, "test"), path.join(__dirname, "test", "browser")], |  167     [path.join(__dirname, "test"), path.join(__dirname, "test", "browser")], | 
|  142     true |  168     true | 
|  143   ); |  169   ); | 
|  144 } |  170 } | 
|  145  |  171  | 
|  146 Promise.resolve(runBrowserTests()).catch(error => |  172 Promise.resolve(runBrowserTests(runnerProcesses)).catch(error => | 
|  147 { |  173 { | 
|  148   console.error("Failed running browser tests"); |  174   console.error("Failed running browser tests"); | 
|  149   console.error(error); |  175   console.error(error); | 
|  150 }).then(() => |  176 }).then(() => | 
|  151 { |  177 { | 
|  152   if (unitFiles.length) |  178   if (unitFiles.length) | 
|  153     nodeunit.reporters.default.run(unitFiles); |  179     nodeunit.reporters.default.run(unitFiles); | 
|  154 }); |  180 }); | 
| OLD | NEW |