UNPKG

zigbee-herdsman

Version:

An open source ZigBee gateway solution with node.js.

115 lines (101 loc) 6.04 kB
import * as Structs from "../../../src/adapter/z-stack/structs"; describe("Z-Stack Structs", () => { it("should export js object from structure", () => { const nib = Structs.nib(); nib.extendedPANID = Buffer.alloc(8, 0x01); nib.nwkLogicalChannel = 21; const obj = nib.toJSON(); expect(obj.extendedPANID.toString("hex")).toBe(Buffer.alloc(8, 0x01).toString("hex")); expect(obj.nwkLogicalChannel).toBe(21); }); it("should properly serialize structure in different alignment modes", () => { const nib = Structs.nib( Buffer.from( "fb050279147900640000000105018f000700020d1e000000150000000000000000000000ffff0800000020000f0f0400010000000100000000779fd609004b1200010000000000000000000000000000000000000000000000000000000000000000000000003c0c0001780a0100000006020000", "hex", ), ); expect(nib.serialize().toString("hex")).toBe( "fb050279147900640000000105018f0700020d1e00001500000000000000000000ffff08000020000f0f0400010000000100000000779fd609004b1200010000000000000000000000000000000000000000000000000000000000000000000000003c0c0001780a010000060200", ); expect(nib.serialize("unaligned", true, 0).toString("hex")).toBe( "fb050279147900640000000105018f0700020d1e00001500000000000000000000ffff08000020000f0f0400010000000100000000779fd609004b1200010000000000000000000000000000000000000000000000000000000000000000000000003c0c0001780a010000060200", ); expect(nib.serialize("aligned", true, 0).toString("hex")).toBe( "fb050279147900640000000105018f000700020d1e000000150000000000000000000000ffff0800000020000f0f0400010000000100000000779fd609004b1200010000000000000000000000000000000000000000000000000000000000000000000000003c0c0001780a0100000006020000", ); expect(nib.getLength("aligned")).toBe(116); expect(nib.getLength("aligned", false)).toBe(115); expect(nib.getLength("unaligned")).toBe(110); }); it("should throw error on invalid uint8 array length", () => { const nib = Structs.nib(); expect(() => { nib.extendedPANID = Buffer.alloc(10, 0x01); }).toThrowError("Invalid length for member extendedPANID (expected=8, got=10)"); }); it("should fail to initialize struct from invalid length source", () => { expect(() => { Structs.nib(Buffer.from("01020304", "hex")); }).toThrowError("Struct length mismatch (expected=110/116, got=4"); }); it("should fail if table entries are not the same length", () => { expect(() => { Structs.securityManagerTable([Buffer.alloc(12, 0x00), Buffer.alloc(17, 0x00)], "unaligned"); }).toThrowError("All table entries need to be the same length"); }); it("should fail if table initialization buffer is indivisible by entry length", () => { expect(() => { Structs.securityManagerTable(Buffer.alloc(91, 0x00)); }).toThrowError("Table length not divisible by entry length (alignment=unaligned, data_length=91, entry_length=5)"); }); it("should fail if table initialization source is unsupported", () => { expect(() => { // biome-ignore lint/suspicious/noExplicitAny: API Structs.securityManagerTable("das_garbage" as any); }).toThrowError("Unsupported table data source"); }); it("should properly return table capacity metrics", () => { const table = Structs.securityManagerTable(8); expect(table.used.length).toBe(0); expect(table.free.length).toBe(8); }); it("should properly serialize unaligned and aligned table - with inline occupancy", () => { const table = Structs.securityManagerTable(8); expect(table.serialize().toString("hex")).toBe("0000feff000000feff000000feff000000feff000000feff000000feff000000feff000000feff000000"); expect(table.serialize("unaligned").toString("hex")).toBe( "0000feff000000feff000000feff000000feff000000feff000000feff000000feff000000feff000000", ); expect(table.serialize("aligned").toString("hex")).toBe( "0000feff00000000feff00000000feff00000000feff00000000feff00000000feff00000000feff00000000feff00000000", ); }); it("should properly evaluate security manager table occupancy", () => { const table = Structs.securityManagerTable(8); table.free[6].ami = 0xfffe; table.free[6].authenticationOption = 0x00; table.free[7].ami = 0x0000; table.free[7].authenticationOption = 0x00; expect(table.freeCount).toBe(8); expect(table.usedCount).toBe(0); }); it("should properly serialize unaligned and aligned table - without inline occupancy", () => { const table = Structs.nwkSecMaterialDescriptorTable(8); expect(table.serialize().toString("hex")).toBe( "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ); expect(table.serialize("unaligned").toString("hex")).toBe( "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ); expect(table.serialize("aligned").toString("hex")).toBe( "000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", ); }); it("should evaluate table struct", () => { const table = Structs.nwkSecMaterialDescriptorTable(8); expect(table.capacity).toBe(8); expect(table.entries.length).toBe(8); expect(table.freeCount).toBe(8); expect(table.usedCount).toBe(0); }); });