pm2/test/programmatic/watcher.js
2017-02-03 16:19:28 +01:00

194 lines
4.5 KiB
JavaScript

var should = require('should');
var p = require('path');
var fs = require('fs')
var EventEmitter = require('events').EventEmitter
var PM2 = require('../..');
var extend = require('util')._extend
var cwd = __dirname + '/../fixtures/watcher';
var paths = {
server : p.join(cwd, 'server-watch.js'),
bak : p.join(cwd, 'server-watch.bak.js'),
json : p.join(cwd, 'server-watch.json')
};
var ee = new EventEmitter()
var json = {
name : 'server-watch',
script: './server-watch.js',
cwd : cwd
}
function testPM2Env(event) {
return function(obj, cb) {
ee.once(event, function(e) {
if(typeof obj == 'function') {
return obj(e)
}
var value
for(var key in obj) {
value = obj[key]
console.log('Testing %s for value %s', key, value)
should(e[key]).eql(value)
}
return cb()
})
}
}
function errShouldBeNull(err) {
should(err).be.null();
}
describe('Watcher', function() {
var pm2 = new PM2.custom({
independent : true,
cwd : __dirname + '/../fixtures/watcher'
});
this.timeout(2500)
after(function(cb) {
pm2.destroy(function() {
fs.unlink(paths.server, cb)
});
});
before(function(cb) {
//copy server-watch.bak, we'll add some lines in it
fs.readFile(paths.bak, function(err, data) {
if(err) {
return cb(err)
}
return fs.writeFile(paths.server, data, cb)
})
})
before(function(done) {
pm2.connect(function() {
done();
});
});
before(function(done) {
pm2.launchBus(function(err, bus) {
should(err).be.null
bus.on('process:event', function(e) {
var name = e.process.name + ':' + e.event
console.log('Bus receiving: ' + name)
delete e.process.ENV
ee.emit(name, e.process)
})
return done()
})
})
it('should be watching', function(cb) {
testPM2Env('server-watch:online')({watch: true}, cb)
var json_app = extend(json, {watch: true});
pm2.start(json_app, errShouldBeNull)
})
it('should be watching after restart', function(cb) {
testPM2Env('server-watch:online')({watch: true}, cb)
pm2.restart('server-watch', errShouldBeNull)
})
it('should restart because of file edit', function(cb) {
testPM2Env('server-watch:online')({restart_time: 2}, cb)
fs.appendFileSync(paths.server, 'console.log("edit")')
})
it('should stop watching', function(cb) {
process.argv.push('--watch')
testPM2Env('server-watch:stop')({watch: false}, function() {
process.argv.splice(process.argv.indexOf('--watch'), 1)
cb()
})
pm2.stop('server-watch', errShouldBeNull)
// this would be better:
// pm2.actionFromJson('stopProcessId', extend(json, {watch: false}), errShouldBeNull)
// or :
// pm2.stop('server-watch', {watch: false}, errShouldBeNull)
})
it('should not watch', function(cb) {
testPM2Env('server-watch:online')({watch: false}, cb)
pm2.restart(extend(json, {watch: false}), errShouldBeNull)
})
it('should watch', function(cb) {
testPM2Env('server-watch:online')({restart_time: 3, watch: true}, cb)
pm2.restart(extend(json, {watch: true}), errShouldBeNull)
})
it('should delete process', function(cb) {
pm2.delete('server-watch', cb)
})
it('should watch json', function(cb) {
testPM2Env('server-watch:online')(function() {
cb()
})
var json_app = paths.json;
pm2.start(json_app, errShouldBeNull)
})
it('should restart json from file touch', function(cb) {
testPM2Env('server-watch:online')({restart_time: 1}, cb)
var path = p.join(cwd, 'donotwatchme.dir', 'test')
fs.writeFile(path, 'Test', {flag: 'a+'}, function(err) {
errShouldBeNull(err)
})
})
it('should restart json from file deletion', function(cb) {
testPM2Env('server-watch:online')({restart_time: 2}, cb)
var path = p.join(cwd, 'donotwatchme.dir', 'test')
fs.unlink(path, function(err) {
errShouldBeNull(err)
})
})
it('should not restart from ignore_watch', function(cb) {
var path = p.join(cwd, 'pm2.log')
fs.writeFile(path, 'Log', {flag: 'a+'}, function(err) {
errShouldBeNull(err)
pm2.describe('server-watch', function(err, d) {
should(d[0].pm2_env.restart_time).eql(2)
fs.unlink(path)
return cb()
})
})
})
/**
* Test #1668
*/
it('should delete from json', function(cb) {
testPM2Env('server-watch:exit')(function() {
cb()
})
pm2.delete(paths.json, errShouldBeNull)
})
})