From ddac6668a274c1174f284a095beaf647894f065e Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 7 Mar 2019 14:08:58 -0600 Subject: [PATCH 1/8] Try restarting chromedriver on timeout and add HEADLESS env flag for local testing --- test/lib/next-webdriver.js | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/test/lib/next-webdriver.js b/test/lib/next-webdriver.js index d63c5aa51251cd..04d3ee9f5ac05e 100644 --- a/test/lib/next-webdriver.js +++ b/test/lib/next-webdriver.js @@ -1,4 +1,7 @@ import wd from 'wd' +import waitPort from 'wait-port' + +const doHeadless = process.env.HEADLESS === 'true' export default async function (appPort, pathname) { if (typeof appPort === 'undefined') { @@ -17,7 +20,21 @@ export default async function (appPort, pathname) { return browser } catch (ex) { console.warn(`> Error when loading browser with url: ${url}`) - if (ex.message === 'TIMEOUT') continue + + if (ex.message === 'TIMEOUT') { + const chromedriver = require('chromedriver') + console.log('Trying to restart chromedriver') + + // try restarting chrome driver + chromedriver.stop() + chromedriver.start() + // https://github.com/giggio/node-chromedriver/issues/117 + await waitPort({ + port: 9515, + timeout: 1000 * 60 * 2 // 2 Minutes + }) + continue + } throw ex } } @@ -37,7 +54,12 @@ function getBrowser (url, timeout) { reject(error) }, timeout) - browser.init({ browserName: 'chrome' }).get(url, err => { + browser.init({ + browserName: 'chrome', + ...(doHeadless ? { + chromeOptions: { args: ['--headless'] } + } : {}) + }).get(url, err => { if (timeouted) { try { browser.close(() => { From 50ea2e775890f85345b33d93b80ae4e0b12ce212 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 7 Mar 2019 14:41:22 -0600 Subject: [PATCH 2/8] Move timeout for with-router test and update chromedriver retry to only retry max twice --- test/integration/with-router/test/index.test.js | 5 +++-- test/lib/next-webdriver.js | 7 ++++--- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/test/integration/with-router/test/index.test.js b/test/integration/with-router/test/index.test.js index 56499ab9ece87e..cf90c134f79e1f 100644 --- a/test/integration/with-router/test/index.test.js +++ b/test/integration/with-router/test/index.test.js @@ -1,6 +1,7 @@ /* eslint-env jest */ /* global jasmine */ import { join } from 'path' +import webdriver from 'next-webdriver' import { getReactErrorOverlayContent, nextServer, @@ -11,14 +12,14 @@ import { startApp, stopApp } from 'next-test-utils' -import webdriver from 'next-webdriver' + +jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 60 * 5 describe('withRouter', () => { const appDir = join(__dirname, '../') let appPort let server let app - jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 60 * 5 beforeAll(async () => { await nextBuild(appDir) diff --git a/test/lib/next-webdriver.js b/test/lib/next-webdriver.js index 04d3ee9f5ac05e..b26acc011695ef 100644 --- a/test/lib/next-webdriver.js +++ b/test/lib/next-webdriver.js @@ -21,11 +21,10 @@ export default async function (appPort, pathname) { } catch (ex) { console.warn(`> Error when loading browser with url: ${url}`) - if (ex.message === 'TIMEOUT') { + // Try restarting chromedriver max twice + if (lc < 2) { const chromedriver = require('chromedriver') console.log('Trying to restart chromedriver') - - // try restarting chrome driver chromedriver.stop() chromedriver.start() // https://github.com/giggio/node-chromedriver/issues/117 @@ -35,6 +34,8 @@ export default async function (appPort, pathname) { }) continue } + + if (ex.message === 'TIMEOUT') continue throw ex } } From a1f7fa645da767c4b65419aff5e837b8db26c0d2 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 7 Mar 2019 15:20:01 -0600 Subject: [PATCH 3/8] Try restarting with random port after failing to connect to chromedriver --- test/lib/next-webdriver.js | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/test/lib/next-webdriver.js b/test/lib/next-webdriver.js index b26acc011695ef..3fb7b62e8d548d 100644 --- a/test/lib/next-webdriver.js +++ b/test/lib/next-webdriver.js @@ -1,7 +1,9 @@ import wd from 'wd' +import getPort from 'get-port' import waitPort from 'wait-port' const doHeadless = process.env.HEADLESS === 'true' +let driverPort = 9515 export default async function (appPort, pathname) { if (typeof appPort === 'undefined') { @@ -24,13 +26,14 @@ export default async function (appPort, pathname) { // Try restarting chromedriver max twice if (lc < 2) { const chromedriver = require('chromedriver') - console.log('Trying to restart chromedriver') + console.log('Trying to restart chromedriver with random port') + driverPort = await getPort() chromedriver.stop() - chromedriver.start() + chromedriver.start([`--port=${driverPort}`]) // https://github.com/giggio/node-chromedriver/issues/117 await waitPort({ - port: 9515, - timeout: 1000 * 60 * 2 // 2 Minutes + port: driverPort, + timeout: 1000 * 30 // 30 seconds }) continue } @@ -45,7 +48,7 @@ export default async function (appPort, pathname) { } function getBrowser (url, timeout) { - const browser = wd.promiseChainRemote('http://localhost:9515/') + const browser = wd.promiseChainRemote(`http://localhost:${driverPort}/`) return new Promise((resolve, reject) => { let timeouted = false From abcbe03e7ec7a4a330c94ae9a0004660ce281773 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 7 Mar 2019 15:52:40 -0600 Subject: [PATCH 4/8] Try bumping chromedriver version --- package.json | 2 +- yarn.lock | 50 +++++++++++++++++++++++++++++++++++++------------- 2 files changed, 38 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 87598bd58bfda1..06492d064ec576 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "babel-eslint": "9.0.0", "babel-jest": "23.6.0", "cheerio": "0.22.0", - "chromedriver": "2.42.0", + "chromedriver": "2.46.0", "clone": "2.1.1", "coveralls": "3.0.2", "cross-spawn": "6.0.5", diff --git a/yarn.lock b/yarn.lock index ef6da1d3cd5a0d..5a9932ca29d64c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3278,16 +3278,16 @@ chrome-trace-event@^1.0.0: dependencies: tslib "^1.9.0" -chromedriver@2.42.0: - version "2.42.0" - resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.42.0.tgz#49d8d314389e76e143a54451b85a8ddfcb1c6128" - integrity sha512-ypW3O2rjLCVQYf73ONFsLRArazecL3kj3dAHXPPF3vF5dGyi4NNerA1Hy3fctIvINRs9Ljo3N4l00S0UxiEOlQ== +chromedriver@2.46.0: + version "2.46.0" + resolved "https://registry.yarnpkg.com/chromedriver/-/chromedriver-2.46.0.tgz#3d78e7eb9bb65dd804fe327a6bf76fced12be053" + integrity sha512-dLtKIJW3y/PuFrPmcw6Mb8Nh+HwSqgVrK1rWgTARXhHfWvV822X2VRkx2meU/tg2+YQL6/nNgT6n5qWwIDHbwg== dependencies: del "^3.0.0" extract-zip "^1.6.7" - kew "^0.7.0" mkdirp "^0.5.1" - request "^2.87.0" + request "^2.88.0" + tcp-port-used "^1.0.1" ci-info@^1.5.0: version "1.6.0" @@ -4182,6 +4182,13 @@ debug@3.1.0: dependencies: ms "2.0.0" +debug@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" + integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== + dependencies: + ms "^2.1.1" + debug@^3.1.0: version "3.2.6" resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b" @@ -4241,7 +4248,7 @@ deep-extend@^0.6.0: resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== -deep-is@~0.1.3: +deep-is@^0.1.3, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= @@ -6820,6 +6827,11 @@ is-upper-case@^1.1.0: dependencies: upper-case "^1.1.0" +is-url@^1.2.2: + version "1.2.4" + resolved "https://registry.yarnpkg.com/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52" + integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== + is-utf8@^0.2.0: version "0.2.1" resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" @@ -6850,6 +6862,15 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0= +is2@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is2/-/is2-2.0.1.tgz#8ac355644840921ce435d94f05d3a94634d3481a" + integrity sha512-+WaJvnaA7aJySz2q/8sLjMb2Mw14KTplHmSwcSpZ/fWJPkUmqw3YTzSWbPJ7OAwRvdYTWF2Wg+yYJ1AdP5Z8CA== + dependencies: + deep-is "^0.1.3" + ip-regex "^2.1.0" + is-url "^1.2.2" + isarray@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" @@ -7464,11 +7485,6 @@ junk@^1.0.1: resolved "https://registry.yarnpkg.com/junk/-/junk-1.0.3.tgz#87be63488649cbdca6f53ab39bec9ccd2347f592" integrity sha1-h75jSIZJy9ym9Tqzm+yczSNH9ZI= -kew@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b" - integrity sha1-edk9LTM2PW/dKXCzNdkUGtWR15s= - kind-of@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-2.0.1.tgz#018ec7a4ce7e3a86cb9141be519d24c8faa981b5" @@ -10663,7 +10679,7 @@ request@2.87.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -request@^2.85.0, request@^2.87.0: +request@^2.85.0, request@^2.87.0, request@^2.88.0: version "2.88.0" resolved "https://registry.yarnpkg.com/request/-/request-2.88.0.tgz#9c2fca4f7d35b592efe57c7f0a55e81052124fef" integrity sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg== @@ -11820,6 +11836,14 @@ taskr@1.1.0: mri "^1.1.0" tinydate "^1.0.0" +tcp-port-used@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/tcp-port-used/-/tcp-port-used-1.0.1.tgz#46061078e2d38c73979a2c2c12b5a674e6689d70" + integrity sha512-rwi5xJeU6utXoEIiMvVBMc9eJ2/ofzB+7nLOdnZuFTmNCLqRiQh2sMG9MqCxHU/69VC/Fwp5dV9306Qd54ll1Q== + dependencies: + debug "4.1.0" + is2 "2.0.1" + temp-dir@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" From bf40aa7ba3faa4e942bf16652d1e46f2b4aa8789 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 7 Mar 2019 16:34:01 -0600 Subject: [PATCH 5/8] Try increasing the timeout on recursive-readdir test to make windows happy --- test/unit/recursive-readdir.test.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/unit/recursive-readdir.test.js b/test/unit/recursive-readdir.test.js index 909dcb59ea68f5..5dbb93bbc90cad 100644 --- a/test/unit/recursive-readdir.test.js +++ b/test/unit/recursive-readdir.test.js @@ -1,9 +1,11 @@ /* eslint-env jest */ +/* global jasmine */ import { recursiveReadDir } from 'next/dist/lib/recursive-readdir' import { join } from 'path' const resolveDataDir = join(__dirname, '..', 'isolated', '_resolvedata') const dirWithPages = join(resolveDataDir, 'readdir', 'pages') +jasmine.DEFAULT_TIMEOUT_INTERVAL = 1000 * 60 * 5 describe('recursiveReadDir', () => { it('should work', async () => { From 91321dde539606cafbee873aa081f0f0b78306b7 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 7 Mar 2019 17:05:31 -0600 Subject: [PATCH 6/8] Add git clean before attempting testing again --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 06492d064ec576..7b6c6834a94f5e 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,8 @@ "testonly": "jest", "testall": "yarn check && yarn run testonly -- --coverage --forceExit --runInBand --reporters=default --reporters=jest-junit", "pretest": "yarn run lint", - "test": "yarn run testall || yarn run testall", + "test-take2": "git clean -d -x -e node_modules -e packages -f && yarn testall", + "test": "yarn run testall || yarn run test-take2", "coveralls": "cat ./test/coverage/lcov.info | coveralls", "lint": "lerna run typescript && standard && standard --parser typescript-eslint-parser --plugin typescript packages/**/*.ts", "lint-fix": "standard --fix && standard --fix --parser typescript-eslint-parser --plugin typescript packages/**/*.ts", From ca9cb0a6e650499d4dbfe8cf538a0a42c933252b Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 7 Mar 2019 18:57:27 -0600 Subject: [PATCH 7/8] Try making headless mode the default --- test/lib/next-webdriver.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/lib/next-webdriver.js b/test/lib/next-webdriver.js index 3fb7b62e8d548d..760f71ea582452 100644 --- a/test/lib/next-webdriver.js +++ b/test/lib/next-webdriver.js @@ -2,7 +2,7 @@ import wd from 'wd' import getPort from 'get-port' import waitPort from 'wait-port' -const doHeadless = process.env.HEADLESS === 'true' +const doHeadless = process.env.HEADLESS !== 'false' let driverPort = 9515 export default async function (appPort, pathname) { From aaafd6f7226b5519421dec39c4c0042924f77b95 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Thu, 7 Mar 2019 19:25:20 -0600 Subject: [PATCH 8/8] Update travis to not use headless mode --- .travis.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index b98bf4bc6cc8c5..077e500454d89b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,6 +7,9 @@ packages: ["google-chrome-stable"] } }, + env: { + HEADLESS: 'false' + }, language: "node_js", node_js: ["8", "10"], cache: {