fast-protocol
Version:
FAST streaming protocol for Node.js (Encoder/Decoder for Javascript) (FAST protocol version 1.1)
218 lines (189 loc) • 6.2 kB
JavaScript
var fastStream = require('./index.js')
var diff = require('deep-diff')
var Long = require('long')
var logDebug = false
function toHexString(byteArray) {
var s = ''
byteArray.forEach(function(byte) {
s += ('0' + (byte & 0xFF).toString(16)).slice(-2) + ' '
})
return s
}
function join(array) {
var s = ''
array.forEach(function(token) {
s += (token === parseInt(token, 10)) ? '[' + token + ']' : (s.length ? '.' : '') + token
})
return s
}
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// - encode provided messages
// - decode encoded binary buffer
// - compare excepted and encoded message
// - print out differences if exists
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
function testCodec(messages) {
var buffer = []
// encode messages ony by one
var encoder = new fastStream.Encoder('test.xml')
for (var i = 0; i < messages.length; ++i) {
if (logDebug) console.log('Input message:', messages[i].msg)
buffer = buffer.concat(encoder.encode(messages[i].name, messages[i].msg))
}
if (logDebug) console.log('\n', toHexString(buffer), '\n')
// decode buffer
var decoder = new fastStream.Decoder('test.xml')
var i = 0
decoder.decode(buffer, function(msg, name) {
if (logDebug) console.log('Output message:', msg)
var differences = diff(messages[i].msg, msg)
if (differences != null) {
for (var d = 0; d < differences.length; ++d) {
switch (differences[d].kind) {
case 'N': // indicates a newly added property/element
console.log('Error: Additional property found:', messages[i].name, '.', join(differences[d].path))
break
case 'D': // indicates a property/element was deleted
console.log('Error: Property ', messages[i].name, '.', join(differences[d].path), 'missing')
break
case 'E': // indicates a property/element was changed
console.log('Error: Property value', messages[i].name, '.', join(differences[d].path), 'differs:', differences[d].lhs, '<>', differences[d].rhs)
break
case 'A': // indicates a change occurred within an array
console.log('Error: Array content ', messages[i].name, '.', join(differences[d].path), 'differs:', differences[d].lhs, '<>', differences[d].rhs)
break
}
}
throw new Error('Decoded message does not match expected message')
}
//console.log('Info: ', messages[i].name, 'passed test')
++i
//assert.deepEqual(messages[i].msg, msg, differences)
/*
if (JSON.stringify(messages[i++].msg) !== JSON.stringify(msg)) {
console.log('Output message:', msg)
console.log('Expected message:', messages[i-1].msg)
throw new Error('Decoded message does not match input message')
}*/
})
}
console.log('\n'.repeat(30))
console.log('Start testing fast-protocol encode/decode')
var u32_ranges = [
{start: 0, end: 150},
{start: 1024, end: 16400},
{start: 2097100, end: 2097500},
{start: 1073741820, end: 1073741900},
{start: 2147483640, end: 2147483660},
{start: 4294967280, end: 4294967295},
]
u32_ranges.forEach(function(range) {
console.log('Start unsigned 32 range', range.start, range.end)
for (var i = range.start; i <= range.end; ++i) {
testCodec([{
name: "UInt32EncodingTestMessage",
msg: {
MandatoryUInt32: i
}
}])
if (!(i % 1000)) {
console.log('Unsigned 32 loop #', i)
}
}
})
var s32_ranges = [
{start: -2147483648, end: -2147483600},
{start: -2024, end: 2024},
{start: 2147483500, end: 2147483647},
]
s32_ranges.forEach(function(range) {
console.log('Start signed 32 range', range.start, range.end)
for (var i = range.start; i <= range.end; ++i) {
testCodec([{
name: "Int32EncodingTestMessage",
msg: {
MandatoryInt32: i
}
}])
if (!(i % 1000)) {
console.log('Signed 32 loop #', i)
}
}
})
//
var u64_ranges = [
{start: "0", end: "150"},
{start: "1000", end: "3400"},
{start: "15000", end: "16400"},
{start: "2097100", end: "2097500"},
{start: "1073741820", end: "1073741900"},
{start: "2147483640", end: "2147483660"},
{start: "4294967280", end: "4294967295"},
{start: "18446744073709551600", end: "18446744073709551614"},
]
u64_ranges.forEach(function(range) {
console.log('Start unsigned 64 range', range.start, range.end)
var end = Long.fromString(range.end, true)
for (var i = Long.fromString(range.start, true); i.lessThanOrEqual(end); i = i.add(Long.UONE)) {
testCodec([{
name: "UInt64EncodingTestMessage",
msg: {
MandatoryUInt64: i.toString(10)
}
}])
if ((i.modulo(1000).equals(Long.UZERO))) {
console.log('Unsigned 64 loop #', i.toString(10))
}
}
})
var s64_ranges = [
{start: "-9223372036854775808", end: "-9223372036854775800"},
{start: "-1", end: "1"},
{start: "-2147483648", end: "-2147483600"},
{start: "-2024", end: "2024"},
{start: "2147483500", end: "2147483647"},
{start: "9223372036854775800", end: "9223372036854775806"},
]
s64_ranges.forEach(function(range) {
console.log('Start signed 64 range', range.start, range.end)
var end = Long.fromString(range.end)
for (var i = Long.fromString(range.start); i.lessThanOrEqual(end); i = i.add(Long.ONE)) {
//console.log('TEST S64:', i.toString(10), i.toString(16))
testCodec([{
name: "Int64EncodingTestMessage",
msg: {
MandatoryInt64: i.toString(10)
}
}])
if (i.modulo(1000).equals(Long.ZERO)) {
console.log('Signed 64 loop #', i.toString(10))
}
}
})
/*
for (var i = 0; i < 4294967295; ++i) {
testCodec([{
name: "UInt32EncodingTestMessage",
msg: {
MandatoryUInt32: i
}
}])
if (!(i % 1000)) {
console.log('Unsigned loop #', i)
}
}
for (var i = -2147483648; i < 2147483647; ++i) {
testCodec([{
name: "Int32EncodingTestMessage",
msg: {
MandatoryInt32: i
}
}])
if (!(i % 1000)) {
console.log('Signed loop #', i)
}
}
*/
console.log('Test done.')