const isDocker = require('is-docker')();

module.exports = function(config) {
  // Set the default values to be what are needed when testing the
  // WebAssembly build locally.
  let cfg = {
    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['jasmine'],

    // list of files / patterns to load in the browser
    files: [
      { pattern: 'npm_build/bin/canvaskit.wasm', included:false, served:true},
      { pattern: 'tests/assets/*', included:false, served:true},
      'tests/testReporter.js',
      'npm_build/bin/canvaskit.js',
      'tests/canvaskitinit.js',
      'tests/util.js',
      'tests/*.spec.js'
    ],

    proxies: {
      '/assets/': '/base/tests/assets/',
      '/npm_build/': '/base/npm_build/bin/',
    },

    // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress'],

    // web server port
    port: 4444,

    // 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,

    browserDisconnectTimeout: 20000,
    browserNoActivityTimeout: 20000,

    // start these browsers
    browsers: ['Chrome'],

    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false,

    // Concurrency level
    // how many browser should be started simultaneous
    concurrency: Infinity,
  };

  if (isDocker || config.headless) {
    // See https://hackernoon.com/running-karma-tests-with-headless-chrome-inside-docker-ae4aceb06ed3
    cfg.browsers = ['ChromeHeadlessNoSandbox'],
    cfg.customLaunchers = {
        ChromeHeadlessNoSandbox: {
          base: 'ChromeHeadless',
          flags: [
            // Without this flag, we see an error:
            // Failed to move to new namespace: PID namespaces supported, Network namespace supported, but failed: errno = Operation not permitted
            '--no-sandbox',
            // may help tests be less flaky
            // https://peter.sh/experiments/chromium-command-line-switches/#browser-test
            '--browser-test',
            // This can also help avoid crashes/timeouts:
            // https://github.com/GoogleChrome/puppeteer/issues/1834
            '--disable-dev-shm-usage',
          ],
        },
    };
  } else {
    // Extra options that should only be applied locally

    // Measure test coverage and write output to coverage/ directory
    cfg.reporters.push('coverage');
    cfg.preprocessors = {
      // Measure test coverage of these source files
      // Since this file is a combination of our code, and emscripten's glue,
      // we'll never see 100% coverage, but this lets us measure improvements.
      'canvaskit/bin/canvaskit.js': ['coverage'],
    };
  }

  config.set(cfg);
}
