From 4fd4855a8f075581416f2694ffe7398075e07b3a Mon Sep 17 00:00:00 2001
From: Ivan Olexyn <ivan@olexyn.com>
Date: Sun, 19 Apr 2020 22:29:32 +0200
Subject: [PATCH] + mock handlers.

---
 mispbridge/src/core/BridgeServlet.java  |  2 +
 mispclient/src/core/ClientServlet.java  | 10 ++--
 mispmock/src/actor/ActorRunnable.java   |  4 +-
 mispmock/src/actor/AppMock.java         | 41 +++++++++++---
 mispmock/src/actor/UserMock.java        |  4 +-
 mispmock/src/core/BridgeMock.java       | 20 +++++--
 mispmock/src/core/ClientMock.java       | 75 ++++++++++++-------------
 mispmock/src/exchange/ExchangeMock.java | 14 +++++
 mispmock/src/exchange/ResponseMock.java |  5 +-
 9 files changed, 112 insertions(+), 63 deletions(-)

diff --git a/mispbridge/src/core/BridgeServlet.java b/mispbridge/src/core/BridgeServlet.java
index 13c9292..39d9349 100644
--- a/mispbridge/src/core/BridgeServlet.java
+++ b/mispbridge/src/core/BridgeServlet.java
@@ -36,6 +36,7 @@ public class BridgeServlet extends HttpServlet {
                     e.printStackTrace();
                 }
             });
+            handleGetLinkThread.setName("handleGetLinkThread");
             handleGetLinkThread.start();
         } else {
             Ride ridePayload = new Ride(jsonPayload);
@@ -50,6 +51,7 @@ public class BridgeServlet extends HttpServlet {
                         e.printStackTrace();
                     }
                 });
+                handleGetRideRequestDataThread.setName("handleGetRideRequestDataThread");
                 handleGetRideRequestDataThread.start();
             }
         }
