@@ -23,30 +23,46 @@ var Log = require('../lib/logger'),
2323 logLevel ,
2424 tunnel ;
2525
26- function cleanUp ( signal ) {
27- try {
28- server . close ( ) ;
29- } catch ( e ) {
30- logger . debug ( "Server already closed" ) ;
31- }
32-
33- logger . info ( "Exiting" ) ;
34-
35- for ( var key in workers ) {
36- var worker = workers [ key ] ;
37- if ( workers . hasOwnProperty ( key ) ) {
38- client . terminateWorker ( worker . id , function ( ) {
39- if ( ! workers [ key ] ) {
40- return ;
41- }
42-
26+ function terminateAllWorkers ( callback ) {
27+ var cleanWorker = function ( id , key ) {
28+ client . terminateWorker ( id , function ( ) {
29+ var worker = workers [ key ] ;
30+ if ( worker ) {
4331 logger . debug ( '[%s] Terminated' , worker . string ) ;
4432 clearTimeout ( worker . activityTimeout ) ;
4533 delete workers [ key ] ;
4634 delete workerKeys [ worker . id ] ;
47- } ) ;
35+ }
36+ if ( utils . objectSize ( workers ) === 0 ) {
37+ callback ( ) ;
38+ }
39+ } ) ;
40+ } ;
41+
42+ if ( utils . objectSize ( workers ) === 0 ) {
43+ callback ( ) ;
44+ } else {
45+ for ( var key in workers ) {
46+ var worker = workers [ key ] ;
47+ if ( worker . id ) {
48+ cleanWorker ( worker . id , key ) ;
49+ } else {
50+ delete workers [ key ] ;
51+ if ( utils . objectSize ( workers ) === 0 ) {
52+ callback ( ) ;
53+ }
54+ }
4855 }
4956 }
57+ } ;
58+
59+ function cleanUpAndExit ( signal , status ) {
60+ try {
61+ server . close ( ) ;
62+ } catch ( e ) {
63+ logger . debug ( "Server already closed" ) ;
64+ }
65+
5066 if ( statusPoller ) statusPoller . stop ( ) ;
5167
5268 try {
@@ -59,9 +75,24 @@ function cleanUp(signal) {
5975 } catch ( e ) {
6076 logger . debug ( "Non existent pid file." ) ;
6177 }
62- if ( signal ) {
63- process . kill ( process . pid , 'SIGTERM' ) ;
78+
79+ if ( signal == 'SIGTERM' ) {
80+ logger . info ( "Exiting" ) ;
81+ process . exit ( status ) ;
82+ } else {
83+ terminateAllWorkers ( function ( ) {
84+ logger . info ( "Exiting" ) ;
85+ process . exit ( 1 ) ;
86+ } ) ;
87+ }
88+ }
89+
90+ function getTestBrowserInfo ( browserString , path ) {
91+ var info = browserString ;
92+ if ( config . multipleTest ) {
93+ info += ", " + path ;
6494 }
95+ return info ;
6596}
6697
6798function launchServer ( ) {
@@ -71,9 +102,10 @@ function launchServer() {
71102 server . listen ( parseInt ( serverPort , 10 ) ) ;
72103}
73104
74- function launchBrowser ( browser , url ) {
105+ function launchBrowser ( browser , path ) {
106+ var url = 'http://localhost:' + serverPort . toString ( ) + '/' + path ;
75107 var browserString = utils . browserString ( browser ) ;
76- logger . debug ( "[%s] Launching" , browserString ) ;
108+ logger . debug ( "[%s] Launching" , getTestBrowserInfo ( browserString , path ) ) ;
77109
78110 var key = utils . uuid ( ) ;
79111
@@ -118,6 +150,7 @@ function launchBrowser(browser, url) {
118150
119151 worker . config = browser ;
120152 worker . string = browserString ;
153+ worker . test_path = path ;
121154 workers [ key ] = worker ;
122155 workerKeys [ worker . id ] = { key : key , marked : false } ;
123156 } ) ;
@@ -127,13 +160,13 @@ function launchBrowser(browser, url) {
127160function launchBrowsers ( config , browser ) {
128161 setTimeout ( function ( ) {
129162 if ( Object . prototype . toString . call ( config . test_path ) === '[object Array]' ) {
163+ config . multipleTest = config . test_path . length > 1 ? true : false ;
130164 config . test_path . forEach ( function ( path ) {
131- var url = 'http://localhost:' + serverPort . toString ( ) + '/' + path ;
132- launchBrowser ( browser , url ) ;
165+ launchBrowser ( browser , path ) ;
133166 } ) ;
134167 } else {
135- var url = 'http://localhost:' + serverPort . toString ( ) + '/' + config . test_path ;
136- launchBrowser ( browser , url ) ;
168+ config . multipleTest = false ;
169+ launchBrowser ( browser , config . test_path ) ;
137170 }
138171 } , 100 ) ;
139172}
@@ -157,7 +190,7 @@ var statusPoller = {
157190
158191 if ( _worker . status === 'running' ) {
159192 //clearInterval(statusPoller);
160- logger . debug ( '[%s] Launched' , worker . string ) ;
193+ logger . debug ( '[%s] Launched' , getTestBrowserInfo ( worker . string , worker . test_path ) ) ;
161194 worker . launched = true ;
162195 workerData . marked = true ;
163196
@@ -177,7 +210,7 @@ var statusPoller = {
177210 config . status = 1 ;
178211 }
179212
180- process . exit ( config . status ) ;
213+ process . kill ( process . pid , 'SIGTERM' ) ;
181214 }
182215 }
183216 } , activityTimeout * 1000 ) ;
@@ -198,7 +231,7 @@ var statusPoller = {
198231 config . status = 1 ;
199232 }
200233
201- process . exit ( config . status ) ;
234+ process . kill ( process . pid , 'SIGTERM' ) ;
202235 }
203236 }
204237 } , ( activityTimeout * 1000 ) ) ;
@@ -219,7 +252,8 @@ function runTests() {
219252 launchServer ( ) ;
220253 tunnel = new Tunnel ( config . key , serverPort , config . tunnelIdentifier , function ( ) {
221254 statusPoller . start ( ) ;
222- logger . info ( "Launching " + browsers . length + " workers" ) ;
255+ var total_workers = config . browsers . length * ( Object . prototype . toString . call ( config . test_path ) === '[object Array]' ? config . test_path . length : 1 ) ;
256+ logger . info ( "Launching " + total_workers + " workers" ) ;
223257 browsers . forEach ( function ( browser ) {
224258 if ( browser . browser_version === "latest" ) {
225259 logger . debug ( "[%s] Finding version." , utils . browserString ( browser ) ) ;
@@ -251,8 +285,8 @@ try {
251285 runTests ( ) ;
252286 var pid_file = process . cwd ( ) + '/browserstack-run.pid' ;
253287 fs . writeFileSync ( pid_file , process . pid , 'utf-8' )
254- process . on ( 'exit ' , function ( ) { cleanUp ( false ) } ) ;
255- process . on ( 'SIGINT ' , function ( ) { cleanUp ( true ) } ) ;
288+ process . on ( 'SIGINT ' , function ( ) { cleanUpAndExit ( 'SIGINT' , 1 ) } ) ;
289+ process . on ( 'SIGTERM ' , function ( ) { cleanUpAndExit ( 'SIGTERM' , config . status ) } ) ;
256290 }
257291} catch ( e ) {
258292 console . log ( e ) ;
0 commit comments