fix flasky test

pull/7076/head
baseballyama 5 years ago
parent 99a04c464d
commit cf5cfb556e

@ -4,7 +4,7 @@ import * as http from 'http';
import { rollup } from 'rollup';
import virtual from '@rollup/plugin-virtual';
import puppeteer from 'puppeteer';
import { addLineNumbers, loadConfig, loadSvelte } from '../helpers';
import { addLineNumbers, loadConfig, loadSvelte, getNewPage } from '../helpers';
import { deepEqual } from 'assert';
const page = `
@ -16,9 +16,8 @@ const page = `
const assert = fs.readFileSync(`${__dirname}/assert.js`, 'utf-8');
describe('custom-elements', function() {
describe('custom-elements', function () {
this.timeout(10000);
let svelte;
let server;
let browser;
@ -44,12 +43,16 @@ describe('custom-elements', function() {
});
}
async function launchPuppeteer() {
return await puppeteer.launch();
}
before(async () => {
svelte = loadSvelte();
console.log('[custom-element] Loaded Svelte');
server = await create_server();
console.log('[custom-element] Started server');
browser = await puppeteer.launch();
browser = await launchPuppeteer();
console.log('[custom-element] Launched puppeteer browser');
});
@ -108,26 +111,7 @@ describe('custom-elements', function() {
const result = await bundle.generate({ format: 'iife', name: 'test' });
code = result.output[0].code;
const page = await browser.newPage();
page.on('console', (type) => {
console[type._type](type._text);
});
page.on('error', error => {
console.log('>>> an error happened');
console.error(error);
});
try {
await page.goto('http://localhost:6789');
const result = await page.evaluate(() => test(document.querySelector('main')));
if (result) console.log(result);
} catch (err) {
console.log(addLineNumbers(code));
throw err;
} finally {
function assertWarnings() {
if (expected_warnings) {
deepEqual(warnings.map(w => ({
code: w.code,
@ -138,6 +122,27 @@ describe('custom-elements', function() {
})), expected_warnings);
}
}
// NOTE: Chromium may exit due to SIGSEGV, so retry in that case.
let count = 0;
do {
count++;
try {
const page = await getNewPage(browser);
await page.goto('http://localhost:6789');
const result = await page.evaluate(() => test(document.querySelector('main')));
if (result) console.log(result);
assertWarnings();
break;
} catch (err) {
if (count === 5 || browser.isConnected()) {
console.log(addLineNumbers(code));
assertWarnings();
throw err;
}
browser = await launchPuppeteer();
}
} while (count <= 5);
});
});
});

@ -5,10 +5,11 @@ import * as path from 'path';
import * as fs from 'fs';
import * as colors from 'kleur';
export const assert = (assert$1 as unknown) as typeof assert$1 & { htmlEqual: (actual, expected, message?) => void, htmlEqualWithComments: (actual, expected, message?) => void };
import { Browser, Page } from 'puppeteer';
// for coverage purposes, we need to test source files,
// but for sanity purposes, we need to test dist files
export function loadSvelte(test) {
export function loadSvelte(test: boolean = false) {
process.env.TEST = test ? 'true' : '';
const resolved = require.resolve('../compiler.js');
@ -55,7 +56,7 @@ export function cleanRequireCache() {
const virtualConsole = new jsdom.VirtualConsole();
virtualConsole.sendTo(console);
const window = new jsdom.JSDOM('<main></main>', {virtualConsole}).window;
const window = new jsdom.JSDOM('<main></main>', { virtualConsole }).window;
global.document = window.document;
global.navigator = window.navigator;
global.getComputedStyle = window.getComputedStyle;
@ -68,7 +69,7 @@ for (const key of Object.getOwnPropertyNames(global)) {
}
// implement mock scroll
window.scrollTo = function(pageXOffset, pageYOffset) {
window.scrollTo = function (pageXOffset, pageYOffset) {
window.pageXOffset = pageXOffset;
window.pageYOffset = pageYOffset;
};
@ -243,7 +244,7 @@ const original_set_timeout = global.setTimeout;
export function useFakeTimers() {
const callbacks = [];
global.setTimeout = function(fn) {
global.setTimeout = function (fn) {
callbacks.push(fn);
};
@ -279,3 +280,20 @@ export function prettyPrintPuppeteerAssertionError(message) {
assert.equal(match[1], match[2]);
}
}
export async function getNewPage(browser: Browser): Promise<Page> {
const pages = await browser.pages();
if (pages.length) return pages[0];
const page = await browser.newPage();
page.on('console', (type) => {
console[type._type](type._text);
});
page.on('error', error => {
console.log('>>> an error happened');
console.error(error);
});
return page;
}

@ -9,7 +9,8 @@ import {
loadConfig,
loadSvelte,
mkdirp,
prettyPrintPuppeteerAssertionError
prettyPrintPuppeteerAssertionError,
getNewPage
} from '../helpers';
import { deepEqual } from 'assert';
@ -48,6 +49,10 @@ function create_server() {
});
}
async function launchPuppeteer() {
return await puppeteer.launch();
}
const assert = fs.readFileSync(`${__dirname}/assert.js`, 'utf-8');
describe('runtime (puppeteer)', () => {
@ -56,7 +61,7 @@ describe('runtime (puppeteer)', () => {
console.log('[runtime-puppeteer] Loaded Svelte');
server = await create_server();
console.log('[runtime-puppeteer] Started server');
browser = await puppeteer.launch();
browser = await launchPuppeteer();
console.log('[runtime-puppeteer] Launched puppeteer browser');
});
@ -205,27 +210,7 @@ describe('runtime (puppeteer)', () => {
const result = await bundle.generate({ format: 'iife', name: 'test' });
code = result.output[0].code;
const page = await browser.newPage();
page.on('console', (type) => {
console[type._type](type._text);
});
page.on('error', error => {
console.log('>>> an error happened');
console.error(error);
});
try {
await page.goto('http://localhost:6789');
const result = await page.evaluate(() => test(document.querySelector('main')));
if (result) console.log(result);
} catch (err) {
failed.add(dir);
prettyPrintPuppeteerAssertionError(err.message);
throw err;
} finally {
function assertWarnings() {
if (config.warnings) {
deepEqual(warnings.map(w => ({
code: w.code,
@ -240,6 +225,27 @@ describe('runtime (puppeteer)', () => {
throw new Error('Received unexpected warnings');
}
}
// NOTE: Chromium may exit due to SIGSEGV, so retry in that case.
let count = 0;
do {
count++;
try {
const page = await getNewPage(browser);
await page.goto('http://localhost:6789');
const result = await page.evaluate(() => test(document.querySelector('main')));
if (result) console.log(result);
assertWarnings();
break;
} catch (err) {
if (count === 5 || browser.isConnected()) {
failed.add(dir);
prettyPrintPuppeteerAssertionError(err.message);
assertWarnings();
throw err;
}
browser = await launchPuppeteer();
}
} while (count <= 5);
});
}

Loading…
Cancel
Save