Files
smpp-js/test/pdu-framer.test.ts

88 lines
2.3 KiB
TypeScript

import assert from 'node:assert/strict';
import test, { describe } from 'node:test';
import { PduFramer } from '../src/pdu-framer.ts';
import { objToPdu } from '../src/pdu.ts';
function pdu(seqNr: number): Buffer {
const { buffer } = objToPdu({ cmdName: 'enquire_link', seqNr });
assert.ok(buffer);
return buffer;
}
describe('PduFramer', () => {
test('yields nothing until a whole PDU has arrived', () => {
const framer = new PduFramer();
const whole = pdu(1);
framer.push(whole.subarray(0, 8));
assert.deepEqual(framer.next(), { pdus: [] });
framer.push(whole.subarray(8));
assert.deepEqual(framer.next(), { pdus: [whole] });
});
test('splits several PDUs delivered in one chunk', () => {
const framer = new PduFramer();
framer.push(Buffer.concat([pdu(1), pdu(2), pdu(3)]));
const { pdus } = framer.next();
assert.ok(pdus);
assert.equal(pdus.length, 3);
assert.deepEqual(pdus[2], pdu(3));
});
test('reassembles a PDU dribbled one octet at a time', () => {
const framer = new PduFramer();
const whole = pdu(42);
for (const octet of whole) {
framer.push(Buffer.from([octet]));
}
assert.deepEqual(framer.next(), { pdus: [whole] });
assert.equal(framer.buffered, 0);
});
test('keeps a trailing partial PDU buffered for the next chunk', () => {
const framer = new PduFramer();
const second = pdu(2);
framer.push(Buffer.concat([pdu(1), second.subarray(0, 4)]));
const first = framer.next();
assert.ok(first.pdus);
assert.equal(first.pdus.length, 1);
assert.equal(framer.buffered, 4);
framer.push(second.subarray(4));
assert.deepEqual(framer.next(), { pdus: [second] });
});
// 0.4.0 read a command length of 0 as "discard the buffer" and looped; anything absurd was
// simply trusted and allocated.
test('reports an impossible command length instead of trusting it', () => {
const zero = new PduFramer();
const huge = new PduFramer();
zero.push(Buffer.alloc(16));
assert.ok(zero.next().err instanceof Error);
huge.push(Buffer.from('ffffffff0000001500000000000000ff', 'hex'));
assert.ok(huge.next().err instanceof Error);
});
test('ignores empty chunks', () => {
const framer = new PduFramer();
framer.push(Buffer.alloc(0));
assert.equal(framer.buffered, 0);
assert.deepEqual(framer.next(), { pdus: [] });
});
});