@@ -86,21 +86,46 @@ var _exampleBoilerplateFiles = [
86
86
87
87
var _exampleDartWebBoilerPlateFiles = [ 'styles.css' ] ;
88
88
89
- // --filter may be passed in to filter/select _example app subdir names
90
- // i.e. gulp run-e2e-tests --filter=foo ; would select all example apps with
91
- // 'foo' in their folder names.
89
+ /**
90
+ * Run Protractor End-to-End Tests for Doc Samples
91
+ *
92
+ * Flags
93
+ * --filter to filter/select _example app subdir names
94
+ * e.g. gulp run-e2e-tests --filter=foo // all example apps with 'foo' in their folder names.
95
+ *
96
+ * --fast by-passes the npm install and webdriver update
97
+ * Use it for repeated test runs (but not the FIRST run)
98
+ * e.g. gulp run-e2e-tests --fast
99
+ *
100
+ * --lang to filter by code language
101
+ * e.g. gulp run-e2e-tests --lang=ts // only TypeScript apps
102
+ * default is (ts|js)
103
+ * all means (ts|js|dart)
104
+ */
92
105
gulp . task ( 'run-e2e-tests' , function ( ) {
93
- var spawnInfo = spawnExt ( 'npm' , [ 'install' ] , { cwd : EXAMPLES_PATH } ) ;
94
- return spawnInfo . promise . then ( function ( ) {
95
- copyExampleBoilerplate ( ) ;
96
- var exePath = path . join ( process . cwd ( ) , "./node_modules/.bin/" ) ;
97
- spawnInfo = spawnExt ( 'webdriver-manager' , [ 'update' ] , { cwd : exePath } ) ;
98
- return spawnInfo . promise ;
99
- } ) . then ( function ( ) {
106
+
107
+ var exePath = path . join ( process . cwd ( ) , "./node_modules/.bin/" ) ;
108
+
109
+ var promise ;
110
+ if ( argv . fast ) {
111
+ // fast; skip all setup
112
+ promise = Promise . resolve ( true ) ;
113
+ } else {
114
+ // Not 'fast'; do full setup
115
+ var spawnInfo = spawnExt ( 'npm' , [ 'install' ] , { cwd : EXAMPLES_PATH } ) ;
116
+ promise = spawnInfo . promise . then ( function ( ) {
117
+ copyExampleBoilerplate ( ) ;
118
+ spawnInfo = spawnExt ( 'webdriver-manager' , [ 'update' ] , { cwd : exePath } ) ;
119
+ return spawnInfo . promise ;
120
+ } ) ;
121
+ }
122
+
123
+ promise . then ( function ( ) {
100
124
return findAndRunE2eTests ( argv . filter ) ;
101
125
} ) . then ( function ( status ) {
102
126
reportStatus ( status ) ;
103
- } ) . fail ( function ( e ) {
127
+ } ) . catch ( function ( e ) {
128
+ gutil . log ( e ) ;
104
129
return e ;
105
130
} ) ;
106
131
} ) ;
@@ -114,10 +139,13 @@ function findAndRunE2eTests(filter) {
114
139
var startTime = new Date ( ) . getTime ( ) ;
115
140
// create an output file with header.
116
141
var outputFile = path . join ( process . cwd ( ) , 'protractor-results.txt' ) ;
117
- var header = "Protractor example results for " + lang + " on " + ( new Date ( ) ) . toLocaleString ( ) + "\n\n" ;
118
- if ( filter ) {
119
- header += ' Filter: ' + filter . toString ( ) + '\n\n' ;
120
- }
142
+
143
+ var header = `Doc Sample Protractor Results for ${ lang } on ${ new Date ( ) . toLocaleString ( ) } \n` ;
144
+ header += argv . fast ?
145
+ ' Fast Mode (--fast): no npm install, webdriver update, or boilerplate copy\n' :
146
+ ' Slow Mode: npm install, webdriver update, and boilerplate copy\n' ;
147
+ header += ` Filter: ${ filter ? filter : 'All tests' } \n\n` ;
148
+
121
149
fs . writeFileSync ( outputFile , header ) ;
122
150
123
151
// create an array of combos where each
@@ -175,25 +203,32 @@ function runE2eTsTests(appDir, protractorConfigFilename, outputFile) {
175
203
}
176
204
177
205
function runProtractor ( prepPromise , appDir , appRunSpawnInfo , protractorConfigFilename , outputFile ) {
178
- return prepPromise . then ( function ( data ) {
179
- // start protractor
180
- var pcFilename = path . resolve ( protractorConfigFilename ) ; // need to resolve because we are going to be running from a different dir
181
- var exePath = path . join ( process . cwd ( ) , "./node_modules/.bin/" ) ;
182
- var spawnInfo = spawnExt ( 'protractor' ,
183
- [ pcFilename , '--params.appDir=' + appDir , '--params.outputFile=' + outputFile ] , { cwd : exePath } ) ;
184
- return spawnInfo . promise ;
185
- } ) . then ( function ( data ) {
186
- // kill the app now that protractor has completed.
187
- // Ugh... proc.kill does not work properly on windows with child processes.
188
- // appRun.proc.kill();
189
- treeKill ( appRunSpawnInfo . proc . pid ) ;
190
- return ! data ;
191
- } ) . fail ( function ( err ) {
192
- // Ugh... proc.kill does not work properly on windows with child processes.
193
- // appRun.proc.kill();
194
- treeKill ( appRunSpawnInfo . proc . pid ) ;
195
- return false ;
196
- } ) ;
206
+ return prepPromise
207
+ . catch ( function ( ) {
208
+ var emsg = `AppDir failed during compile: ${ appDir } \n\n` ;
209
+ gutil . log ( emsg ) ;
210
+ fs . appendFileSync ( outputFile , emsg ) ;
211
+ return Promise . reject ( emsg ) ;
212
+ } )
213
+ . then ( function ( data ) {
214
+ // start protractor
215
+ var pcFilename = path . resolve ( protractorConfigFilename ) ; // need to resolve because we are going to be running from a different dir
216
+ var exePath = path . join ( process . cwd ( ) , "./node_modules/.bin/" ) ;
217
+ var spawnInfo = spawnExt ( 'protractor' ,
218
+ [ pcFilename , '--params.appDir=' + appDir , '--params.outputFile=' + outputFile ] , { cwd : exePath } ) ;
219
+ return spawnInfo . promise
220
+ } )
221
+ . then (
222
+ function ( ) { return finish ( true ) ; } ,
223
+ function ( ) { return finish ( false ) ; }
224
+ )
225
+
226
+ function finish ( ok ) {
227
+ // Ugh... proc.kill does not work properly on windows with child processes.
228
+ // appRun.proc.kill();
229
+ treeKill ( appRunSpawnInfo . proc . pid ) ;
230
+ return ok ;
231
+ }
197
232
}
198
233
199
234
// start the server in appDir/build/web; then run protractor with the specified
@@ -252,9 +287,11 @@ function spawnExt(command, args, options) {
252
287
proc . stderr . on ( 'data' , function ( data ) {
253
288
gutil . log ( data . toString ( ) ) ;
254
289
} ) ;
255
- proc . on ( 'close' , function ( data ) {
290
+ proc . on ( 'close' , function ( returnCode ) {
256
291
gutil . log ( 'completed: ' + descr ) ;
257
- deferred . resolve ( data ) ;
292
+ // Many tasks (e.g., tsc) complete but are actually errors;
293
+ // Confirm return code is zero.
294
+ returnCode === 0 ? deferred . resolve ( 0 ) : deferred . reject ( returnCode ) ;
258
295
} ) ;
259
296
proc . on ( 'error' , function ( data ) {
260
297
gutil . log ( 'completed with error:' + descr ) ;
0 commit comments