1- import assert from 'assert ' ;
1+ import pTimeout from 'p-timeout ' ;
22import * as playwright from 'playwright' ;
33
44import { CpuUsage , CpuUsageSampler , CpuUsageSerialized } from './perf/cpu.js' ;
@@ -71,12 +71,16 @@ export class MetricsCollector {
7171 for ( let run = 1 ; run <= testCase . runs ; run ++ ) {
7272 const innerLabel = `Scenario ${ name } data collection, run ${ run } /${ testCase . runs } ` ;
7373 console . time ( innerLabel ) ;
74- results . push ( await this . _run ( scenario ) ) ;
74+ try {
75+ results . push ( await this . _run ( scenario ) ) ;
76+ } catch ( e ) {
77+ console . warn ( `${ innerLabel } failed with ${ e } ` ) ;
78+ break ;
79+ }
7580 console . timeEnd ( innerLabel ) ;
7681 }
7782 console . timeEnd ( label ) ;
78- assert . strictEqual ( results . length , testCase . runs ) ;
79- if ( await testCase . shouldAccept ( results ) ) {
83+ if ( ( results . length == testCase . runs ) && await testCase . shouldAccept ( results ) ) {
8084 console . log ( `Test case ${ testCase . name } , scenario ${ name } passed on try ${ try_ } /${ testCase . tries } ` ) ;
8185 return results ;
8286 } else if ( try_ != testCase . tries ) {
@@ -93,40 +97,44 @@ export class MetricsCollector {
9397 private async _run ( scenario : Scenario ) : Promise < Metrics > {
9498 const disposeCallbacks : ( ( ) => Promise < void > ) [ ] = [ ] ;
9599 try {
96- const browser = await playwright . chromium . launch ( {
97- headless : this . _options . headless ,
98-
100+ return await pTimeout ( ( async ( ) => {
101+ const browser = await playwright . chromium . launch ( {
102+ headless : this . _options . headless ,
103+ } ) ;
104+ disposeCallbacks . push ( ( ) => browser . close ( ) ) ;
105+ const page = await browser . newPage ( ) ;
106+ disposeCallbacks . push ( ( ) => page . close ( ) ) ;
107+
108+ const cdp = await page . context ( ) . newCDPSession ( page ) ;
109+
110+ // Simulate throttling.
111+ await cdp . send ( 'Network.emulateNetworkConditions' , {
112+ offline : false ,
113+ latency : PredefinedNetworkConditions [ networkConditions ] . latency ,
114+ uploadThroughput : PredefinedNetworkConditions [ networkConditions ] . upload ,
115+ downloadThroughput : PredefinedNetworkConditions [ networkConditions ] . download ,
116+ } ) ;
117+ await cdp . send ( 'Emulation.setCPUThrottlingRate' , { rate : cpuThrottling } ) ;
118+
119+ // Collect CPU and memory info 10 times per second.
120+ const perfSampler = await PerfMetricsSampler . create ( cdp , 100 ) ;
121+ disposeCallbacks . push ( async ( ) => perfSampler . stop ( ) ) ;
122+ const cpuSampler = new CpuUsageSampler ( perfSampler ) ;
123+ const memSampler = new JsHeapUsageSampler ( perfSampler ) ;
124+
125+ const vitalsCollector = await WebVitalsCollector . create ( page ) ;
126+ await scenario . run ( browser , page ) ;
127+
128+ // NOTE: FID needs some interaction to actually show a value
129+ const vitals = await vitalsCollector . collect ( ) ;
130+
131+ return new Metrics ( vitals , cpuSampler . getData ( ) , memSampler . getData ( ) ) ;
132+ } ) ( ) , {
133+ milliseconds : 60 * 1000 ,
99134 } ) ;
100- disposeCallbacks . push ( async ( ) => browser . close ( ) ) ;
101- const page = await browser . newPage ( ) ;
102-
103- const cdp = await page . context ( ) . newCDPSession ( page ) ;
104-
105- // Simulate throttling.
106- await cdp . send ( 'Network.emulateNetworkConditions' , {
107- offline : false ,
108- latency : PredefinedNetworkConditions [ networkConditions ] . latency ,
109- uploadThroughput : PredefinedNetworkConditions [ networkConditions ] . upload ,
110- downloadThroughput : PredefinedNetworkConditions [ networkConditions ] . download ,
111- } ) ;
112- await cdp . send ( 'Emulation.setCPUThrottlingRate' , { rate : cpuThrottling } ) ;
113-
114- // Collect CPU and memory info 10 times per second.
115- const perfSampler = await PerfMetricsSampler . create ( cdp , 100 ) ;
116- disposeCallbacks . push ( async ( ) => perfSampler . stop ( ) ) ;
117- const cpuSampler = new CpuUsageSampler ( perfSampler ) ;
118- const memSampler = new JsHeapUsageSampler ( perfSampler ) ;
119-
120- const vitalsCollector = await WebVitalsCollector . create ( page ) ;
121-
122- await scenario . run ( browser , page ) ;
123-
124- // NOTE: FID needs some interaction to actually show a value
125- const vitals = await vitalsCollector . collect ( ) ;
126-
127- return new Metrics ( vitals , cpuSampler . getData ( ) , memSampler . getData ( ) ) ;
128135 } finally {
129- disposeCallbacks . reverse ( ) . forEach ( ( cb ) => cb ( ) . catch ( console . log ) ) ;
136+ console . log ( 'Disposing of browser and resources' ) ;
137+ disposeCallbacks . reverse ( ) . forEach ( ( cb ) => cb ( ) . catch ( ( ) => { /* silent */ } ) ) ;
130138 }
131139 }
132140}
0 commit comments