From c4fe4e46c2b364118667759c3c39db6b35e3ac1b Mon Sep 17 00:00:00 2001 From: Jack Franklin Date: Fri, 17 Apr 2020 14:27:50 +0100 Subject: [PATCH] chore(ci): re-enable tests on Windows (#5637) * chore: Add Windows to Travis This commit runs the unit tests on Windows. There are two tests failing on Windows that we skip. I spoke to Mathias B and we agreed to defer debugging this for now in favour of getting tests running on Windows. But we didn't want to ignore it forever, hence giving the test a date at which it will start to fail. --- .travis.yml | 11 +++++++ mocha-config/puppeteer-unit-tests.js | 25 ++++++++++++++- test/headful.spec.js | 47 ++++++++++++++++------------ test/launcher.spec.js | 30 +++++++++++------- test/mocha-utils.js | 10 ++++++ test/network.spec.js | 6 ++-- 6 files changed, 95 insertions(+), 34 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0de02d4b2747d..cd013926e2997 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,17 @@ cache: - node_modules jobs: include: + - os: "windows" + node_js: "10.19.0" + env: + - CHROMIUM=true + before_install: + # populate .local-firefox for launcher tests + - PUPPETEER_PRODUCT=firefox npm install + script: + - ls .local-chromium .local-firefox + - npm run tsc + - npm run unit - node_js: "10.19.0" dist: trusty env: diff --git a/mocha-config/puppeteer-unit-tests.js b/mocha-config/puppeteer-unit-tests.js index 964f7f7f0a2a5..10f7404bffb0a 100644 --- a/mocha-config/puppeteer-unit-tests.js +++ b/mocha-config/puppeteer-unit-tests.js @@ -1,8 +1,31 @@ +/** + * Copyright 2020 Google Inc. All rights reserved. + * + * 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 os = require('os'); const base = require('./base'); +const longerTimeoutRequired = process.env.PUPPETEER_PRODUCT === 'firefox' || os.platform() === 'win32'; + +const timeout = longerTimeoutRequired ? 25 * 1000 : 10 * 1000; + +console.log('Mocha config: Timeout set to', timeout / 1000, 'seconds'); + module.exports = { ...base, file: ['./test/mocha-utils.js'], spec: 'test/*.spec.js', - timeout: process.env.PUPPETEER_PRODUCT === 'firefox' ? 15 * 1000 : 10 * 1000, + timeout, }; diff --git a/test/headful.spec.js b/test/headful.spec.js index aa2a95fe6e436..43e066bd975cf 100644 --- a/test/headful.spec.js +++ b/test/headful.spec.js @@ -85,26 +85,33 @@ describeChromeOnly('headful tests', function() { expect(pages).toEqual(['about:blank']); await browser.close(); }); - it('headless should be able to read cookies written by headful', async() => { - const { server, puppeteer } = getTestState(); - - const userDataDir = await mkdtempAsync(TMP_FOLDER); - // Write a cookie in headful chrome - const headfulBrowser = await puppeteer.launch(Object.assign({userDataDir}, headfulOptions)); - const headfulPage = await headfulBrowser.newPage(); - await headfulPage.goto(server.EMPTY_PAGE); - await headfulPage.evaluate(() => document.cookie = 'foo=true; expires=Fri, 31 Dec 9999 23:59:59 GMT'); - await headfulBrowser.close(); - // Read the cookie from headless chrome - const headlessBrowser = await puppeteer.launch(Object.assign({userDataDir}, headlessOptions)); - const headlessPage = await headlessBrowser.newPage(); - await headlessPage.goto(server.EMPTY_PAGE); - const cookie = await headlessPage.evaluate(() => document.cookie); - await headlessBrowser.close(); - // This might throw. See https://github.com/puppeteer/puppeteer/issues/2778 - await rmAsync(userDataDir).catch(e => {}); - expect(cookie).toBe('foo=true'); - }); + itFailsWindowsUntilDate( + /* We have deferred fixing this test on Windows in favour of + * getting all other Windows tests running on CI. Putting this + * date in to force us to come back and debug properly in the + * future. + */ + new Date('2020-06-01'), + 'headless should be able to read cookies written by headful', async() => { + const { server, puppeteer } = getTestState(); + + const userDataDir = await mkdtempAsync(TMP_FOLDER); + // Write a cookie in headful chrome + const headfulBrowser = await puppeteer.launch(Object.assign({userDataDir}, headfulOptions)); + const headfulPage = await headfulBrowser.newPage(); + await headfulPage.goto(server.EMPTY_PAGE); + await headfulPage.evaluate(() => document.cookie = 'foo=true; expires=Fri, 31 Dec 9999 23:59:59 GMT'); + await headfulBrowser.close(); + // Read the cookie from headless chrome + const headlessBrowser = await puppeteer.launch(Object.assign({userDataDir}, headlessOptions)); + const headlessPage = await headlessBrowser.newPage(); + await headlessPage.goto(server.EMPTY_PAGE); + const cookie = await headlessPage.evaluate(() => document.cookie); + await headlessBrowser.close(); + // This might throw. See https://github.com/puppeteer/puppeteer/issues/2778 + await rmAsync(userDataDir).catch(e => {}); + expect(cookie).toBe('foo=true'); + }); // TODO: Support OOOPIF. @see https://github.com/puppeteer/puppeteer/issues/2548 xit('OOPIF: should report google.com frame', async() => { const { server } = getTestState(); diff --git a/test/launcher.spec.js b/test/launcher.spec.js index 8fc93f01056b0..8a5d44a3b1b53 100644 --- a/test/launcher.spec.js +++ b/test/launcher.spec.js @@ -353,6 +353,7 @@ describe('Launcher specs', function() { await browser.close(); }); }); + describe('Puppeteer.launch', function() { let productName; @@ -367,21 +368,28 @@ describe('Launcher specs', function() { puppeteer._productName = productName; }); - it('should be able to launch different products', async() => { + it('should be able to launch Chrome', async() => { const {puppeteer} = getTestState(); + const browser = await puppeteer.launch({product: 'chrome'}); + const userAgent = await browser.userAgent(); + await browser.close(); + expect(userAgent).toContain('Chrome'); + }); - const products = ['firefox', 'chrome']; - for (const product of products) { - const browser = await puppeteer.launch({product}); - const userAgent = await browser.userAgent(); - await browser.close(); - if (product === 'chrome') - expect(userAgent).toContain('Chrome'); - else - expect(userAgent).toContain('Firefox'); - } + /* We think there's a bug in the FF Windows launcher, or some + * combo of that plus it running on CI, but we're deferring fixing + * this so we can get Windows CI stable and then dig into this + * properly with help from the Mozilla folks. + */ + itFailsWindowsUntilDate(new Date('2020-06-01'), 'should be able to launch Firefox', async() => { + const {puppeteer} = getTestState(); + const browser = await puppeteer.launch({product: 'firefox'}); + const userAgent = await browser.userAgent(); + await browser.close(); + expect(userAgent).toContain('Firefox'); }); }); + describe('Puppeteer.connect', function() { it('should be able to connect multiple times to the same browser', async() => { const { puppeteer, defaultBrowserOptions} = getTestState(); diff --git a/test/mocha-utils.js b/test/mocha-utils.js index 48d0edce5c2b7..037d62aa344d9 100644 --- a/test/mocha-utils.js +++ b/test/mocha-utils.js @@ -17,6 +17,7 @@ const {TestServer} = require('../utils/testserver/index'); const path = require('path'); const fs = require('fs'); +const os = require('os'); const puppeteer = require('../'); const utils = require('./utils'); const assertCoverage = require('./coverage-utils'); @@ -92,6 +93,15 @@ global.itFailsFirefox = (...args) => { return it(...args); }; +global.itFailsWindowsUntilDate = (date, ...args) => { + if (os.platform() === 'win32' && Date.now() < date) { + // we are within the deferred time so skip the test + return xit(...args); + } + + return it(...args); +}; + global.describeFailsFirefox = (...args) => { if (isFirefox) return xdescribe(...args); diff --git a/test/network.spec.js b/test/network.spec.js index 053a82e08891a..b9a1717a03e43 100644 --- a/test/network.spec.js +++ b/test/network.spec.js @@ -189,7 +189,8 @@ describe('network', function() { const { page, server } = getTestState(); const response = await page.goto(server.PREFIX + '/simple.json'); - expect(await response.text()).toBe('{"foo": "bar"}\n'); + const responseText = (await response.text()).trimEnd(); + expect(responseText).toBe('{"foo": "bar"}'); }); it('should return uncompressed text', async() => { const { page, server } = getTestState(); @@ -197,7 +198,8 @@ describe('network', function() { server.enableGzip('/simple.json'); const response = await page.goto(server.PREFIX + '/simple.json'); expect(response.headers()['content-encoding']).toBe('gzip'); - expect(await response.text()).toBe('{"foo": "bar"}\n'); + const responseText = (await response.text()).trimEnd(); + expect(responseText).toBe('{"foo": "bar"}'); }); it('should throw when requesting body of redirected response', async() => { const { page, server } = getTestState();