Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update integration tests to use latest Chrome, Firefox and Chrome Dev #19392

Merged
merged 25 commits into from
Nov 29, 2018
Merged
Show file tree
Hide file tree
Changes from 24 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 22 additions & 19 deletions build-system/tasks/karma.conf.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,9 +131,6 @@ module.exports = {
process.env.TRAVIS ? 'Chrome_travis_ci' : 'Chrome_no_extensions',
],

// Number of sauce platforms to start in parallel
concurrency: 4,

customLaunchers: {
/* eslint "google-camelcase/google-camelcase": 0*/
Chrome_travis_ci: {
Expand All @@ -151,11 +148,17 @@ module.exports = {
// SauceLabs configurations.
// New configurations can be created here:
// https://wiki.saucelabs.com/display/DOCS/Platform+Configurator#/
SL_Chrome_67: Object.assign({
SL_Chrome: Object.assign({
base: 'SauceLabs',
browserName: 'chrome',
platform: 'Windows 10',
version: 'latest',
estherkim marked this conversation as resolved.
Show resolved Hide resolved
}, SAUCE_TIMEOUT_CONFIG),
SL_Chrome_Dev: Object.assign({
base: 'SauceLabs',
browserName: 'chrome',
platform: 'Windows 10',
version: '67.0',
version: 'dev',
}, SAUCE_TIMEOUT_CONFIG),
SL_Chrome_Android_7: Object.assign({
base: 'SauceLabs',
Expand All @@ -165,19 +168,13 @@ module.exports = {
platformName: 'Android',
platformVersion: '7.1',
}, SAUCE_TIMEOUT_CONFIG),
SL_Chrome_45: Object.assign({
SL_iOS_12: Object.assign({
base: 'SauceLabs',
browserName: 'chrome',
platform: 'Windows 8',
version: '45.0',
}, SAUCE_TIMEOUT_CONFIG),
SL_Android_6: Object.assign({
base: 'SauceLabs',
appiumVersion: '1.8.1',
deviceName: 'Android Emulator',
browserName: 'Chrome',
platformName: 'Android',
platformVersion: '6.0',
appiumVersion: '1.9.1',
deviceName: 'iPhone X Simulator',
browserName: 'Safari',
platformName: 'iOS',
platformVersion: '12.0',
}, SAUCE_TIMEOUT_CONFIG),
SL_iOS_11: Object.assign({
base: 'SauceLabs',
Expand All @@ -187,11 +184,17 @@ module.exports = {
platformName: 'iOS',
platformVersion: '11.3',
}, SAUCE_TIMEOUT_CONFIG),
SL_Firefox_61: Object.assign({
SL_Firefox: Object.assign({
base: 'SauceLabs',
browserName: 'firefox',
platform: 'Windows 10',
version: '61.0',
version: 'latest',
}, SAUCE_TIMEOUT_CONFIG),
SL_Safari_12: Object.assign({
base: 'SauceLabs',
browserName: 'safari',
platform: 'macOS 10.13',
version: '12.0',
}, SAUCE_TIMEOUT_CONFIG),
SL_Safari_11: Object.assign({
base: 'SauceLabs',
Expand Down
255 changes: 152 additions & 103 deletions build-system/tasks/runtime-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ const {green, yellow, cyan, red, bold} = colors;
const preTestTasks = argv.nobuild ? [] : (
(argv.unit || argv.a4a || argv['local-changes']) ? ['css'] : ['build']);
const extensionsCssMapPath = 'EXTENSIONS_CSS_MAP';
const batchSize = 4; // Number of Sauce Lab browsers

let saucelabsBrowsers = [];
/**
* Read in and process the configuration settings for karma
* @return {!Object} Karma configuration
Expand Down Expand Up @@ -69,26 +71,32 @@ function getConfig() {
if (!process.env.SAUCE_ACCESS_KEY) {
throw new Error('Missing SAUCE_ACCESS_KEY Env variable');
}
return Object.assign({}, karmaDefault, {
reporters: ['super-dots', 'saucelabs', 'karmaSimpleReporter'],
browsers: argv.saucelabs ? [
// With --saucelabs, integration tests are run on this set of browsers.
'SL_Chrome_67',
'SL_Firefox_61',

saucelabsBrowsers = argv.saucelabs ?
// With --saucelabs, integration tests are run on this set of browsers.
[
'SL_Chrome',
'SL_Firefox',
'SL_Safari_11',
// TODO(rsimha, #16687): Enable after Sauce disconnects are resolved.
// 'SL_Chrome_Android_7',
// 'SL_Chrome_45',
// 'SL_Android_6',
// 'SL_iOS_11',
// 'SL_Edge_17',
// 'SL_IE_11',
] : [
// With --saucelabs_lite, a subset of the unit tests are run.
// Only browsers that support chai-as-promised may be included below.
// TODO(rsimha-amp): Add more browsers to this list. #6039.
'SL_iOS_11',
'SL_Edge_17',
]
// TODO(amp-infra): Evaluate and add more platforms here.
//'SL_Chrome_Dev',
//'SL_Chrome_Android_7',
//'SL_Safari_12',
//'SL_iOS_12'
//'SL_IE_11'
: [
// With --saucelabs_lite, a subset of the unit tests are run.
// Only browsers that support chai-as-promised may be included below.
// TODO(rsimha-amp): Add more browsers to this list. #6039.
'SL_Safari_11',
],
];

return Object.assign({}, karmaDefault, {
reporters: ['super-dots', 'saucelabs', 'karmaSimpleReporter'],
browsers: saucelabsBrowsers,
});
}
return karmaDefault;
Expand Down Expand Up @@ -373,7 +381,7 @@ function unitTestsToRun() {
/**
* Runs all the tests.
*/
function runTests() {
async function runTests() {

if (argv.dev_dashboard) {

Expand Down Expand Up @@ -541,96 +549,137 @@ function runTests() {
const sectionMarker =
(argv.saucelabs || argv.saucelabs_lite) ? 'saucelabs' : 'local';

let resolver;
const deferred = new Promise(resolverIn => {resolver = resolverIn;});
new Karma(c, function(exitCode) {
if (shouldCollapseSummary) {
console./* OK*/log('travis_fold:end:console_errors_' + sectionMarker);
}
server.emit('kill');
if (exitCode) {
log(
red('ERROR:'),
yellow('Karma test failed with exit code ' + exitCode));
// Run Sauce Labs tests in batches to avoid timeouts when connecting to the
// Sauce Labs environment.
let processExitCode;
if (argv.saucelabs || argv.saucelabs_lite) {
processExitCode = await runTestInBatches();
} else {
processExitCode = await createKarmaServer(c);
}

server.emit('kill');
exitCtrlcHandler(handlerProcess);

if (processExitCode != 0) {
log(
red('ERROR:'),
yellow('Karma test failed with exit code ' + processExitCode));
process.exitCode = processExitCode;
}

/**
* Runs tests in batches
* @return {number} processExitCode
*/
async function runTestInBatches() {
let batch = 1;
estherkim marked this conversation as resolved.
Show resolved Hide resolved
let startIndex = 0;
let endIndex = batchSize;
const batchExitCodes = [];

log(green('Running tests on ' + saucelabsBrowsers.length +
' Sauce Lab browser(s) in total...'));
while (startIndex < endIndex) {
rsimha marked this conversation as resolved.
Show resolved Hide resolved
const configBatch = Object.assign({}, c);
configBatch.browsers = saucelabsBrowsers.slice(startIndex, endIndex);
log(green('Batch #' + batch + ': Running tests on ' +
configBatch.browsers.length + ' Sauce Labs browser(s)...'));
estherkim marked this conversation as resolved.
Show resolved Hide resolved
batchExitCodes.push(await createKarmaServer(configBatch));
startIndex = batch * batchSize;
batch++;
endIndex = Math.min(batch * batchSize, saucelabsBrowsers.length);
}
estherkim marked this conversation as resolved.
Show resolved Hide resolved
if (argv.coverage) {
if (process.env.TRAVIS) {
const codecovCmd =
'./node_modules/.bin/codecov --file=test/coverage/lcov.info';
let flags = '';
if (argv.unit) {
flags = ' --flags=unit_tests';
} else if (argv.integration) {
flags = ' --flags=integration_tests';
}
log(green('INFO: ') + 'Uploading code coverage report to ' +
cyan('https://codecov.io/gh/ampproject/amphtml') + ' by running ' +
cyan(codecovCmd + flags) + '...');
const output = getStdout(codecovCmd + flags);
const viewReportPrefix = 'View report at: ';
const viewReport = output.match(viewReportPrefix + '.*');
if (viewReport && viewReport.length > 0) {
log(green('INFO: ') + viewReportPrefix +
cyan(viewReport[0].replace(viewReportPrefix, '')));

return batchExitCodes.every(exitCode => exitCode == 0) ? 0 : 1;
}

/**
* Creates and starts karma server
* @param {!Object} configBatch
* @return {!Promise<number>}
*/
function createKarmaServer(configBatch) {
let resolver;
const deferred = new Promise(resolverIn => {resolver = resolverIn;});
new Karma(configBatch, function(exitCode) {
if (shouldCollapseSummary) {
console./* OK*/log('travis_fold:end:console_errors_' + sectionMarker);
}
if (argv.coverage) {
if (process.env.TRAVIS) {
const codecovCmd =
'./node_modules/.bin/codecov --file=test/coverage/lcov.info';
let flags = '';
if (argv.unit) {
flags = ' --flags=unit_tests';
} else if (argv.integration) {
flags = ' --flags=integration_tests';
}
log(green('INFO: ') + 'Uploading code coverage report to ' +
cyan('https://codecov.io/gh/ampproject/amphtml') + ' by running ' +
cyan(codecovCmd + flags) + '...');
const output = getStdout(codecovCmd + flags);
const viewReportPrefix = 'View report at: ';
const viewReport = output.match(viewReportPrefix + '.*');
if (viewReport && viewReport.length > 0) {
log(green('INFO: ') + viewReportPrefix +
cyan(viewReport[0].replace(viewReportPrefix, '')));
} else {
log(yellow('WARNING: ') +
'Code coverage report upload may have failed:\n' +
yellow(output));
}
} else {
log(yellow('WARNING: ') +
'Code coverage report upload may have failed:\n' +
yellow(output));
const coverageReportUrl =
'file://' + path.resolve('test/coverage/index.html');
log(green('INFO: ') + 'Generated code coverage report at ' +
cyan(coverageReportUrl));
opn(coverageReportUrl, {wait: false});
}
} else {
const coverageReportUrl =
'file://' + path.resolve('test/coverage/index.html');
log(green('INFO: ') + 'Generated code coverage report at ' +
cyan(coverageReportUrl));
opn(coverageReportUrl, {wait: false});
}
}
// TODO(rsimha, 14814): Remove after Karma / Sauce ticket is resolved.
if (process.env.TRAVIS) {
setTimeout(() => {
process.exit(exitCode);
}, 5000);
} else {
process.exitCode = exitCode;
}
resolver();
}).on('run_start', function() {
if (argv.saucelabs || argv.saucelabs_lite) {
log(green('Running tests on ' + c.browsers.length +
' Sauce Labs browser(s)...'));
} else {
log(green('Running tests locally...'));
}
}).on('run_complete', function() {
if (shouldCollapseSummary) {
console./* OK*/log(bold(red('Console errors:')),
'Expand this section and fix all errors printed by your tests.');
console./* OK*/log('travis_fold:start:console_errors_' + sectionMarker);
}
}).on('browser_complete', function(browser) {
const result = browser.lastResult;
// Prevent cases where Karma detects zero tests and still passes. #16851.
if (result.total == 0) {
log(red('ERROR: Zero tests detected by Karma. Something went wrong.'));
if (!argv.watch) {
process.exit(1);
// TODO(rsimha, 14814): Remove after Karma / Sauce ticket is resolved.
if (process.env.TRAVIS) {
setTimeout(() => {
process.exit(exitCode);
}, 5000);
}
}
if (shouldCollapseSummary) {
let message = browser.name + ': ';
message += 'Executed ' + (result.success + result.failed) +
' of ' + result.total + ' (Skipped ' + result.skipped + ') ';
if (result.failed === 0) {
message += green('SUCCESS');
} else {
message += red(result.failed + ' FAILED');
resolver(exitCode);
}).on('run_start', function() {
if (!argv.saucelabs && !argv.saucelabs_lite) {
log(green('Running tests locally...'));
}
message += '\n';
console./* OK*/log('\n');
log(message);
}
}).start();
return deferred.then(() => exitCtrlcHandler(handlerProcess));
}).on('run_complete', function() {
if (shouldCollapseSummary) {
console./* OK*/log(bold(red('Console errors:')),
'Expand this section and fix all errors printed by your tests.');
console./* OK*/log('travis_fold:start:console_errors_' + sectionMarker);
}
}).on('browser_complete', function(browser) {
const result = browser.lastResult;
// Prevent cases where Karma detects zero tests and still passes. #16851.
if (result.total == 0) {
log(red('ERROR: Zero tests detected by Karma. Something went wrong.'));
if (!argv.watch) {
process.exit(1);
}
}
if (shouldCollapseSummary) {
let message = browser.name + ': ';
message += 'Executed ' + (result.success + result.failed) +
' of ' + result.total + ' (Skipped ' + result.skipped + ') ';
if (result.failed === 0) {
message += green('SUCCESS');
} else {
message += red(result.failed + ' FAILED');
}
message += '\n';
console./* OK*/log('\n');
log(message);
}
}).start();
return deferred;
}
}

/**
Expand Down
3 changes: 2 additions & 1 deletion build-system/tasks/visual-diff/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -630,7 +630,8 @@ async function ensureOrBuildAmpRuntimeInTestMode_() {

function installPercy_() {
log('info', 'Running', colors.cyan('yarn'), 'to install Percy...');
execOrDie('npx yarn --cwd build-system/tasks/visual-diff');
execOrDie('npx yarn --cwd build-system/tasks/visual-diff',
{'stdio': 'ignore'});
estherkim marked this conversation as resolved.
Show resolved Hide resolved

puppeteer = require('puppeteer');
Percy = require('@percy/puppeteer').Percy;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,8 @@ describe.configure().run('amp-fx-collection', function() {
win = env.win;
toggleExperiment(win, 'amp-fx-fly-in', true, false);
});

it('runs fly-in-left animation with default parameters', () => {
//TODO(esth, #19392): Fails on Firefox 63.0.0
it.skip('runs fly-in-left animation with default parameters', () => {
expect(isExperimentOn(win, 'amp-fx-fly-in')).to.be.true;
const initialLeft = getComputedLeft(win);
win.scrollTo(0, 0.5 * getViewportHeight(win));
Expand Down Expand Up @@ -96,8 +96,8 @@ describe.configure().run('amp-fx-collection', function() {
win = env.win;
toggleExperiment(win, 'amp-fx-fly-in', true, false);
});

it('runs fly-in-right animation with default parameters', () => {
//TODO(esth, #19392): Fails on Firefox 63.0.0
it.skip('runs fly-in-right animation with default parameters', () => {
expect(isExperimentOn(win, 'amp-fx-fly-in')).to.be.true;
const initialLeft = getComputedLeft(win);
win.scrollTo(0, 0.5 * getViewportHeight(win));
Expand Down