Skip to content

Commit

Permalink
test: 🐛 correct payload and header serialization and update tests
Browse files Browse the repository at this point in the history
  • Loading branch information
drazisil committed Oct 10, 2024
1 parent c38cc6f commit 7792fb6
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 28 deletions.
9 changes: 4 additions & 5 deletions packages/shared-packets/src/GameMessageHeader.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export class GameMessageHeader
}

override serialize(): Buffer {
return this.version === 0 ? this.serializeV0() : this.serializeV1();
return this.version === 257 ? this.serializeV1() : this.serializeV0();
}

private deserializeV0(data: Buffer): void {
Expand All @@ -96,10 +96,10 @@ export class GameMessageHeader
);
}

if (this.version === 0) {
this.deserializeV0(data);
} else {
if (this.version === 257) {
this.deserializeV1(data);
} else {
this.deserializeV0(data);
}
}

Expand All @@ -124,5 +124,4 @@ export class GameMessageHeader
override toString(): string {
return `GameMessageHeader {id: ${this.id}, length: ${this.length}, version: ${this.version}}`;
}

}
25 changes: 3 additions & 22 deletions packages/shared-packets/src/GameMessagePayload.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,44 +5,25 @@ export class GameMessagePayload
extends BufferSerializer
implements SerializableInterface
{
public messageId: number = 0; // 2 bytes

private isEncrypted: boolean = false; // Not serialized

static copy(payload: GameMessagePayload): GameMessagePayload {
const newPayload = new GameMessagePayload();
newPayload.messageId = payload.messageId;
newPayload._data = Buffer.from(payload._data);
return newPayload;
}

Check warning on line 14 in packages/shared-packets/src/GameMessagePayload.ts

View check run for this annotation

Codecov / codecov/patch

packages/shared-packets/src/GameMessagePayload.ts#L11-L14

Added lines #L11 - L14 were not covered by tests

override getByteSize(): number {
return 2 + this._data.length;
return this._data.length;
}

Check warning on line 18 in packages/shared-packets/src/GameMessagePayload.ts

View check run for this annotation

Codecov / codecov/patch

packages/shared-packets/src/GameMessagePayload.ts#L17-L18

Added lines #L17 - L18 were not covered by tests

override serialize(): Buffer {
const buffer = Buffer.alloc(this.getByteSize());
buffer.writeUInt16LE(this.messageId, 0);
this._data.copy(buffer, 2);

return buffer;
return this._data;
}

override deserialize(data: Buffer): GameMessagePayload {
this._assertEnoughData(data, 2);

this.messageId = data.readUInt16LE(0);
this._data = data.subarray(2);

return this;
}

getMessageId(): number {
return this.messageId;
}
this._data = data;

setMessageId(messageId: number): GameMessagePayload {
this.messageId = messageId;
return this;
}

Expand Down
7 changes: 6 additions & 1 deletion packages/shared-packets/src/GamePacket.ts
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,11 @@ export class GamePacket extends BasePacket implements SerializableMessage {
override getDataBuffer(): Buffer {
return this.data.serialize();
}

getVersion(): number {
return this.header.getVersion();
}

override setDataBuffer(data: Buffer): GamePacket {
if (this.data.getByteSize() > 2) {
throw new Error(
Expand Down Expand Up @@ -63,7 +68,7 @@ export class GamePacket extends BasePacket implements SerializableMessage {
}

Check warning on line 68 in packages/shared-packets/src/GamePacket.ts

View check run for this annotation

Codecov / codecov/patch

packages/shared-packets/src/GamePacket.ts#L66-L68

Added lines #L66 - L68 were not covered by tests

getMessageId(): number {
return this.data.getMessageId();
return this.header.getId();
}

getLength(): number {
Expand Down
83 changes: 83 additions & 0 deletions packages/shared-packets/test/GamePacket.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import { describe, it, expect } from "vitest";
import { Buffer } from "buffer";
import { GamePacket } from "../src/GamePacket.js";

describe("GamePacket", () => {
it("should deserialize correctly v0 correctly", () => {
const buffer = Buffer.alloc(11);
buffer.writeUInt16BE(1234, 0); // Message ID
buffer.writeUInt16BE(11, 2); // Length

buffer.write("test da", 4); // Data

const packet = new GamePacket();
packet.deserialize(buffer);

expect(packet.getMessageId()).toBe(1234);
expect(packet.getDataBuffer().toString("hex")).equals(
Buffer.from("test da").toString("hex"),
);
});

it("should deserialize correctly v1 correctly", () => {
const buffer = Buffer.alloc(26);
buffer.writeUInt16BE(1234, 0); // Message ID
buffer.writeUInt16BE(11, 2); // Length
buffer.writeUInt16BE(0x101, 4); // Version
buffer.writeUInt32BE(11, 8); // Checksum
buffer.write("test data", 12); // Data

const packet = new GamePacket();
packet.deserialize(buffer);

expect(packet.getMessageId()).toBe(1234);
expect(packet.getDataBuffer().toString("hex")).equals(
Buffer.from("test data\u0000\u0000\u0000\u0000\u0000").toString("hex"),
);
});

it("should throw error if data is insufficient for header", () => {
const buffer = Buffer.alloc(5); // Less than required for header

const packet = new GamePacket();
expect(() => packet.deserialize(buffer)).toThrow(
"Data is too short. Expected at least 6 bytes, got 5 bytes",
);
});

it("should throw error if data is insufficient for full packet", () => {
const buffer = Buffer.alloc(10); // Less than required for full packet
buffer.writeUInt16BE(0x101, 4); // Version

const packet = new GamePacket();
expect(() => packet.deserialize(buffer)).toThrow(
"Data is too short. Expected at least 12 bytes, got 10 bytes",
);
});

it("should identify version correctly", () => {
const buffer = Buffer.alloc(15);
buffer.writeUInt16BE(11, 0); // Length
buffer.writeUInt16BE(0x101, 4); // Version
buffer.writeUInt16BE(1234, 6); // Message ID
buffer.write("test data", 8, "utf8"); // Data

const packet = new GamePacket();
packet.deserialize(buffer);

expect(packet.getVersion()).toBe(257);
});

it("should handle version 0 correctly", () => {
const buffer = Buffer.alloc(15);
buffer.writeUInt16BE(1234, 0); // Message ID
buffer.writeUInt16BE(11, 4); // Length
buffer.writeUInt16BE(0x100, 4); // Version
buffer.write("test data", 8, "utf8"); // Data

const packet = new GamePacket();
packet.deserialize(buffer);

expect(packet.getVersion()).toBe(0);
});
});

0 comments on commit 7792fb6

Please sign in to comment.