178 lines
7.1 KiB
JavaScript
178 lines
7.1 KiB
JavaScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
const DEBUG = false;
|
|
|
|
const configPath = 'TMPL_config';
|
|
const onPreparePath = 'TMPL_on_prepare';
|
|
const workspace = 'TMPL_workspace';
|
|
const server = 'TMPL_server';
|
|
|
|
if (DEBUG)
|
|
console.info(`Protractor test starting with:
|
|
cwd: ${process.cwd()}
|
|
configPath: ${configPath}
|
|
onPreparePath: ${onPreparePath}
|
|
workspace: ${workspace}
|
|
server: ${server}`);
|
|
|
|
// Helper function to warn when a user specified value is being overwritten
|
|
function setConf(conf, name, value, msg) {
|
|
if (conf[name] && conf[name] !== value) {
|
|
console.warn(
|
|
`Your protractor configuration specifies an option which is overwritten by Bazel: '${name}' ${msg}`);
|
|
}
|
|
conf[name] = value;
|
|
}
|
|
|
|
function mergeCapabilities(conf, capabilities) {
|
|
if (conf.capabilities) {
|
|
if (conf.capabilities.browserName === capabilities.browserName) {
|
|
// there are capabilities to merge
|
|
if (capabilities.browserName === 'chrome') {
|
|
conf.capabilities.chromeOptions = conf.capabilities.chromeOptions || {};
|
|
conf.capabilities.chromeOptions.binary = capabilities.chromeOptions.binary;
|
|
conf.capabilities.chromeOptions.args = conf.capabilities.chromeOptions.args || [];
|
|
conf.capabilities.chromeOptions.args.push(...capabilities.chromeOptions.args);
|
|
console.warn(
|
|
`Your protractor configuration specifies capabilities for browser '${conf.capabilities.browserName}'
|
|
which will be merged with capabilities provided by Bazel resulting in:`,
|
|
JSON.stringify(conf.capabilities, null, 2));
|
|
} else {
|
|
// TODO(gmagolan): implement firefox support for protractor
|
|
throw new Error(
|
|
`Unexpected browserName ${capabilities.browserName} for capabilities merging`);
|
|
}
|
|
} else {
|
|
console.warn(
|
|
`Your protractor configuration specifies capabilities for browser '${conf.capabilities.browserName}' which will be overwritten by Bazel`);
|
|
conf.capabilities = capabilities;
|
|
}
|
|
} else {
|
|
conf.capabilities = capabilities;
|
|
}
|
|
}
|
|
|
|
let conf = {};
|
|
|
|
// Import the user's base protractor configuration if specified
|
|
if (configPath) {
|
|
const baseConf = require(configPath);
|
|
if (!baseConf.config) {
|
|
throw new Error('Invalid base protractor configuration. Expected config to be exported.');
|
|
}
|
|
conf = baseConf.config;
|
|
if (DEBUG) console.info(`Base protractor configuration: ${JSON.stringify(conf, null, 2)}`);
|
|
}
|
|
|
|
// Import the user's on prepare function if specified
|
|
if (onPreparePath) {
|
|
const onPrepare = require(onPreparePath);
|
|
if (typeof onPrepare === 'function') {
|
|
const original = conf.onPrepare;
|
|
conf.onPrepare = function() {
|
|
return Promise.resolve(original ? original() : null)
|
|
.then(() => Promise.resolve(onPrepare({workspace, server})));
|
|
};
|
|
} else {
|
|
throw new Error(
|
|
'Invalid protractor on_prepare script. Expected a function as the default export.');
|
|
}
|
|
}
|
|
|
|
// Override the user's base protractor configuration as appropriate based on the
|
|
// ts_web_test_suite & rules_webtesting WEB_TEST_METADATA attributes
|
|
setConf(conf, 'framework', 'jasmine2', 'is set to jasmine2');
|
|
|
|
const specs =
|
|
[TMPL_specs].map(s => require.resolve(s)).filter(s => /(\b|_)(spec|test)\.js$/.test(s));
|
|
|
|
setConf(conf, 'specs', specs, 'are determined by the srcs and deps attribute');
|
|
|
|
// WEB_TEST_METADATA is configured in rules_webtesting based on value
|
|
// of the browsers attribute passed to ts_web_test_suite
|
|
// We setup the protractor configuration based on the values in this object
|
|
if (process.env['WEB_TEST_METADATA']) {
|
|
const webTestMetadata = require(process.env['WEB_TEST_METADATA']);
|
|
if (DEBUG) console.info(`WEB_TEST_METADATA: ${JSON.stringify(webTestMetadata, null, 2)}`);
|
|
if (webTestMetadata['environment'] === 'sauce') {
|
|
// If a sauce labs browser is chosen for the test such as
|
|
// "@io_bazel_rules_webtesting//browsers/sauce:chrome-win10"
|
|
// than the 'environment' will equal 'sauce'.
|
|
// We expect that a SAUCE_USERNAME and SAUCE_ACCESS_KEY is available
|
|
// from the environment for this test to run
|
|
|
|
// TODO(gmagolan): implement sauce labs support for protractor
|
|
throw new Error('Saucelabs not yet support by protractor_web_test_suite.');
|
|
|
|
// if (!process.env.SAUCE_USERNAME || !process.env.SAUCE_ACCESS_KEY) {
|
|
// console.error('Make sure the SAUCE_USERNAME and SAUCE_ACCESS_KEY environment variables are
|
|
// set.');
|
|
// process.exit(1);
|
|
// }
|
|
// setConf(conf, 'sauceUser', process.env.SAUCE_USERNAME, 'is determined by the SAUCE_USERNAME
|
|
// environment variable');
|
|
// setConf(conf, 'sauceKey', process.env.SAUCE_ACCESS_KEY, 'is determined by the
|
|
// SAUCE_ACCESS_KEY environment variable');
|
|
} else if (webTestMetadata['environment'] === 'local') {
|
|
// When a local chrome or firefox browser is chosen such as
|
|
// "@io_bazel_rules_webtesting//browsers:chromium-local" or
|
|
// "@io_bazel_rules_webtesting//browsers:firefox-local"
|
|
// then the 'environment' will equal 'local' and
|
|
// 'webTestFiles' will contain the path to the binary to use
|
|
const webTestNamedFiles = webTestMetadata['webTestFiles'][0]['namedFiles'];
|
|
const headless = !process.env['DISPLAY'];
|
|
if (webTestNamedFiles['CHROMIUM']) {
|
|
const chromeBin = require.resolve(webTestNamedFiles['CHROMIUM']);
|
|
const chromeDriver = require.resolve(webTestNamedFiles['CHROMEDRIVER']);
|
|
|
|
// The sandbox needs to be disabled, because it causes Chrome to crash on some environments.
|
|
// See: http://chromedriver.chromium.org/help/chrome-doesn-t-start
|
|
const args = ['--no-sandbox'];
|
|
if (headless) {
|
|
args.push('--headless', '--disable-gpu');
|
|
}
|
|
setConf(conf, 'directConnect', true, 'is set to true for chrome');
|
|
setConf(conf, 'chromeDriver', chromeDriver, 'is determined by the browsers attribute');
|
|
mergeCapabilities(conf, {
|
|
browserName: 'chrome',
|
|
chromeOptions: {
|
|
binary: chromeBin,
|
|
args: args,
|
|
}
|
|
});
|
|
}
|
|
if (webTestNamedFiles['FIREFOX']) {
|
|
// TODO(gmagolan): implement firefox support for protractor
|
|
throw new Error('Firefox not yet support by protractor_web_test_suite');
|
|
|
|
// const firefoxBin = require.resolve(webTestNamedFiles['FIREFOX'])
|
|
// const args = [];
|
|
// if (headless) {
|
|
// args.push("--headless")
|
|
// args.push("--marionette")
|
|
// }
|
|
// setConf(conf, 'seleniumAddress', process.env.WEB_TEST_HTTP_SERVER.trim() + "/wd/hub", 'is
|
|
// configured by Bazel for firefox browser')
|
|
// mergeCapabilities(conf, {
|
|
// browserName: "firefox",
|
|
// 'moz:firefoxOptions': {
|
|
// binary: firefoxBin,
|
|
// args: args,
|
|
// }
|
|
// }, 'is determined by the browsers attribute');
|
|
}
|
|
} else {
|
|
console.warn(`Unknown WEB_TEST_METADATA environment '${webTestMetadata['environment']}'`);
|
|
}
|
|
}
|
|
|
|
// Export the complete protractor configuration
|
|
if (DEBUG) console.info(`Protractor configuration: ${JSON.stringify(conf, null, 2)}`);
|
|
|
|
exports.config = conf;
|