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