diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b583c4d367465c421bdcd2dbc0948edd4088f51..f03a39fd0c735b0e7f46a02d2080948a4b17d74b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,23 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [1.4.1-SNAPSHOT] - 2020-01-04 + +### Added +- Added response Response with Status.OK on incomming ExceptionMessages +- Added response Response with Status.OK on incomming LeaveMessages +- Added response Response with Status.OK on incomming AkkaSystemJoinedMessages +- Added response Response with Status.OK on incomming AkkaSystemLeaveMessages +- Added response Response with Status.OK on incomming ForwardableP2PMessages +- Added response Response with Status.OK on incomming InitCompleteMessages +- Added response Response with Status.OK on incomming PeerOfflineMessages +- Added response Response with Status.NOT_IMPLEMENTED on incomming HandoffCompletedMessages + +### Changed +- Changed the response by an already open connection from ExceptionMessage to a Response with an ExceptionMessage +- Removed the LeaveMessage from the NetworkTool.alive() method, because this is no longer needed (the relay recognizes the broken connection) +- Corrected the JavaDoc of the Client + ## [1.4.0-SNAPSHOT] - 2019-12-27 ### Upgrade notice diff --git a/README.md b/README.md index a3abbf6b3e32ef05b41f2699bfe49d2164800123..bfa547b3dabbb76599ecde3b170c7aed19ca5e2d 100644 --- a/README.md +++ b/README.md @@ -15,9 +15,13 @@ A monitoring website is by default activated and listening on port `8080`. Remem ## Usage To establish a connection to the relay, a [JoinMessage](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/JoinMessage.java) must be sent as a handshake. -If the mediator has been successfully registered with the relay, it responds with a [Status.OK](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/Status.java) packed in a [Response](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/Response.java). +If the mediator has been successfully registered with the relay, it responds with a [BackupRelayServersMessage](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/BackupRelayServersMessage.java) packed in a [Response](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/common/src/main/java/city/sane/relay/common/messages/Response.java). No messages from or to the mediator are forwarded before the handshake. **If a handshake is not successfully performed within 30s, the connection is disconnected. If a non-valid message is sent before a handshake, the connection is also closed because an incorrect protocol/client is assumed.** +See also this diagram: + + + A dummy client can be found [here](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/server/src/test/java/city/sane/relay/server/dummy/DummyClient.java). How this is used can be seen in this [JUnit test](https://git.informatik.uni-hamburg.de/smartcity2019/relayserver/blob/master/server/src/test/java/city/sane/relay/server/ClientTest.java). diff --git a/common/src/main/java/city/sane/relay/common/tools/NetworkTool.java b/common/src/main/java/city/sane/relay/common/tools/NetworkTool.java index fb71873d7515ef2809e993363323ff9209f88e40..97e575607f2ab1f2c454fd801a5b7b48b84af76a 100644 --- a/common/src/main/java/city/sane/relay/common/tools/NetworkTool.java +++ b/common/src/main/java/city/sane/relay/common/tools/NetworkTool.java @@ -3,15 +3,10 @@ package city.sane.relay.common.tools; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; -import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.net.URL; -import org.apache.commons.codec.Charsets; - -import city.sane.relay.common.messages.LeaveMessage; - public final class NetworkTool { /** * The minimum server port number. @@ -96,8 +91,6 @@ public final class NetworkTool { /** * Checks to see if a specific host:port is available. * - * Sends a LeaveMessage to avoid using unnecessary resources. - * * @param host host name or IP address to check for availability * @param port the port number to check for availability * @throws IllegalArgumentException is thrown if the port number is out of range @@ -108,8 +101,6 @@ public final class NetworkTool { throw new IllegalArgumentException("Invalid port: " + port); try (Socket s = new Socket(host, port)) { - PrintWriter out = new PrintWriter(s.getOutputStream(), true, Charsets.UTF_8); - out.println(MessageJSONTool.getGson().toJson(new LeaveMessage())); return true; } catch (IOException e) { // Do nothing diff --git a/docs/diagrams/ForwardableMessageAction-sequence-diagram.drawio b/docs/diagrams/ForwardableMessageAction-sequence-diagram.drawio new file mode 100644 index 0000000000000000000000000000000000000000..748c1fa0624e9d9259152014e8236a531b4bacf7 --- /dev/null +++ b/docs/diagrams/ForwardableMessageAction-sequence-diagram.drawio @@ -0,0 +1 @@ +<mxfile host="Electron" modified="2020-01-05T00:56:39.723Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.4.2 Chrome/78.0.3904.130 Electron/7.1.4 Safari/537.36" etag="1H6kZJtl_hSw3gVc7NBq" version="12.4.2" type="device" pages="1"><diagram id="jNmw1OtuLjn-EWaEBNeS" name="Seite-1">7Vhbc5s4FP41PCbDxeD40Zek3Z1mtk1mtu1TR4ZjrIlArBCx3V+/RyDumJI23stM/GL0gS6c7ztHnzCcdXR8J0iyv+cBMMM2g6PhbAzbtk3Pxj+FnDTiuFaBhIIGBdYAHul30KCp0YwGkLYelJwzSZM26PM4Bl+2MCIEP7Qf23HWnjUhIfSAR5+wPvqZBnJfoDf2vMbfAw335cyWtyjuRKR8WL9JuicBPzQg59Zw1oJzWVxFxzUwFb0yLkW/uzN3q4UJiOWUDr99+rr69mHD39u///FsP9x9jpbx1awY5ZmwTL+w4SwfgJGTXrQ8lZHA9SfqMovYB7oDRmNsrRIQNAIJAu8wDX+ssdVhTyU8JsRXXQ8oEsT2MmLYsvASaZMEu4iqzRhJUrrNZzUREeBnIqXP8ABpoQ6F8kyqmdYV6/mjPIsDCPRQVbzNfNyI+vqakS2wFfGfwrzDmjOupo95/kKpFPyp4loNtMM13pGIMqXhP0EEJCYa1nq1MGorwmgYY8NHPvJX16EFIeF4ljOrUgLmEHAMm8DQm7qDN1tce3Oz+ukBdDJdOZ7W1qGWpmVqbN+QpbfQINHpEFZT1YrBCy2aFwjI7QuoK5wG3QmnscyX4K4Md9PRDxdyz0MeE9ZUUM2q+b9h9XyunaV65ra4rWhsUdtndn4pYr2hynAPASUSA/tWHP794jAzTSwOEyqCO6Qb71LCmb9VhKkVwRvlt0ztF1YE72LM3vSYTSEOELnj4kAwXpiY95CmylKNUK4iRdFhLXUgt1xKHuENHGypLJvCGPefcggX/kUTmje+TmJ3IpcQoNnTiwS25YfbGljlAN4o11tRrXqN5yy+Os+EDz9OE0lECGMacYc1ItCjSSx8bcM7wLju+lHlWa0t1zbHjIXtdjRUvI4epCOjalU/r6zFQM3wmFTbAa7MC9XVI/yVQYwxxdMEJaEgUe7nhQo2KofGoVrvGTXioUEH7VSOjAutB+/pFXNZtnejomB0dUYZ60C9+tDVe0SDIBfY0PbXrm2vYSGR6ba1uJpZ/UoyG7KN9qUqSbmAtrvoE7f0JeXxm9v4D7iNxVS3MV9cO84/eQSxrDfHMdVxWOYoyTc/dwhxL8ftwDGky23DNviMpKmio5nYlYe4Mq9NlHDTSCCwKIHNsekzNqdmqyGGRmF+FSPgTjQC1pn8bHAzZPRL7BcNw8Bhw+6yfsYk9MZaeOPmo7vtFKG5mPmw+ieWNWF+hvFC5+CRSG0U8TZNii0AMIginWAYphsBofYTUm80/RJ1vrgYtrPLf2N1QX8d1VMYVYR/XC/GjyiYUXbHXFivIjfb7IzqtUfgu10KL1QDNuuvrcXj9Udr5/Zv</diagram></mxfile> \ No newline at end of file diff --git a/docs/diagrams/JoinMessageAction-sequence-diagram.drawio b/docs/diagrams/JoinMessageAction-sequence-diagram.drawio new file mode 100644 index 0000000000000000000000000000000000000000..5bb0015d5f7aa2de0550047b3dee95da143d0fc7 --- /dev/null +++ b/docs/diagrams/JoinMessageAction-sequence-diagram.drawio @@ -0,0 +1 @@ +<mxfile host="Electron" modified="2020-01-04T21:05:56.588Z" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/12.4.2 Chrome/78.0.3904.130 Electron/7.1.4 Safari/537.36" etag="2PvFMpCWPjXDKACj6eKU" version="12.4.2" type="device" pages="1"><diagram name="Page-1" id="13e1069c-82ec-6db2-03f1-153e76fe0fe0">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</diagram></mxfile> \ No newline at end of file diff --git a/docs/diagrams/pdf/JoinMessageAction-sequence-diagram.pdf b/docs/diagrams/pdf/JoinMessageAction-sequence-diagram.pdf new file mode 100644 index 0000000000000000000000000000000000000000..90bf62c901c6dcef99176c19fede7a50e3d5ee84 Binary files /dev/null and b/docs/diagrams/pdf/JoinMessageAction-sequence-diagram.pdf differ diff --git a/server/src/main/java/city/sane/relay/server/actions/ExceptionMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/ExceptionMessageAction.java index 750516c6bdb34f6b9e8ccbceca051973f85f8dd7..1c1ab15fcf020cc18083232f39d3f846dec324d1 100644 --- a/server/src/main/java/city/sane/relay/server/actions/ExceptionMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/ExceptionMessageAction.java @@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory; import city.sane.relay.common.messages.ExceptionMessage; import city.sane.relay.common.messages.Response; +import city.sane.relay.common.messages.Status; import city.sane.relay.server.RelayServer; import city.sane.relay.server.actions.p2p.MessageAction; import city.sane.relay.server.client.Client; @@ -17,7 +18,7 @@ public class ExceptionMessageAction implements RelayAction<ExceptionMessage> { @Override public void onMessage(ExceptionMessage message, Client client2, RelayServer relay2) { LOG.error("Received exception message: {}", message.getException()); - + client2.sendMessage(new Response(Status.OK, message.messageID)); } @Override diff --git a/server/src/main/java/city/sane/relay/server/actions/JoinMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/JoinMessageAction.java index 675c15e7b839f2dc4c5376c0e956ee02945b6d54..ef290bab216d3010005ee9602c40f82607b0ea49 100644 --- a/server/src/main/java/city/sane/relay/server/actions/JoinMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/JoinMessageAction.java @@ -48,9 +48,11 @@ public class JoinMessageAction implements RelayAction<JoinMessage> { client.close(false); } } else { - client.sendException(new ExceptionMessage( - "This akka system has already an open connection to this relay server. Can't open more sockets.")); - client.close(false); + client.sendExceptionAsResponse(new ExceptionMessage( + "This akka system has already an open connection to this relay server. Can't open more sockets."), + message.messageID); + if (!client.isInitialized()) + client.close(false); } } diff --git a/server/src/main/java/city/sane/relay/server/actions/LeaveMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/LeaveMessageAction.java index 61a4f7f35081cb67e16f31163ddaf1a5cefffc75..dcdd37677e5b7e1709ecd2dd4ddffb200dd83602 100644 --- a/server/src/main/java/city/sane/relay/server/actions/LeaveMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/LeaveMessageAction.java @@ -2,6 +2,7 @@ package city.sane.relay.server.actions; import city.sane.relay.common.messages.LeaveMessage; import city.sane.relay.common.messages.Response; +import city.sane.relay.common.messages.Status; import city.sane.relay.server.RelayServer; import city.sane.relay.server.actions.p2p.MessageAction; import city.sane.relay.server.client.Client; @@ -11,6 +12,7 @@ public class LeaveMessageAction implements RelayAction<LeaveMessage> { @Override public void onMessage(LeaveMessage message, Client client, RelayServer relay) { + client.sendMessage(new Response(Status.OK, message.messageID)); client.close(true); } diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemJoinedMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemJoinedMessageAction.java index 0527a6eb66a2a26397e96170f9a24c5316cb3417..36bfa906b574d33ec8b59dae938433609e8bc961 100644 --- a/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemJoinedMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemJoinedMessageAction.java @@ -4,6 +4,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import city.sane.relay.common.messages.Response; +import city.sane.relay.common.messages.Status; import city.sane.relay.common.messages.p2p.AkkaSystemJoinedMessage; import city.sane.relay.server.RelayServer; import city.sane.relay.server.actions.RelayAction; @@ -19,6 +20,7 @@ public class AkkaSystemJoinedMessageAction implements RelayAction<AkkaSystemJoin relay.getNewAkkaSystemsBucket().add(message.getAkkaSystemId()); LOG.debug("Added the Akka system {} with the channels {} to the remote client bucket.", message.getAkkaSystemId(), message.getChannels()); + client.sendMessage(new Response(Status.OK, message.messageID)); } @Override diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemLeaveMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemLeaveMessageAction.java index 1fdaf27063132ffb004cbb10151474759cd599c9..89a6cb9a65386c94a9251b7393eb68537d637ee4 100644 --- a/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemLeaveMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/p2p/AkkaSystemLeaveMessageAction.java @@ -4,6 +4,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import city.sane.relay.common.messages.Response; +import city.sane.relay.common.messages.Status; import city.sane.relay.common.messages.p2p.AkkaSystemLeaveMessage; import city.sane.relay.server.RelayServer; import city.sane.relay.server.actions.RelayAction; @@ -18,6 +19,7 @@ public class AkkaSystemLeaveMessageAction implements RelayAction<AkkaSystemLeave public void onMessage(AkkaSystemLeaveMessage message, Client client, RelayServer relay) { relay.getClientBucket().removeClient(message.getAkkaSystemId()); LOG.debug("Removed the Akka system {} from the local client bucket.", message.getAkkaSystemId()); + client.sendMessage(new Response(Status.OK, message.messageID)); } @Override diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/ForwardableP2PMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/ForwardableP2PMessageAction.java index e31d1d05918e1ad4dd28fab7203eb005f8e98f88..19c3e5b000ea6b0827620de0a9c9a1ffa93c0a0b 100644 --- a/server/src/main/java/city/sane/relay/server/actions/p2p/ForwardableP2PMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/p2p/ForwardableP2PMessageAction.java @@ -8,6 +8,7 @@ import city.sane.relay.common.messages.ForwardableMessage; import city.sane.relay.common.messages.p2p.ForwardableP2PMessage; import city.sane.relay.common.models.AkkaId; import city.sane.relay.common.messages.Response; +import city.sane.relay.common.messages.Status; import city.sane.relay.server.RelayServer; import city.sane.relay.server.actions.RelayAction; import city.sane.relay.server.client.Client; @@ -27,6 +28,7 @@ public class ForwardableP2PMessageAction implements RelayAction<ForwardableP2PMe localAkkaSystems.keySet().retainAll(AkkaSystemFilter.filter(sender, receiver, localAkkaSystems.keySet())); relay.broadcastMessageLocally(fwdMessage, localAkkaSystems); + client.sendMessage(new Response(Status.OK, message.messageID)); } @Override diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/HandoffCompletedMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/HandoffCompletedMessageAction.java index 4ccbf42dea1a343b21c79f9a73fb04710470669f..45804a1266accb04700cab2296dbc155f818b526 100644 --- a/server/src/main/java/city/sane/relay/server/actions/p2p/HandoffCompletedMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/p2p/HandoffCompletedMessageAction.java @@ -1,6 +1,7 @@ package city.sane.relay.server.actions.p2p; import city.sane.relay.common.messages.Response; +import city.sane.relay.common.messages.Status; import city.sane.relay.common.messages.p2p.HandoffCompletedMessage; import city.sane.relay.server.RelayServer; import city.sane.relay.server.actions.RelayAction; @@ -11,7 +12,7 @@ public class HandoffCompletedMessageAction implements RelayAction<HandoffComplet @Override public void onMessage(HandoffCompletedMessage message, Client client, RelayServer relay) { - // This message does not comes from the relay server + client.sendMessage(new Response(Status.NOT_IMPLEMENTED, message.messageID)); } @Override diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/InitCompleteMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/InitCompleteMessageAction.java index 42964a730d6fb99aa467c3973a7d452e21efcd8c..4e8a261c4fd2a4538e9f95723a4ce62827da70ee 100644 --- a/server/src/main/java/city/sane/relay/server/actions/p2p/InitCompleteMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/p2p/InitCompleteMessageAction.java @@ -1,6 +1,7 @@ package city.sane.relay.server.actions.p2p; import city.sane.relay.common.messages.Response; +import city.sane.relay.common.messages.Status; import city.sane.relay.common.messages.p2p.InitCompleteMessage; import city.sane.relay.server.RelayServer; import city.sane.relay.server.actions.RelayAction; @@ -15,6 +16,7 @@ public class InitCompleteMessageAction implements RelayAction<InitCompleteMessag @Override public void onMessage(InitCompleteMessage message, Client client, RelayServer relay) { relay.getRelayP2PAgent().checkIfRelocationNeeded(); + client.sendMessage(new Response(Status.OK, message.messageID)); } @Override diff --git a/server/src/main/java/city/sane/relay/server/actions/p2p/PeerOfflineMessageAction.java b/server/src/main/java/city/sane/relay/server/actions/p2p/PeerOfflineMessageAction.java index 99a59a0076b1ae09e1c39c369a88564a4150d69e..539666fe31911c7d8b7fde81bcdda6fa5867a65a 100644 --- a/server/src/main/java/city/sane/relay/server/actions/p2p/PeerOfflineMessageAction.java +++ b/server/src/main/java/city/sane/relay/server/actions/p2p/PeerOfflineMessageAction.java @@ -8,6 +8,7 @@ import org.slf4j.LoggerFactory; import com.google.common.collect.Sets; import city.sane.relay.common.messages.Response; +import city.sane.relay.common.messages.Status; import city.sane.relay.common.messages.p2p.PeerOfflineMessage; import city.sane.relay.common.models.AkkaId; import city.sane.relay.server.RelayServer; @@ -29,6 +30,7 @@ public class PeerOfflineMessageAction implements RelayAction<PeerOfflineMessage> relay.getClientBucket().removeClients(akkaSystemsToRemove); LOG.debug("Removed received akka system IDs from the client bucket: {}", akkaSystemsToRemove); } + client.sendMessage(new Response(Status.OK, message.messageID)); } @Override diff --git a/server/src/main/java/city/sane/relay/server/client/Client.java b/server/src/main/java/city/sane/relay/server/client/Client.java index c48904f7a5be800153cf532f9bfe18fafbeb08e6..55bff3a9f682d3d6669260b814b351064c02f07e 100644 --- a/server/src/main/java/city/sane/relay/server/client/Client.java +++ b/server/src/main/java/city/sane/relay/server/client/Client.java @@ -100,7 +100,6 @@ public class Client extends Thread { } if (!isInitialized() && !socket.isClosed() && !isClosed) { - sendException(new ExceptionMessage( "Handshake did not take place successfully in " + timeout + " ms. Connection is closed.")); close(false); @@ -237,7 +236,8 @@ public class Client extends Thread { * Sends a message to the remote host without any response. * * @param message message that should be sent - * @throws IllegalStateException if the client has not yet been initialized. + * @throws IllegalStateException if the client has already been prompted to + * close */ public void sendMessage(Message message) { if (isClosed) { @@ -257,7 +257,8 @@ public class Client extends Thread { * have been sent and a response received * @param responseClass the class of the response object, to avoid * ClassCastExceptions - * @throws IllegalStateException if the client has not yet been initialized. + * @throws IllegalStateException if the client has already been prompted to + * close * @return a future that can be fulfilled with a {@link Message response} to the * message */ @@ -282,7 +283,7 @@ public class Client extends Thread { futures.remove(message.messageID); futuresTimeouted++; } - + }); outputQueue.add(gson.toJson(message)); @@ -298,7 +299,8 @@ public class Client extends Thread { * @param message message that should be sent * @param responseClass the class of the response object, to avoid * ClassCastExceptions - * @throws IllegalStateException if the client has not yet been initialized. + * @throws IllegalStateException if the client has already been prompted to + * close * @return a future that can be fulfilled with a {@link Message response} to the * message */ @@ -352,42 +354,42 @@ public class Client extends Thread { public IPAddress getClientsIP() { return clientsIP; } - + /** * @return the boot timestamp */ public long getBootTime() { return bootTime; } - + /** * @return true if the client is terminated/dead */ public boolean isTerminated() { return isTerminated; } - + /** * @return the amount of pending futures */ public int pendingFutures() { return futures.size(); } - + /** * @return the amount of futures that have time outed */ public int timoutedFutures() { return futuresTimeouted; } - + /** * @return the amount of pending out messages */ public int pendingOutMsg() { return outputQueue.size(); } - + /** * @return the amount of pending in messages */ @@ -595,8 +597,9 @@ public class Client extends Thread { processIncomingMessage(message); } } catch (IOException e) { - LOG.debug("[Client-{}] Closed input socket.", uid); + // } finally { + LOG.debug("[Client-{}] Closed input socket.", uid); close(true); } } diff --git a/server/src/test/java/city/sane/relay/server/actions/JoinMessageActionTest.java b/server/src/test/java/city/sane/relay/server/actions/JoinMessageActionTest.java index c39d2bf5ff59047d80e87e6fde5bcb0de07e9d8e..c14b87254f62ad0ab8632a4b8e9ae5aaa4c4b7fe 100644 --- a/server/src/test/java/city/sane/relay/server/actions/JoinMessageActionTest.java +++ b/server/src/test/java/city/sane/relay/server/actions/JoinMessageActionTest.java @@ -57,11 +57,12 @@ public class JoinMessageActionTest extends ActionTest { JoinMessage msg = new JoinMessage(AkkaId.of("akkaSystem"), new HashSet<>()); classUnderTest.onMessage(msg, mockClient, mockRelay); - verify(mockClient, times(1)).sendException(new ExceptionMessage( - "This akka system has already an open connection to this relay server. Can't open more sockets.")); + verify(mockClient, times(1)).sendExceptionAsResponse(new ExceptionMessage( + "This akka system has already an open connection to this relay server. Can't open more sockets."), + msg.messageID); verify(mockClient, never()).setInitialized(anyBoolean()); verify(mockClient, never()).setUID(any()); - verify(mockClient, times(1)).close(false); + verify(mockClient, never()).close(false); } @Test @@ -72,8 +73,9 @@ public class JoinMessageActionTest extends ActionTest { JoinMessage msg = new JoinMessage(AkkaId.of("akkaSystem"), new HashSet<>()); classUnderTest.onMessage(msg, mockClient, mockRelay); - verify(mockClient, times(1)).sendException(new ExceptionMessage( - "This akka system has already an open connection to this relay server. Can't open more sockets.")); + verify(mockClient, times(1)).sendExceptionAsResponse(new ExceptionMessage( + "This akka system has already an open connection to this relay server. Can't open more sockets."), + msg.messageID); verify(mockClient, never()).setInitialized(anyBoolean()); verify(mockClient, never()).setUID(any()); verify(mockClient, times(1)).close(false); diff --git a/server/src/test/java/city/sane/relay/server/client/ClientIntegrationTest.java b/server/src/test/java/city/sane/relay/server/client/ClientIntegrationTest.java index 65010ceee4c03f4cc38d45da2ba8ccb64eb88589..7b85d34fb7714e6f362f0fdc2d4b2a9acc8f0544 100644 --- a/server/src/test/java/city/sane/relay/server/client/ClientIntegrationTest.java +++ b/server/src/test/java/city/sane/relay/server/client/ClientIntegrationTest.java @@ -460,11 +460,15 @@ public class ClientIntegrationTest { }); client2.addListener(msg -> { - if (msg instanceof ExceptionMessage) { - ExceptionMessage s = (ExceptionMessage) msg; - if (s.getException().equals("This akka system has already an open " - + "connection to this relay server. Can't open more sockets.")) { - lock.countDown(); + if (msg instanceof Response) { + Response f = (Response) msg; + + if (f.getMessageObj() instanceof ExceptionMessage) { + ExceptionMessage s = (ExceptionMessage) f.getMessageObj(); + if (s.getException().equals("This akka system has already an open " + + "connection to this relay server. Can't open more sockets.")) { + lock.countDown(); + } } } }); @@ -501,16 +505,12 @@ public class ClientIntegrationTest { if (f.getMessageObj() instanceof BackupRelayServersMessage) { lock.countDown(); client.sendMessage(new JoinMessage(AkkaId.of("testID1"), channels)); - } - } - }); - - client.addListener(msg -> { - if (msg instanceof ExceptionMessage) { - ExceptionMessage s = (ExceptionMessage) msg; - if (s.getException().equals("This akka system has already an open " - + "connection to this relay server. Can't open more sockets.")) { - lock.countDown(); + } else if (f.getMessageObj() instanceof ExceptionMessage) { + ExceptionMessage s = (ExceptionMessage) f.getMessageObj(); + if (s.getException().equals("This akka system has already an open " + + "connection to this relay server. Can't open more sockets.")) { + lock.countDown(); + } } } });