From cf5cfb556e8ff274d8c044f0107aa29e01a44f97 Mon Sep 17 00:00:00 2001 From: baseballyama Date: Thu, 30 Dec 2021 14:53:06 +0900 Subject: [PATCH] fix flasky test --- test/custom-elements/index.ts | 53 ++++++++++++++++++--------------- test/helpers.ts | 26 +++++++++++++--- test/runtime-puppeteer/index.ts | 52 ++++++++++++++++++-------------- 3 files changed, 80 insertions(+), 51 deletions(-) diff --git a/test/custom-elements/index.ts b/test/custom-elements/index.ts index 35df156879..b928b9f695 100644 --- a/test/custom-elements/index.ts +++ b/test/custom-elements/index.ts @@ -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); }); }); }); diff --git a/test/helpers.ts b/test/helpers.ts index 101490d4dc..dd2c0d2448 100644 --- a/test/helpers.ts +++ b/test/helpers.ts @@ -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('
', {virtualConsole}).window; +const window = new jsdom.JSDOM('
', { 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 { + 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; +} diff --git a/test/runtime-puppeteer/index.ts b/test/runtime-puppeteer/index.ts index b700d47945..3c232b1da5 100644 --- a/test/runtime-puppeteer/index.ts +++ b/test/runtime-puppeteer/index.ts @@ -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); }); }