| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144 |
- var child_process = require('child_process');
- var util = require('util');
- var events = require('events');
- var Logger = require('../../util/logger.js');
- function ChildProcess(environment, index, env_output, settings, args) {
- events.EventEmitter.call(this);
- this.env_output = env_output || [];
- this.mainModule = process.mainModule.filename;
- this.index = index;
- this.itemKey = this.getChildProcessEnvKey(environment);
- this.startDelay = settings.parallel_process_delay || ChildProcess.defaultStartDelay;
- this.environment = environment;
- this.settings = settings;
- this.child = null;
- this.globalExitCode = 0;
- this.processRunning = false;
- this.env_label = '';
- this.args = args || [];
- }
- util.inherits(ChildProcess, events.EventEmitter);
- ChildProcess.prevIndex = 0;
- ChildProcess.defaultStartDelay = 10;
- ChildProcess.prototype.setLabel = function(label) {
- this.env_itemKey = label;
- this.env_label = this.settings.disable_colors ?
- (' ' + label + ' ') : Logger.colors.yellow(' ' + label + ' ', Logger.colors.background.black);
- return this;
- };
- ChildProcess.prototype.run = function(colors, done) {
- this.availColors = colors;
- var cliArgs = this.getArgs();
- var env = {};
- Object.keys(process.env).forEach(function(key) {
- env[key] = process.env[key];
- });
- var self = this;
- setTimeout(function() {
- env.__NIGHTWATCH_PARALLEL_MODE = 1;
- env.__NIGHTWATCH_ENV = self.environment;
- env.__NIGHTWATCH_ENV_KEY = self.itemKey;
- env.__NIGHTWATCH_ENV_LABEL = self.env_itemKey;
- self.child = child_process.spawn(process.execPath, cliArgs, {
- cwd: process.cwd(),
- encoding: 'utf8',
- env: env,
- stdio: [null, null, null, 'ipc']
- });
- self.child.on('message', function(data) {
- self.emit('result', JSON.parse(data));
- });
- self.processRunning = true;
- if (self.settings.output) {
- console.log('Started child process for:' + self.env_label);
- }
- self.child.stdout.on('data', function (data) {
- self.writeToStdout(data);
- });
- self.child.stderr.on('data', function (data) {
- self.writeToStdout(data);
- });
- self.child.on('exit', function (code) {
- if (self.settings.output) {
- console.log('\n >>' + self.env_label + 'finished. ', '\n');
- }
- if (code) {
- self.globalExitCode = 2;
- }
- self.processRunning = false;
- done(self.env_output, code);
- });
- }, this.index * this.startDelay);
- };
- ChildProcess.prototype.getChildProcessEnvKey = function(env) {
- return env + '_' + (this.index+1);
- };
- /**
- * Returns an array of cli arguments to be passed to the child process,
- * based on the args passed to the main process
- * @returns {Array}
- */
- ChildProcess.prototype.getArgs = function() {
- var args = [this.mainModule];
- args.push.apply(args, this.args);
- args.push('--parallel-mode');
- return args;
- };
- ChildProcess.prototype.writeToStdout = function(data) {
- data = data.toString().trim();
- var color_pair = this.availColors[this.index%4];
- var output = '';
- if (ChildProcess.prevIndex !== this.index) {
- ChildProcess.prevIndex = this.index;
- if (this.settings.live_output) {
- output += '\n';
- }
- }
- if (this.settings.output) {
- if (this.settings.disable_colors) {
- output += ' ' + this.environment + ' ';
- } else {
- output += Logger.colors[color_pair[1]](' ' + this.environment + ' ',
- Logger.colors.background[color_pair[0]]);
- }
- output += ' ';
- }
- output += data;
- if (this.settings.live_output) {
- process.stdout.write(output + '\n');
- } else {
- this.env_output.push(output);
- }
- };
- module.exports = ChildProcess;
|