test('split buffer, single message parsing', function() { var fullBuffer = buffers.dataRow([null, "bang", "zug zug", null, "!"]); var stream = new MemoryStream(); stream.readyState = 'open'; var client = new Connection({ stream: stream }); client.connect(); var message = null; client.on('message', function(msg) { message = msg; }); test('parses when full buffer comes in', function() { stream.emit('data', fullBuffer); assert.length(message.fields, 5); assert.equal(message.fields[0], null); assert.equal(message.fields[1], "bang"); assert.equal(message.fields[2], "zug zug"); assert.equal(message.fields[3], null); assert.equal(message.fields[4], "!"); }); var testMessageRecievedAfterSpiltAt = function(split) { var firstBuffer = new Buffer(fullBuffer.length-split); var secondBuffer = new Buffer(fullBuffer.length-firstBuffer.length); fullBuffer.copy(firstBuffer, 0, 0); fullBuffer.copy(secondBuffer, 0, firstBuffer.length); stream.emit('data', firstBuffer); stream.emit('data', secondBuffer); assert.length(message.fields, 5); assert.equal(message.fields[0], null); assert.equal(message.fields[1], "bang"); assert.equal(message.fields[2], "zug zug"); assert.equal(message.fields[3], null); assert.equal(message.fields[4], "!"); }; test('parses when split in the middle', function() { testMessageRecievedAfterSpiltAt(6); }); test('parses when split at end', function() { testMessageRecievedAfterSpiltAt(2); }); test('parses when split at beginning', function() { testMessageRecievedAfterSpiltAt(fullBuffer.length - 2); testMessageRecievedAfterSpiltAt(fullBuffer.length - 1); testMessageRecievedAfterSpiltAt(fullBuffer.length - 5); }); });
},{ name: 'name', tableID: 1, attributeNumber: 2, dataTypeID: 25, //text typeModifer: 0, formatCode: 0 //text format }, { name: 'comment', tableID: 1, attributeNumber: 3, dataTypeID: 25, //text typeModifer: 0, formatCode: 0 //text format }]); var row1 = buffers.dataRow(['1', 'Brian', 'Something groovy']); var row2 = buffers.dataRow(['2', 'Bob', 'Testint test']); var row3 = buffers.dataRow(['3', 'The amazing power of the everlasting gobstopper', 'okay now']); var complete = buffers.commandComplete('SELECT 3'); var ready = buffers.readyForQuery(); var buffer = Buffer.concat([ rowDescription, row1, row2, row3, row1, row2, row3, row1, row2, row3, complete, ready]); var bufferSlice = require('buffer-slice'); buffers = bufferSlice(10, buffer); client.connect(assert.calls(function() { client.connection.emit('readyForQuery');
test('split buffer, multiple message parsing', function() { var dataRowBuffer = buffers.dataRow(['!']); var readyForQueryBuffer = buffers.readyForQuery(); var fullBuffer = new Buffer(dataRowBuffer.length + readyForQueryBuffer.length); dataRowBuffer.copy(fullBuffer, 0, 0); readyForQueryBuffer.copy(fullBuffer, dataRowBuffer.length, 0); var messages = []; var stream = new MemoryStream(); var client = new Connection({ stream: stream }); client.connect(); client.on('message', function(msg) { messages.push(msg); }); var verifyMessages = function() { assert.length(messages, 2); assert.same(messages[0],{ name: 'dataRow', fieldCount: 1 }); assert.equal(messages[0].fields[0],'!'); assert.same(messages[1],{ name: 'readyForQuery' }); messages = []; }; //sanity check test('recieves both messages when packet is not split', function() { stream.emit('data', fullBuffer); verifyMessages(); }); var splitAndVerifyTwoMessages = function(split) { var firstBuffer = new Buffer(fullBuffer.length-split); var secondBuffer = new Buffer(fullBuffer.length-firstBuffer.length); fullBuffer.copy(firstBuffer, 0, 0); fullBuffer.copy(secondBuffer, 0, firstBuffer.length); stream.emit('data', firstBuffer); stream.emit('data', secondBuffer); }; test('recieves both messages when packet is split', function() { test('in the middle', function() { splitAndVerifyTwoMessages(11); }); test('at the front', function() { splitAndVerifyTwoMessages(fullBuffer.length-1); splitAndVerifyTwoMessages(fullBuffer.length-4); splitAndVerifyTwoMessages(fullBuffer.length-6); }); test('at the end', function() { splitAndVerifyTwoMessages(8); splitAndVerifyTwoMessages(1); }); }); });
var twoRowBuf = new buffers.rowDescription([row1,{ name: 'whoah', tableID: 10, attributeNumber: 11, dataTypeID: 12, dataTypeSize: 13, typeModifier: 14, formatCode: 0 }]) var emptyRowFieldBuf = new BufferList() .addInt16(0) .join(true, 'D'); var emptyRowFieldBuf = buffers.dataRow(); var oneFieldBuf = new BufferList() .addInt16(1) //number of fields .addInt32(5) //length of bytes of fields .addCString('test') .join(true, 'D'); var oneFieldBuf = buffers.dataRow(['test']); var expectedAuthenticationOkayMessage = { name: 'authenticationOk', length: 8 };