@@ -70,7 +70,6 @@ function lastLogger() {
70
70
}
71
71
72
72
const testGlob = argv . glob || 'tests/**/*.ts' ;
73
- let currentFileName = null ;
74
73
75
74
const e2eRoot = path . join ( __dirname , 'e2e' ) ;
76
75
const allSetups = glob . sync ( 'setup/**/*.ts' , { nodir : true , cwd : e2eRoot } ) . sort ( ) ;
@@ -122,124 +121,117 @@ setGlobalVariable('argv', argv);
122
121
setGlobalVariable ( 'ci' , process . env [ 'CI' ] ?. toLowerCase ( ) === 'true' || process . env [ 'CI' ] === '1' ) ;
123
122
setGlobalVariable ( 'package-manager' , argv . yarn ? 'yarn' : 'npm' ) ;
124
123
125
- Promise . all ( [ findFreePort ( ) , findFreePort ( ) ] ) . then ( async ( [ httpPort , httpsPort ] ) => {
126
- setGlobalVariable ( 'package-registry' , 'http://localhost:' + httpPort ) ;
127
- setGlobalVariable ( 'package-secure-registry' , 'http://localhost:' + httpsPort ) ;
124
+ Promise . all ( [ findFreePort ( ) , findFreePort ( ) ] )
125
+ . then ( async ( [ httpPort , httpsPort ] ) => {
126
+ setGlobalVariable ( 'package-registry' , 'http://localhost:' + httpPort ) ;
127
+ setGlobalVariable ( 'package-secure-registry' , 'http://localhost:' + httpsPort ) ;
128
128
129
- const registryProcess = await createNpmRegistry ( httpPort , httpPort ) ;
130
- const secureRegistryProcess = await createNpmRegistry ( httpPort , httpsPort , true ) ;
129
+ let lastTestRun : string | null = null ;
131
130
132
- return (
133
- testsToRun
134
- . reduce ( ( previous , relativeName , testIndex ) => {
135
- // Make sure this is a windows compatible path.
136
- let absoluteName = path . join ( e2eRoot , relativeName ) ;
137
- if ( / ^ w i n / . test ( process . platform ) ) {
138
- absoluteName = absoluteName . replace ( / \\ / g, path . posix . sep ) ;
131
+ // NPM registries for the lifetime of the test execution
132
+ const registryProcess = await createNpmRegistry ( httpPort , httpPort ) ;
133
+ const secureRegistryProcess = await createNpmRegistry ( httpPort , httpsPort , true ) ;
134
+
135
+ try {
136
+ for ( const [ testIndex , test ] of testsToRun . entries ( ) ) {
137
+ await runTest ( ( lastTestRun = test ) , testIndex ) ;
138
+ }
139
+
140
+ console . log ( colors . green ( 'Done.' ) ) ;
141
+ } catch ( err ) {
142
+ console . log ( '\n' ) ;
143
+ console . error ( colors . red ( `Test "${ lastTestRun } " failed...` ) ) ;
144
+ console . error ( colors . red ( err . message ) ) ;
145
+ console . error ( colors . red ( err . stack ) ) ;
146
+
147
+ if ( argv . debug ) {
148
+ console . log ( `Current Directory: ${ process . cwd ( ) } ` ) ;
149
+ console . log ( 'Will loop forever while you debug... CTRL-C to quit.' ) ;
150
+
151
+ /* eslint-disable no-constant-condition */
152
+ while ( 1 ) {
153
+ // That's right!
139
154
}
155
+ }
140
156
141
- return previous . then ( ( ) => {
142
- currentFileName = relativeName . replace ( / \. t s $ / , '' ) ;
143
- const start = + new Date ( ) ;
144
-
145
- const module = require ( absoluteName ) ;
146
- const originalEnvVariables = {
147
- ...process . env ,
148
- } ;
149
-
150
- const fn : ( skipClean ?: ( ) => void ) => Promise < void > | void =
151
- typeof module == 'function'
152
- ? module
153
- : typeof module . default == 'function'
154
- ? module . default
155
- : ( ) => {
156
- throw new Error ( 'Invalid test module.' ) ;
157
- } ;
158
-
159
- let clean = true ;
160
- let previousDir = null ;
161
-
162
- return Promise . resolve ( )
163
- . then ( ( ) => printHeader ( currentFileName , testIndex ) )
164
- . then ( ( ) => ( previousDir = process . cwd ( ) ) )
165
- . then ( ( ) => logStack . push ( lastLogger ( ) . createChild ( currentFileName ) ) )
166
- . then ( ( ) => fn ( ( ) => ( clean = false ) ) )
167
- . then (
168
- ( ) => logStack . pop ( ) ,
169
- ( err ) => {
170
- logStack . pop ( ) ;
171
- throw err ;
172
- } ,
173
- )
174
- . then ( ( ) => console . log ( '----' ) )
175
- . then ( ( ) => {
176
- // If we're not in a setup, change the directory back to where it was before the test.
177
- // This allows tests to chdir without worrying about keeping the original directory.
178
- if ( ! allSetups . includes ( relativeName ) && previousDir ) {
179
- process . chdir ( previousDir ) ;
180
-
181
- // Restore env variables before each test.
182
- console . log ( ' Restoring original environment variables...' ) ;
183
- process . env = originalEnvVariables ;
184
- }
185
- } )
186
- . then ( ( ) => {
187
- // Only clean after a real test, not a setup step. Also skip cleaning if the test
188
- // requested an exception.
189
- if ( ! allSetups . includes ( relativeName ) && clean ) {
190
- logStack . push ( new logging . NullLogger ( ) ) ;
191
- return gitClean ( ) . then (
192
- ( ) => logStack . pop ( ) ,
193
- ( err ) => {
194
- logStack . pop ( ) ;
195
- throw err ;
196
- } ,
197
- ) ;
198
- }
199
- } )
200
- . then (
201
- ( ) => printFooter ( currentFileName , start ) ,
202
- ( err ) => {
203
- printFooter ( currentFileName , start ) ;
204
- console . error ( err ) ;
205
- throw err ;
206
- } ,
207
- ) ;
208
- } ) ;
209
- } , Promise . resolve ( ) )
210
- // Output success vs failure information.
211
- . then (
212
- ( ) => console . log ( colors . green ( 'Done.' ) ) ,
213
- ( err ) => {
214
- console . log ( '\n' ) ;
215
- console . error ( colors . red ( `Test "${ currentFileName } " failed...` ) ) ;
216
- console . error ( colors . red ( err . message ) ) ;
217
- console . error ( colors . red ( err . stack ) ) ;
218
-
219
- if ( argv . debug ) {
220
- console . log ( `Current Directory: ${ process . cwd ( ) } ` ) ;
221
- console . log ( 'Will loop forever while you debug... CTRL-C to quit.' ) ;
222
-
223
- /* eslint-disable no-constant-condition */
224
- while ( 1 ) {
225
- // That's right!
226
- }
227
- }
228
-
229
- return Promise . reject ( err ) ;
230
- } ,
231
- )
232
- // Kill the registry processes before exiting.
233
- . finally ( ( ) => {
234
- registryProcess . kill ( ) ;
235
- secureRegistryProcess . kill ( ) ;
236
- } )
237
- . then (
238
- ( ) => process . exit ( 0 ) ,
239
- ( ) => process . exit ( 1 ) ,
240
- )
157
+ throw err ;
158
+ } finally {
159
+ registryProcess . kill ( ) ;
160
+ secureRegistryProcess . kill ( ) ;
161
+ }
162
+ } )
163
+ . then (
164
+ ( ) => process . exit ( 0 ) ,
165
+ ( ) => process . exit ( 1 ) ,
241
166
) ;
242
- } ) ;
167
+
168
+ async function runTest ( relativeName : string , testIndex : number ) {
169
+ // Make sure this is a windows compatible path.
170
+ let absoluteName = path . join ( e2eRoot , relativeName ) ;
171
+ if ( / ^ w i n / . test ( process . platform ) ) {
172
+ absoluteName = absoluteName . replace ( / \\ / g, path . posix . sep ) ;
173
+ }
174
+
175
+ const currentFileName = relativeName . replace ( / \. t s $ / , '' ) ;
176
+ const start = + new Date ( ) ;
177
+
178
+ const module = require ( absoluteName ) ;
179
+ const originalEnvVariables = {
180
+ ...process . env ,
181
+ } ;
182
+
183
+ const fn : ( skipClean ?: ( ) => void ) => Promise < void > | void =
184
+ typeof module == 'function'
185
+ ? module
186
+ : typeof module . default == 'function'
187
+ ? module . default
188
+ : ( ) => {
189
+ throw new Error ( 'Invalid test module.' ) ;
190
+ } ;
191
+
192
+ printHeader ( currentFileName , testIndex ) ;
193
+
194
+ let clean = true ;
195
+ let previousDir = process . cwd ( ) ;
196
+ try {
197
+ // Run the test function with the current file on the logStack.
198
+ logStack . push ( lastLogger ( ) . createChild ( currentFileName ) ) ;
199
+ try {
200
+ await fn ( ( ) => ( clean = false ) ) ;
201
+ } finally {
202
+ logStack . pop ( ) ;
203
+ }
204
+
205
+ console . log ( '----' ) ;
206
+
207
+ // If we're not in a setup, change the directory back to where it was before the test.
208
+ // This allows tests to chdir without worrying about keeping the original directory.
209
+ if ( ! allSetups . includes ( relativeName ) && previousDir ) {
210
+ process . chdir ( previousDir ) ;
211
+
212
+ // Restore env variables before each test.
213
+ console . log ( ' Restoring original environment variables...' ) ;
214
+ process . env = originalEnvVariables ;
215
+ }
216
+
217
+ // Only clean after a real test, not a setup step. Also skip cleaning if the test
218
+ // requested an exception.
219
+ if ( ! allSetups . includes ( relativeName ) && clean ) {
220
+ logStack . push ( new logging . NullLogger ( ) ) ;
221
+ try {
222
+ await gitClean ( ) ;
223
+ } finally {
224
+ logStack . pop ( ) ;
225
+ }
226
+ }
227
+
228
+ printFooter ( currentFileName , start ) ;
229
+ } catch ( err ) {
230
+ printFooter ( currentFileName , start ) ;
231
+ console . error ( err ) ;
232
+ throw err ;
233
+ }
234
+ }
243
235
244
236
function printHeader ( testName : string , testIndex : number ) {
245
237
const text = `${ testIndex + 1 } of ${ testsToRun . length } ` ;
0 commit comments