]> git.basschouten.com Git - openhab-addons.git/blob
6fc3c9db7be98210e54b3f28f7669c09a75dec17
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2021 Contributors to the openHAB project
3  *
4  * See the NOTICE file(s) distributed with this work for additional
5  * information.
6  *
7  * This program and the accompanying materials are made available under the
8  * terms of the Eclipse Public License 2.0 which is available at
9  * http://www.eclipse.org/legal/epl-2.0
10  *
11  * SPDX-License-Identifier: EPL-2.0
12  */
13 package org.openhab.binding.nibeheatpump.internal.message;
14
15 import static org.junit.jupiter.api.Assertions.*;
16
17 import java.util.ArrayList;
18 import java.util.Arrays;
19 import java.util.List;
20 import java.util.concurrent.TimeUnit;
21
22 import org.junit.jupiter.api.BeforeEach;
23 import org.junit.jupiter.api.Test;
24 import org.junit.jupiter.api.Timeout;
25 import org.openhab.binding.nibeheatpump.internal.protocol.NibeHeatPumpProtocolContext;
26 import org.openhab.binding.nibeheatpump.internal.protocol.NibeHeatPumpProtocolDefaultContext;
27 import org.openhab.core.util.HexUtils;
28
29 /**
30  * @author Pauli Anttila - Initial contribution
31  */
32 public class NibeHeatPumpProtocolTest {
33
34     int ackRequestCount = 0;
35     int nakRequestCount = 0;
36     int sendWriteMsgCount = 0;
37     int sendReadMsgCount = 0;
38     List<byte[]> receivedMsgs = null;
39
40     final NibeHeatPumpProtocolContext mockupContext = new NibeHeatPumpProtocolDefaultContext() {
41         @Override
42         public void sendAck() {
43             ackRequestCount++;
44         }
45
46         @Override
47         public void sendNak() {
48             nakRequestCount++;
49         }
50
51         @Override
52         public void msgReceived(byte[] data) {
53             receivedMsgs.add(Arrays.copyOf(data, data.length));
54         }
55
56         @Override
57         public void sendWriteMsg() {
58             sendWriteMsgCount++;
59         }
60
61         @Override
62         public void sendReadMsg() {
63             sendReadMsgCount++;
64         }
65     };
66
67     @BeforeEach
68     public void Before() {
69         ackRequestCount = 0;
70         nakRequestCount = 0;
71         sendWriteMsgCount = 0;
72         sendReadMsgCount = 0;
73         receivedMsgs = new ArrayList<>();
74         mockupContext.buffer().clear();
75         mockupContext.msg().clear();
76     }
77
78     @Test
79     @Timeout(value = 1, unit = TimeUnit.SECONDS)
80     public void test() {
81         //@formatter:off
82         final String strTestData =
83                 // RMU40 message, acknowledge should be send
84                 "5C001962189600E1010200000000800000000000020914340001000005B8"
85                 // RMU40 message, CRC failure, negative acknowledge should be send
86                 + "5C001962189600E1010200000000800000000000020914340001000005B9"
87                 // MODBUS40 write request
88                 + "5C00206B004B"
89                 // nonsense
90                 + "3EAABB"
91                 // MODBUS40 read request
92                 + "5C0020690049"
93                 // nonsense
94                 + "F0561939F6"
95                 // MODBUS40 data read out, acknowledge should be send
96                 + "5C00206850449C9600489C88014C9C2D014E9CCF004D9CE0014F9C3200509C0400519C8201529C6B02569C3E00C9AF000001A8F600FDA77E02FAA90F0098A9DC27FFFF0000A0A93A04FFFF00009CA9FD19FFFF000081"
97                 // nonsense
98                 + "F0349823"
99                 // MODBUS40 data read out, CRC failure, negative acknowledge should be send
100                 + "5C00206850449C9600489C88014C9C2D014E9CCF004D9CE0014F9C3200509C0400519C8201529C6B02569C3E00C9AF000001A8F600FDA77E02FAA90F0098A9DC27FFFF0000A0A93A04FFFF00009CA9FD19FFFF000080"
101                 // RMU40 message, acknowledge should be send
102                 + "5C001962189600DF01020000000080000000000002091434000100000586"
103                 // nonsense
104                 + "123490"
105                 // unknown RMU40 message, acknowledge should be send
106                 + "5C0019600079"
107                 // MODBUS40 data read out, special len, acknowledge should be send
108                 + "5C00206851449C2500489CFC004C9CF1004E9CC7014D9C0B024F9C2500509C3300519C0B01529C5C5C01569C3100C9AF000001A80C01FDA716FAFAA9070098A91B1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000BE"
109                 // MODBUS40 data read out, special len, acknowledge should be send
110                 + "5C00206852449C2500489CFE004C9CF2004E9CD4014D9CFB014F9C2500509C3700519C0D01529C5C5C01569C3200C9AF000001A80C01FDA712FAFAA9070098A95C5C1BFFFF0000A0A9D102FFFF00009CA9B412FFFF00007F"
111                 // MODBUS40 data read out, special checksum, acknowledge should be send
112                 + "5C00206850449C2600489CF6004C9CF1004E9CD6014D9C0C024F9C4500509C3F00519CF100529C0401569CD500C9AF000001A80C01FDA799FAFAA9020098A91A1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000C5";
113         //@formatter:on
114
115         // create byte data from hex string
116         final byte[] rawData = HexUtils.hexToBytes(strTestData);
117
118         // put byte data to protocol state machine
119         mockupContext.buffer().put(rawData);
120         mockupContext.buffer().flip();
121
122         // run protocol state machine to process test data
123         while (mockupContext.state().process(mockupContext)) {
124         }
125
126         // test results
127
128         assertEquals(7, ackRequestCount);
129         assertEquals(2, nakRequestCount);
130         assertEquals(1, sendWriteMsgCount);
131         assertEquals(1, sendReadMsgCount);
132         assertEquals(7, receivedMsgs.size());
133
134         String expect;
135
136         expect = "5C001962189600E1010200000000800000000000020914340001000005B8";
137         assertArrayEquals(HexUtils.hexToBytes(expect), receivedMsgs.get(0));
138
139         expect = "5C00206850449C9600489C88014C9C2D014E9CCF004D9CE0014F9C3200509C0400519C8201529C6B02569C3E00C9AF000001A8F600FDA77E02FAA90F0098A9DC27FFFF0000A0A93A04FFFF00009CA9FD19FFFF000081";
140         assertArrayEquals(HexUtils.hexToBytes(expect), receivedMsgs.get(1));
141
142         expect = "5C001962189600DF01020000000080000000000002091434000100000586";
143         assertArrayEquals(HexUtils.hexToBytes(expect), receivedMsgs.get(2));
144
145         expect = "5C0019600079";
146         assertArrayEquals(HexUtils.hexToBytes(expect), receivedMsgs.get(3));
147
148         expect = "5C00206851449C2500489CFC004C9CF1004E9CC7014D9C0B024F9C2500509C3300519C0B01529C5C5C01569C3100C9AF000001A80C01FDA716FAFAA9070098A91B1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000BE";
149         assertArrayEquals(HexUtils.hexToBytes(expect), receivedMsgs.get(4));
150
151         expect = "5C00206852449C2500489CFE004C9CF2004E9CD4014D9CFB014F9C2500509C3700519C0D01529C5C5C01569C3200C9AF000001A80C01FDA712FAFAA9070098A95C5C1BFFFF0000A0A9D102FFFF00009CA9B412FFFF00007F";
152         assertArrayEquals(HexUtils.hexToBytes(expect), receivedMsgs.get(5));
153
154         expect = "5C00206850449C2600489CF6004C9CF1004E9CD6014D9C0C024F9C4500509C3F00519CF100529C0401569CD500C9AF000001A80C01FDA799FAFAA9020098A91A1BFFFF0000A0A9CA02FFFF00009CA99212FFFF0000C5";
155         assertArrayEquals(HexUtils.hexToBytes(expect), receivedMsgs.get(6));
156     }
157 }