@@ -86,21 +86,46 @@ var _exampleBoilerplateFiles = [
8686
8787var _exampleDartWebBoilerPlateFiles = [ 'styles.css' ] ;
8888
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+ */
92105gulp . 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 ( ) {
100124 return findAndRunE2eTests ( argv . filter ) ;
101125 } ) . then ( function ( status ) {
102126 reportStatus ( status ) ;
103- } ) . fail ( function ( e ) {
127+ } ) . catch ( function ( e ) {
128+ gutil . log ( e ) ;
104129 return e ;
105130 } ) ;
106131} ) ;
@@ -114,10 +139,13 @@ function findAndRunE2eTests(filter) {
114139 var startTime = new Date ( ) . getTime ( ) ;
115140 // create an output file with header.
116141 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+
121149 fs . writeFileSync ( outputFile , header ) ;
122150
123151 // create an array of combos where each
@@ -175,25 +203,32 @@ function runE2eTsTests(appDir, protractorConfigFilename, outputFile) {
175203}
176204
177205function 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+ }
197232}
198233
199234// start the server in appDir/build/web; then run protractor with the specified
@@ -252,9 +287,11 @@ function spawnExt(command, args, options) {
252287 proc . stderr . on ( 'data' , function ( data ) {
253288 gutil . log ( data . toString ( ) ) ;
254289 } ) ;
255- proc . on ( 'close' , function ( data ) {
290+ proc . on ( 'close' , function ( returnCode ) {
256291 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 ) ;
258295 } ) ;
259296 proc . on ( 'error' , function ( data ) {
260297 gutil . log ( 'completed with error:' + descr ) ;
0 commit comments