Files
archived-nodemon/test/utils.js

147 lines
3.1 KiB
JavaScript

'use strict';
var fork = require('child_process').fork,
path = require('path'),
appjs = path.resolve(__dirname, 'fixtures', 'app.js'),
assert = require('assert'),
port = 8000,
appcoffee = path.resolve(__dirname, 'fixtures', 'app.coffee');
function asCLI(cmd) {
return {
exec: 'bin/nodemon.js',
// make nodemon verbose so we can check the filters being applied
args: ('-V ' + (cmd || '')).trim().split(' ')
};
}
function match(str, key) {
return str.indexOf(key) !== -1;
}
function monitorForChange(str) {
var watch = false;
return function (line) {
if (match(line, 'files triggering change check: nodemonCheckFsWatch')) {
watch = false;
} else if (match(line, 'files triggering change check:')) {
watch = true;
}
if (watch) {
if (match(line, str)) {
return true;
}
}
return false;
};
}
function run(cmd, callbacks) {
var cli = typeof cmd === 'string' ? asCLI(cmd) : cmd;
port++;
process.env.PORT = port;
var proc = fork(cli.exec, cli.args, {
env: process.env,
cwd: process.cwd(),
encoding: 'utf8',
silent: true,
});
proc.stderr.setEncoding('utf8');
proc.stdout.setEncoding('utf8');
if (callbacks.output) {
proc.stdout.on('data', callbacks.output);
}
if (callbacks.restart) {
proc.stdout.on('data', function (data) {
if (match(data, 'restarting due to changes')) {
callbacks.restart(null, data);
}
});
}
if (callbacks.error) {
proc.stderr.on('data', function (error) {
error = error.toString().trim();
if (process.env.TRAVIS && error === 'User defined signal 2') {
// swallow the SIGUSR2 - it should never hit the stderr, but for some
// reason, travis sees it and causes our tests to fail, so we swallow
// if this specific error bubbles out
} else {
callbacks.error(error);
}
});
}
return proc;
}
function cleanup(p, done, err) {
// as above
if (process.env.TRAVIS && err &&
err.message.indexOf('User defined signal 2') === 0) {
err = null;
}
if (p) {
p.once('exit', function () {
p = null;
done(err);
});
p.send('quit');
} else {
done(err);
}
}
function Plan(count, done) {
this.done = done;
this.count = count;
}
Plan.prototype.assert = function() {
assert.apply(null, arguments);
// console.log(arguments[1]);
if (this.count === 0) {
assert(false, 'Too many assertions called via "' + arguments[1] + '"');
} else {
this.count--;
}
if (this.count === 0) {
this.done();
}
};
function getTriggerCount(msg) {
var changes = msg.split(/\n/).shift();
changes = changes.replace(/\s*/gm, '').slice(-5).split('/');
return changes.pop();
}
function isRunning(pid) {
try {
process.kill(pid, 0)
return true
} catch (error) {
if (error.code && error.code === 'ESRCH') return false
throw error
}
}
module.exports = {
getTriggerCount: getTriggerCount,
Plan: Plan,
asCLI: asCLI,
match: match,
run: run,
cleanup: cleanup,
appjs: appjs,
appcoffee: appcoffee,
monitorForChange: monitorForChange,
port: port,
isRunning: isRunning
};