From 31a2d843e8070be735a914cc231b113d90f9452a Mon Sep 17 00:00:00 2001 From: Ruben Bridgewater Date: Tue, 1 Mar 2016 17:56:04 +0100 Subject: [PATCH] Add slave ready test --- test/conect.slave.spec.js | 92 +++++++++++++++++++++++++++++++++++++++ test/conf/slave.conf | 6 +++ 2 files changed, 98 insertions(+) create mode 100644 test/conect.slave.spec.js create mode 100644 test/conf/slave.conf diff --git a/test/conect.slave.spec.js b/test/conect.slave.spec.js new file mode 100644 index 0000000000..0080b2339c --- /dev/null +++ b/test/conect.slave.spec.js @@ -0,0 +1,92 @@ +'use strict'; + +var assert = require("assert"); +var config = require("./lib/config"); +var helper = require('./helper'); +var RedisProcess = require("./lib/redis-process"); +var rp; +var path = require('path'); +var redis = config.redis; + +describe('master slave sync', function () { + var master = null; + var slave = null; + + before(function (done) { + helper.stopRedis(function () { + helper.startRedis('./conf/password.conf', done); + }); + }); + + before(function (done) { + master = redis.createClient({ + password: 'porkchopsandwiches' + }); + var multi = master.multi(); + var i = 0; + while (i < 1000) { + i++; + // Write some data in the redis instance, so there's something to sync + multi.set('foo' + i, 'bar' + new Array(500).join(Math.random())); + } + multi.exec(done); + }); + + it("sync process and no master should delay ready being emitted for slaves", function (done) { + if (helper.redisProcess().spawnFailed()) this.skip(); + + var port = 6381; + var firstInfo; + slave = redis.createClient({ + port: port, + retry_strategy: function (options) { + // Try to reconnect in very small intervals to catch the master_link_status down before the sync completes + return 10; + } + }); + + var tmp = slave.info.bind(slave); + var i = 0; + slave.info = function (err, res) { + i++; + tmp(err, res); + if (!firstInfo || Object.keys(firstInfo).length === 0) { + firstInfo = slave.server_info; + } + }; + + slave.on('connect', function () { + assert.strictEqual(i, 0); + }); + + var end = helper.callFuncAfter(done, 2); + + slave.on('ready', function () { + assert.strictEqual(this.server_info.master_link_status, 'up'); + assert.strictEqual(firstInfo.master_link_status, 'down'); + assert(i > 1); + this.get('foo300', function (err, res) { + assert.strictEqual(res.substr(0, 3), 'bar'); + end(err); + }); + }); + + RedisProcess.start(function (err, _rp) { + rp = _rp; + end(err); + }, path.resolve(__dirname, './conf/slave.conf'), port); + }); + + after(function (done) { + var end = helper.callFuncAfter(done, 3); + rp.stop(end); + slave.end(true); + master.flushdb(function (err) { + end(err); + master.end(true); + }); + helper.stopRedis(function () { + helper.startRedis('./conf/redis.conf', end); + }); + }); +}); diff --git a/test/conf/slave.conf b/test/conf/slave.conf new file mode 100644 index 0000000000..61ea50d959 --- /dev/null +++ b/test/conf/slave.conf @@ -0,0 +1,6 @@ +port 6381 +bind ::1 127.0.0.1 +unixsocket /tmp/redis6381.sock +unixsocketperm 755 +slaveof localhost 6379 +masterauth porkchopsandwiches