]> git.basschouten.com Git - openhab-addons.git/blob
4675ef1fb2b314f1a9911cdf567098f0550c000b
[openhab-addons.git] /
1 /**
2  * Copyright (c) 2010-2023 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.onewire.test;
14
15 import static org.junit.jupiter.api.Assertions.fail;
16
17 import java.io.DataInputStream;
18 import java.io.DataOutputStream;
19 import java.io.IOException;
20 import java.net.ServerSocket;
21 import java.net.Socket;
22 import java.util.ArrayList;
23 import java.util.List;
24 import java.util.concurrent.CompletableFuture;
25
26 import org.eclipse.jdt.annotation.NonNullByDefault;
27 import org.openhab.binding.onewire.internal.OwException;
28 import org.openhab.binding.onewire.internal.OwPageBuffer;
29 import org.openhab.binding.onewire.internal.owserver.OwserverPacket;
30 import org.openhab.binding.onewire.internal.owserver.OwserverPacketType;
31 import org.slf4j.Logger;
32 import org.slf4j.LoggerFactory;
33
34 /**
35  * The {@link OwserverTestServer} defines a server for testing the OwserverConnection class
36  *
37  * @author Jan N. Klug - Initial contribution
38  */
39 @NonNullByDefault
40 public class OwserverTestServer {
41     private final Logger logger = LoggerFactory.getLogger(OwserverTestServer.class);
42
43     private final ServerSocket serverSocket;
44     private boolean isRunning = false;
45
46     public OwserverTestServer(int port) throws IOException {
47         serverSocket = new ServerSocket(port);
48     }
49
50     public void startServer(CompletableFuture<Boolean> serverStarted) throws IOException {
51         isRunning = true;
52
53         new Thread() {
54             @Override
55             public void run() {
56                 OwserverPacket receivedPacket;
57                 List<OwserverPacket> answerPackets;
58                 serverStarted.complete(true);
59                 try {
60                     while (isRunning) {
61                         final Socket connectionSocket = serverSocket.accept();
62                         final DataInputStream inputStream = new DataInputStream(connectionSocket.getInputStream());
63                         final DataOutputStream outputStream = new DataOutputStream(connectionSocket.getOutputStream());
64
65                         receivedPacket = new OwserverPacket(inputStream, OwserverPacketType.REQUEST);
66                         logger.debug("received {}", receivedPacket);
67
68                         answerPackets = processPacket(receivedPacket);
69
70                         answerPackets.forEach(answerPacket -> {
71                             logger.debug("answering {}", answerPacket);
72                             try {
73                                 outputStream.write(answerPacket.toBytes());
74                             } catch (IOException e) {
75                                 logger.error("I/O Error: {}", e.getMessage());
76                             }
77                         });
78                     }
79                 } catch (IOException e) {
80                     logger.error("I/O Error: {}", e.getMessage());
81                 } catch (OwException e) {
82                     fail("caught unexpected OwException");
83                 }
84             }
85         }.start();
86     }
87
88     public void stopServer() throws IOException {
89         isRunning = false;
90         serverSocket.close();
91     }
92
93     private List<OwserverPacket> processPacket(OwserverPacket inputPacket) {
94         List<OwserverPacket> returnPackets = new ArrayList<>();
95         OwserverPacket returnPacket = new OwserverPacket(OwserverPacketType.RETURN);
96         switch (inputPacket.getMessageType()) {
97             case NOP:
98                 returnPacket.setPayload("");
99                 returnPackets.add(returnPacket);
100                 break;
101             case DIRALL:
102                 returnPacket.setPayload("/00.0123456789ab,/00.0123456789ac,/00.0123456789ad,/statistics");
103                 returnPackets.add(returnPacket);
104                 returnPacket = new OwserverPacket(OwserverPacketType.RETURN);
105                 break;
106             case PRESENT:
107                 switch (inputPacket.getPayloadString()) {
108                     case "present":
109                         break;
110                     default:
111                         returnPacket.setReturnCode(-1);
112                 }
113                 returnPacket.setPayload(inputPacket.getPayloadString());
114                 returnPackets.add(returnPacket);
115                 break;
116             case READ:
117                 switch (inputPacket.getPayloadString()) {
118                     case "testsensor/pages/page.ALL":
119                         OwPageBuffer pageBuffer = new OwPageBuffer(8);
120                         pageBuffer.setByte(5, 7, (byte) 31);
121                         returnPacket.setPayload(pageBuffer);
122                         returnPackets.add(returnPacket);
123                         break;
124                     case "testsensor/decimal":
125                         returnPacket.setPayload("    17.4");
126                         returnPackets.add(returnPacket);
127                         break;
128                     case "testsensor/decimalarray":
129                         returnPacket.setPayload("        3834,           0");
130                         returnPackets.add(returnPacket);
131                         break;
132                     default:
133                 }
134                 break;
135             case WRITE:
136                 returnPackets.add(returnPacket);
137                 break;
138             default:
139
140         }
141         return returnPackets;
142     }
143 }