From 3b037fb2dfd4d39d5944e1a7e7b17795d726c75d Mon Sep 17 00:00:00 2001
From: rschoene <rene.schoene@tu-dresden.de>
Date: Thu, 14 Jun 2018 13:46:28 +0200
Subject: [PATCH] Use actual new process to start Gradle for sandbox run.

- using a new process rather than the GradleConnection is now the default, but can be changed in scenarios.json using the key useGradleConnection
---
 .../st/mquat/benchmark/FullBenchmarkMain.java | 72 ++++++++++++++-----
 .../benchmark/data/ScenarioSettings.java      |  1 +
 2 files changed, 56 insertions(+), 17 deletions(-)

diff --git a/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/FullBenchmarkMain.java b/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/FullBenchmarkMain.java
index 706ff95..4fcbbe0 100644
--- a/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/FullBenchmarkMain.java
+++ b/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/FullBenchmarkMain.java
@@ -32,12 +32,20 @@ public class FullBenchmarkMain {
   static class InvokeJavaVMBenchmark extends Benchmark {
     BenchmarkSettings settings;
     int repetitions;
+    private boolean useGradleConnection = false;
+    private final String gradleCommand = System.getProperty("os.name")
+        .toLowerCase().contains("windows") ? "./gradle.bat" : "./gradlew";
 
     InvokeJavaVMBenchmark(BenchmarkSettings settings, int repetitions) {
       this.settings = settings;
       this.repetitions = repetitions;
     }
 
+    InvokeJavaVMBenchmark setUseGradleConnection(boolean useGradleConnection) {
+      this.useGradleConnection = useGradleConnection;
+      return this;
+    }
+
     @Override
     public void run() {
       for (int i = 0; i < this.repetitions; i++) {
@@ -49,21 +57,46 @@ public class FullBenchmarkMain {
           logger.catching(e);
           throw new RuntimeException("Could not create temporary file for sandBoxed use. Exiting.");
         }
-        // invoke Gradle target
-        ProjectConnection connection = GradleConnector.newConnector()
-            .forProjectDirectory(new File("."))
-            .connect();
-        try {
-          connection.newBuild()
-              .forTasks("sandboxRun")
-              .withArguments("-PrunSettingsFile=" + tempPath.toAbsolutePath().toString())
-              .setStandardOutput(System.out)
-              .run();
-        } finally {
-          connection.close();
+        if (useGradleConnection) {
+          // invoke Gradle target directly
+          ProjectConnection connection = GradleConnector.newConnector()
+              .forProjectDirectory(new File("."))
+              .connect();
+          try {
+            connection.newBuild()
+                .forTasks("sandboxRun")
+                .withArguments("-PrunSettingsFile=" + tempPath.toAbsolutePath().toString())
+                .setStandardOutput(System.out)
+                .run();
+          } finally {
+            connection.close();
+          }
+        } else {
+          // start a new process calling gradle
+          File currentDir = getCurrentDir();
+          try {
+            ProcessBuilder pb = new ProcessBuilder(gradleCommand, "sandboxRun",
+                "-PrunSettingsFile=" + tempPath.toAbsolutePath().toString());
+            pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
+            pb.redirectError(ProcessBuilder.Redirect.INHERIT);
+            pb.directory(currentDir);
+            Process p = pb.start();
+            p.waitFor();
+          } catch (IOException | InterruptedException e) {
+            e.printStackTrace();
+          }
         }
       }
     }
+
+    private File getCurrentDir() {
+      // hacky solution to get to the root of the repository
+      File maybeCurrentDir = new File("").getAbsoluteFile();
+      if ("jastadd-mquat-benchmark".equals(maybeCurrentDir.getName())) {
+        maybeCurrentDir = maybeCurrentDir.getParentFile();
+      }
+      return maybeCurrentDir;
+    }
   }
 
   public static void main(String[] args) {
@@ -95,7 +128,7 @@ public class FullBenchmarkMain {
         .map(SolverFactory::getSolverByName).collect(Collectors.toList());
     return settings.scenarios.stream()
         .filter(data -> takeAll || allowedIds.contains(data.getId()) || allowedNames.contains(data.name))
-        .map(data -> create(from(settings, data), solvers, settings.repetitions, settings.sandBoxed))
+        .map(data -> create(settings, data, solvers))
         .collect(Collectors.toList());
   }
 
@@ -143,10 +176,15 @@ public class FullBenchmarkMain {
     return result;
   }
 
-  private static Benchmark create(BenchmarkSettings settings, List<BenchmarkableSolver> solvers, int repetitions, boolean sandBoxed) {
-    return sandBoxed ?
-        new InvokeJavaVMBenchmark(settings, repetitions) :
-        new ScenarioBenchmark(settings, solvers, repetitions);
+  private static Benchmark create(ScenarioSettings scenarioSettings, ScenarioData data,
+                                  List<BenchmarkableSolver> solvers) {
+    BenchmarkSettings settings = from(scenarioSettings, data);
+    if (scenarioSettings.sandBoxed) {
+      return new InvokeJavaVMBenchmark(settings, scenarioSettings.repetitions)
+          .setUseGradleConnection(scenarioSettings.useGradleConnection);
+    } else {
+      return new ScenarioBenchmark(settings, solvers, scenarioSettings.repetitions);
+    }
   }
 
 }
diff --git a/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/data/ScenarioSettings.java b/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/data/ScenarioSettings.java
index 9614f3f..3d2fa73 100644
--- a/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/data/ScenarioSettings.java
+++ b/jastadd-mquat-benchmark/src/main/java/de/tudresden/inf/st/mquat/benchmark/data/ScenarioSettings.java
@@ -17,4 +17,5 @@ public class ScenarioSettings {
   public int repetitions = 1;
   public List<ScenarioData> scenarios;
   public boolean sandBoxed;
+  public boolean useGradleConnection = false;
 }
-- 
GitLab