2 * Copyright (c) 2010-2020 Contributors to the openHAB project
4 * See the NOTICE file(s) distributed with this work for additional
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
11 * SPDX-License-Identifier: EPL-2.0
13 package org.openhab.binding.onewire.test;
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;
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;
34 * The {@link OwserverTestServer} defines a server for testing the OwserverConnection class
36 * @author Jan N. Klug - Initial contribution
39 public class OwserverTestServer {
40 private final Logger logger = LoggerFactory.getLogger(OwserverTestServer.class);
42 private final ServerSocket serverSocket;
43 private boolean isRunning = false;
45 public OwserverTestServer(int port) throws IOException {
46 serverSocket = new ServerSocket(port);
49 public void startServer(CompletableFuture<Boolean> serverStarted) throws IOException {
55 OwserverPacket receivedPacket;
56 List<OwserverPacket> answerPackets;
57 serverStarted.complete(true);
60 final Socket connectionSocket = serverSocket.accept();
61 final DataInputStream inputStream = new DataInputStream(connectionSocket.getInputStream());
62 final DataOutputStream outputStream = new DataOutputStream(connectionSocket.getOutputStream());
64 receivedPacket = new OwserverPacket(inputStream, OwserverPacketType.REQUEST);
65 logger.debug("received {}", receivedPacket);
67 answerPackets = processPacket(receivedPacket);
69 answerPackets.forEach(answerPacket -> {
70 logger.debug("answering {}", answerPacket);
72 outputStream.write(answerPacket.toBytes());
73 } catch (IOException e) {
74 logger.error("I/O Error: {}", e.getMessage());
78 } catch (IOException e) {
79 logger.error("I/O Error: {}", e.getMessage());
80 } catch (OwException e) {
81 Assert.fail("caught unexpected OwException");
87 public void stopServer() throws IOException {
92 private List<OwserverPacket> processPacket(OwserverPacket inputPacket) {
93 List<OwserverPacket> returnPackets = new ArrayList<>();
94 OwserverPacket returnPacket = new OwserverPacket(OwserverPacketType.RETURN);
95 switch (inputPacket.getMessageType()) {
97 returnPacket.setPayload("");
98 returnPackets.add(returnPacket);
101 returnPacket.setPayload("/00.0123456789ab,/00.0123456789ac,/00.0123456789ad,/statistics");
102 returnPackets.add(returnPacket);
103 returnPacket = new OwserverPacket(OwserverPacketType.RETURN);
106 switch (inputPacket.getPayloadString()) {
110 returnPacket.setReturnCode(-1);
112 returnPacket.setPayload(inputPacket.getPayloadString());
113 returnPackets.add(returnPacket);
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);
123 case "testsensor/decimal":
124 returnPacket.setPayload(" 17.4");
125 returnPackets.add(returnPacket);
127 case "testsensor/decimalarray":
128 returnPacket.setPayload(" 3834, 0");
129 returnPackets.add(returnPacket);
135 returnPackets.add(returnPacket);
140 return returnPackets;