From 8c71e84875348ff13f40a804b0acd00fa078f5dd Mon Sep 17 00:00:00 2001 From: David Ventura Date: Fri, 3 May 2024 23:02:25 +0200 Subject: [PATCH] add integration test with mock server --- mock_server.ts | 14 ++++++++++++++ tests/fn.test.js | 9 ++------- tests/integration.test.js | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 mock_server.ts create mode 100644 tests/integration.test.js diff --git a/mock_server.ts b/mock_server.ts new file mode 100644 index 0000000..a61f721 --- /dev/null +++ b/mock_server.ts @@ -0,0 +1,14 @@ +import { createSocket, RemoteInfo } from "node:dgram"; +export const mockServer = (onMessage: (msg: DataView) => Uint8Array[]) => { + const sock = createSocket("udp4"); + const SEND_PORT = 32108; + sock.bind(SEND_PORT); + sock.on("message", (msg, rinfo: RemoteInfo) => { + const dv = new DataView(new Uint8Array(msg).buffer); + onMessage(dv).forEach((out) => { + sock.send(out, rinfo.port, rinfo.address); + }); + }); + + return sock; +}; diff --git a/tests/fn.test.js b/tests/fn.test.js index ee21fc6..c35f3d6 100644 --- a/tests/fn.test.js +++ b/tests/fn.test.js @@ -2,9 +2,9 @@ import "../shim.ts"; import assert from "assert"; -import { XqBytesDec, XqBytesEnc } from "../func_replacements.js"; import { hexdump } from "../hexdump.js"; -import { SendStartVideo, SendDevStatus, SendUsrChk, SendWifiDetails, parse_PunchPkt } from "../impl.ts"; +import { XqBytesDec, XqBytesEnc } from "../func_replacements.js"; +import { parse_PunchPkt, SendDevStatus, SendStartVideo, SendUsrChk, SendWifiDetails } from "../impl.ts"; import { placeholderTypes, sprintf } from "../utils.js"; describe("debug_tools", () => { @@ -122,11 +122,6 @@ describe("module", () => { }); const hstrToBA = (hs) => new Uint8Array(hs.match(/../g).map((h) => parseInt(h, 16))).buffer; -describe("events", () => { - it("emits login event upon logging in", () => { - // TODO - }); -}); describe("parse packet", () => { it("parses PunchPkt", () => { const in_pkt_str = "f14100144241544400000000000262ca574f4e4a4d000000"; diff --git a/tests/integration.test.js b/tests/integration.test.js new file mode 100644 index 0000000..ab13df3 --- /dev/null +++ b/tests/integration.test.js @@ -0,0 +1,33 @@ +import { mockServer } from "../mock_server.js"; +import { discoverDevices } from "../discovery.js"; +import { buildLogger } from "../logger.js"; +import { Commands } from "../datatypes.js"; + +import assert from "assert"; + +const hstrToU8 = (hs) => new Uint8Array(hs.match(/../g).map((h) => parseInt(h, 16))); +describe("integration", () => { + it("emits login event upon logging in", () => { + // TODO + }); + + it("discovers a device", () => { + buildLogger("trace"); + const EXPECTED_SERIAL = "BATD156362WONJM"; + const punchPkt = "f14100144241544400000000000262ca574f4e4a4d000000"; + const mockSock = mockServer((msg) => { + const cmd = msg.readU16(); + if (cmd == Commands.LanSearch) { + const buf = hstrToU8(punchPkt); + return [buf]; + } + return []; + }); + const ev = discoverDevices("127.0.0.1"); + ev.on("discover", (rinfo, dev) => { + assert.deepEqual(dev.devId, EXPECTED_SERIAL); + ev.emit("close"); + mockSock.close(); + }); + }); +});