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

chore(ci): re-enable tests on Windows #5637

Merged
merged 5 commits into from Apr 17, 2020
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions .travis.yml
Expand Up @@ -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:
Expand Down
25 changes: 24 additions & 1 deletion 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,
};
47 changes: 27 additions & 20 deletions test/headful.spec.js
Expand Up @@ -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, 5, 1),
jackfranklin marked this conversation as resolved.
Show resolved Hide resolved
'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();
Expand Down
30 changes: 19 additions & 11 deletions test/launcher.spec.js
Expand Up @@ -353,6 +353,7 @@ describe('Launcher specs', function() {
await browser.close();
});
});

describe('Puppeteer.launch', function() {
let productName;

Expand All @@ -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, 5, 1), 'should be able to launch Firefox', async() => {
jackfranklin marked this conversation as resolved.
Show resolved Hide resolved
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();
Expand Down
11 changes: 11 additions & 0 deletions test/mocha-utils.js
Expand Up @@ -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');
Expand Down Expand Up @@ -92,6 +93,16 @@ global.itFailsFirefox = (...args) => {
return it(...args);
};

global.itFailsWindowsUntilDate = (date, ...args) => {
const today = new Date();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since we only need the timestamp to compare:

Suggested change
const today = new Date();
const today = Date.now;

Since this is pretty short we don't really need the today variable (better: now?) anymore.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could make this function accept a string for the date parameter, since all callers do new Date(string) anyway.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i.e. itFailsWindowsUntilDate('2020-06-01', blah)

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

May do that in a follow up PR - I'm also tempted to tidy up the test helpers a bit. Right now we have itFailsFirefox (with no date) and itFailsWindowsUntilDate. I'd quite like a itFails({ product: 'firefox', date: '... }) or similar API rather than bespoke methods every time

if (os.platform() === 'win32' && today < 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);
Expand Down
7 changes: 5 additions & 2 deletions test/network.spec.js
Expand Up @@ -15,6 +15,7 @@
*/

const fs = require('fs');
const os = require('os');
jackfranklin marked this conversation as resolved.
Show resolved Hide resolved
const path = require('path');
const utils = require('./utils');
const expect = require('expect');
Expand Down Expand Up @@ -189,15 +190,17 @@ 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();

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();
Expand Down