From 1f46966d614335ec4a7d7832662770a3a6b3f0ae Mon Sep 17 00:00:00 2001
From: juanf <juanf@ethz.ch>
Date: Tue, 11 Jul 2023 19:23:02 +0200
Subject: [PATCH] SSDM-13251: Additioanl Transaction Flows Tests

---
 .../core/AbstractPublicAPIWrapper.java        | 32 ++++---
 .../impl/APIServerAdapterWrapper.java         | 28 +++++-
 .../afsserver/impl/ApiServerAdapterTest.java  | 85 ++++++++++++++++++-
 3 files changed, 129 insertions(+), 16 deletions(-)

diff --git a/server-data-store/src/test/java/ch/ethz/sis/afsserver/core/AbstractPublicAPIWrapper.java b/server-data-store/src/test/java/ch/ethz/sis/afsserver/core/AbstractPublicAPIWrapper.java
index 6695bc3aeed..5051ebcf156 100644
--- a/server-data-store/src/test/java/ch/ethz/sis/afsserver/core/AbstractPublicAPIWrapper.java
+++ b/server-data-store/src/test/java/ch/ethz/sis/afsserver/core/AbstractPublicAPIWrapper.java
@@ -100,53 +100,59 @@ public abstract class AbstractPublicAPIWrapper implements PublicAPI
     @Override
     public void begin(UUID transactionId) throws Exception
     {
-        //TODO: Unused
+        Map<String, Object> args = Map.of(
+                "transactionId", transactionId);
+        process(null, "begin", args);
     }
 
     @Override
     public Boolean prepare() throws Exception
     {
-        //TODO: Unused
-        return true;
+        Map<String, Object> args = Map.of();
+        return process(Boolean.class, "prepare", args);
     }
 
     @Override
     public void commit() throws Exception
     {
-        //TODO: Unused
+        Map<String, Object> args = Map.of();
+        process(null, "commit", args);
     }
 
     @Override
     public void rollback() throws Exception
     {
-        //TODO: Unused
+        Map<String, Object> args = Map.of();
+        process(null, "rollback", args);
     }
 
     @Override
     public List<UUID> recover() throws Exception
     {
-        //TODO: Unused
-        return null;
+        Map<String, Object> args = Map.of();
+        return process(List.class, "recover", args);
     }
 
     @Override
     public String login(String userId, String password) throws Exception
     {
-        //TODO: Unused
-        return null;
+        Map<String, Object> args = Map.of(
+                "userId", userId,
+                "password", password);
+        return process(String.class, "login", args);
     }
 
     @Override
     public Boolean isSessionValid() throws Exception
     {
-        //TODO: Unused
-        return null;
+        Map<String, Object> args = Map.of();
+        return process(Boolean.class, "isSessionValid", args);
     }
 
     @Override
     public Boolean logout() throws Exception
     {
-        //TODO: Unused
-        return null;
+        Map<String, Object> args = Map.of();
+        return process(Boolean.class, "logout", args);
     }
 }
diff --git a/server-data-store/src/test/java/ch/ethz/sis/afsserver/impl/APIServerAdapterWrapper.java b/server-data-store/src/test/java/ch/ethz/sis/afsserver/impl/APIServerAdapterWrapper.java
index 91972ae7694..769ea80399f 100644
--- a/server-data-store/src/test/java/ch/ethz/sis/afsserver/impl/APIServerAdapterWrapper.java
+++ b/server-data-store/src/test/java/ch/ethz/sis/afsserver/impl/APIServerAdapterWrapper.java
@@ -36,12 +36,26 @@ public class APIServerAdapterWrapper extends AbstractPublicAPIWrapper
 
     private ApiServerAdapter apiServerAdapter;
 
+    private String interactiveSessionKey;
+
+    private String transactionManagerKey;
+
+    private String sessionToken;
 
     public APIServerAdapterWrapper(ApiServerAdapter apiServerAdapter)
     {
         this.apiServerAdapter = apiServerAdapter;
     }
 
