From e24f49285c7cbcb068f6ba4b0504b605f0a2b748 Mon Sep 17 00:00:00 2001 From: Parnic Date: Sun, 9 Feb 2020 14:51:23 -0600 Subject: [PATCH] Added tests for some of the SLMessage utilities --- test/slmessage.spec.js | 175 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 175 insertions(+) create mode 100644 test/slmessage.spec.js diff --git a/test/slmessage.spec.js b/test/slmessage.spec.js new file mode 100644 index 0000000..fc06b70 --- /dev/null +++ b/test/slmessage.spec.js @@ -0,0 +1,175 @@ +'use strict'; + +const SLMessage = require('../messages/SLMessage.js').SLMessage; +const assert = require('assert'); + +function slMessageLen(str) { + // strings have length prefixed on them as an int32 for an additional 4b. + // strings are dword aligned, so if str.length is 21, dword alignment pushes it up to 24 + return 4 + str.length + SLMessage.slackForAlignment(str.length); +} + +describe('SLMessage utilities', () => { + // message header = senderId, messageId, bodyLen. + // senderId and messageId are int16's, so 2b each. bodyLen is an int32, so 4b. total 8b. + let msgHeaderLen = 8; + + it('sets senderId and messageId properly', function() { + { + let msg = new SLMessage(123, 456); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.senderId, 123); + assert.strictEqual(decodedMsg.messageId, 456); + assert.strictEqual(decodedMsg.dataLength, 0); + } + + { + let msg = new SLMessage(0, 65534); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.senderId, 0); + assert.strictEqual(decodedMsg.messageId, 65534); + assert.strictEqual(decodedMsg.dataLength, 0); + } + + { + let msg = new SLMessage(); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.senderId, 0); + assert.strictEqual(decodedMsg.messageId, 0); + assert.strictEqual(decodedMsg.dataLength, 0); + } + + { + let msg = new SLMessage(123); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.senderId, 123); + assert.strictEqual(decodedMsg.messageId, 0); + assert.strictEqual(decodedMsg.dataLength, 0); + } + + { + let msg = new SLMessage(0); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.senderId, 0); + assert.strictEqual(decodedMsg.messageId, 0); + assert.strictEqual(decodedMsg.dataLength, 0); + } + }); + + it('encodes and decodes SLStrings', function() { + { + let msg = new SLMessage(); + let testStr = 'this is a test string'; + msg.writeSLString(testStr); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.readSLString(), testStr, 'did not receive serialized message properly'); + assert.strictEqual(SLMessage.slackForAlignment(testStr.length), 3); + // SLString byte length = 4 + 21 + 3 = 28b + assert.strictEqual(slMessageLen(testStr), + 4 + testStr.length + SLMessage.slackForAlignment(testStr.length)); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(testStr), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + + { + let msg = new SLMessage(); + let testStr = '1'; + msg.writeSLString(testStr); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.readSLString(), testStr, 'did not receive serialized message properly'); + assert.strictEqual(SLMessage.slackForAlignment(testStr.length), 3); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(testStr), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + + { + let msg = new SLMessage(); + let testStr = '12'; + msg.writeSLString(testStr); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.readSLString(), testStr, 'did not receive serialized message properly'); + assert.strictEqual(SLMessage.slackForAlignment(testStr.length), 2); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(testStr), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + + { + let msg = new SLMessage(); + let testStr = '123'; + msg.writeSLString(testStr); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.readSLString(), testStr, 'did not receive serialized message properly'); + assert.strictEqual(SLMessage.slackForAlignment(testStr.length), 1); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(testStr), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + + { + let msg = new SLMessage(); + let testStr = '1234'; + msg.writeSLString(testStr); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.strictEqual(decodedMsg.readSLString(), testStr, 'did not receive serialized message properly'); + assert.strictEqual(SLMessage.slackForAlignment(testStr.length), 0); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(testStr), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + }); + + it('encodes and decodes SLArrays', function() { + { + let msg = new SLMessage(); + let list = []; + msg.writeSLArray(list); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.deepStrictEqual(decodedMsg.readSLArray(), list); + assert.strictEqual(SLMessage.slackForAlignment(list.length), 0); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(list), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + + { + let msg = new SLMessage(); + let list = [1]; + msg.writeSLArray(list); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.deepStrictEqual(decodedMsg.readSLArray(), list); + assert.strictEqual(SLMessage.slackForAlignment(list.length), 3); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(list), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + + { + let msg = new SLMessage(); + let list = [1, 2]; + msg.writeSLArray(list); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.deepStrictEqual(decodedMsg.readSLArray(), list); + assert.strictEqual(SLMessage.slackForAlignment(list.length), 2); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(list), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + + { + let msg = new SLMessage(); + let list = [1, 2, 3]; + msg.writeSLArray(list); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.deepStrictEqual(decodedMsg.readSLArray(), list); + assert.strictEqual(SLMessage.slackForAlignment(list.length), 1); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(list), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + + { + let msg = new SLMessage(); + let list = [1, 2, 3, 4]; + msg.writeSLArray(list); + let decodedMsg = new SLMessage(msg.toBuffer()); + assert.deepStrictEqual(decodedMsg.readSLArray(), list); + assert.strictEqual(SLMessage.slackForAlignment(list.length), 0); + assert.strictEqual(decodedMsg.readOffset, msgHeaderLen + slMessageLen(list), 'read offset was invalid'); + assert.strictEqual(decodedMsg.dataLength, decodedMsg.readOffset - 8); + } + }); +}); \ No newline at end of file