| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| var debug = require('debug')('integration-runner'); |
| var extend = require('xtend'); |
| var ServiceRunner = require('../services/run-services'); |
| var serviceRunner; |
| var spawn = require('child_process').spawn; |
| |
| var argv = require('minimist')(process.argv.slice(2), { |
| '--': true, |
| default: {services: ''} |
| }); |
| |
| process.on('uncaughtException', function(err) { |
| console.error('Uncaught exception: ' + err); |
| stop(err); |
| }); |
| process.on('SIGINT', stop); |
| |
| // Spawn test command and stop on exit. |
| function runTests() { |
| debug('running tests'); |
| var debugEnv = { |
| DEBUG: argv.debug || process.env.DEBUG || '', |
| DEBUG_COLORS: true |
| }; |
| var env = extend(process.env, serviceRunner.env, debugEnv); |
| |
| var command = argv['--']; |
| var name = command[0]; |
| var args = command.slice(1); |
| var proc = spawn(name, args, {env: env}); |
| |
| // Pipe the test's stdout and stderr to the parent process. |
| proc.stdout.pipe(process.stdout); |
| proc.stderr.pipe(process.stderr); |
| proc.on('error', function(err) { |
| debug('test errored'); |
| stop(err); |
| }); |
| |
| // NOTE: 'exit' is better than 'close' in this context since close can be |
| // emitted multiple times (since multiple processes might share the same |
| // stdio streams) |
| proc.on('exit', function(code, signal) { |
| debug('test process exited - code: %s, signal: %s', code, signal); |
| stop(null, code); |
| }); |
| } |
| |
| // Stop all services and exit. |
| function stop(err, code) { |
| if (err) { |
| code = code || 1; |
| console.error(err); |
| console.error(err.stack); |
| } else { |
| code = code || 0; |
| } |
| |
| serviceRunner.stop(function(err) { |
| if (err) { |
| debug('warning: serviceRunner.stop() failed! exiting anyways: %s', code); |
| } else { |
| debug('runner stopped, exiting: %s', code); |
| } |
| process.exit(code); |
| }); |
| } |
| |
| // Starts the "servicerunner" service as well as any services specified in the |
| // --services command line flag, then runs tests. |
| function startServicesAndRunTests() { |
| var services = []; |
| if (argv.services && argv.services.length) { |
| services = argv.services.split(','); |
| } |
| |
| debug('starting core services and: ' + services.join(', ')); |
| |
| // NOTE(sadovsky): There are all sorts of race conditions and unhandled edge |
| // cases in this code. |
| serviceRunner = new ServiceRunner(services); |
| serviceRunner |
| .on('error', stop) |
| .start(function(err) { |
| if (err) { |
| return stop(err); |
| } |
| runTests(); |
| }); |
| } |
| |
| startServicesAndRunTests(); |