| // Karma configuration |
| // GENERATED BY Bazel |
| const path = require('path'); |
| const fs = require('fs'); |
| const tmp = require('tmp'); |
| |
| const browsers = []; |
| let customLaunchers = null; |
| |
| // WEB_TEST_METADATA is configured in rules_webtesting based on value |
| // of the browsers attribute passed to ts_web_test_suite |
| // We setup the karma configuration based on the values in this object |
| if (process.env['WEB_TEST_METADATA']) { |
| const webTestMetadata = require(process.env['WEB_TEST_METADATA']); |
| if (webTestMetadata['environment'] === 'sauce') { |
| // If a sauce labs browser is chosen for the test such as |
| // "@io_bazel_rules_webtesting//browsers/sauce:chrome-win10" |
| // than the 'environment' will equal 'sauce'. |
| // We expect that a SAUCE_USERNAME and SAUCE_ACCESS_KEY is available |
| // from the environment for this test to run |
| if (!process.env.SAUCE_USERNAME || !process.env.SAUCE_ACCESS_KEY) { |
| console.error('Make sure the SAUCE_USERNAME and SAUCE_ACCESS_KEY environment variables are set.'); |
| process.exit(1); |
| } |
| // 'capabilities' will specify the sauce labs configuration to use |
| const capabilities = webTestMetadata['capabilities']; |
| customLaunchers = { |
| 'sauce': { |
| base: 'SauceLabs', |
| browserName: capabilities['browserName'], |
| platform: capabilities['platform'], |
| version: capabilities['version'], |
| } |
| }; |
| browsers.push('sauce'); |
| } else if (webTestMetadata['environment'] === 'local') { |
| // When a local chrome or firefox browser is chosen such as |
| // "@io_bazel_rules_webtesting//browsers:chromium-local" or |
| // "@io_bazel_rules_webtesting//browsers:firefox-local" |
| // then the 'environment' will equal 'local' and |
| // 'webTestFiles' will contain the path to the binary to use |
| const webTestNamedFiles = webTestMetadata['webTestFiles'][0]['namedFiles']; |
| if (webTestNamedFiles['CHROMIUM']) { |
| // When karma is configured to use Chrome it will look for a CHROME_BIN |
| // environment variable. |
| process.env.CHROME_BIN = path.join('external', webTestNamedFiles['CHROMIUM']); |
| browsers.push(process.env['DISPLAY'] ? 'Chrome': 'ChromeHeadless'); |
| } |
| if (webTestNamedFiles['FIREFOX']) { |
| // When karma is configured to use Firefox it will look for a FIREFOX_BIN |
| // environment variable. |
| process.env.FIREFOX_BIN = path.join('external', webTestNamedFiles['FIREFOX']); |
| browsers.push(process.env['DISPLAY'] ? 'Firefox': 'FirefoxHeadless'); |
| } |
| } else { |
| console.warn(`Unknown WEB_TEST_METADATA environment '${webTestMetadata['environment']}'`); |
| } |
| } |
| |
| // Fallback to using the system local chrome if no valid browsers have been |
| // configured above |
| if (!browsers.length) { |
| console.warn('No browsers configured. Configuring Karma to use system Chrome.'); |
| browsers.push(process.env['DISPLAY'] ? 'Chrome': 'ChromeHeadless'); |
| } |
| |
| // On Windows, runfiles will not be in the runfiles folder but inteaad |
| // there is a MANIFEST file which maps the runfiles for the test |
| // to their location on disk. Bazel provides a RUNFILE_MANIFEST_FILE environment |
| // variable which is set the location of the MANIFEST file during test execution. |
| // If a MANIFEST file is found, we remap the test files to their |
| // location on disk using the MANIFEST file. |
| let manifest = null; |
| if (process.env.RUNFILE_MANIFEST_FILE && fs.existsSync(process.env.RUNFILE_MANIFEST_FILE)) { |
| // MANIFEST file contains the one runfile mapping per line seperated |
| // a space. For example: |
| // rxjs/operators.js /private/var/tmp/.../external/rxjs/operators.js |
| // The file is parsed here into a map of for easy lookup |
| manifest = {}; |
| for (l of fs.readFileSync(process.env.RUNFILE_MANIFEST_FILE, 'utf8').split('\n')) { |
| const m = l.split(' '); |
| manifest[m[0]] = m[1]; |
| } |
| } |
| |
| function resolveRunfiles(manifest, runfiles) { |
| if (manifest) { |
| runfiles = runfiles.map(f => { |
| const manifestFile = manifest[f]; |
| if (!manifestFile) { |
| throw new Error(`File not found in MANIFEST: ${f}`); |
| } |
| return manifestFile; |
| }); |
| } |
| return runfiles; |
| } |
| |
| const files = resolveRunfiles(manifest, [ |
| TMPL_bootstrap_files |
| TMPL_user_files |
| ]); |
| |
| // static files are added to the files array but |
| // configured to not be included so karma-concat-js does |
| // not included them in the bundle |
| resolveRunfiles(manifest, [ |
| TMPL_static_files |
| ]).forEach(f => { |
| files.push({ pattern: f, included: false }); |
| }); |
| |
| var requireConfigContent = ` |
| // A simplified version of Karma's requirejs.config.tpl.js for use with Karma under Bazel. |
| // This does an explicit \`require\` on each test script in the files, otherwise nothing will be loaded. |
| (function(){ |
| var allFiles = [TMPL_user_files]; |
| var allTestFiles = []; |
| allFiles.forEach(function (file) { |
| if (/(spec|test)\\.js$/i.test(file) && !/\\/node_modules\\//.test(file)) { |
| allTestFiles.push(file.replace(/\\.js$/, '')) |
| } |
| }); |
| require(allTestFiles, window.__karma__.start); |
| })(); |
| `; |
| |
| const requireConfigFile = tmp.fileSync( |
| {keep: false, postfix: '.js', dir: process.env['TEST_TMPDIR']}); |
| fs.writeFileSync(requireConfigFile.name, requireConfigContent); |
| files.push(requireConfigFile.name); |
| |
| module.exports = function(config) { |
| const configuration = { |
| // list of karma plugins |
| plugins: [ |
| 'karma-*', |
| 'karma-concat-js', |
| 'karma-sourcemap-loader', |
| 'karma-chrome-launcher', |
| 'karma-firefox-launcher', |
| 'karma-sauce-launcher', |
| ], |
| |
| // list of karma preprocessors |
| preprocessors: { |
| '**/*.js': ['sourcemap'] |
| }, |
| |
| // list of test frameworks to use |
| frameworks: ['jasmine', 'concat_js'], |
| |
| // test results reporter to use |
| // possible values: 'dots', 'progress' |
| // available reporters: https://npmjs.org/browse/keyword/karma-reporter |
| reporters: ['progress'], |
| |
| // web server port |
| port: 9876, |
| |
| // enable / disable colors in the output (reporters and logs) |
| colors: true, |
| |
| // level of logging |
| // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG |
| logLevel: config.LOG_INFO, |
| |
| // enable / disable watching file and executing tests whenever any file changes |
| autoWatch: true, |
| |
| // start these browsers |
| // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher |
| browsers: browsers, |
| |
| // Continuous Integration mode |
| // if true, Karma captures browsers, runs the tests and exits |
| // note: run_karma.sh may override this as a command-line option. |
| singleRun: false, |
| |
| // Concurrency level |
| // how many browser should be started simultaneous |
| concurrency: Infinity, |
| |
| // base path that will be used to resolve all patterns (eg. files, exclude) |
| basePath: 'TMPL_runfiles_path', |
| |
| // list of files passed to karma; these are concatenated into a single |
| // file by karma-concat-js |
| files, |
| } |
| |
| if (process.env['IBAZEL_NOTIFY_CHANGES'] === 'y') { |
| // Tell karma to only listen for ibazel messages on stdin rather than watch all the input files |
| // This is from fork alexeagle/karma in the ibazel branch: |
| // https://github.com/alexeagle/karma/blob/576d262af50b10e63485b86aee99c5358958c4dd/lib/server.js#L172 |
| configuration.watchMode = 'ibazel'; |
| } |
| |
| // Extra configuration is needed for saucelabs |
| // See: https://github.com/karma-runner/karma-sauce-launcher |
| if (customLaunchers) { |
| // set the test name for sauce labs to use |
| // TEST_BINARY is set by Bazel and contains the name of the test |
| // target posfixed with the the browser name such as |
| // 'examples/testing/testing_sauce_chrome-win10' for the |
| // test target examples/testing:testing |
| configuration.sauceLabs = { |
| testName: process.env['TEST_BINARY'] || 'ts_web_test_suite' |
| }; |
| |
| // setup the custom launchers for saucelabs |
| configuration.customLaunchers = customLaunchers; |
| |
| // add the saucelabs reporter |
| configuration.reporters.push('saucelabs'); |
| } |
| |
| config.set(configuration); |
| } |