From 70f0d8ce3532c07dfe59fa091fb75d1540361736 Mon Sep 17 00:00:00 2001 From: Axel Uhl Date: Fri, 30 Sep 2011 10:36:39 +0200 Subject: [PATCH] added first test case towards SwissTiming SailMaster connectivity --- .../test/SailMasterConnectivityTest.java | 47 +++++++++++++++ .../test/SailMasterDummy.java | 57 +++++++++++++++++++ .../impl/SailMasterConnector.java | 31 ++++++++++ .../impl/SailMasterTransceiver.java | 45 +++++++++++++++ 4 files changed, 180 insertions(+) create mode 100644 java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SailMasterConnectivityTest.java create mode 100644 java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SailMasterDummy.java create mode 100644 java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterConnector.java create mode 100644 java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterTransceiver.java diff --git a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SailMasterConnectivityTest.java b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SailMasterConnectivityTest.java new file mode 100644 index 00000000000..15fef7e34f6 --- /dev/null +++ b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SailMasterConnectivityTest.java @@ -0,0 +1,47 @@ +package com.sap.sailing.domain.swisstimingadapter.test; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.net.Socket; +import java.net.UnknownHostException; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.sap.sailing.domain.swisstimingadapter.impl.SailMasterTransceiver; + +public class SailMasterConnectivityTest { + private SailMasterDummy sailMaster; + private static final int port = 50002; + + private SailMasterTransceiver transceiver; + + @Before + public void setUp() { + // create a SailMaster dummy on port 50002 and launch it in a separate thread + sailMaster = new SailMasterDummy(port); + new Thread(sailMaster, "SailMasterDummy on port "+port).start(); + transceiver = new SailMasterTransceiver(); + } + + @After + public void tearDown() throws IOException { + Socket s = connect(); + transceiver.sendMessage("StopServer", s.getOutputStream()); + } + + @Test + public void testRaceId() throws UnknownHostException, IOException { + Socket s = connect(); + transceiver.sendMessage("RaceId", s.getOutputStream()); + String response = transceiver.receiveMessage(s.getInputStream()); + assertEquals("RaceId|4711,A wonderful test race|4712,Not such a wonderful race", response); + } + + private Socket connect() throws UnknownHostException, IOException { + Socket s = new Socket("localhost", port); + return s; + } +} diff --git a/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SailMasterDummy.java b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SailMasterDummy.java new file mode 100644 index 00000000000..2e2453f1713 --- /dev/null +++ b/java/com.sap.sailing.domain.swisstimingadapter.test/src/com/sap/sailing/domain/swisstimingadapter/test/SailMasterDummy.java @@ -0,0 +1,57 @@ +package com.sap.sailing.domain.swisstimingadapter.test; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.ServerSocket; +import java.net.Socket; + +import com.sap.sailing.domain.swisstimingadapter.impl.SailMasterTransceiver; + +public class SailMasterDummy implements Runnable { + public static final byte STX = 0x02; + public static final byte ETX = 0x03; + + private final int port; + + private boolean stopped; + + private final SailMasterTransceiver transceiver = new SailMasterTransceiver(); + + public SailMasterDummy(int port) { + this.port = port; + } + + public void run() { + try { + ServerSocket listenOn = new ServerSocket(port); + stopped = false; + while (!stopped) { + Socket s = listenOn.accept(); + processRequests(s); + } + System.out.println("Server stopped. Thread ending."); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void processRequests(Socket s) throws IOException { + InputStream is = s.getInputStream(); + String message = transceiver.receiveMessage(is); + if (message != null) { + respondToMessage(message, s.getOutputStream()); + } + } + + private void respondToMessage(String message, OutputStream os) throws IOException { + if ("RaceId".equals(message)) { + transceiver.sendMessage("RaceId|4711,A wonderful test race|4712,Not such a wonderful race", os); + } else if ("StopServer".equals(message)) { + stopped = true; + transceiver.sendMessage("Server stopped", os); + } else { + transceiver.sendMessage("Request not understood", os); + } + } +} diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterConnector.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterConnector.java new file mode 100644 index 00000000000..619647d72c4 --- /dev/null +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterConnector.java @@ -0,0 +1,31 @@ +package com.sap.sailing.domain.swisstimingadapter.impl; + +import java.io.IOException; +import java.io.OutputStream; +import java.net.Socket; +import java.net.UnknownHostException; + +public class SailMasterConnector extends SailMasterTransceiver { + private final String host; + private final int port; + private Socket socket; + + public SailMasterConnector(String host, int port) { + super(); + this.host = host; + this.port = port; + } + + public String sendRequestAndGetResponse(String requestMessage) throws UnknownHostException, IOException { + ensureSocketIsOpen(); + OutputStream os = socket.getOutputStream(); + sendMessage(requestMessage, os); + return receiveMessage(socket.getInputStream()); + } + + private void ensureSocketIsOpen() throws UnknownHostException, IOException { + if (socket == null) { + socket = new Socket(host, port); + } + } +} diff --git a/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterTransceiver.java b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterTransceiver.java new file mode 100644 index 00000000000..e13a6ac2658 --- /dev/null +++ b/java/com.sap.sailing.domain.swisstimingadapter/src/com/sap/sailing/domain/swisstimingadapter/impl/SailMasterTransceiver.java @@ -0,0 +1,45 @@ +package com.sap.sailing.domain.swisstimingadapter.impl; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +public class SailMasterTransceiver { + private static final byte STX = 0x02; + private static final byte ETX = 0x03; + + public void sendMessage(String message, OutputStream os) throws IOException { + os.write(STX); + os.write(message.getBytes()); // TODO clarify which character set / encoding to use + os.write(ETX); + } + + public String receiveMessage(InputStream inputStream) throws IOException { + // read until an STX byte comes along + int read = inputStream.read(); + while (read != -1 && read != STX) { + read = inputStream.read(); + } + String message = null; + if (read == STX) { + message = readMessage(inputStream); + } + return message; + } + + /** + * Read bytes until EOF or ETX is reached and turn those bytes into a string. + */ + private String readMessage(InputStream is) throws IOException { + ByteArrayOutputStream bos = new ByteArrayOutputStream(4096); + int read = is.read(); + while (read != -1 && read != ETX) { + bos.write(read); + read = is.read(); + } + String message = new String(bos.toByteArray()); // TODO clarify character set / encoding with Kai + return message; + } + +}