dev-utils/karma.js (146 lines of code) (raw):
/**
* MIT License
*
* Copyright (c) 2017-present, Elasticsearch BV
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
*/
const {
getSauceConnectOptions,
getBrowserList,
getGlobalConfig,
getAppiumBrowsersForKarma
} = require('./test-config')
const { getWebpackConfig, BUNDLE_TYPES } = require('./build')
/**
* Polyfills file that are required for the browser tests
*
* Including here eliminates polyfills required in each test suite
*/
const polyfills = 'test/polyfills.+(js|ts)'
const specPattern =
'test/{*.spec.+(js|ts),!(e2e|integration|node|bundle|types)/**/*.spec.+(js|ts)}'
const { tunnelIdentifier } = getSauceConnectOptions()
// makes all object properties configurable by default
// which in jasmine is essential to spy on functions exported from modules
const objectConfigurable = '../../dev-utils/object-configurable.js'
/**
* Common base config for all the mono repo packages
*/
const baseConfig = {
files: [
objectConfigurable,
polyfills,
require.resolve('regenerator-runtime/runtime'),
specPattern
],
frameworks: ['jasmine'],
preprocessors: {
[specPattern]: ['webpack', 'sourcemap'],
[polyfills]: ['webpack']
},
plugins: [
'karma-sauce-launcher',
'karma-jasmine',
'karma-failed-reporter',
'karma-spec-reporter',
'karma-webpack',
'karma-sourcemap-loader'
],
client: {
clearContext: false,
jasmine: {
random: false,
failFast: true,
timeoutInterval: 30000
}
},
webpack: getWebpackConfig(BUNDLE_TYPES.BROWSER_DEV),
webpackMiddleware: {
logLevel: 'error'
},
autoWatch: false,
browserNoActivityTimeout: 120000,
customLaunchers: [...getBrowserList(), ...getAppiumBrowsersForKarma()].map(
launcher => ({
...launcher,
base: 'SauceLabs'
})
),
browsers: [],
captureTimeout: 120000, // on saucelabs it takes some time to capture browser
reporters: ['spec', 'failed'],
sauceLabs: {
testName: 'ApmJs',
startConnect: false,
recordVideo: false,
recordScreenshots: true,
tunnelIdentifier,
options: {
commandTimeout: 600,
idleTimeout: 600,
maxDuration: 5400
}
}
}
function prepareConfig(config, packageName) {
const globalConfig = getGlobalConfig(packageName)
console.log('Global test Configuration: ', globalConfig)
const { agentConfig, testConfig } = globalConfig
const { isCI, sauceLabs: isSauce } = testConfig
let buildId = `ApmJs-${agentConfig.name}`
if (isCI) {
console.log('prepareConfig: Run in Jenkins')
buildId =
buildId +
' - Jenkins #' +
process.env.BUILD_NUMBER +
' (' +
process.env.BRANCH_NAME +
') Elastic Stack ' +
process.env.STACK_VERSION +
' Scope ' +
process.env.SCOPE
config.plugins.push('karma-chrome-launcher')
if (!isSauce) {
config.browsers = ['ChromeHeadlessNoSandbox']
config.customLaunchers = {
ChromeHeadlessNoSandbox: {
base: 'ChromeHeadless',
flags: [
'--no-sandbox', // required to run without privileges in docker
'--user-data-dir=/tmp/chrome-test-profile',
'--disable-web-security'
]
}
}
}
config.plugins.push('karma-junit-reporter')
config.reporters.push('junit')
config.junitReporter = {
outputDir: 'reports'
}
} else {
console.log('prepareConfig: Run in Default enviroment')
config.plugins.push('karma-chrome-launcher')
config.browsers.push('Chrome')
}
/**
* Add coverage reports and plugins required for all environments
*/
if (config.coverage) {
config.plugins.push('karma-coverage', 'karma-coverage-istanbul-reporter')
config.reporters.push('coverage')
if (config.webpack) {
const babelPlugins = config.webpack.module.rules[0].options.plugins
babelPlugins.push('istanbul')
}
config.coverageReporter = {
includeAllSources: true,
reporters: [
{ type: 'cobertura', file: 'coverage-' + buildId + '-report.xml' },
{ type: 'lcov' },
{ type: 'text-summary' }
],
dir: 'coverage/'
}
}
if (isSauce) {
console.log('prepareConfig: Run in SauceLab mode')
config.sauceLabs.build = buildId
console.log('saucelabs.build:', buildId)
if (isCI) {
config.sauceLabs.tags = [testConfig.branch, process.env.STACK_VERSION]
} else if (testConfig.branch === 'main') {
config.sauceLabs.tags = [testConfig.branch]
}
config.reporters.push('dots', 'saucelabs')
config.browsers = Object.keys(config.customLaunchers)
config.transports = ['polling']
}
return config
}
module.exports = {
prepareConfig,
baseConfig
}