From cdafa29d841d5e785f3d291d7d287f78d90d9a09 Mon Sep 17 00:00:00 2001
From: Martin Vogel <martin.vogel@sinc.de>
Date: Tue, 28 May 2024 15:26:56 +0200
Subject: [PATCH] feat: add socket provider (planning#1779)

---
 .../fitconnect/client/util/NetworkUtils.java  | 22 +++++++++++++----
 .../client/util/SocketProvider.java           | 10 ++++++++
 .../client/util/NetworkUtilsTest.java         | 24 ++++++++++++++++++-
 3 files changed, 50 insertions(+), 6 deletions(-)
 create mode 100644 client/src/main/java/dev/fitko/fitconnect/client/util/SocketProvider.java

diff --git a/client/src/main/java/dev/fitko/fitconnect/client/util/NetworkUtils.java b/client/src/main/java/dev/fitko/fitconnect/client/util/NetworkUtils.java
index 7f98d7658..b893af265 100644
--- a/client/src/main/java/dev/fitko/fitconnect/client/util/NetworkUtils.java
+++ b/client/src/main/java/dev/fitko/fitconnect/client/util/NetworkUtils.java
@@ -11,29 +11,41 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.stream.Stream;
 
+import static dev.fitko.fitconnect.api.domain.validation.ValidationResult.*;
+
 /**
  * A testing util that checks all FIT-Connect endpoints for reachability.
  */
 public class NetworkUtils {
 
+    private final SocketProvider socketProvider;
+
+    NetworkUtils(SocketProvider socketProvider) {
+        this.socketProvider = socketProvider;
+    }
+
+    NetworkUtils() {
+        this.socketProvider = new SocketProvider();
+    }
+
     public ValidationResult checkNetworkConnections() {
         Environment e = Environments.TEST.getEnvironment();
         return Stream.of(
-                testConnection(e.getAuthBaseUrl()),
+                        testConnection(e.getAuthBaseUrl()),
                         testConnection(e.getSelfServicePortalBaseUrl()),
                         testConnection(e.getRoutingBaseUrl()),
                         testConnection(e.getSubmissionBaseUrls().get(0)))
                 .filter(ValidationResult::hasError)
                 .findFirst()
-                .orElse(ValidationResult.ok());
+                .orElse(ok());
     }
 
     private ValidationResult testConnection(String url) {
-        try (Socket socket = new Socket()) {
+        try (Socket socket = socketProvider.getSocket()) {
             socket.connect(new InetSocketAddress(getHost(url), 80), 5000);
-            return ValidationResult.ok();
+            return socket.isConnected() ? ok() : error("Socket to " + url + " could nt be connected");
         } catch (IOException | URISyntaxException e) {
-            return ValidationResult.error(e);
+            return error(e);
         }
     }
 
diff --git a/client/src/main/java/dev/fitko/fitconnect/client/util/SocketProvider.java b/client/src/main/java/dev/fitko/fitconnect/client/util/SocketProvider.java
new file mode 100644
index 000000000..ebcf9f59f
--- /dev/null
+++ b/client/src/main/java/dev/fitko/fitconnect/client/util/SocketProvider.java
@@ -0,0 +1,10 @@
+package dev.fitko.fitconnect.client.util;
+
+import java.net.Socket;
+
+public class SocketProvider {
+
+    public Socket getSocket(){
+        return new Socket();
+    }
+}
diff --git a/client/src/test/java/dev/fitko/fitconnect/client/util/NetworkUtilsTest.java b/client/src/test/java/dev/fitko/fitconnect/client/util/NetworkUtilsTest.java
index b7aefc50f..ec07133af 100644
--- a/client/src/test/java/dev/fitko/fitconnect/client/util/NetworkUtilsTest.java
+++ b/client/src/test/java/dev/fitko/fitconnect/client/util/NetworkUtilsTest.java
@@ -3,6 +3,10 @@ package dev.fitko.fitconnect.client.util;
 import dev.fitko.fitconnect.api.domain.validation.ValidationResult;
 import org.junit.jupiter.api.Test;
 
+import java.io.IOException;
+import java.net.Socket;
+import java.net.SocketAddress;
+
 import static org.junit.jupiter.api.Assertions.*;
 
 class NetworkUtilsTest {
@@ -10,10 +14,28 @@ class NetworkUtilsTest {
     @Test
     void checkNetworkConnections() {
 
-        NetworkUtils networkUtils = new NetworkUtils();
+        NetworkUtils networkUtils = new NetworkUtils(new DummySocketProvider());
 
         final ValidationResult validationResult = networkUtils.checkNetworkConnections();
 
         assertTrue(validationResult.isValid());
     }
+
+    class DummySocketProvider extends SocketProvider{
+        @Override
+        public Socket getSocket() {
+            return new DummySocket();
+        }
+
+        class DummySocket extends Socket{
+            @Override
+            public void connect(SocketAddress endpoint, int timeout) {
+                // NO-OP
+            }
+            @Override
+            public boolean isConnected() {
+                return true;
+            }
+        }
+    }
 }
\ No newline at end of file
-- 
GitLab