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);
});
}