@@ -5,6 +5,11 @@ if (process.argv[2] == '--verbose')
55else
66 global . logLevel = "info" ;
77
8+ if ( process . argv [ 2 ] == 'init' ) {
9+ require ( './init.js' ) ;
10+ return ;
11+ }
12+
813var Log = require ( '../lib/logger' ) ,
914 logger = new Log ( global . logLevel ) ,
1015 BrowserStack = require ( 'browserstack' ) ,
@@ -26,30 +31,47 @@ var Log = require('../lib/logger'),
2631 tunnelingAgent ,
2732 tunnel ;
2833
29- function cleanUp ( signal ) {
30- try {
31- server . close ( ) ;
32- } catch ( e ) {
33- logger . debug ( "Server already closed" ) ;
34- }
35-
36- logger . info ( "Exiting" ) ;
37-
38- for ( var key in workers ) {
39- var worker = workers [ key ] ;
40- if ( workers . hasOwnProperty ( key ) ) {
41- client . terminateWorker ( worker . id , function ( ) {
42- if ( ! workers [ key ] ) {
43- return ;
44- }
45-
34+ function terminateAllWorkers ( callback ) {
35+ var cleanWorker = function ( id , key ) {
36+ client . terminateWorker ( id , function ( ) {
37+ var worker = workers [ key ] ;
38+ if ( worker ) {
4639 logger . debug ( '[%s] Terminated' , worker . string ) ;
4740 clearTimeout ( worker . activityTimeout ) ;
41+ clearTimeout ( worker . testActivityTimeout ) ;
4842 delete workers [ key ] ;
4943 delete workerKeys [ worker . id ] ;
50- } ) ;
44+ }
45+ if ( utils . objectSize ( workers ) === 0 ) {
46+ callback ( ) ;
47+ }
48+ } ) ;
49+ } ;
50+
51+ if ( utils . objectSize ( workers ) === 0 ) {
52+ callback ( ) ;
53+ } else {
54+ for ( var key in workers ) {
55+ var worker = workers [ key ] ;
56+ if ( worker . id ) {
57+ cleanWorker ( worker . id , key ) ;
58+ } else {
59+ delete workers [ key ] ;
60+ if ( utils . objectSize ( workers ) === 0 ) {
61+ callback ( ) ;
62+ }
63+ }
5164 }
5265 }
66+ } ;
67+
68+ function cleanUpAndExit ( signal , status ) {
69+ try {
70+ server . close ( ) ;
71+ } catch ( e ) {
72+ logger . debug ( "Server already closed" ) ;
73+ }
74+
5375 if ( statusPoller ) statusPoller . stop ( ) ;
5476
5577 try {
@@ -62,9 +84,24 @@ function cleanUp(signal) {
6284 } catch ( e ) {
6385 logger . debug ( "Non existent pid file." ) ;
6486 }
65- if ( signal ) {
66- process . kill ( process . pid , 'SIGTERM' ) ;
87+
88+ if ( signal == 'SIGTERM' ) {
89+ logger . info ( "Exiting" ) ;
90+ process . exit ( status ) ;
91+ } else {
92+ terminateAllWorkers ( function ( ) {
93+ logger . info ( "Exiting" ) ;
94+ process . exit ( 1 ) ;
95+ } ) ;
96+ }
97+ }
98+
99+ function getTestBrowserInfo ( browserString , path ) {
100+ var info = browserString ;
101+ if ( config . multipleTest ) {
102+ info += ", " + path ;
67103 }
104+ return info ;
68105}
69106
70107function launchServer ( ) {
@@ -74,9 +111,10 @@ function launchServer() {
74111 server . listen ( parseInt ( serverPort , 10 ) ) ;
75112}
76113
77- function launchBrowser ( browser , url ) {
114+ function launchBrowser ( browser , path ) {
115+ var url = 'http://localhost:' + serverPort . toString ( ) + '/' + path ;
78116 var browserString = utils . browserString ( browser ) ;
79- logger . debug ( "[%s] Launching" , browserString ) ;
117+ logger . debug ( "[%s] Launching" , getTestBrowserInfo ( browserString , path ) ) ;
80118
81119 var key = utils . uuid ( ) ;
82120
@@ -121,6 +159,7 @@ function launchBrowser(browser, url) {
121159
122160 worker . config = browser ;
123161 worker . string = browserString ;
162+ worker . test_path = path ;
124163 workers [ key ] = worker ;
125164 workerKeys [ worker . id ] = { key : key , marked : false } ;
126165 } ) ;
@@ -130,13 +169,13 @@ function launchBrowser(browser, url) {
130169function launchBrowsers ( config , browser ) {
131170 setTimeout ( function ( ) {
132171 if ( Object . prototype . toString . call ( config . test_path ) === '[object Array]' ) {
172+ config . multipleTest = config . test_path . length > 1 ? true : false ;
133173 config . test_path . forEach ( function ( path ) {
134- var url = 'http://localhost:' + serverPort . toString ( ) + '/' + path ;
135- launchBrowser ( browser , url ) ;
174+ launchBrowser ( browser , path ) ;
136175 } ) ;
137176 } else {
138- var url = 'http://localhost:' + serverPort . toString ( ) + '/' + config . test_path ;
139- launchBrowser ( browser , url ) ;
177+ config . multipleTest = false ;
178+ launchBrowser ( browser , config . test_path ) ;
140179 }
141180 } , 100 ) ;
142181}
@@ -160,7 +199,7 @@ var statusPoller = {
160199
161200 if ( _worker . status === 'running' ) {
162201 //clearInterval(statusPoller);
163- logger . debug ( '[%s] Launched' , worker . string ) ;
202+ logger . debug ( '[%s] Launched' , getTestBrowserInfo ( worker . string , worker . test_path ) ) ;
164203 worker . launched = true ;
165204 workerData . marked = true ;
166205
@@ -180,12 +219,12 @@ var statusPoller = {
180219 config . status = 1 ;
181220 }
182221
183- process . exit ( config . status ) ;
222+ process . kill ( process . pid , 'SIGTERM' ) ;
184223 }
185224 }
186225 } , activityTimeout * 1000 ) ;
187226
188- setTimeout ( function ( ) {
227+ worker . testActivityTimeout = setTimeout ( function ( ) {
189228 if ( worker . acknowledged ) {
190229 var subject = "Tests timed out on: " + worker . string ;
191230 var content = "Worker details:\n" + JSON . stringify ( worker . config , null , 4 ) ;
@@ -201,7 +240,7 @@ var statusPoller = {
201240 config . status = 1 ;
202241 }
203242
204- process . exit ( config . status ) ;
243+ process . kill ( process . pid , 'SIGTERM' ) ;
205244 }
206245 }
207246 } , ( activityTimeout * 1000 ) ) ;
@@ -232,7 +271,8 @@ function runTests() {
232271 launchServer ( ) ;
233272 tunnel = new Tunnel ( config . key , serverPort , config . tunnelIdentifier , function ( ) {
234273 statusPoller . start ( ) ;
235- logger . info ( "Launching " + browsers . length + " workers" ) ;
274+ var total_workers = config . browsers . length * ( Object . prototype . toString . call ( config . test_path ) === '[object Array]' ? config . test_path . length : 1 ) ;
275+ logger . info ( "Launching " + total_workers + " workers" ) ;
236276 browsers . forEach ( function ( browser ) {
237277 if ( browser . browser_version === "latest" ) {
238278 logger . debug ( "[%s] Finding version." , utils . browserString ( browser ) ) ;
@@ -254,21 +294,16 @@ function runTests() {
254294}
255295
256296try {
257- if ( process . argv [ 2 ] == 'init' ) {
258- require ( './init.js' ) ;
259- } else {
260- var client = BrowserStack . createClient ( {
261- username : config . username ,
262- password : config . key
263- } ) ;
264- runTests ( ) ;
265- var pid_file = process . cwd ( ) + '/browserstack-run.pid' ;
266- fs . writeFileSync ( pid_file , process . pid , 'utf-8' )
267- process . on ( 'exit' , function ( ) { cleanUp ( false ) } ) ;
268- process . on ( 'SIGINT' , function ( ) { cleanUp ( true ) } ) ;
269- }
297+ var client = BrowserStack . createClient ( {
298+ username : config . username ,
299+ password : config . key
300+ } ) ;
301+ runTests ( ) ;
302+ var pid_file = process . cwd ( ) + '/browserstack-run.pid' ;
303+ fs . writeFileSync ( pid_file , process . pid , 'utf-8' )
304+ process . on ( 'SIGINT' , function ( ) { cleanUpAndExit ( 'SIGINT' , 1 ) } ) ;
305+ process . on ( 'SIGTERM' , function ( ) { cleanUpAndExit ( 'SIGTERM' , config . status ) } ) ;
270306} catch ( e ) {
271307 console . log ( e ) ;
272308 console . log ( 'Invalid command.' ) ;
273309}
274-
0 commit comments