Skip to content

Commit

Permalink
Merge branch 'develop'
Browse files Browse the repository at this point in the history
  • Loading branch information
Corey600 committed Jun 29, 2016
2 parents 3dbd739 + dbd0318 commit aa73d1c
Show file tree
Hide file tree
Showing 4 changed files with 213 additions and 21 deletions.
34 changes: 21 additions & 13 deletions lib/codec.js
Original file line number Diff line number Diff line change
Expand Up @@ -279,12 +279,12 @@ Codec.prototype._parseLength = function (head) {
Codec.prototype._parseBody = function (heap, cb) {
// 检验魔数
if(heap[0] !== MAGIC_HIGH || heap[1] !== MAGIC_LOW){
cb('Magic header is wrong!');
return cb('Magic header is wrong!');
}

// 检查序列化协议
if((heap[2] & SERIALIZATION_MASK)!=2){ // hessian2 的协议ID为 2
cb('Unknown serialization protocol!');
return cb('Unknown serialization protocol!');
}

// 打印标志位
Expand All @@ -297,26 +297,34 @@ Codec.prototype._parseBody = function (heap, cb) {
return cb(decodeURIComponent(heap.slice(18, heap.length-1).toString()));
}

var buf, flag, ret;
try {
// 反序列化
var buf = new hessian.DecoderV2(heap.slice(16, heap.length));
buf = new hessian.DecoderV2(heap.slice(16, heap.length));

// 结果标志位为数据段第一个字节,为 0x90 0x91 0x92其中之一
// 实际为hessian协议的简化整数表示,反序列化后为: 0 1 2
// RESPONSE_WITH_EXCEPTION = 0;
// RESPONSE_VALUE = 1;
// RESPONSE_NULL_VALUE = 2;
var flag = buf.readInt();
info('flag:' + flag);
if(flag == 2){
return cb(false);
}
var _ret = buf.read();
if (_ret instanceof Error || flag === 0) {
return cb(_ret);
}
return cb(false, JSON.stringify(_ret));
flag = buf.readInt();
} catch (err) {
return cb(err);
}

info('flag: ' + flag);
if(flag === 2){ // 无返回值
return cb(false);
}

try{
ret = buf.read();
}catch(err){
return cb(err);
}

if (ret instanceof Error || flag === 0) {
return cb(ret);
}
return cb(false, ret);
};
6 changes: 1 addition & 5 deletions lib/invoker.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,7 @@ Invoker.prototype._excute = function (method, args, cb) {
if (err) {
return cb(err);
}
try {
return codec.decodeResponse(cb);
} catch (err) {
cb(err);
}
return codec.decodeResponse(cb);
});
}

Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "zoodubbo",
"version": "0.0.4",
"version": "0.1.0",
"description": "A Javascript module for Node.js to connect Dubbo service by node-zookeeper-client.",
"main": "index.js",
"scripts": {
Expand Down
192 changes: 190 additions & 2 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@
* Created by Corey600 on 2016/6/17.
*/


// modules to test
var ZD = require('../index');
var Invoker = require('../lib/invoker');
var Codec = require('../lib/codec');

// require core modules
var net = require('net');
Expand Down Expand Up @@ -181,8 +182,195 @@ describe('test', function () {
});

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(){
this.emit('close', true);
});

var zd = ZD();
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(true);
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();
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;i<1000;i++){
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;i<300000;i++){
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.clearChunck();
codec.pushChunck(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).to.be(false);
expect(data).to.be(123);
done();
});
});

it('wrong magic header', function (done) {
var codec = new Codec();
codec.clearChunck();
codec.pushChunck(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('string');
expect(data).to.be(undefined);
done();
});
});

it('Unknown serialization protocol', function (done) {
var codec = new Codec();
codec.clearChunck();
codec.pushChunck(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('string');
expect(data).to.be(undefined);
done();
});
});

it('wrong status code', function (done) {
var codec = new Codec();
codec.clearChunck();
codec.pushChunck(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('string');
expect(data).to.be(undefined);
done();
});
});

it('decode failed', function (done) {
var codec = new Codec();
codec.clearChunck();
codec.pushChunck(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.clearChunck();
codec.pushChunck(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.clearChunck();
codec.pushChunck(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).to.be(false);
expect(data).to.be(undefined);
done();
});
});

it('return error', function (done) {
var codec = new Codec();
codec.clearChunck();
codec.pushChunck(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(123);
expect(data).to.be(undefined);
done();
});
});
});
});

0 comments on commit aa73d1c

Please sign in to comment.