|  | /** | 
|  | * @license | 
|  | * Copyright 2020 Google LLC | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | const runUnderBazel = !!process.env["RUNFILES_DIR"]; | 
|  | const path = require("path"); | 
|  |  | 
|  | function getModulesDir() { | 
|  | if (runUnderBazel) { | 
|  | // Run under bazel | 
|  | return [ | 
|  | `external/plugins_npm/node_modules`, | 
|  | `external/ui_npm/node_modules`, | 
|  | `external/ui_dev_npm/node_modules`, | 
|  | ]; | 
|  | } | 
|  |  | 
|  | // Run from intellij or npm run test:kdebug | 
|  | return [ | 
|  | path.join(__dirname, "app/node_modules"), | 
|  | path.join(__dirname, "node_modules"), | 
|  | ]; | 
|  | } | 
|  |  | 
|  | function getUiDevNpmFilePath(importPath) { | 
|  | if (runUnderBazel) { | 
|  | return `external/ui_dev_npm/node_modules/${importPath}`; | 
|  | } else { | 
|  | return `polygerrit-ui/node_modules/${importPath}`; | 
|  | } | 
|  | } | 
|  |  | 
|  | function runInIde() { | 
|  | // A simple detection of IDE. | 
|  | // Default browserNoActivityTimeout is 30 seconds. An IDE usually | 
|  | // runs karma in background and send commands when a user wants to | 
|  | // execute test. If interval between user executed tests is bigger than | 
|  | // browserNoActivityTimeout, the IDE reports error and doesn't restart | 
|  | // server. | 
|  | // We want to increase browserNoActivityTimeout when tests run in IDE. | 
|  | // Wd don't want to increase it in other cases, oterhise hanging tests | 
|  | // can slow down CI. | 
|  | return ( | 
|  | !runUnderBazel && | 
|  | process.argv.some((arg) => arg.toLowerCase().contains("intellij")) | 
|  | ); | 
|  | } | 
|  |  | 
|  | module.exports = function (config) { | 
|  | let root = config.root; | 
|  | if (!root) { | 
|  | console.warn(`--root argument not set. Falling back to __dirname.`); | 
|  | root = path.resolve(__dirname) + "/"; | 
|  | } | 
|  | // Use --test-files to specify pattern for a test files. | 
|  | // It can be just a file name, without a path: | 
|  | // --test-files async-foreach-behavior_test.js | 
|  | // If you specify --test-files without pattern, it gets true value | 
|  | // In this case we will run all tests (usefull for package.json "debugtest" | 
|  | // script) | 
|  | // We will convert a .ts argument to .js and fill in .js if no extension is | 
|  | // given. | 
|  | let filePattern; | 
|  | if (typeof config.testFiles === "string") { | 
|  | if (config.testFiles.endsWith(".ts")) { | 
|  | filePattern = | 
|  | config.testFiles.substr(0, config.testFiles.lastIndexOf(".")) + ".js"; | 
|  | } else if (config.testFiles.endsWith(".js")) { | 
|  | filePattern = config.testFiles; | 
|  | } else { | 
|  | filePattern = config.testFiles + ".js"; | 
|  | } | 
|  | } else { | 
|  | filePattern = "*_test.js"; | 
|  | } | 
|  | const testFilesPattern = root + "**/" + filePattern; | 
|  |  | 
|  | console.info(`Karma test file pattern: ${testFilesPattern}`); | 
|  | // Special patch for grep parameters (see details in the grep-patch-karam.js) | 
|  | const additionalFiles = runUnderBazel | 
|  | ? [] | 
|  | : ["polygerrit-ui/grep-patch-karma.js"]; | 
|  | config.set({ | 
|  | browserNoActivityTimeout: runInIde ? 60 * 60 * 1000 : 30 * 1000, | 
|  | // base path that will be used to resolve all patterns (eg. files, exclude) | 
|  | basePath: "../", | 
|  | plugins: [ | 
|  | // Do not use karma-* to load all installed plugin | 
|  | // This can lead to unexpected behavior under bazel | 
|  | // if you forget to add a plugin in a bazel rule. | 
|  | require.resolve("@open-wc/karma-esm"), | 
|  | "karma-mocha", | 
|  | "karma-chrome-launcher", | 
|  | "karma-mocha-reporter", | 
|  | ], | 
|  | // frameworks to use | 
|  | // available frameworks: https://npmjs.org/browse/keyword/karma-adapter | 
|  | frameworks: ["mocha", "esm"], | 
|  |  | 
|  | // list of files / patterns to load in the browser | 
|  | files: [ | 
|  | ...additionalFiles, | 
|  | getUiDevNpmFilePath("source-map-support/browser-source-map-support.js"), | 
|  | getUiDevNpmFilePath( | 
|  | "accessibility-developer-tools/dist/js/axs_testing.js" | 
|  | ), | 
|  | { | 
|  | pattern: getUiDevNpmFilePath("@open-wc/semantic-dom-diff/index.js"), | 
|  | type: "module", | 
|  | }, | 
|  | { | 
|  | pattern: getUiDevNpmFilePath("@open-wc/testing-helpers/index.js"), | 
|  | type: "module", | 
|  | }, | 
|  | getUiDevNpmFilePath("sinon/pkg/sinon.js"), | 
|  | { pattern: testFilesPattern, type: "module" }, | 
|  | ], | 
|  | esm: { | 
|  | nodeResolve: { | 
|  | // By default, it tries to use page.mjs file instead of page.js | 
|  | // when importing 'page/page', so we shouldn't use .mjs extension | 
|  | // in node resolve. | 
|  | // The .ts extension is required to display source code in browser | 
|  | // (otherwise esm plugin crashes) | 
|  | extensions: [".js", ".ts"], | 
|  | }, | 
|  | moduleDirs: getModulesDir(), | 
|  | // Bazel and yarn uses symlinks for files. | 
|  | // preserveSymlinks is necessary for correct modules paths resolving | 
|  | preserveSymlinks: true, | 
|  | // By default, esm-dev-server uses 'auto' compatibility mode. | 
|  | // In the 'auto' mode it incorrectly applies polyfills and | 
|  | // breaks tests in some browser versions | 
|  | // (for example, Chrome 69 on gerrit-ci). | 
|  | compatibility: "none", | 
|  | plugins: [ | 
|  | { | 
|  | resolveImport(importSpecifier) { | 
|  | // esm-dev-server interprets .ts files as .js files and | 
|  | // tries to replace all module imports with relative/absolute | 
|  | // paths. In most cases this works correctly. However if | 
|  | // a ts file imports type from .d.ts and there is no | 
|  | // associated .js file then the esm-dev-server responds with | 
|  | // 500 error. | 
|  | // For example the following import .ts file causes problem | 
|  | // import {PolymerDeepPropertyChange} from '@polymer/polymer/interfaces'; | 
|  | // To avoid problems, we don't resolve imports in .ts files | 
|  | // and instead always return original path | 
|  | if (importSpecifier.context.originalUrl.endsWith(".ts")) { | 
|  | return importSpecifier.source; | 
|  | } | 
|  | return undefined; | 
|  | }, | 
|  | }, | 
|  | { | 
|  | transform(context) { | 
|  | if (context.path.endsWith("/node_modules/page/page.js")) { | 
|  | const orignalBody = context.body; | 
|  | // Can't import page.js directly, because this is undefined. | 
|  | // Replace it with window | 
|  | // The same replace exists in server.go | 
|  | // Rollup makes this replacement automatically | 
|  | const transformedBody = orignalBody.replace( | 
|  | "}(this, (function () { 'use strict';", | 
|  | "}(window, (function () { 'use strict';" | 
|  | ); | 
|  | if (orignalBody.length === transformedBody.length) { | 
|  | console.error( | 
|  | "The page.js was updated. Please update transform accordingly" | 
|  | ); | 
|  | process.exit(1); | 
|  | } | 
|  | return { body: transformedBody }; | 
|  | } | 
|  | }, | 
|  | }, | 
|  | ], | 
|  | }, | 
|  | // test results reporter to use | 
|  | // possible values: 'dots', 'progress' | 
|  | // available reporters: https://npmjs.org/browse/keyword/karma-reporter | 
|  | reporters: ["mocha"], | 
|  |  | 
|  | mochaReporter: { | 
|  | showDiff: true, | 
|  | }, | 
|  |  | 
|  | // Listen on localhost so it either listens to ipv4 | 
|  | // or ipv6. Some OS's default to ipv6 for localhost | 
|  | // and others ipv4. | 
|  | // Nodejs 17 changed the behaviour from prefering ipv4 to | 
|  | // using the OS settings. | 
|  | // The default is 127.0.0.1 thus if localhost is on ipv6 only | 
|  | // it'll fail to connect to the karma server. | 
|  | // See https://github.com/karma-runner/karma/blob/e17698f950af83bf2b3edc540d2a3e1fb73cba59/lib/utils/dns-utils.js#L3 | 
|  | listenAddress: "localhost", | 
|  |  | 
|  | // 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: false, | 
|  |  | 
|  | // start these browsers | 
|  | // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher | 
|  | browsers: ["CustomChromeHeadless"], | 
|  | browserForDebugging: "CustomChromeHeadlessWithDebugPort", | 
|  |  | 
|  | // Continuous Integration mode | 
|  | // if true, Karma captures browsers, runs the tests and exits | 
|  | singleRun: true, | 
|  |  | 
|  | // Concurrency level | 
|  | // how many browser should be started simultaneous | 
|  | concurrency: Infinity, | 
|  |  | 
|  | client: { | 
|  | mocha: { | 
|  | ui: "tdd", | 
|  | timeout: 5000, | 
|  | }, | 
|  | }, | 
|  |  | 
|  | customLaunchers: { | 
|  | // Based on https://developers.google.com/web/updates/2017/06/headless-karma-mocha-chai | 
|  | CustomChromeHeadless: { | 
|  | base: "ChromeHeadless", | 
|  | flags: ["--disable-translate", "--disable-extensions"], | 
|  | }, | 
|  | ChromeDev: { | 
|  | base: "Chrome", | 
|  | flags: ["--disable-extensions", " --auto-open-devtools-for-tabs"], | 
|  | }, | 
|  | CustomChromeHeadlessWithDebugPort: { | 
|  | base: "CustomChromeHeadless", | 
|  | flags: ["--remote-debugging-port=9222"], | 
|  | }, | 
|  | }, | 
|  | }); | 
|  | }; |