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-wasm/bin/test/pathkit.wasm', included:false, served:true},
      { pattern: 'tests/*.json', included:false, served:true},
      'tests/testReporter.js',
      'npm-wasm/bin/test/pathkit.js',
      'tests/pathkitinit.js',
      'tests/*.spec.js'
    ],

    proxies: {
      '/pathkit/': '/base/npm-wasm/bin/test/'
    },

    // 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) {
    // 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',
          ],
        },
    };
  }

  if (process.env.ASM_JS) {
    console.log('asm.js is under test');
    cfg.files = [
      { pattern: 'npm-asmjs/bin/test/pathkit.js.mem', included:false, served:true},
      { pattern: 'tests/*.json', included:false, served:true},
      'tests/testReporter.js',
      'npm-asmjs/bin/test/pathkit.js',
      'tests/pathkitinit.js',
      'tests/*.spec.js'
    ];

    cfg.proxies = {
      '/pathkit/': '/base/npm-asmjs/bin/test/'
    };
  } else {
    console.log('wasm is under test');
  }

  config.set(cfg);
}
