const os = require('os');

// At this point, process.argv looks something like:
// [
//  '/b/f/w/bazel-out/k8-fastbuild/bin/shaders/modules/shadernode/index_test.sh.runfiles/skia_infra/shaders/modules/shadernode/index_test_node_bin/node',
//  '/b/f/w/bazel-out/k8-fastbuild/bin/shaders/modules/shadernode/index_test.sh.runfiles/skia_infra/node_modules/.aspect_rules_js/karma@6.3.16/node_modules/karma/bin/karma',
//  'start',
//  'shaders/shaders.karma.conf.js',
//  'shaders/modules/shadernode/index_test_bundle.js',
//  'shaders/wasm_libs/from_container/canvaskit.js',
//  'shaders/wasm_libs/from_container/canvaskit.wasm',
//  'shaders/wasm_libs/version.js'
// ]
const startIdx = process.argv.findIndex((v) => v === 'start');

// The path to the JS bundle is passed by the karma_test rule as the second argument after start.
const jsTestFile = process.argv[startIdx + 2];
// CanvasKit JS, WASM, and version files are right after that.
const canvasKitJSFile = process.argv[startIdx + 3];
const canvasKitWASMFile = process.argv[startIdx + 4];
const versionFile = process.argv[startIdx + 5];

// Detect whether we're running as a test (e.g. "bazel test //path/to/my:karma_test").
//
// https://github.com/bazelbuild/rules_nodejs/blob/681c6683dac742f1e375a401c0399ec7783ac8fd/packages/karma/karma_web_test.bzl#L257
const isBazelTest = !process.env.BUILD_WORKSPACE_DIRECTORY; // Set when running via "bazel run".

// Returns the path to the Bazel runfiles directory.
//
// See:
//  - https://docs.bazel.build/versions/master/skylark/rules.html#runfiles-location
//  - https://docs.bazel.build/versions/master/test-encyclopedia.html#initial-conditions
const bazelRunfilesDir = `${process.env.RUNFILES_DIR}/${process.env.TEST_WORKSPACE}`;

// Forces Karma to use the Bazel-downloaded Google Chrome browser.
process.env.CHROME_BIN = `${bazelRunfilesDir}/external/google_chrome/opt/google/chrome/chrome`;

module.exports = function (config) {
  config.set({
    plugins: [
      'karma-chrome-launcher',
      'karma-sinon',
      'karma-mocha',
      'karma-chai',
      'karma-chai-dom',
      'karma-spec-reporter',
    ],

    // Frameworks are loaded in reverse order, so chai-dom loads after chai.
    frameworks: ['mocha', 'chai-dom', 'chai', 'sinon'],

    files: [
      // We want the WASM file to be available for loading by the CanvasKit JS file.
      {
        pattern: `${bazelRunfilesDir}/${canvasKitWASMFile}`,
        included: false,
        served: true,
      },
      // We want the canvasKitJS file to be run before the tests so CanvasKitInit is defined.
      { pattern: `${bazelRunfilesDir}/${canvasKitJSFile}` },
      { pattern: `${bazelRunfilesDir}/${versionFile}` },
      {
        pattern: `${bazelRunfilesDir}/${jsTestFile}`,
        // Force the test files to be served from disk on each request. Without this, interactive
        // mode with ibazel does not work (e.g. "ibazel run //path/to/my:karma_test").
        nocache: true,
      },
    ],

    proxies: {
      // This lets our tests just try to load /canvaskit_assets/canvaskit.wasm instead of the
      // actual path (which is deep inside Bazel's output directory)
      '/canvaskit_assets/canvaskit.wasm': `${bazelRunfilesDir}/${canvasKitWASMFile}`,
    },

    // Only use a headless browser when running as a test (i.e. "bazel test").
    //
    // Do not launch any browsers when running interactively (i.e. with "bazel run"). The developer
    // can open the printed out URL for the Karma server in their browser of choice.
    browsers: isBazelTest ? ['ChromeHeadlessCustom'] : [],

    // Headless Chrome that works on the RBE toolchain container, and any other Docker container.
    //
    // https://github.com/puppeteer/puppeteer/blob/master/docs/troubleshooting.md#running-puppeteer-in-docker
    customLaunchers: {
      ChromeHeadlessCustom: {
        base: 'ChromeHeadless',
        flags: ['--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu'],
      },
    },

    // Report the outcome of each individual test case to stdout.
    //
    // This is consistent with the output format of Puppeteer tests (and any other Node.js tests
    // using Mocha).
    colors: true,
    reporters: ['spec'],

    // Run tests only once when invoked via "bazel test", otherwise Karma will run forever and Bazel
    // will eventually time out and report test failure.
    singleRun: isBazelTest,

    // Autowatch is disabled because it is currently broken in two major ways:
    //
    //   1. It doesn't force a browser refresh when files change.
    //   2. Sometimes it randomly reports changed files as deleted, and stops executing the contents
    //      of those files for the remainder of the session.
    //
    // ibazel can be used to achieve a similar workflow:
    //
    //   - `ibazel test //path/to/my:karma_test`: Reruns the tests on a headless Chrome every time
    //     the tests change, and reports the results on the console.
    //   - `ibazel run //path/to/my:karma_test`: Interactive mode. Prints out a URL that can be
    //     opened in the browser. Tests are rebuilt automatically when the code changes. Reload the
    //     page manually to see the changes.
    autoWatch: false,

    // Set hostname so that, when running in interactive mode (e.g. "bazel run //path/to:test"),
    // the test runner prints "Karma vX.Y.Z server started at http://<HOSTNAME>:9876", where
    // <HOSTNAME> is the actual host's name rather than "localhost". This is useful when running
    // tests in interactive mode remotely via SSH and one wishes to open the test runner page in a
    // browser running locally.
    hostname: os.hostname(),
  });
};
