@@ -6,17 +6,14 @@ const {
66 ArrayPrototypePush,
77 ArrayPrototypeSlice,
88 ArrayPrototypeSort,
9- Promise,
10- PromiseAll,
11- SafeArrayIterator,
9+ SafePromiseAll,
1210 SafeSet,
1311} = primordials ;
1412const {
1513 prepareMainThreadExecution,
1614} = require ( 'internal/bootstrap/pre_execution' ) ;
1715const { spawn } = require ( 'child_process' ) ;
1816const { readdirSync, statSync } = require ( 'fs' ) ;
19- const { finished } = require ( 'internal/streams/end-of-stream' ) ;
2017const console = require ( 'internal/console/global' ) ;
2118const {
2219 codes : {
@@ -30,6 +27,7 @@ const {
3027 doesPathMatchFilter,
3128} = require ( 'internal/test_runner/utils' ) ;
3229const { basename, join, resolve } = require ( 'path' ) ;
30+ const { once } = require ( 'events' ) ;
3331const kFilterArgs = [ '--test' ] ;
3432
3533prepareMainThreadExecution ( false ) ;
@@ -102,53 +100,41 @@ function filterExecArgv(arg) {
102100}
103101
104102function runTestFile ( path ) {
105- return test ( path , ( ) => {
106- return new Promise ( ( resolve , reject ) => {
107- const args = ArrayPrototypeFilter ( process . execArgv , filterExecArgv ) ;
108- ArrayPrototypePush ( args , path ) ;
109-
110- const child = spawn ( process . execPath , args ) ;
111- // TODO(cjihrig): Implement a TAP parser to read the child's stdout
112- // instead of just displaying it all if the child fails.
113- let stdout = '' ;
114- let stderr = '' ;
115- let err ;
116-
117- child . on ( 'error' , ( error ) => {
118- err = error ;
119- } ) ;
120-
121- child . stdout . setEncoding ( 'utf8' ) ;
122- child . stderr . setEncoding ( 'utf8' ) ;
123-
124- child . stdout . on ( 'data' , ( chunk ) => {
125- stdout += chunk ;
126- } ) ;
127-
128- child . stderr . on ( 'data' , ( chunk ) => {
129- stderr += chunk ;
130- } ) ;
131-
132- child . once ( 'exit' , async ( code , signal ) => {
133- if ( code !== 0 || signal !== null ) {
134- if ( ! err ) {
135- await PromiseAll ( new SafeArrayIterator ( [ finished ( child . stderr ) , finished ( child . stdout ) ] ) ) ;
136- err = new ERR_TEST_FAILURE ( 'test failed' , kSubtestsFailed ) ;
137- err . exitCode = code ;
138- err . signal = signal ;
139- err . stdout = stdout ;
140- err . stderr = stderr ;
141- // The stack will not be useful since the failures came from tests
142- // in a child process.
143- err . stack = undefined ;
144- }
145-
146- return reject ( err ) ;
147- }
148-
149- resolve ( ) ;
150- } ) ;
103+ return test ( path , async ( t ) => {
104+ const args = ArrayPrototypeFilter ( process . execArgv , filterExecArgv ) ;
105+ ArrayPrototypePush ( args , path ) ;
106+
107+ const child = spawn ( process . execPath , args , { signal : t . signal } ) ;
108+ // TODO(cjihrig): Implement a TAP parser to read the child's stdout
109+ // instead of just displaying it all if the child fails.
110+ let err ;
111+
112+ child . on ( 'error' , ( error ) => {
113+ err = error ;
151114 } ) ;
115+
116+ child . stdout . setEncoding ( 'utf8' ) ;
117+ child . stderr . setEncoding ( 'utf8' ) ;
118+ const { 0 : { code, signal } , 1 : stdout , 2 : stderr } = await SafePromiseAll ( [
119+ once ( child , 'exit' , { signal : t . signal } ) ,
120+ child . stdout . toArray ( { signal : t . signal } ) ,
121+ child . stderr . toArray ( { signal : t . signal } ) ,
122+ ] ) ;
123+
124+ if ( code !== 0 || signal !== null ) {
125+ if ( ! err ) {
126+ err = new ERR_TEST_FAILURE ( 'test failed' , kSubtestsFailed ) ;
127+ err . exitCode = code ;
128+ err . signal = signal ;
129+ err . stdout = stdout . join ( '' ) ;
130+ err . stderr = stderr . join ( '' ) ;
131+ // The stack will not be useful since the failures came from tests
132+ // in a child process.
133+ err . stack = undefined ;
134+ }
135+
136+ throw err ;
137+ }
152138 } ) ;
153139}
154140
0 commit comments