// 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);
}
