|  | /** | 
|  | * @license | 
|  | * Copyright (C) 2020 The Android Open Source Project | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | * http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  | const runUnderBazel = !!process.env["RUNFILES_DIR"]; | 
|  | const path = require('path'); | 
|  |  | 
|  | function getModulesDir() { | 
|  | if(runUnderBazel) { | 
|  | // Run under bazel | 
|  | return [ | 
|  | `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) { | 
|  | const localDirName = path.resolve(__dirname, '../.ts-out/polygerrit-ui/app'); | 
|  | const rootDir = runUnderBazel ? | 
|  | 'polygerrit-ui/app/_pg_with_tests_out/' : localDirName + '/'; | 
|  | const testFilesLocationPattern = | 
|  | `${rootDir}**/!(template_test_srcs)/`; | 
|  | // 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 ill run all tests (usefull for package.json "debugtest" | 
|  | // script) | 
|  | const testFilesPattern = (typeof config.testFiles == 'string') ? | 
|  | testFilesLocationPattern + config.testFiles : | 
|  | testFilesLocationPattern + '*_test.js'; | 
|  | // 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'), | 
|  | 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 | 
|  | }, | 
|  |  | 
|  | // 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'], | 
|  | } | 
|  | } | 
|  | }); | 
|  | }; |