From 841667fb9b07a7712b4b05004f62e823b0c406ac Mon Sep 17 00:00:00 2001
From: mamunozgil <miguel.munoz-gil@hft-stuttgart.de>
Date: Fri, 17 Jan 2025 14:44:55 +0100
Subject: [PATCH] Add dynamic paths to test

---
 .../dtabackend/rest/v1/task/TaskUpload.java   |  6 +--
 .../dtabackend/utils/DockerUtil.java          | 47 +++++++++++++++----
 .../dtabackend/utils/ExecuteTestUtil.java     |  6 +--
 3 files changed, 44 insertions(+), 15 deletions(-)

diff --git a/src/main/java/de/hftstuttgart/dtabackend/rest/v1/task/TaskUpload.java b/src/main/java/de/hftstuttgart/dtabackend/rest/v1/task/TaskUpload.java
index a070bef..0e7c788 100644
--- a/src/main/java/de/hftstuttgart/dtabackend/rest/v1/task/TaskUpload.java
+++ b/src/main/java/de/hftstuttgart/dtabackend/rest/v1/task/TaskUpload.java
@@ -33,14 +33,14 @@ public class TaskUpload {
     private static final Logger LOG = LogManager.getLogger(TaskUpload.class);
 
     private final RepoUtil repoUtil;
-    private final Path testTmpPath;
+    private final Path assignmentSubmissionsPath;
     private final ExecuteTestUtil executeTestUtil;
     private final Tika tika;
 
     public TaskUpload(Environment env, RepoUtil repoUtil, ExecuteTestUtil executeTestUtil) {
         this.repoUtil = repoUtil;
         this.executeTestUtil = executeTestUtil;
-        this.testTmpPath = Paths.get(env.getProperty("tests.tmp.dir"));
+        this.assignmentSubmissionsPath = Paths.get(env.getProperty("tests.tmp.dir"));
         this.tika = new Tika();
     }
 
@@ -68,7 +68,7 @@ public class TaskUpload {
 
     private Path createWorkDirectory() throws IOException {
         LOG.debug("Creating new temporary directory");
-        Path workDirectory = Files.createTempDirectory(testTmpPath, "dta-submission");
+        Path workDirectory = Files.createTempDirectory(assignmentSubmissionsPath, "dta-submission");
         LOG.debug("Working directory for test: {}", workDirectory.toAbsolutePath());
         return workDirectory;
     }
diff --git a/src/main/java/de/hftstuttgart/dtabackend/utils/DockerUtil.java b/src/main/java/de/hftstuttgart/dtabackend/utils/DockerUtil.java
index 17f1b2e..194388b 100644
--- a/src/main/java/de/hftstuttgart/dtabackend/utils/DockerUtil.java
+++ b/src/main/java/de/hftstuttgart/dtabackend/utils/DockerUtil.java
@@ -59,27 +59,56 @@ public class DockerUtil {
                 image,
                 e.getMessage()));
         }
-
+    
         LOG.debug("creating container");
         CreateContainerResponse containerResponse;
         try {
+            // Extract paths from binds
+            String testPath = null;
+            String srcPath = null;
+            String resultPath = null;
+            for (Bind bind : binds) {
+                Volume volume = bind.getVolume();
+                if (volume.getPath().contains("test")) {
+                    testPath = bind.getPath();
+                } else if (volume.getPath().contains("src")) {
+                    srcPath = bind.getPath();
+                } else if (volume.getPath().contains("result")) {
+                    resultPath = bind.getPath();
+                }
+            }
+    
+            if (testPath == null || srcPath == null || resultPath == null) {
+                throw new IllegalArgumentException("All required paths (testPath, srcPath, resultPath) must be provided.");
+            }
+    
             containerResponse = dockerClient.createContainerCmd("testcontainer")
                 .withImage(image)
                 .withHostConfig(
                     HostConfig.newHostConfig()
-                        .withBinds(binds))
+                        .withBinds(binds)
+                )
+                .withCmd(
+                    "java",
+                    "-Djava.security.egd=file:/dev/./urandom",
+                    "-jar",
+                    "/data/app.jar",
+                    String.format("%s:%s", srcPath, testPath),
+                    "/data/libs/*:/data/test/libs/*",
+                    resultPath
+                )
                 .exec();
         } catch (DockerException e) {
             LOG.error(String.format(
                 "Creating Docker Testrunner container failed with %s", e.getMessage()));
             throw e;
         }
-
+    
         LOG.debug(String.format("container created: %s", containerResponse.getId()));
-
+    
         LOG.debug(String.format("starting container %s", containerResponse.getId()));
         dockerClient.startContainerCmd(containerResponse.getId()).exec();
-
+    
         LOG.debug(String.format("retrieving logs for container %s", containerResponse.getId()));
         dockerClient.logContainerCmd(containerResponse.getId())
             .withStdOut(true)
@@ -92,7 +121,7 @@ public class DockerUtil {
                     LOG.debug(String.format("LOG: %s", new String(frame.getPayload(), StandardCharsets.UTF_8)));
                 }
             });
-
+    
         LOG.debug(String.format("waiting for completion of container %s", containerResponse.getId()));
         int ret = dockerClient
             .waitContainerCmd(containerResponse.getId())
@@ -100,12 +129,12 @@ public class DockerUtil {
             .awaitCompletion()
             .awaitStatusCode();
         LOG.debug(String.format("container completed with status %d", ret));
-
+    
         LOG.debug(String.format("deleting container %s", containerResponse.getId()));
         dockerClient.removeContainerCmd(containerResponse.getId())
             .withRemoveVolumes(true)
             .exec();
-
+    
         return ret;
-    }
+    }    
 }
diff --git a/src/main/java/de/hftstuttgart/dtabackend/utils/ExecuteTestUtil.java b/src/main/java/de/hftstuttgart/dtabackend/utils/ExecuteTestUtil.java
index fb4a3fb..cacb6b9 100644
--- a/src/main/java/de/hftstuttgart/dtabackend/utils/ExecuteTestUtil.java
+++ b/src/main/java/de/hftstuttgart/dtabackend/utils/ExecuteTestUtil.java
@@ -104,9 +104,9 @@ public class ExecuteTestUtil {
         // Start the test-container with professor-given image and submission-specific volume mounts
         dockerUtil.runContainer(
             image,
-            new Bind(testPath.toString(), new Volume("/data/test")),
-            new Bind(srcPath.toString(), new Volume("/data/src")),
-            new Bind(resultPath.toString(), new Volume("/data/result"))
+            new Bind(testPath.toString(), new Volume("test")),
+            new Bind(srcPath.toString(), new Volume("src")),
+            new Bind(resultPath.toString(), new Volume("result"))
         );
 
         return generateResult(assignmentId, resultPath, testPath);
-- 
GitLab