@@ -11,43 +11,42 @@ var util = require('util'),
11
11
child = require ( 'child_process' ) ,
12
12
ConfigParser = require ( './configParser' ) ;
13
13
14
+ var launcherPrefix = '[launcher] '
14
15
15
- var reportHeader_ = function ( proc , env ) {
16
- var capability = JSON . parse ( env . capability ) ;
16
+ var log_ = function ( stuff ) {
17
+ console . log ( launcherPrefix + stuff ) ;
18
+ }
19
+
20
+ var noLineLog_ = function ( stuff ) {
21
+ process . stdout . write ( launcherPrefix + stuff ) ;
22
+ }
23
+
24
+
25
+ var reportHeader_ = function ( childFork ) {
26
+ var capability = childFork . capability ;
17
27
var eol = require ( 'os' ) . EOL ;
18
28
19
- var outputHeader = eol + '------------------------------' + eol ;
20
- outputHeader += 'PID: ' + proc . pid + ' (capability: ' ;
29
+ var outputHeader = eol + '------------------------------------ ' + eol ; ;
30
+ outputHeader += 'PID: ' + childFork . process . pid + ' (capability: ' ;
21
31
outputHeader += ( capability . browserName ) ?
22
32
capability . browserName : '' ;
23
33
outputHeader += ( capability . version ) ?
24
34
capability . version : '' ;
25
35
outputHeader += ( capability . platform ) ?
26
36
capability . platform : '' ;
27
- outputHeader += ( env . runNumber ) ?
28
- ' #' + env . runNumber : '' ;
37
+ outputHeader += ( childFork . runNumber ) ?
38
+ ' #' + childFork . runNumber : '' ;
29
39
outputHeader += ')' + eol ;
30
- outputHeader += '------------------------------' ;
40
+ outputHeader += '------------------------------------' + eol ;
31
41
32
42
33
43
util . puts ( outputHeader ) ;
34
44
} ;
35
45
36
- var makeChildEnv_ = function ( additional ) {
37
- var newEnv = { } ;
38
- for ( var v in process . env ) {
39
- newEnv [ v ] = process . env [ v ] ;
40
- }
41
- for ( var a in additional ) {
42
- newEnv [ a ] = additional [ a ] ;
43
- }
44
- return newEnv ;
45
- } ;
46
-
47
46
/**
48
47
* Initialize and run the tests.
49
48
*
50
- * @param {Object } argv - Optimist parsed arguments
49
+ * @param {Object } argv Optimist parsed arguments.
51
50
*/
52
51
var init = function ( argv ) {
53
52
@@ -61,8 +60,20 @@ var init = function(argv) {
61
60
addConfig ( argv ) .
62
61
getConfig ( ) ;
63
62
63
+ var listRemainingForks = function ( ) {
64
+ var remaining = 0 ;
65
+ childForks . forEach ( function ( childFork ) {
66
+ if ( ! childFork . done ) {
67
+ remaining ++ ;
68
+ }
69
+ } ) ;
70
+ if ( remaining ) {
71
+ noLineLog_ ( remaining + ' instance(s) of WebDriver still running' ) ;
72
+ }
73
+ }
74
+
64
75
if ( config . multiCapabilities . length ) {
65
- console . log ( 'Running using config.multiCapabilities - ' +
76
+ log_ ( 'Running using config.multiCapabilities - ' +
66
77
'config.capabilities will be ignored' ) ;
67
78
}
68
79
@@ -80,79 +91,88 @@ var init = function(argv) {
80
91
81
92
// Fork the child runners.
82
93
for ( var j = 0 ; j < capabilityRunCount ; j ++ ) {
83
-
84
- // We use an environment variable to retain the optimist parsed args and
85
- // to tell the runner which capability its responsible for.
86
- // The child environment inherits from the parent environment.
87
- childForks . push ( makeChildEnv_ ( {
88
- cliArgs : JSON . stringify ( argv ) ,
89
- capability : JSON . stringify ( config . multiCapabilities [ i ] ) ,
94
+ childForks . push ( {
95
+ cliArgs : argv ,
96
+ capability : config . multiCapabilities [ i ] ,
90
97
runNumber : j + 1
91
- } ) ) ;
98
+ } ) ;
92
99
}
93
100
}
94
101
95
102
// If we're launching multiple runners, aggregate output until completion.
96
- // Otherwise, there are multiple runners , let's pipe the output straight
103
+ // Otherwise, there is a single runner , let's pipe the output straight
97
104
// through to maintain realtime reporting.
98
105
if ( childForks . length === 1 ) {
99
- var childEnv = childForks . pop ( ) ,
100
- childProc = child . fork ( __dirname + "/runFromLauncher.js" , [ ] ,
101
- { env : childEnv ,
102
- cwd : process . cwd ( ) } ) ;
103
- reportHeader_ ( childProc , childEnv ) ;
104
- childProc . on ( 'error' , function ( err ) {
105
- util . puts ( 'Runner Process(' + childProc . pid + ') Error: ' + err ) ;
106
+ var childFork = childForks [ 0 ] ;
107
+ childFork . process = child . fork (
108
+ __dirname + "/runFromLauncher.js" , [ ] , { cwd : process . cwd ( ) } ) ;
109
+ reportHeader_ ( childFork ) ;
110
+
111
+ childFork . process . send ( {
112
+ command : 'run' ,
113
+ cliArgs : childFork . cliArgs ,
114
+ capability : childFork . capability
115
+ } ) ;
116
+
117
+ childFork . process . on ( 'error' , function ( err ) {
118
+ log_ ( 'Runner Process(' + childFork . process . pid + ') Error: ' + err ) ;
106
119
} ) ;
107
120
108
- childProc . on ( 'exit' , function ( code , signal ) {
121
+ childFork . process . on ( 'exit' , function ( code , signal ) {
109
122
if ( code ) {
110
- util . puts ( 'Runner Process Exited With Error Code: ' + code ) ;
123
+ log_ ( 'Runner Process Exited With Error Code: ' + code ) ;
111
124
launcherExitCode = 1 ;
112
125
}
113
126
} ) ;
114
127
} else {
115
- process . stdout . write ( 'Running ' + childForks . length + ' instances of WebDriver' ) ;
128
+ noLineLog_ ( 'Running ' + childForks . length +
129
+ ' instances of WebDriver' ) ;
116
130
117
131
// Launch each fork and set up listeners
118
- childForks . forEach ( function ( childEnv ) {
119
-
120
- var childProc = child . fork ( __dirname + "/runFromLauncher.js" , [ ] ,
121
- { env : childEnv , silent : true , cwd : process . cwd ( ) } ) ;
122
-
123
- // Force evaluation to protect from loop changing closure in callbacks
124
- ( function ( childProc_ , childEnv_ ) {
125
- childProc_ . output = '' ;
126
-
127
- // stdin pipe
128
- childProc_ . stdout . on ( 'data' , function ( chunk ) {
129
- // Output something so processes know we haven't stalled.
130
- // TODO - consider replacing this with a message system which would
131
- // output a dot per test.
132
- process . stdout . write ( '.' ) ;
133
- childProc_ . output += chunk ;
134
- } ) ;
135
-
136
- // stderr pipe
137
- childProc_ . stderr . on ( 'data' , function ( chunk ) {
138
- childProc_ . output += chunk ;
139
- } ) ;
140
-
141
- // err handler
142
- childProc_ . on ( 'error' , function ( err ) {
143
- util . puts ( 'Runner Process(' + childProc_ . pid + ') Error: ' + err ) ;
144
- } ) ;
145
-
146
- // exit handlers
147
- childProc_ . on ( 'exit' , function ( code , signal ) {
148
- if ( code ) {
149
- util . puts ( 'Runner Process Exited With Error Code: ' + code ) ;
150
- launcherExitCode = 1 ;
151
- }
152
- reportHeader_ ( childProc_ , childEnv_ ) ;
153
- util . puts ( childProc_ . output ) ;
154
- } ) ;
155
- } ) ( childProc , childEnv ) ;
132
+ childForks . forEach ( function ( childFork ) {
133
+
134
+ childFork . process = child . fork (
135
+ __dirname + "/runFromLauncher.js" , [ ] ,
136
+ { silent : true , cwd : process . cwd ( ) } ) ;
137
+
138
+ childFork . output = '' ;
139
+
140
+ // stdin pipe
141
+ childFork . process . stdout . on ( 'data' , function ( chunk ) {
142
+ // Output something so processes know we haven't stalled.
143
+ // TODO - consider replacing this with a message system which would
144
+ // output a dot per test.
145
+ process . stdout . write ( '.' ) ;
146
+ childFork . output += chunk ;
147
+ } ) ;
148
+
149
+ // stderr pipe
150
+ childFork . process . stderr . on ( 'data' , function ( chunk ) {
151
+ childFork . output += chunk ;
152
+ } ) ;
153
+
154
+ // err handler
155
+ childFork . process . on ( 'error' , function ( err ) {
156
+ log_ ( 'Runner Process(' + childFork . process . pid + ') Error: ' + err ) ;
157
+ } ) ;
158
+
159
+ // exit handlers
160
+ childFork . process . on ( 'exit' , function ( code , signal ) {
161
+ if ( code ) {
162
+ log_ ( 'Runner Process Exited With Error Code: ' + code ) ;
163
+ launcherExitCode = 1 ;
164
+ }
165
+ reportHeader_ ( childFork ) ;
166
+ util . puts ( childFork . output ) ;
167
+ childFork . done = true ;
168
+ listRemainingForks ( ) ;
169
+ } ) ;
170
+
171
+ childFork . process . send ( {
172
+ command : 'run' ,
173
+ cliArgs : childFork . cliArgs ,
174
+ capability : childFork . capability
175
+ } ) ;
156
176
} ) ;
157
177
}
158
178
0 commit comments