Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions test/js/msp.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import {describe, expect, it} from "vitest";
import MSP from "../../src/js/msp";

describe("MSP", () => {
describe("encode_message_v1", () => {
it("handles correctly any code and no data", () => {
for (let code = 0; code < 256; code++) {
let encodedMessage = MSP.encode_message_v1(code, false);
expect(new Uint8Array(encodedMessage)).toEqual(new Uint8Array([36, 77, 60, 0, code, code]));
}
});
it("handles non-empty messages correctly", () => {
let [operationCode, inputDataLengthPadding] = crypto.getRandomValues(new Uint8Array(2));

let inputData = crypto.getRandomValues(new Uint8Array(100 + inputDataLengthPadding % 100));

let encodedMessage = new Uint8Array(MSP.encode_message_v1(operationCode, inputData));

// check that header is in place
expect(encodedMessage.slice(0, 3)).toEqual(new Uint8Array([36, 77, 60]));

// check that length got encoded as expected
expect(encodedMessage[3]).toEqual(inputData.length);

// check that operation code is there
expect(encodedMessage[4]).toEqual(operationCode);

// check that data got encoded as expected
expect(encodedMessage.slice(5, -1)).toEqual(inputData);

// and that the checksum is valid
let checksum = encodedMessage.slice(3, -1).reduce((acc, curr) => acc ^ curr);
expect(encodedMessage[encodedMessage.length - 1]).toEqual(checksum);
});
});

describe("encode_message_v2", () => {
it("handles correctly any code and no data", () => {
for (let codeLowByte = 0; codeLowByte < 256; codeLowByte++) {
for (let codeHighByte = 0; codeHighByte < 256; codeHighByte++) {
let encodedMessage = MSP.encode_message_v2(codeLowByte + codeHighByte * 256, false).slice(0, -1);
expect(new Uint8Array(encodedMessage)).toEqual(new Uint8Array([36, 88, 60, 0, codeLowByte, codeHighByte, 0, 0]));
}
}
});
it("handles non-empty messages correctly", () => {
let [lengthLowByte, lengthHighByte] = crypto.getRandomValues(new Uint8Array(2));

let inputData = crypto.getRandomValues(new Uint8Array(lengthLowByte + lengthHighByte * 256));
let [operationCodeLowByte, operationCodeHighByte] = crypto.getRandomValues(new Uint8Array(2));

let encodedMessage = new Uint8Array(MSP.encode_message_v2(operationCodeLowByte + 256 * operationCodeHighByte, inputData));

// check that header is in place
expect(encodedMessage.slice(0, 3)).toEqual(new Uint8Array([36, 88, 60]));

expect(encodedMessage[3]).toEqual(0);

// check that operation code is there
expect(encodedMessage[4]).toEqual(operationCodeLowByte);
expect(encodedMessage[5]).toEqual(operationCodeHighByte);

// check that length got encoded as expected
expect(encodedMessage[6]).toEqual(lengthLowByte);
expect(encodedMessage[7]).toEqual(lengthHighByte);

// check that data got encoded as expected
expect(encodedMessage.slice(8, -1)).toEqual(inputData);
});
});
});