2 * Copyright (c) 2010-2023 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 static org.junit.jupiter.api.Assertions.fail;
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;
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;
35 * The {@link OwserverTestServer} defines a server for testing the OwserverConnection class
37 * @author Jan N. Klug - Initial contribution
40 public class OwserverTestServer {
41 private final Logger logger = LoggerFactory.getLogger(OwserverTestServer.class);
43 private final ServerSocket serverSocket;
44 private boolean isRunning = false;
46 public OwserverTestServer(int port) throws IOException {
47 serverSocket = new ServerSocket(port);
50 public void startServer(CompletableFuture<Boolean> serverStarted) throws IOException {
56 OwserverPacket receivedPacket;
57 List<OwserverPacket> answerPackets;
58 serverStarted.complete(true);
61 final Socket connectionSocket = serverSocket.accept();
62 final DataInputStream inputStream = new DataInputStream(connectionSocket.getInputStream());
63 final DataOutputStream outputStream = new DataOutputStream(connectionSocket.getOutputStream());
65 receivedPacket = new OwserverPacket(inputStream, OwserverPacketType.REQUEST);
66 logger.debug("received {}", receivedPacket);
68 answerPackets = processPacket(receivedPacket);
70 answerPackets.forEach(answerPacket -> {
71 logger.debug("answering {}", answerPacket);
73 outputStream.write(answerPacket.toBytes());
74 } catch (IOException e) {
75 logger.error("I/O Error: {}", e.getMessage());
79 } catch (IOException e) {
80 logger.error("I/O Error: {}", e.getMessage());
81 } catch (OwException e) {
82 fail("caught unexpected OwException");
88 public void stopServer() throws IOException {
93 private List<OwserverPacket> processPacket(OwserverPacket inputPacket) {
94 List<OwserverPacket> returnPackets = new ArrayList<>();
95 OwserverPacket returnPacket = new OwserverPacket(OwserverPacketType.RETURN);
96 switch (inputPacket.getMessageType()) {
98 returnPacket.setPayload("");
99 returnPackets.add(returnPacket);
102 returnPacket.setPayload("/00.0123456789ab,/00.0123456789ac,/00.0123456789ad,/statistics");
103 returnPackets.add(returnPacket);
104 returnPacket = new OwserverPacket(OwserverPacketType.RETURN);
107 switch (inputPacket.getPayloadString()) {
111 returnPacket.setReturnCode(-1);
113 returnPacket.setPayload(inputPacket.getPayloadString());
114 returnPackets.add(returnPacket);
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);
124 case "testsensor/decimal":
125 returnPacket.setPayload(" 17.4");
126 returnPackets.add(returnPacket);
128 case "testsensor/decimalarray":
129 returnPacket.setPayload(" 3834, 0");
130 returnPackets.add(returnPacket);
136 returnPackets.add(returnPacket);
141 return returnPackets;