knxultimate
Version:
KNX IP protocol implementation for Node. This is the ENGINE of Node-Red KNX-Ultimate node.
167 lines (149 loc) • 6.13 kB
text/typescript
import { describe, it, beforeEach } from 'node:test'
import assert from 'assert'
import KNXProtocol from '../../src/protocol/KNXProtocol'
import KNXHeader from '../../src/protocol/KNXHeader'
import HPAI from '../../src/protocol/HPAI'
import TunnelCRI from '../../src/protocol/TunnelCRI'
import CEMIMessage from '../../src/protocol/cEMI/CEMIMessage'
import { KNX_CONSTANTS } from '../../src/protocol/KNXConstants'
import KNXSearchRequest from '../../src/protocol/KNXSearchRequest'
import KNXDescriptionRequest from '../../src/protocol/KNXDescriptionRequest'
import KNXConnectRequest from '../../src/protocol/KNXConnectRequest'
import KNXConnectionStateRequest from '../../src/protocol/KNXConnectionStateRequest'
import KNXDisconnectRequest from '../../src/protocol/KNXDisconnectRequest'
import KNXDisconnectResponse from '../../src/protocol/KNXDisconnectResponse'
import KNXTunnelingAck from '../../src/protocol/KNXTunnelingAck'
import KNXTunnelingRequest from '../../src/protocol/KNXTunnelingRequest'
import KNXRoutingIndication from '../../src/protocol/KNXRoutingIndication'
import KNXSecureSessionRequest from '../../src/protocol/KNXSecureSessionRequest'
describe('KNXProtocol', () => {
let mockHPAI: HPAI
let mockTunnelCRI: TunnelCRI
let mockCEMIMessage: CEMIMessage
beforeEach(() => {
mockHPAI = new HPAI('192.168.1.1', 3671, KNX_CONSTANTS.IPV4_UDP)
mockTunnelCRI = new TunnelCRI(KNX_CONSTANTS.TUNNEL_LINKLAYER)
mockCEMIMessage = {} as CEMIMessage
})
describe('parseMessage', () => {
it('should parse KNXSearchRequest correctly', () => {
const mockBuffer = Buffer.from([
0x06,
0x10,
0x02,
0x01,
0x00,
0x0e,
...mockHPAI.toBuffer(),
])
const result = KNXProtocol.parseMessage(mockBuffer)
assert(result.knxHeader instanceof KNXHeader)
assert(result.knxMessage instanceof KNXSearchRequest)
})
it('should handle unknown message types', () => {
const mockBuffer = Buffer.from([0x06, 0x10, 0xff, 0xff, 0x00, 0x0e])
const result = KNXProtocol.parseMessage(mockBuffer)
assert(result.knxHeader instanceof KNXHeader)
assert(result.knxMessage === undefined)
})
})
describe('newKNXSearchRequest', () => {
it('should create a new KNXSearchRequest', () => {
const result = KNXProtocol.newKNXSearchRequest(mockHPAI)
assert(result instanceof KNXSearchRequest)
assert.deepStrictEqual(result.hpai, mockHPAI)
})
})
describe('newKNXDescriptionRequest', () => {
it('should create a new KNXDescriptionRequest', () => {
const result = KNXProtocol.newKNXDescriptionRequest(mockHPAI)
assert(result instanceof KNXDescriptionRequest)
assert.deepStrictEqual(result.hpai, mockHPAI)
})
})
describe('newKNXConnectRequest', () => {
it('should create a new KNXConnectRequest with default HPAIs', () => {
const result = KNXProtocol.newKNXConnectRequest(mockTunnelCRI)
assert(result instanceof KNXConnectRequest)
assert.deepStrictEqual(result.cri, mockTunnelCRI)
assert.deepStrictEqual(result.hpaiControl, HPAI.NULLHPAI)
assert.deepStrictEqual(result.hpaiData, HPAI.NULLHPAI)
})
it('should create a new KNXConnectRequest with custom HPAIs', () => {
const result = KNXProtocol.newKNXConnectRequest(
mockTunnelCRI,
mockHPAI,
mockHPAI,
)
assert(result instanceof KNXConnectRequest)
assert.deepStrictEqual(result.cri, mockTunnelCRI)
assert.deepStrictEqual(result.hpaiControl, mockHPAI)
assert.deepStrictEqual(result.hpaiData, mockHPAI)
})
})
describe('newKNXConnectionStateRequest', () => {
it('should create a new KNXConnectionStateRequest with default HPAI', () => {
const result = KNXProtocol.newKNXConnectionStateRequest(1)
assert(result instanceof KNXConnectionStateRequest)
assert.strictEqual(result.channelID, 1)
assert.deepStrictEqual(result.hpaiControl, HPAI.NULLHPAI)
})
it('should create a new KNXConnectionStateRequest with custom HPAI', () => {
const result = KNXProtocol.newKNXConnectionStateRequest(1, mockHPAI)
assert(result instanceof KNXConnectionStateRequest)
assert.strictEqual(result.channelID, 1)
assert.deepStrictEqual(result.hpaiControl, mockHPAI)
})
})
describe('newKNXDisconnectRequest', () => {
it('should create a new KNXDisconnectRequest with default HPAI', () => {
const result = KNXProtocol.newKNXDisconnectRequest(1)
assert(result instanceof KNXDisconnectRequest)
assert.strictEqual(result.channelID, 1)
assert.deepStrictEqual(result.hpaiControl, HPAI.NULLHPAI)
})
it('should create a new KNXDisconnectRequest with custom HPAI', () => {
const result = KNXProtocol.newKNXDisconnectRequest(1, mockHPAI)
assert(result instanceof KNXDisconnectRequest)
assert.strictEqual(result.channelID, 1)
assert.deepStrictEqual(result.hpaiControl, mockHPAI)
})
})
describe('newKNXDisconnectResponse', () => {
it('should create a new KNXDisconnectResponse', () => {
const result = KNXProtocol.newKNXDisconnectResponse(1, 0)
assert(result instanceof KNXDisconnectResponse)
assert.strictEqual(result.channelID, 1)
assert.strictEqual(result.status, 0)
})
})
describe('newKNXTunnelingACK', () => {
it('should create a new KNXTunnelingACK', () => {
const result = KNXProtocol.newKNXTunnelingACK(1, 2, 0)
assert(result instanceof KNXTunnelingAck)
assert.strictEqual(result.channelID, 1)
assert.strictEqual(result.seqCounter, 2)
assert.strictEqual(result.status, 0)
})
})
describe('newKNXTunnelingRequest', () => {
it('should create a new KNXTunnelingRequest', () => {
const result = KNXProtocol.newKNXTunnelingRequest(
1,
2,
mockCEMIMessage,
)
assert(result instanceof KNXTunnelingRequest)
assert.strictEqual(result.channelID, 1)
assert.strictEqual(result.seqCounter, 2)
assert.deepStrictEqual(result.cEMIMessage, mockCEMIMessage)
})
})
describe('newKNXRoutingIndication', () => {
it('should create a new KNXRoutingIndication', () => {
const result = KNXProtocol.newKNXRoutingIndication(mockCEMIMessage)
assert(result instanceof KNXRoutingIndication)
assert.deepStrictEqual(result.cEMIMessage, mockCEMIMessage)
})
})
})