zoodubbo
Version:
A Javascript module for Node.js to connect Dubbo service by node-zookeeper-client.
426 lines (376 loc) • 11.8 kB
JavaScript
/**
* Created by Corey600 on 2016/6/17.
*/
// modules to test
var ZD = require('../index');
var Invoker = require('../lib/invoker');
var Codec = require('../lib/codec');
var createPool = require('../lib/pool');
// require core modules
var net = require('net');
// require thirdpart modules
var zookeeper = require('node-zookeeper-client');
var expect = require('expect.js');
var mm = require('mm');
var Buffer = require('safe-buffer').Buffer;
// require custom modules
var MySocket = require('./lib/socket');
var MyZookeeper = require('./lib/zookeeper');
describe('test', function () {
beforeEach(function (done) {
mm(net, 'Socket', MySocket);
done();
});
afterEach(function (done) {
mm.restore();
done();
});
describe('main', function () {
var zd;
before(function (done) {
mm(zookeeper, 'createClient', function (conn, opt) {
return new MyZookeeper(conn, opt);
});
zd = new ZD({
conn: '127.0.0.2:4180,127.0.0.3:4180',
dubbo: '2.5.3'
});
done();
});
after(function (done) {
done();
});
it('excute success', function (done) {
zd.connect();
var invoker = zd.getInvoker('com.demo.Service', { version: '1.0.0' });
var method = 'get';
var arg1 = { $class: 'java.lang.String', $: '123456789' };
invoker.excute(method, [arg1]).then(function (data) {
expect(data).to.be(undefined);
zd.close();
return done();
}).catch(function (err) {
expect(err).not.to.be.a(Error);
zd.close();
return done();
});
});
it('no method', function (done) {
zd.connect();
var invoker = zd.getInvoker('com.demo.Service', { version: '1.0.0' });
var method = 'getxxx';
var arg1 = { $class: 'java.lang.String', $: '123456789' };
invoker.excute(method, [arg1]).then(function (data) {
expect(data).to.be(undefined);
zd.close();
return done();
}).catch(function (err) {
expect(err).to.be.a(Error);
zd.close();
return done();
});
});
});
describe('index.js', function () {
it('connect and close when no client', function (done) {
mm(zookeeper, 'createClient', function () {
return null;
});
var err = null;
try {
var zd = ZD(null);
zd.connect();
zd.close();
} catch (e) {
err = e;
}
expect(err).to.be(null);
return done();
});
it('get children error', function (done) {
mm(zookeeper, 'createClient', function (conn, opt) {
var zp = new MyZookeeper(conn, opt);
zp.getChildren = function (path, watcher, cb) {
setImmediate(function () {
cb(new Error());
});
};
return zp;
});
var zd = ZD(null);
zd.connect();
var invoker = zd.getInvoker('com.demo.Service');
var method = 'get';
var arg1 = { $class: 'java.lang.String', $: '123456789' };
invoker.excute(method, [arg1], function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
zd.close();
return done();
});
});
it('get no children', function (done) {
mm(zookeeper, 'createClient', function (conn, opt) {
var zp = new MyZookeeper(conn, opt);
zp.getChildren = function (path, watcher, cb) {
setImmediate(function () {
cb(false, []);
});
};
return zp;
});
var zd = ZD(null);
zd.connect();
var invoker = zd.getInvoker('com.demo.Service');
var method = 'get';
var arg1 = { $class: 'java.lang.String', $: '123456789' };
invoker.excute(method, [arg1], function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
zd.close();
return done();
});
});
it('parse children error', function (done) {
mm(zookeeper, 'createClient', function (conn, opt) {
var zp = new MyZookeeper(conn, opt);
zp.getChildren = function (path, watcher, cb) {
setImmediate(function () {
cb(false, ['xxxxx']);
});
};
return zp;
});
var zd = ZD(null);
zd.connect();
var invoker = zd.getInvoker('com.demo.Service');
var method = 'get';
var arg1 = { $class: 'java.lang.String', $: '123456789' };
invoker.excute(method, [arg1], function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
zd.close();
return done();
});
});
});
describe('lib/invoker.js', function () {
it('excute callback error', function (done) {
var invoker = Invoker(null, {
path: 'com.demo.Service'
});
var method = 'get';
var arg1 = { $class: 'java.lang.String', $: '123456789' };
invoker.excute(method, [arg1], function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
return done();
});
});
it('excute promise error', function (done) {
var invoker = Invoker(null, {
path: 'com.demo.Service'
});
var method = 'get';
var arg1 = { $class: 'java.lang.String', $: '123456789' };
invoker.excute(method, [arg1]).then(function (data) {
expect(data).to.be(undefined);
return done();
}).catch(function (err) {
expect(err).to.be.a(Error);
return done();
});
});
it('socket close error', function (done) {
mm(zookeeper, 'createClient', function (conn, opt) {
return new MyZookeeper(conn, opt);
});
mm(MySocket.prototype, 'destroy', function () {
setImmediate(function () {
this.emit('close', new Error());
});
});
var zd = ZD(null);
zd.connect();
var invoker = zd.getInvoker('com.demo.Service');
var method = 'get';
var arg1 = { $class: 'java.lang.String', $: '123456789' };
invoker.excute(method, [arg1], function (err, data) {
expect(err).not.to.be.a(Error);
expect(data).to.be(undefined);
zd.close();
return done();
});
});
});
describe('lib/codec.js', function () {
var zd;
var invoker;
before(function (done) {
mm(zookeeper, 'createClient', function (conn, opt) {
return new MyZookeeper(conn, opt);
});
zd = new ZD(null);
zd.connect();
invoker = zd.getInvoker('com.demo.Service');
done();
});
after(function (done) {
zd.close();
done();
});
it('encode request', function (done) {
var codec = new Codec();
var err = false;
try {
var arr = [];
for (var i = 0; 1000 > i; i += 1) {
arr.push({ $class: 'int', $: i });
}
codec.encodeRequest(invoker, {}, 'get', arr);
} catch (e) {
err = e;
}
expect(err).not.to.be.a(Error);
done();
});
it('large data length', function (done) {
var codec = new Codec();
var err = false;
try {
var arr = [];
for (var i = 0; 300000 > i; i += 1) {
arr.push({ $class: 'int', $: i });
}
codec.encodeRequest(invoker, {}, 'get', arr);
} catch (e) {
err = e;
}
expect(err).to.be.a(Error);
done();
});
it('decode response', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xda, 0xbb, 0x02, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x91, 0xc8, 0x7b]));
codec.decodeResponse(function (err, data) {
expect(err).not.to.be.a(Error);
expect(data).to.be(123);
done();
});
});
it('wrong magic header', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xaa, 0xbb, 0x02, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x92]));
codec.decodeResponse(function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
done();
});
});
it('serialization protocol', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xda, 0xbb, 0x22, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x92]));
codec.decodeResponse(function (err, data) {
expect(err).not.to.be.a(Error);
expect(data).to.be(undefined);
done();
});
});
it('Unknown serialization protocol', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xda, 0xbb, 0x03, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x92]));
codec.decodeResponse(function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
done();
});
});
it('wrong status code', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xda, 0xbb, 0x02, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x92]));
codec.decodeResponse(function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
done();
});
});
it('decode failed', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xda, 0xbb, 0x02, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00]));
codec.decodeResponse(function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
done();
});
});
it('read error', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xda, 0xbb, 0x02, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xa1]));
codec.decodeResponse(function (err, data) {
expect(err).to.be.a(Error);
expect(data).to.be(undefined);
done();
});
});
it('no return', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xda, 0xbb, 0x02, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x92]));
codec.decodeResponse(function (err, data) {
expect(err).not.to.be.a(Error);
expect(data).to.be(undefined);
done();
});
});
it('return error', function (done) {
var codec = new Codec();
codec.clearChunk();
codec.pushChunk(new Buffer([0xda, 0xbb, 0x02, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x90, 0xc8, 0x7b]));
codec.decodeResponse(function (err, data) {
expect(err).to.be.a(Error);
expect(err.message).to.be('123');
expect(data).to.be(undefined);
done();
});
});
});
describe('lib/pool.js', function () {
it('destroy client', function (done) {
var pool = createPool('127.0.0.1', 8080);
var resource = pool.acquire();
resource
.then(function (client) {
return pool.destroy(client);
})
.then(function () {
return pool.drain();
})
.then(function () {
return pool.clear();
})
.then(function () {
done();
})
.catch(function (err) {
expect(err).not.to.be.a(Error);
done();
});
});
});
});