diff --git a/mispclient/src/core/ClientServlet.java b/mispclient/src/core/ClientServlet.java
index 9d8c71b..1966ad6 100644
--- a/mispclient/src/core/ClientServlet.java
+++ b/mispclient/src/core/ClientServlet.java
@@ -26,9 +26,9 @@ public class ClientServlet extends HttpServlet {
     public ClientServlet() {
 
         // Thread : while AvailableRides < 256 , add Ride to AvailableRides , send POST (Ride) [DONE]
-        new Thread(new PostRideRunnable(this)).start();
-
-
+        Thread postRideThread = new Thread(new PostRideRunnable(this));
+        postRideThread.setName("postRideThread");
+        postRideThread.start();
     }
 
 
@@ -65,7 +65,7 @@ public class ClientServlet extends HttpServlet {
     /**
      * # send GET (Request) to App
      */
-    void sendGetRequest(Ride ride) throws IOException {
+    void sendGetRequest(Ride ride) throws IOException, ServletException, InterruptedException {
 
         // send FOO
         // TODO make sure as many as possible tyes of requests can be forwarded.
@@ -85,7 +85,7 @@ public class ClientServlet extends HttpServlet {
     /**
      * # send GET (Ride)(Request)(Data)
      */
-    void sendGetRideRequestData(Ride oldRide) throws IOException {
+    void sendGetRideRequestData(Ride oldRide) throws IOException, ServletException, InterruptedException {
 
         HttpURLConnection connection = ConnectionHelper.make("GET", MISP_BRIDGE_URL);
 
diff --git a/mispmock/src/actor/ActorRunnable.java b/mispmock/src/actor/ActorRunnable.java
index 7a190dd..1805504 100644
--- a/mispmock/src/actor/ActorRunnable.java
+++ b/mispmock/src/actor/ActorRunnable.java
@@ -47,8 +47,8 @@ public abstract class ActorRunnable implements Runnable {
     }
 
 
-    abstract void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;
+    public abstract void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;
 
-    abstract void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;
+    public abstract void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException;
 
 }
diff --git a/mispmock/src/actor/AppMock.java b/mispmock/src/actor/AppMock.java
index a09e311..1497269 100644
--- a/mispmock/src/actor/AppMock.java
+++ b/mispmock/src/actor/AppMock.java
@@ -1,36 +1,63 @@
 package actor;
 
-import actor.ActorRunnable;
+import core.MockSet;
+import exchange.ExchangeMock;
+import exchange.RequestMock;
+import org.apache.commons.io.IOUtils;
+import org.json.JSONObject;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
-
-import core.MockSet;
+import java.io.PrintWriter;
 
 public class AppMock extends ActorRunnable {
 
-    public AppMock(MockSet mockSet){
+    public AppMock(MockSet mockSet) {
         super(mockSet);
     }
 
 
     @Override
     public void run() {
+        while (true) {
+            try {
+                Thread.sleep(100);
 
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+            }
+
+        }
     }
 
     @Override
-    void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+
+        RequestMock mockRequest = (RequestMock) request;
+        ExchangeMock exchange = mockRequest.exchange;
 
+        synchronized (exchange) {
+            String parsedRequest = IOUtils.toString(request.getReader());
+            JSONObject obj = new JSONObject(parsedRequest);
+            parsedRequest = obj.getString("request");
 
+            String dataString = "DATA" + parsedRequest.split("-")[1];
+            JSONObject dataObj = new JSONObject();
+            dataObj.put("data", dataString);
 
-        //Main.clientRunnable.responses.add(mockResponse);
+            exchange.response.setStatus(200);
+            PrintWriter writer = exchange.response.getWriter();
+            writer.write(dataObj.toString());
+            writer.flush();
+            writer.close();
 
+            exchange.notify();
+        }
     }
 
     @Override
-    void doPost(HttpServletRequest request, HttpServletResponse response) {
+    public void doPost(HttpServletRequest request, HttpServletResponse response) {
 
     }
 }
diff --git a/mispmock/src/actor/UserMock.java b/mispmock/src/actor/UserMock.java
index c972d0e..4c07f2c 100644
--- a/mispmock/src/actor/UserMock.java
+++ b/mispmock/src/actor/UserMock.java
@@ -35,12 +35,12 @@ public class UserMock extends ActorRunnable {
     }
 
     @Override
-    void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
+    public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
 
     }
 
     @Override
-    void doPost(HttpServletRequest request, HttpServletResponse response) {
+    public void doPost(HttpServletRequest request, HttpServletResponse response) {
 
     }
 
diff --git a/mispmock/src/core/BridgeMock.java b/mispmock/src/core/BridgeMock.java
index dd0c5f6..a92f686 100644
--- a/mispmock/src/core/BridgeMock.java
+++ b/mispmock/src/core/BridgeMock.java
@@ -67,11 +67,14 @@ public class BridgeMock extends BridgeServlet {
                     Thread.sleep(100);
                     ride.wait();
                 }
+                ride.setState(State.LOADED);
 
                 exchange.response.setStatus(200);
                 PrintWriter writer = exchange.response.getWriter();
-                writer.print(ride.getData());
-                ride.setState(State.LOADED);
+                writer.write(ride.getData());
+                writer.flush();
+                writer.close();
+
                 ride.notify();
             }
             exchange.notify();
@@ -112,7 +115,9 @@ public class BridgeMock extends BridgeServlet {
 
                 exchange.response.setStatus(200);
                 PrintWriter writer = response.getWriter();
-                writer.print(ride.json());
+                writer.write(ride.json());
+                writer.flush();
+                writer.close();
                 rideMap.remove(ride.getID());
                 ride.notify();
 
@@ -167,10 +172,13 @@ public class BridgeMock extends BridgeServlet {
 
                 exchange.response.setStatus(200);
                 PrintWriter writer = response.getWriter();
-                writer.print(ride.json());
-                exchange.notify();
+                //writer.print(ride.json());
+                writer.write(ride.json());
+                writer.flush();
+                writer.close();
+                ride.notify();
             }
-
+            exchange.notify();
         }
 
 
diff --git a/mispmock/src/core/ClientMock.java b/mispmock/src/core/ClientMock.java
index 0e27490..246801a 100644
--- a/mispmock/src/core/ClientMock.java
+++ b/mispmock/src/core/ClientMock.java
@@ -1,6 +1,7 @@
 package core;
 
 import exchange.ExchangeMock;
+import org.json.JSONObject;
 
 import javax.servlet.ServletException;
 import java.io.DataOutputStream;
@@ -55,31 +56,27 @@ public class ClientMock extends ClientServlet {
      * # send GET (Request) to App
      */
     @Override
-    void sendGetRequest(Ride ride) throws IOException {
-
-        HttpURLConnection connection = ConnectionHelper.make("GET", ClientServlet.APP_URL);
-
-        // send GET (Request)
-        connection.setDoOutput(true);
-        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
-        outputStream.writeBytes(ride.getRequest());
-        outputStream.flush();
-        outputStream.close();
-
-        // handle OK (Data)
-        // remove Ride from BookedRides
-        // add Ride to LoadedRides
-        // send GET (Ride)(Data)
-        if (connection.getResponseCode() == 200) {
-            String parsedData = ConnectionHelper.parseString(connection);
-            ride.setData(parsedData);
-            ride.setState(State.LOADED);
-        }
+    void sendGetRequest(Ride ride) throws IOException, ServletException, InterruptedException {
 
-        sendGetRideRequestData(ride);
+        // Mock Exchange
+        ExchangeMock exchange = new ExchangeMock();
 
+        exchange.request.setMethod("GET");
+        exchange.request.setContentType("application/json");
+        exchange.request.setContent(ride.json().getBytes());
 
+        synchronized (exchange){
+            // Mock GET (Request)
+            exchange.notify();
+            mockSet.appMock.doGet(exchange.request,exchange.response);
+            exchange.wait();
 
+            // handle OK (Data)
+            Ride parsedRide = new Ride(exchange.response.getContentAsString());
+            ride.setData(parsedRide.getData());
+            ride.setState(State.LOADED);
+            sendGetRideRequestData(ride);
+        }
 
     }
 
@@ -88,24 +85,24 @@ public class ClientMock extends ClientServlet {
      * # send GET (Ride)(Request)(Data)
      */
     @Override
-    void sendGetRideRequestData(Ride ride) throws IOException {
-
-        HttpURLConnection connection = ConnectionHelper.make("GET", ClientServlet.MISP_BRIDGE_URL);
-
-        // send GET (Ride)(Request)(Data)
-        connection.setDoOutput(true);
-        DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
-        outputStream.writeBytes(ride.json());
-        outputStream.flush();
-        outputStream.close();
-
-        // handle OK (Ride)
-        // remove Ride from LoadedRides
-        if (connection.getResponseCode() == 200) {
-            Ride shellIdRide = ConnectionHelper.parseRide(connection);
-            if (shellIdRide.getID() != null) {
-                rideMap.remove(ride.getID());
-            }
+    void sendGetRideRequestData(Ride ride) throws IOException, ServletException, InterruptedException {
+
+        // Mock Exchange
+        ExchangeMock exchange = new ExchangeMock();
+
+        exchange.request.setMethod("GET");
+        exchange.request.setContentType("application/json");
+        exchange.request.setContent(ride.json().getBytes());
+
+        synchronized (exchange){
+            // Mock GET (Ride)(Request)(Data)
+            exchange.notify();
+            mockSet.bridgeMock.doGet(exchange.request,exchange.response);
+            exchange.wait();
+
+            // handle OK (Ride)
+            Ride parsedRide = new Ride(exchange.response.getContentAsString());
+            rideMap.remove(parsedRide.getID());
         }
     }
 
diff --git a/mispmock/src/exchange/ExchangeMock.java b/mispmock/src/exchange/ExchangeMock.java
index 9fea683..aca954b 100644
--- a/mispmock/src/exchange/ExchangeMock.java
+++ b/mispmock/src/exchange/ExchangeMock.java
@@ -4,6 +4,20 @@ package exchange;
 import java.util.ArrayList;
 import java.util.List;
 
+/**
+ * How "exchange" mocks an exchange:<br>
+ * <br>
+ * An "exchange" corresponds to request & reply pair.<br>
+ * - i.e. a GET & OK pair.<br>
+ * Steps:<br>
+ * 1. new Exchange()<br>
+ * 2. set properties of .request<br>
+ * 3. "send" request by using exchange.notify(); recipient.doGet();<br>
+ * 4. recipient does someting with request<br>
+ * - -  recipient sets proerties of .response<br>
+ * - -  recipient sends reply using exchange.notify();<br>
+ * 5. "receive" response by using exchange.wait();
+ */
 public class ExchangeMock {
 
     public static List<ExchangeMock> exchangeList = new ArrayList<>();
diff --git a/mispmock/src/exchange/ResponseMock.java b/mispmock/src/exchange/ResponseMock.java
index 501c80c..dad1a3f 100644
--- a/mispmock/src/exchange/ResponseMock.java
+++ b/mispmock/src/exchange/ResponseMock.java
@@ -8,6 +8,7 @@ import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.io.PrintWriter;
+import java.io.UnsupportedEncodingException;
 import java.util.List;
 import java.util.Locale;
 import java.util.Set;
@@ -147,8 +148,8 @@ public class ResponseMock extends MockHttpServletResponse  implements HttpServle
     }
 
     @Override
-    public PrintWriter getWriter() {
-        return null;
+    public PrintWriter getWriter() throws UnsupportedEncodingException {
+        return super.getWriter();
     }
 
     @Override