yuna
Version:
Extra zookeeper support for Illyria.
392 lines (336 loc) • 12.4 kB
JavaScript
/**
* XadillaX created at 2015-05-18 17:20:35 With ♥
*
* Copyright (c) 2015 Huaban.com, all rights
* reserved.
*/
var should = require("should");
var Illyria = require("illyria");
var Scarlet = require("scarlet-task");
var common = require("./common");
var Yuna = require("../");
describe("connection test", function() {
var SERVER_COUNT = 10;
var SERVER_START_PORT = 6655;
var servers = [];
var yuna;
before(function(callback) {
var scarlet = new Scarlet(SERVER_COUNT);
var createServer = function(taskObject) {
var id = taskObject.task.id;
common.createServer(SERVER_START_PORT + id, function(err, server) {
should(err).not.be.instanceof(Error);
servers.push(server);
scarlet.taskDone(taskObject);
});
};
for(var i = 0; i < SERVER_COUNT; i++) {
scarlet.push({ id: i }, createServer);
}
scarlet.afterFinish(SERVER_COUNT, function() {
servers = servers.sort(function(a, b) {
return a.port - b.port;
});
callback();
}, false);
});
after(function() {
yuna.destroy();
for(var i = 0; i < SERVER_COUNT; i++) servers[i].close();
});
it("should has 10 connections", function(callback) {
yuna = Yuna.createPool(
common.ZK_CONNECTION_STRING,
common.ZK_ROOT,
common.ZK_PREFIX, {
maxPool: 10
});
var count = 0;
var ports = {};
var onNew = function(client) {
count++;
ports[client.port] = true;
if(count === 10) {
finish();
}
};
yuna.on("new", onNew);
var finish = function() {
yuna.pool.length.should.be.eql(10);
var uuids = {};
for(var i = 0; i < yuna.pool.length; i++) {
var client = yuna.pool.valueAt(i);
client.should.be.instanceof(Illyria.Client);
client.connectStatus().should.be.eql("CONNECTED");
ports[SERVER_START_PORT + i].should.be.eql(true);
should(uuids[client.uuid]).be.eql(undefined);
uuids[client.uuid] = true;
}
yuna.availableCount().should.be.eql(10);
yuna.removeListener("new", onNew);
callback();
};
});
it("should disconnect one and reconnect", function(callback) {
for(var i = 0; i < yuna.pool.length; i++) {
var client = yuna.pool.valueAt(i);
client.socket.socket.end();
}
var newCount = 0;
var closeCount = 0;
var onNew = function() {
newCount++;
if(newCount === 10 && closeCount === 10) finish();
};
var onClose = function() {
closeCount++;
if(newCount === 10 && closeCount === 10) finish();
};
yuna.on("new", onNew);
yuna.on("close", onClose);
var finish = function() {
for(var i = 0; i < yuna.pool.length; i++) {
var client = yuna.pool.valueAt(i);
client.should.be.instanceof(Illyria.Client);
client.connectStatus().should.be.eql("CONNECTED");
}
yuna.removeListener("new", onNew);
yuna.removeListener("close", onClose);
callback();
};
});
it("can't create more connections", function(callback) {
yuna.newConnection(function(err) {
err.message.indexOf("connection limit exceeded.").should.above(0);
callback();
});
});
it("can create more connections forcely", function(callback) {
yuna.newConnection(true, function(err, conn) {
should(err).be.eql(undefined);
conn.should.be.instanceof(Illyria.Client);
yuna.clientPosition(conn).should.be.eql(10);
callback();
});
});
it("can get a usable connection", function(callback) {
yuna.getConnection(function(err, conn) {
should(err).be.eql(undefined);
conn.should.be.instanceof(Illyria.Client);
yuna.clientPosition(conn).should.be.eql(0);
callback();
});
});
it("should get the second connection because the first one is CLOSED", function(callback) {
yuna.pool._head.next.value.status = "CLOSED";
yuna.getConnection(function(err, conn) {
should(err).be.eql(undefined);
yuna.availableCount().should.be.eql(10);
conn.should.be.instanceof(Illyria.Client);
yuna.clientPosition(conn).should.be.eql(1);
yuna.pool._head.next.value.status = "CONNECTED";
callback();
});
});
it("should get the second connection because the first one has more tasks", function(callback) {
yuna.pool._head.next.value.taskCount = 10;
yuna.getConnection(function(err, conn) {
should(err).be.eql(undefined);
conn.should.be.instanceof(Illyria.Client);
yuna.clientPosition(conn).should.be.eql(1);
yuna.pool._head.next.value.taskCount = 0;
callback();
});
});
it("shouldn't get a connection because all are in error", function(callback) {
for(var i = 0; i < 11; i++) {
yuna.pool.valueAt(i).status = "CLOSED";
}
yuna.getConnection(function(err) {
err.message.should.be.eql("No usable client node now.");
for(var i = 0; i < 11; i++) {
yuna.pool.valueAt(i).status = "CONNECTED";
}
callback();
});
});
var connections = [];
it("should create a new connection because no connection", function(callback) {
while(yuna.pool.length) connections.push(yuna.pool.popBack());
yuna.getConnection(function(err, conn) {
should(err).be.eql(undefined);
conn.should.be.instanceof(Illyria.Client);
yuna.clientPosition(conn).should.be.eql(0);
callback();
});
});
it("should create a new connection because no availble connection", function(callback) {
yuna.pool._head.next.value.status = "CLOSED";
yuna.getConnection(function(err, conn) {
should(err).be.eql(undefined);
conn.should.be.instanceof(Illyria.Client);
yuna.clientPosition(conn).should.be.eql(1);
yuna.pool._head.next.value.status = "CONNECTED";
for(var i = 0; i < connections.length; i++) {
yuna.pool.pushFront(connections[i]);
}
callback();
});
});
it("create with none argument", function(callback) {
var _yuna = Yuna.createPool();
var count = 0;
var onError = function(err) {
err.message.indexOf("No available server found").should.above(0);
count++;
if(count === 10) {
finish();
}
};
_yuna.on("error", onError);
var finish = function() {
_yuna.pool.length.should.be.eql(0);
_yuna.removeListener("new", onError);
_yuna.destroy();
callback();
};
});
it("create with one argument 1⃣️", function(callback) {
var _yuna = Yuna.createPool([ common.ZK_CONNECTION_STRING ]);
var count = 0;
var onError = function(err) {
err.message.indexOf("No available server found").should.above(0);
count++;
if(count === 10) {
finish();
}
};
_yuna.on("error", onError);
var finish = function() {
_yuna.pool.length.should.be.eql(0);
_yuna.removeListener("new", onError);
_yuna.destroy();
callback();
};
});
it("create with one argument 2⃣️", function(callback) {
var _yuna = Yuna.createPool({ maxPool: 10 });
var count = 0;
var onError = function(err) {
err.message.indexOf("No available server found").should.above(0);
count++;
if(count === 10) {
finish();
}
};
_yuna.on("error", onError);
var finish = function() {
_yuna.pool.length.should.be.eql(0);
_yuna.removeListener("new", onError);
_yuna.destroy();
callback();
};
});
it("create with two arguments 1⃣️", function(callback) {
var _yuna = Yuna.createPool([ common.ZK_CONNECTION_STRING ], { maxPool: 10 });
var count = 0;
var onError = function(err) {
err.message.indexOf("No available server found").should.above(0);
count++;
if(count === 10) {
finish();
}
};
_yuna.on("error", onError);
var finish = function() {
_yuna.pool.length.should.be.eql(0);
_yuna.removeListener("new", onError);
_yuna.destroy();
callback();
};
});
it("create with two arguments 2⃣️", function(callback) {
var _yuna = Yuna.createPool([ common.ZK_CONNECTION_STRING ], common.ZK_ROOT);
var count = 0;
var onError = function(err) {
err.message.indexOf("No available server found.").should.above(0);
count++;
if(count === 10) {
finish();
}
};
_yuna.on("error", onError);
var finish = function() {
_yuna.pool.length.should.be.eql(0);
_yuna.removeListener("new", onError);
_yuna.destroy();
callback();
};
});
it("create with three arguments 1⃣️", function(callback) {
var _yuna = Yuna.createPool([ common.ZK_CONNECTION_STRING ], common.ZK_ROOT, { maxPool: 10 });
var count = 0;
var onError = function(err) {
err.message.indexOf("No available server found.").should.above(0);
count++;
if(count === 10) {
finish();
}
};
_yuna.on("error", onError);
var finish = function() {
_yuna.pool.length.should.be.eql(0);
_yuna.removeListener("new", onError);
_yuna.destroy();
callback();
};
});
it("create with three arguments 2⃣️ and can't create new connection after destroying", function(callback) {
var _yuna = Yuna.createPool([ common.ZK_CONNECTION_STRING ], common.ZK_ROOT, common.ZK_PREFIX);
var count = 0;
var onNew = function() {
count++;
if(count === 10) {
finish();
}
};
_yuna.on("new", onNew);
var finish = function() {
_yuna.pool.length.should.be.eql(10);
for(var i = 0; i < _yuna.pool.length; i++) {
var client = _yuna.pool.valueAt(i);
client.should.be.instanceof(Illyria.Client);
client.connectStatus().should.be.eql("CONNECTED");
}
_yuna.removeListener("new", onNew);
_yuna.destroy();
_yuna.newConnection(true, function(err) {
err.message.should.be.eql("This Yuna has been destroyed.");
_yuna.getConnection(function(err) {
err.message.should.be.eql("This Yuna has been destroyed.");
callback();
});
});
};
});
it("should occur timeout", function(callback) {
var _yuna = Yuna.createPool([ common.ZK_CONNECTION_STRING ], common.ZK_ROOT, common.ZK_PREFIX, {
connectTimeout: 1
});
var count = 0;
var onError = function(err) {
err.message.indexOf("timeout").should.above(0);
count++;
if(count === 10) {
finish();
}
};
_yuna.on("error", onError);
var finish = function() {
_yuna.pool.length.should.be.eql(0);
_yuna.removeListener("new", onError);
_yuna.destroy();
callback();
};
});
});