@@ -6,17 +6,14 @@ const {
6
6
ArrayPrototypePush,
7
7
ArrayPrototypeSlice,
8
8
ArrayPrototypeSort,
9
- Promise,
10
- PromiseAll,
11
- SafeArrayIterator,
9
+ SafePromiseAll,
12
10
SafeSet,
13
11
} = primordials ;
14
12
const {
15
13
prepareMainThreadExecution,
16
14
} = require ( 'internal/bootstrap/pre_execution' ) ;
17
15
const { spawn } = require ( 'child_process' ) ;
18
16
const { readdirSync, statSync } = require ( 'fs' ) ;
19
- const { finished } = require ( 'internal/streams/end-of-stream' ) ;
20
17
const console = require ( 'internal/console/global' ) ;
21
18
const {
22
19
codes : {
@@ -30,6 +27,7 @@ const {
30
27
doesPathMatchFilter,
31
28
} = require ( 'internal/test_runner/utils' ) ;
32
29
const { basename, join, resolve } = require ( 'path' ) ;
30
+ const { once } = require ( 'events' ) ;
33
31
const kFilterArgs = [ '--test' ] ;
34
32
35
33
prepareMainThreadExecution ( false ) ;
@@ -102,53 +100,41 @@ function filterExecArgv(arg) {
102
100
}
103
101
104
102
function 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 ;
151
114
} ) ;
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
+ }
152
138
} ) ;
153
139
}
154
140
0 commit comments