@@ -23,30 +23,46 @@ var Log = require('../lib/logger'),
23
23
logLevel ,
24
24
tunnel ;
25
25
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 ) {
43
31
logger . debug ( '[%s] Terminated' , worker . string ) ;
44
32
clearTimeout ( worker . activityTimeout ) ;
45
33
delete workers [ key ] ;
46
34
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
+ }
48
55
}
49
56
}
57
+ } ;
58
+
59
+ function cleanUpAndExit ( signal , status ) {
60
+ try {
61
+ server . close ( ) ;
62
+ } catch ( e ) {
63
+ logger . debug ( "Server already closed" ) ;
64
+ }
65
+
50
66
if ( statusPoller ) statusPoller . stop ( ) ;
51
67
52
68
try {
@@ -59,9 +75,24 @@ function cleanUp(signal) {
59
75
} catch ( e ) {
60
76
logger . debug ( "Non existent pid file." ) ;
61
77
}
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 ;
64
94
}
95
+ return info ;
65
96
}
66
97
67
98
function launchServer ( ) {
@@ -71,9 +102,10 @@ function launchServer() {
71
102
server . listen ( parseInt ( serverPort , 10 ) ) ;
72
103
}
73
104
74
- function launchBrowser ( browser , url ) {
105
+ function launchBrowser ( browser , path ) {
106
+ var url = 'http://localhost:' + serverPort . toString ( ) + '/' + path ;
75
107
var browserString = utils . browserString ( browser ) ;
76
- logger . debug ( "[%s] Launching" , browserString ) ;
108
+ logger . debug ( "[%s] Launching" , getTestBrowserInfo ( browserString , path ) ) ;
77
109
78
110
var key = utils . uuid ( ) ;
79
111
@@ -118,6 +150,7 @@ function launchBrowser(browser, url) {
118
150
119
151
worker . config = browser ;
120
152
worker . string = browserString ;
153
+ worker . test_path = path ;
121
154
workers [ key ] = worker ;
122
155
workerKeys [ worker . id ] = { key : key , marked : false } ;
123
156
} ) ;
@@ -127,13 +160,13 @@ function launchBrowser(browser, url) {
127
160
function launchBrowsers ( config , browser ) {
128
161
setTimeout ( function ( ) {
129
162
if ( Object . prototype . toString . call ( config . test_path ) === '[object Array]' ) {
163
+ config . multipleTest = config . test_path . length > 1 ? true : false ;
130
164
config . test_path . forEach ( function ( path ) {
131
- var url = 'http://localhost:' + serverPort . toString ( ) + '/' + path ;
132
- launchBrowser ( browser , url ) ;
165
+ launchBrowser ( browser , path ) ;
133
166
} ) ;
134
167
} 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 ) ;
137
170
}
138
171
} , 100 ) ;
139
172
}
@@ -157,7 +190,7 @@ var statusPoller = {
157
190
158
191
if ( _worker . status === 'running' ) {
159
192
//clearInterval(statusPoller);
160
- logger . debug ( '[%s] Launched' , worker . string ) ;
193
+ logger . debug ( '[%s] Launched' , getTestBrowserInfo ( worker . string , worker . test_path ) ) ;
161
194
worker . launched = true ;
162
195
workerData . marked = true ;
163
196
@@ -177,7 +210,7 @@ var statusPoller = {
177
210
config . status = 1 ;
178
211
}
179
212
180
- process . exit ( config . status ) ;
213
+ process . kill ( process . pid , 'SIGTERM' ) ;
181
214
}
182
215
}
183
216
} , activityTimeout * 1000 ) ;
@@ -198,7 +231,7 @@ var statusPoller = {
198
231
config . status = 1 ;
199
232
}
200
233
201
- process . exit ( config . status ) ;
234
+ process . kill ( process . pid , 'SIGTERM' ) ;
202
235
}
203
236
}
204
237
} , ( activityTimeout * 1000 ) ) ;
@@ -219,7 +252,8 @@ function runTests() {
219
252
launchServer ( ) ;
220
253
tunnel = new Tunnel ( config . key , serverPort , config . tunnelIdentifier , function ( ) {
221
254
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" ) ;
223
257
browsers . forEach ( function ( browser ) {
224
258
if ( browser . browser_version === "latest" ) {
225
259
logger . debug ( "[%s] Finding version." , utils . browserString ( browser ) ) ;
@@ -251,8 +285,8 @@ try {
251
285
runTests ( ) ;
252
286
var pid_file = process . cwd ( ) + '/browserstack-run.pid' ;
253
287
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 ) } ) ;
256
290
}
257
291
} catch ( e ) {
258
292
console . log ( e ) ;
0 commit comments