+    public APIServerAdapterWrapper(ApiServerAdapter apiServerAdapter, String interactiveSessionKey,
+            String transactionManagerKey, String sessionToken)
+    {
+        this.apiServerAdapter = apiServerAdapter;
+        this.interactiveSessionKey = interactiveSessionKey;
+        this.transactionManagerKey = transactionManagerKey;
+        this.sessionToken = sessionToken;
+    }
+
     public Map<String, List<String>> getURIParameters(Map<String, Object> args)
     {
         Map<String, List<String>> result = new HashMap<>(args.size());
@@ -64,7 +78,17 @@ public class APIServerAdapterWrapper extends AbstractPublicAPIWrapper
         {
             HttpMethod httpMethod = ApiServerAdapter.getHttpMethod(apiMethod);
             Map<String, List<String>> requestParameters = getURIParameters(params);
-            requestParameters.put("sessionToken", List.of(UUID.randomUUID().toString()));
+            if (interactiveSessionKey != null)
+            {
+                requestParameters.put("interactiveSessionKey", List.of(interactiveSessionKey));
+            }
+            if (transactionManagerKey != null) {
+                requestParameters.put("transactionManagerKey", List.of(transactionManagerKey));
+            }
+            if (sessionToken != null)
+            {
+                requestParameters.put("sessionToken", List.of(sessionToken));
+            }
             requestParameters.put("method", List.of(apiMethod));
 
             byte[] requestBody = null;
@@ -82,7 +106,7 @@ public class APIServerAdapterWrapper extends AbstractPublicAPIWrapper
 
 
 
-            HttpResponse response = apiServerAdapter.process(httpMethod, requestParameters, null);
+            HttpResponse response = apiServerAdapter.process(httpMethod, requestParameters, requestBody);
             String contentType = response.getContentType();
             byte[] body = response.getBody();
 
diff --git a/server-data-store/src/test/java/ch/ethz/sis/afsserver/impl/ApiServerAdapterTest.java b/server-data-store/src/test/java/ch/ethz/sis/afsserver/impl/ApiServerAdapterTest.java
index 711a8bda445..a0bb758ce3c 100644
--- a/server-data-store/src/test/java/ch/ethz/sis/afsserver/impl/ApiServerAdapterTest.java
+++ b/server-data-store/src/test/java/ch/ethz/sis/afsserver/impl/ApiServerAdapterTest.java
@@ -22,15 +22,98 @@ import ch.ethz.sis.afsserver.server.impl.ApiServerAdapter;
 import ch.ethz.sis.afsserver.startup.AtomicFileSystemServerParameter;
 import ch.ethz.sis.afsjson.JsonObjectMapper;
 import ch.ethz.sis.shared.startup.Configuration;
+import org.junit.Test;
+
+import java.util.UUID;
 
 public class ApiServerAdapterTest extends ApiServerTest {
 
+
+    public UUID sessionToken = UUID.randomUUID();
+
+    public PublicAPI getPublicAPI(String interactiveSessionKey, String transactionManagerKey) throws Exception {
+        APIServer apiServer = getAPIServer();
+        Configuration configuration = ServerClientEnvironmentFS.getInstance().getDefaultServerConfiguration();
+        JsonObjectMapper jsonObjectMapper = configuration.getSharableInstance(AtomicFileSystemServerParameter.jsonObjectMapperClass);
+        ApiServerAdapter apiServerAdapter = new ApiServerAdapter(apiServer, jsonObjectMapper);
+        return new APIServerAdapterWrapper(apiServerAdapter, interactiveSessionKey, transactionManagerKey, this.sessionToken.toString());
+    }
+
     @Override
     public PublicAPI getPublicAPI() throws Exception {
         APIServer apiServer = getAPIServer();
         Configuration configuration = ServerClientEnvironmentFS.getInstance().getDefaultServerConfiguration();
         JsonObjectMapper jsonObjectMapper = configuration.getSharableInstance(AtomicFileSystemServerParameter.jsonObjectMapperClass);
         ApiServerAdapter apiServerAdapter = new ApiServerAdapter(apiServer, jsonObjectMapper);
-        return new APIServerAdapterWrapper(apiServerAdapter);
+        return new APIServerAdapterWrapper(apiServerAdapter, null, null, sessionToken.toString());
+    }
+
+    @Test
+    public void operation_state_begin_succeed() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+    }
+
+    @Test
+    public void operation_state_prepare_succeed() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+        publicAPI.prepare();
+    }
+
+    @Test
+    public void operation_state_rollback_succeed() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+        publicAPI.prepare();
+        publicAPI.rollback();
+    }
+
+    @Test
+    public void operation_state_commit_succeed() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+        publicAPI.commit();
+    }
+
+    @Test
+    public void operation_state_commitPrepared_succeed() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+        publicAPI.prepare();
+        publicAPI.commit();
+    }
+
+    @Test
+    public void operation_state_commit_reuse_succeed() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+        publicAPI.prepare();
+        publicAPI.commit();
+        publicAPI.begin(sessionToken);
+    }
+
+    @Test
+    public void operation_state_rollback_reuse_succeed() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+        publicAPI.prepare();
+        publicAPI.rollback();
+        publicAPI.begin(sessionToken);
+    }
+
+    @Test(expected = RuntimeException.class)
+    public void operation_state_begin_reuse_fails() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+        publicAPI.begin(sessionToken);
+    }
+
+    @Test
+    public void operation_state_prepare_reuse_succeed() throws Exception {
+        PublicAPI publicAPI = getPublicAPI("1234", "5678");
+        publicAPI.begin(sessionToken);
+        publicAPI.prepare();
+        publicAPI.begin(sessionToken);
     }
 }
-- 
GitLab