You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

68 lines
2.3 KiB

'use strict';
// helper to start and stop the redis process.
var config = require('./config');
var fs = require('fs');
var path = require('path');
var spawn = require('win-spawn');
var spawnFailed = false;
var tcpPortUsed = require('tcp-port-used');
// wait for redis to be listening in
// all three modes (ipv4, ipv6, socket).
function waitForRedis (available, cb) {
if (process.platform === 'win32') return cb();
var ipV4 = false;
var id = setInterval(function () {
tcpPortUsed.check(config.PORT, '127.0.0.1').then(function (_ipV4) {
ipV4 = _ipV4;
return tcpPortUsed.check(config.PORT, '::1');
}).then(function (ipV6) {
if (ipV6 === available && ipV4 === available && fs.existsSync('/tmp/redis.sock') === available) {
clearInterval(id);
return cb();
}
});
}, 100);
}
module.exports = {
start: function (done, conf) {
// spawn redis with our testing configuration.
var confFile = conf || path.resolve(__dirname, '../conf/redis.conf');
var rp = spawn("redis-server", [confFile], {});
// capture a failure booting redis, and give
// the user running the test some directions.
rp.once("exit", function (code) {
if (code !== 0) spawnFailed = true;
});
// wait for redis to become available, by
// checking the port we bind on.
waitForRedis(true, function () {
// return an object that can be used in
// an after() block to shutdown redis.
return done(null, {
spawnFailed: function () {
return spawnFailed;
},
stop: function (done) {
if (spawnFailed) return done();
rp.once("exit", function (code) {
var error = null;
if (code !== null && code !== 0) {
error = Error('Redis shutdown failed with code ' + code);
}
waitForRedis(false, function () {
return done(error);
});
});
rp.kill("SIGTERM");
}
});
});
}
};