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.
86 lines
2.6 KiB
86 lines
2.6 KiB
'use strict' |
|
|
|
var Buffer = require('safe-buffer').Buffer |
|
var test = require('tape').test |
|
var msgpack = require('../') |
|
var bl = require('bl') |
|
|
|
test('encode/decode variable ext data up between 0x0100 and 0xffff', function (t) { |
|
var encoder = msgpack() |
|
var all = [] |
|
|
|
function MyType (size, value) { |
|
this.value = value |
|
this.size = size |
|
} |
|
|
|
function mytipeEncode (obj) { |
|
var buf = Buffer.allocUnsafe(obj.size) |
|
buf.fill(obj.value) |
|
return buf |
|
} |
|
|
|
function mytipeDecode (data) { |
|
var result = new MyType(data.length, data.toString('utf8', 0, 1)) |
|
|
|
for (var i = 0; i < data.length; i++) { |
|
if (data.readUInt8(0) !== data.readUInt8(i)) { |
|
throw new Error('should all be the same') |
|
} |
|
} |
|
|
|
return result |
|
} |
|
|
|
encoder.register(0x42, MyType, mytipeEncode, mytipeDecode) |
|
|
|
all.push(new MyType(0x0100, 'a')) |
|
all.push(new MyType(0x0101, 'a')) |
|
all.push(new MyType(0xffff, 'a')) |
|
|
|
all.forEach(function (orig) { |
|
t.test('encoding a custom obj of length ' + orig.size, function (t) { |
|
var buf = encoder.encode(orig) |
|
t.equal(buf.length, 4 + orig.size, 'must have the right length') |
|
t.equal(buf.readUInt8(0), 0xc8, 'must have the ext header') |
|
t.equal(buf.readUInt16BE(1), orig.size, 'must include the data length') |
|
t.equal(buf.readUInt8(3), 0x42, 'must include the custom type id') |
|
t.equal(buf.toString('utf8', 4, 5), orig.value, 'must decode correctly') |
|
t.end() |
|
}) |
|
|
|
t.test('mirror test with a custom obj of length ' + orig.size, function (t) { |
|
t.deepEqual(encoder.decode(encoder.encode(orig)), orig, 'must stay the same') |
|
t.end() |
|
}) |
|
}) |
|
|
|
t.test('decoding an incomplete variable ext data up between 0x0100 and 0xffff', function (t) { |
|
var obj = encoder.encode(new MyType(0xfff0, 'a')) |
|
var buf = Buffer.allocUnsafe(obj.length) |
|
buf[0] = 0xc8 |
|
buf.writeUInt16BE(obj.length + 2, 1) // set bigger size |
|
obj.copy(buf, 3, 3, obj.length) |
|
buf = bl().append(buf) |
|
var origLength = buf.length |
|
t.throws(function () { |
|
encoder.decode(buf) |
|
}, encoder.IncompleteBufferError, 'must throw IncompleteBufferError') |
|
t.equals(buf.length, origLength, 'must not consume any byte') |
|
t.end() |
|
}) |
|
|
|
t.test('decoding an incomplete header of variable ext data up between 0x0100 and 0xffff', function (t) { |
|
var buf = Buffer.allocUnsafe(3) |
|
buf[0] = 0xc8 |
|
buf = bl().append(buf) |
|
var origLength = buf.length |
|
t.throws(function () { |
|
encoder.decode(buf) |
|
}, encoder.IncompleteBufferError, 'must throw IncompleteBufferError') |
|
t.equals(buf.length, origLength, 'must not consume any byte') |
|
t.end() |
|
}) |
|
|
|
t.end() |
|
})
|
|
|