Leaving log files opened was intentional to avoid missing output that can appear `child.on('exit',...)`. With this approach cucumber tests hit locally maximum number of opened files, because node.js keeps all log files opened.
58 lines
2.2 KiB
JavaScript
58 lines
2.2 KiB
JavaScript
'use strict';
|
|
|
|
const path = require('path');
|
|
const fs = require('fs');
|
|
const util = require('util');
|
|
const child_process = require('child_process');
|
|
|
|
module.exports = function () {
|
|
// replaces placeholders for in user supplied commands
|
|
this.expandOptions = (options) => {
|
|
let opts = options.slice();
|
|
let table = {
|
|
'{osm_file}': this.inputCacheFile,
|
|
'{processed_file}': this.processedCacheFile,
|
|
'{profile_file}': this.profileFile,
|
|
'{rastersource_file}': this.rasterCacheFile,
|
|
'{speeds_file}': this.speedsCacheFile,
|
|
'{penalties_file}': this.penaltiesCacheFile
|
|
};
|
|
|
|
for (let k in table) {
|
|
opts = opts.replace(k, table[k]);
|
|
}
|
|
|
|
return opts;
|
|
};
|
|
|
|
this.setupOutputLog = (process, log) => {
|
|
if (process.logFunc) {
|
|
process.stdout.removeListener('data', process.logFunc);
|
|
process.stderr.removeListener('data', process.logFunc);
|
|
}
|
|
|
|
process.logFunc = (message) => { log.write(message); };
|
|
process.stdout.on('data', process.logFunc);
|
|
process.stderr.on('data', process.logFunc);
|
|
};
|
|
|
|
this.runBin = (bin, options, env, callback) => {
|
|
let cmd = path.resolve(util.format('%s/%s%s', this.BIN_PATH, bin, this.EXE));
|
|
let opts = options.split(' ').filter((x) => { return x && x.length > 0; });
|
|
let log = fs.createWriteStream(this.scenarioLogFile, {'flags': 'a'});
|
|
log.write(util.format('*** running %s %s\n', cmd, options));
|
|
// we need to set a large maxbuffer here because we have long running processes like osrm-routed
|
|
// with lots of log output
|
|
let child = child_process.execFile(cmd, opts, {maxBuffer: 1024 * 1024 * 1000, env: env}, callback);
|
|
child.on('exit', function(code) {
|
|
log.write(util.format('*** %s exited with code %d\n', bin, code));
|
|
// remove listeners and close log file -> some tail messages can be lost
|
|
child.stdout.removeListener('data', child.logFunc);
|
|
child.stderr.removeListener('data', child.logFunc);
|
|
log.end();
|
|
}.bind(this));
|
|
this.setupOutputLog(child, log);
|
|
return child;
|
|
};
|
|
};
|