11import { constants as osConstants } from 'node:os' ;
2- import { cleanCoverageReports , createCoverageProvider } from '../coverage' ;
2+ import {
3+ cleanCoverageReports ,
4+ createCoverageProvider ,
5+ resolveAndMergeRawCoverage ,
6+ } from '../coverage' ;
37import { ensureRunDependencies } from './dependencies' ;
48import { createPool } from '../pool' ;
59import type {
@@ -160,12 +164,38 @@ const notifyReportersOnTestRunEnd = async ({
160164
161165const isLifecycleDebugEnabled = isDebug ( ) ;
162166
167+ type LifecycleStepOptions = {
168+ slowAfter ?: number ;
169+ slowMessage ?: string ;
170+ slowDoneMessage ?: string ;
171+ } ;
172+
163173const runLifecycleStep = async < T > (
164174 label : string ,
165175 fn : ( ) => Promise < T > ,
176+ options ?: LifecycleStepOptions ,
166177) : Promise < T > => {
178+ const { slowAfter, slowMessage, slowDoneMessage } = options ?? { } ;
179+ let didShowSlowMessage = false ;
180+ const slowTimer = slowMessage
181+ ? setTimeout ( ( ) => {
182+ didShowSlowMessage = true ;
183+ logger . info ( slowMessage ) ;
184+ } , slowAfter ?? 1000 )
185+ : undefined ;
186+
167187 if ( ! isLifecycleDebugEnabled ) {
168- return fn ( ) ;
188+ try {
189+ const result = await fn ( ) ;
190+ if ( didShowSlowMessage && slowDoneMessage ) {
191+ logger . info ( slowDoneMessage ) ;
192+ }
193+ return result ;
194+ } finally {
195+ if ( slowTimer ) {
196+ clearTimeout ( slowTimer ) ;
197+ }
198+ }
169199 }
170200
171201 const startTime = Date . now ( ) ;
@@ -174,10 +204,17 @@ const runLifecycleStep = async <T>(
174204 try {
175205 const result = await fn ( ) ;
176206 logger . debug ( `lifecycle: finish ${ label } (${ Date . now ( ) - startTime } ms)` ) ;
207+ if ( didShowSlowMessage && slowDoneMessage ) {
208+ logger . info ( slowDoneMessage ) ;
209+ }
177210 return result ;
178211 } catch ( error ) {
179212 logger . debug ( `lifecycle: fail ${ label } (${ Date . now ( ) - startTime } ms)` ) ;
180213 throw error ;
214+ } finally {
215+ if ( slowTimer ) {
216+ clearTimeout ( slowTimer ) ;
217+ }
181218 }
182219} ;
183220
@@ -573,6 +610,7 @@ export async function runTests(context: Rstest): Promise<void> {
573610 const mergedCoverageMap : CoverageMap | undefined = coverageProvider
574611 ? coverageProvider . createCoverageMap ( )
575612 : undefined ;
613+ const rawCoverageResults : unknown [ ] = [ ] ;
576614
577615 // Adopt the pre-allocated buffer (set above `runTests` or at the end of
578616 // the previous rerun's `finalize`) so browser events emitted before
@@ -688,6 +726,7 @@ export async function runTests(context: Rstest): Promise<void> {
688726 buildId,
689727 updateSnapshot : context . snapshotManager . options . updateSnapshot ,
690728 onCoverageResult : ( coverage ) => mergedCoverageMap ?. merge ( coverage ) ,
729+ onRawCoverageResult : ( coverage ) => rawCoverageResults . push ( coverage ) ,
691730 onTraceEvents : traceRun . onEvents ,
692731 traceSpan : span ,
693732 } ) ;
@@ -704,8 +743,6 @@ export async function runTests(context: Rstest): Promise<void> {
704743 testStart ??= buildStart ;
705744 const buildTime = testStart - buildStart ;
706745
707- const testTime = Date . now ( ) - testStart ;
708-
709746 // Wait for browser tests to complete if running in parallel
710747 const browserResult = browserResultPromise
711748 ? await browserResultPromise
@@ -746,21 +783,6 @@ export async function runTests(context: Rstest): Promise<void> {
746783 // from the browser results to avoid reporter/state cache bloat (mirrors
747784 // the node-side pool layer's `delete result.coverage`).
748785
749- // When unifying reporter output, combine browser and node durations
750- const duration : Duration =
751- shouldUnifyReporter && browserResult
752- ? {
753- totalTime :
754- testTime + buildTime + browserResult . duration . totalTime ,
755- buildTime : buildTime + browserResult . duration . buildTime ,
756- testTime : testTime + browserResult . duration . testTime ,
757- }
758- : {
759- totalTime : testTime + buildTime ,
760- buildTime,
761- testTime,
762- } ;
763-
764786 const results = returns . flatMap ( ( r ) => r . results ) ;
765787 const testResults = returns . flatMap ( ( r ) => r . testResults ) ;
766788 const errors = returns . flatMap ( ( r ) => r . errors || [ ] ) ;
@@ -786,6 +808,28 @@ export async function runTests(context: Rstest): Promise<void> {
786808 errors . push ( ...browserResult . unhandledErrors ) ;
787809 }
788810
811+ await resolveAndMergeRawCoverage ( {
812+ coverageProvider,
813+ mergedCoverageMap,
814+ rawCoverageResults,
815+ runCoverageStep : runLifecycleStep ,
816+ } ) ;
817+
818+ const testTime = Date . now ( ) - testStart ;
819+ const duration : Duration =
820+ shouldUnifyReporter && browserResult
821+ ? {
822+ totalTime :
823+ testTime + buildTime + browserResult . duration . totalTime ,
824+ buildTime : buildTime + browserResult . duration . buildTime ,
825+ testTime : testTime + browserResult . duration . testTime ,
826+ }
827+ : {
828+ totalTime : testTime + buildTime ,
829+ buildTime,
830+ testTime,
831+ } ;
832+
789833 // Check for failures including browser results when unified
790834 const nodeHasFailure =
791835 results . some ( ( r ) => r . status === 'fail' ) || errors . length ;
0 commit comments