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