Setting the output directory for each ChildJVM

Making sure we put all artifacts in a named output directory for each
process.
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartClient.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartClient.java
index dab4d8f..f69c284 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartClient.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartClient.java
@@ -17,6 +17,7 @@
 
 package org.apache.geode.benchmark.tasks;
 
+import java.io.File;
 import java.net.InetAddress;
 
 import org.apache.geode.cache.client.ClientCache;
@@ -38,10 +39,12 @@
 
     InetAddress locator = context.getHostsForRole("locator").iterator().next();
 
+    String statsFile = new File(context.getOutputDir(), "stats.gfs").getAbsolutePath();
+
     ClientCache clientCache = new ClientCacheFactory()
         .addPoolLocator(locator.getHostAddress(), locatorPort)
         .set(ConfigurationProperties.STATISTIC_SAMPLING_ENABLED,"true")
-        .set(ConfigurationProperties.STATISTIC_ARCHIVE_FILE,"output/stats.gfs")
+        .set(ConfigurationProperties.STATISTIC_ARCHIVE_FILE, statsFile)
         .create();
 
     clientCache.createClientRegionFactory(ClientRegionShortcut.PROXY)
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartLocator.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartLocator.java
index f04b3e0..5bc6d39 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartLocator.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartLocator.java
@@ -17,6 +17,7 @@
 
 package org.apache.geode.benchmark.tasks;
 
+import java.io.File;
 import java.net.InetAddress;
 import java.util.Properties;
 
@@ -35,9 +36,12 @@
   @Override
   public void run(TestContext context) throws Exception {
     Properties properties = new Properties();
-    properties.setProperty(ConfigurationProperties.NAME,"locator-"+ InetAddress.getLocalHost());
+
+    String statsFile = new File(context.getOutputDir(), "stats.gfs").getAbsolutePath();
     properties.setProperty(ConfigurationProperties.STATISTIC_SAMPLING_ENABLED,"true");
-    properties.setProperty(ConfigurationProperties.STATISTIC_ARCHIVE_FILE,"output/stats.gfs");
+    properties.setProperty(ConfigurationProperties.STATISTIC_ARCHIVE_FILE, statsFile);
+
+    properties.setProperty(ConfigurationProperties.NAME,"locator-"+ InetAddress.getLocalHost());
     Locator.startLocatorAndDS(locatorPort, null, properties);
   }
 }
diff --git a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartServer.java b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartServer.java
index d2bb8aa..46f9445 100644
--- a/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartServer.java
+++ b/geode-benchmarks/src/main/java/org/apache/geode/benchmark/tasks/StartServer.java
@@ -17,6 +17,7 @@
 
 package org.apache.geode.benchmark.tasks;
 
+import java.io.File;
 import java.net.InetAddress;
 
 import org.apache.geode.cache.Cache;
@@ -39,12 +40,13 @@
   public void run(TestContext context) throws Exception {
 
     String locatorString = LocatorUtil.getLocatorString(context, locatorPort);
+    String statsFile = new File(context.getOutputDir(), "stats.gfs").getAbsolutePath();
 
     Cache cache = new CacheFactory()
         .set(ConfigurationProperties.LOCATORS,locatorString)
         .set(ConfigurationProperties.NAME,"server-"+ InetAddress.getLocalHost())
         .set(ConfigurationProperties.STATISTIC_SAMPLING_ENABLED,"true")
-        .set(ConfigurationProperties.STATISTIC_ARCHIVE_FILE,"output/stats.gfs")
+        .set(ConfigurationProperties.STATISTIC_ARCHIVE_FILE, statsFile)
         .create();
 
     CacheServer cacheServer = ((Cache) cache).addCacheServer();
diff --git a/harness/src/main/java/org/apache/geode/perftest/TestConfig.java b/harness/src/main/java/org/apache/geode/perftest/TestConfig.java
index e3acb06..1d5a6f6 100644
--- a/harness/src/main/java/org/apache/geode/perftest/TestConfig.java
+++ b/harness/src/main/java/org/apache/geode/perftest/TestConfig.java
@@ -78,7 +78,7 @@
    * @param roles The roles to run the workload on
    */
   public void workload(BenchmarkDriver benchmark, String ... roles) {
-    workload.add(new TestStep(new YardstickTask(benchmark, workloadConfig, "output"), roles));
+    workload.add(new TestStep(new YardstickTask(benchmark, workloadConfig), roles));
   }
 
 
diff --git a/harness/src/main/java/org/apache/geode/perftest/TestContext.java b/harness/src/main/java/org/apache/geode/perftest/TestContext.java
index 9a4425c..589900f 100644
--- a/harness/src/main/java/org/apache/geode/perftest/TestContext.java
+++ b/harness/src/main/java/org/apache/geode/perftest/TestContext.java
@@ -17,10 +17,13 @@
 
 package org.apache.geode.perftest;
 
+import java.io.File;
 import java.io.Serializable;
 import java.net.InetAddress;
 import java.util.Set;
 
 public interface TestContext extends Serializable {
   Set<InetAddress> getHostsForRole(String role);
+
+  File getOutputDir();
 }
diff --git a/harness/src/main/java/org/apache/geode/perftest/jdk/SystemInterface.java b/harness/src/main/java/org/apache/geode/perftest/jdk/SystemInterface.java
index 91a18e8..7d25070 100644
--- a/harness/src/main/java/org/apache/geode/perftest/jdk/SystemInterface.java
+++ b/harness/src/main/java/org/apache/geode/perftest/jdk/SystemInterface.java
@@ -24,7 +24,7 @@
  */
 public class SystemInterface {
 
-  public static String getProperty(String property) {
+  public String getProperty(String property) {
     return System.getProperty(property);
   }
 
diff --git a/harness/src/main/java/org/apache/geode/perftest/jvms/JVMLauncher.java b/harness/src/main/java/org/apache/geode/perftest/jvms/JVMLauncher.java
index 6d3bdef..eb26879 100644
--- a/harness/src/main/java/org/apache/geode/perftest/jvms/JVMLauncher.java
+++ b/harness/src/main/java/org/apache/geode/perftest/jvms/JVMLauncher.java
@@ -40,16 +40,17 @@
       throws UnknownHostException {
     List<CompletableFuture<Void>> futures = new ArrayList<CompletableFuture<Void>>();
     for (JVMMapping entry : mapping) {
-      futures.add(launchWorker(infra, rmiPort, entry.getId(), entry.getNode(), libDir));
+      futures.add(launchWorker(infra, rmiPort, entry.getId(), entry.getNode(), libDir, entry.getOutputDir()));
     }
     return CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
   }
 
   CompletableFuture<Void> launchWorker(Infrastructure infra, int rmiPort,
-                                       int id, final Infrastructure.Node node, String libDir)
+                                       int id, final Infrastructure.Node node, String libDir,
+                                       String outputDir)
       throws UnknownHostException {
     String[] shellCommand = buildCommand(InetAddress.getLocalHost().getHostAddress(), rmiPort, id,
-        libDir);
+        libDir, outputDir);
     CompletableFuture<Void> future = new CompletableFuture<Void>();
     Thread thread = new Thread("Worker " + node.getAddress()) {
       public void run() {
@@ -71,7 +72,8 @@
     return future;
   }
 
-  String[] buildCommand(String rmiHost, int rmiPort, int id, String libDir) {
+  String[] buildCommand(String rmiHost, int rmiPort, int id, String libDir,
+                        String outputDir) {
 
     List<String> command = new ArrayList<String>();
     command.add("java");
@@ -80,6 +82,7 @@
     command.add("-D" + RemoteJVMFactory.RMI_HOST + "=" + rmiHost);
     command.add("-D" + RemoteJVMFactory.RMI_PORT_PROPERTY + "=" + rmiPort);
     command.add("-D" + RemoteJVMFactory.JVM_ID + "=" + id);
+    command.add("-D" + RemoteJVMFactory.OUTPUT_DIR + "=" + outputDir);
     command.add(ChildJVM.class.getName());
 
     return command.toArray(new String[0]);
diff --git a/harness/src/main/java/org/apache/geode/perftest/jvms/JVMMapping.java b/harness/src/main/java/org/apache/geode/perftest/jvms/JVMMapping.java
index e01f1f9..0ae6236 100644
--- a/harness/src/main/java/org/apache/geode/perftest/jvms/JVMMapping.java
+++ b/harness/src/main/java/org/apache/geode/perftest/jvms/JVMMapping.java
@@ -44,4 +44,7 @@
     return id;
   }
 
+  public String getOutputDir() {
+    return "output/" + role + "-" + id;
+  }
 }
diff --git a/harness/src/main/java/org/apache/geode/perftest/jvms/RemoteJVMFactory.java b/harness/src/main/java/org/apache/geode/perftest/jvms/RemoteJVMFactory.java
index 61f5c81..af18ddc 100644
--- a/harness/src/main/java/org/apache/geode/perftest/jvms/RemoteJVMFactory.java
+++ b/harness/src/main/java/org/apache/geode/perftest/jvms/RemoteJVMFactory.java
@@ -45,6 +45,7 @@
   public static final String RMI_HOST = "RMI_HOST";
   public static final String RMI_PORT_PROPERTY = "RMI_PORT";
   public static final String CONTROLLER = "CONTROLLER";
+  public static final String OUTPUT_DIR = "OUTPUT_DIR";
   public static final String JVM_ID = "JVM_ID";
   public static final int RMI_PORT = 33333;
   public static final String CLASSPATH = System.getProperty("java.class.path");
diff --git a/harness/src/main/java/org/apache/geode/perftest/jvms/RemoteJVMs.java b/harness/src/main/java/org/apache/geode/perftest/jvms/RemoteJVMs.java
index f619282..aa1e546 100644
--- a/harness/src/main/java/org/apache/geode/perftest/jvms/RemoteJVMs.java
+++ b/harness/src/main/java/org/apache/geode/perftest/jvms/RemoteJVMs.java
@@ -72,21 +72,13 @@
     exited.get();
   }
 
-  public String getRole(Infrastructure.Node node) {
-    return jvmMappings.stream()
-        .filter(mapping -> mapping.getNode().equals(node))
-        .map(JVMMapping::getRole)
-        .findFirst()
-        .orElse("no-role");
-  }
-
   /**
    * Copy results to the provided output directory
    */
   public void copyResults(File benchmarkOutput) throws IOException {
     benchmarkOutput.mkdirs();
     for (JVMMapping jvm : jvmMappings) {
-      infra.copyFromNode(jvm.getNode(), "output", new File(benchmarkOutput, jvm.getRole() + "-" + jvm.getId()));
+      infra.copyFromNode(jvm.getNode(), jvm.getOutputDir(), new File(benchmarkOutput, jvm.getRole() + "-" + jvm.getId()));
     }
   }
 }
diff --git a/harness/src/main/java/org/apache/geode/perftest/jvms/rmi/ChildJVM.java b/harness/src/main/java/org/apache/geode/perftest/jvms/rmi/ChildJVM.java
index d29563a..a1e1b5e 100644
--- a/harness/src/main/java/org/apache/geode/perftest/jvms/rmi/ChildJVM.java
+++ b/harness/src/main/java/org/apache/geode/perftest/jvms/rmi/ChildJVM.java
@@ -20,6 +20,7 @@
 import java.io.File;
 import java.io.PrintStream;
 
+import org.apache.commons.io.FileUtils;
 import org.bouncycastle.jcajce.provider.drbg.DRBG;
 
 import org.apache.geode.perftest.jdk.RMI;
@@ -37,24 +38,32 @@
   private final RMI rmi;
   private final SystemInterface system;
   private final int pingTime;
-  private final File outputDir;
 
-  public ChildJVM(RMI rmi, SystemInterface system, int pingTime, File outputDir) {
+  public ChildJVM(RMI rmi, SystemInterface system, int pingTime) {
     this.rmi = rmi;
     this.system = system;
     this.pingTime = pingTime;
-    this.outputDir = outputDir;
   }
 
   public static void main(String[] args) {
-    new ChildJVM(new RMI(), new SystemInterface(), 1000, new File("output")).run();
+    new ChildJVM(new RMI(), new SystemInterface(), 1000).run();
   }
 
   void run() {
     try {
       String RMI_HOST = system.getProperty(RemoteJVMFactory.RMI_HOST);
       String RMI_PORT = system.getProperty(RemoteJVMFactory.RMI_PORT_PROPERTY);
+      String OUTPUT_DIR = system.getProperty(RemoteJVMFactory.OUTPUT_DIR);
       int id = system.getInteger(RemoteJVMFactory.JVM_ID);
+
+
+      if(RMI_HOST == null || RMI_PORT == null || OUTPUT_DIR == null) {
+        throw new IllegalStateException("ChildJVM must be launched with all required system properties set.");
+      }
+
+      File outputDir = new File(OUTPUT_DIR);
+      //Clean up the output directory before the test runs
+      FileUtils.deleteQuietly(outputDir);
       outputDir.mkdirs();
       PrintStream out = new PrintStream(new File(outputDir, "ChildJVM-" + id + ".txt"));
       system.setOut(out);
@@ -64,7 +73,7 @@
           .lookup("//" + RMI_HOST + ":" + RMI_PORT + "/" + RemoteJVMFactory.CONTROLLER);
 
       SharedContext sharedContext = controller.getsharedContext();
-      DefaultTestContext context = new DefaultTestContext(sharedContext);
+      DefaultTestContext context = new DefaultTestContext(sharedContext, outputDir);
 
       Worker worker = new Worker(context);
 
diff --git a/harness/src/main/java/org/apache/geode/perftest/runner/DefaultTestContext.java b/harness/src/main/java/org/apache/geode/perftest/runner/DefaultTestContext.java
index f54563a..92a7182 100644
--- a/harness/src/main/java/org/apache/geode/perftest/runner/DefaultTestContext.java
+++ b/harness/src/main/java/org/apache/geode/perftest/runner/DefaultTestContext.java
@@ -17,6 +17,7 @@
 
 package org.apache.geode.perftest.runner;
 
+import java.io.File;
 import java.net.InetAddress;
 import java.util.Set;
 
@@ -25,13 +26,20 @@
 public class DefaultTestContext implements TestContext {
 
   private SharedContext sharedContext;
+  private File outputDir;
 
-  public DefaultTestContext(SharedContext sharedContext) {
+  public DefaultTestContext(SharedContext sharedContext, File outputDir) {
     this.sharedContext = sharedContext;
+    this.outputDir = outputDir;
   }
 
   @Override
   public Set<InetAddress> getHostsForRole(String role) {
     return sharedContext.getHostsForRole(role);
   }
+
+  @Override
+  public File getOutputDir() {
+    return outputDir;
+  }
 }
diff --git a/harness/src/main/java/org/apache/geode/perftest/yardstick/YardstickTask.java b/harness/src/main/java/org/apache/geode/perftest/yardstick/YardstickTask.java
index 80f4c1a..9046327 100644
--- a/harness/src/main/java/org/apache/geode/perftest/yardstick/YardstickTask.java
+++ b/harness/src/main/java/org/apache/geode/perftest/yardstick/YardstickTask.java
@@ -42,13 +42,11 @@
  */
 public class YardstickTask implements Task {
   private final BenchmarkDriver benchmark;
-  private final String outputDir;
   private WorkloadConfig workloadConfig;
 
-  public YardstickTask(BenchmarkDriver benchmark, WorkloadConfig workloadConfig, String outputDir) {
+  public YardstickTask(BenchmarkDriver benchmark, WorkloadConfig workloadConfig) {
     this.benchmark = benchmark;
     this.workloadConfig = workloadConfig;
-    this.outputDir = outputDir;
   }
 
   @Override
@@ -77,7 +75,7 @@
 
       @Override
       public String outputFolder() {
-        return outputDir;
+        return context.getOutputDir().getAbsolutePath();
       }
     };
     cfg.output(System.out);
diff --git a/harness/src/test/java/org/apache/geode/perftest/jvms/RemoteJVMFactoryTest.java b/harness/src/test/java/org/apache/geode/perftest/jvms/RemoteJVMFactoryTest.java
index 4d1eb2b..cb576f0 100644
--- a/harness/src/test/java/org/apache/geode/perftest/jvms/RemoteJVMFactoryTest.java
+++ b/harness/src/test/java/org/apache/geode/perftest/jvms/RemoteJVMFactoryTest.java
@@ -41,7 +41,6 @@
 import org.apache.geode.perftest.jvms.classpath.ClassPathCopier;
 import org.apache.geode.perftest.jvms.rmi.Controller;
 import org.apache.geode.perftest.jvms.rmi.ControllerFactory;
-import org.apache.geode.perftest.runner.SharedContext;
 
 public class RemoteJVMFactoryTest {
 
diff --git a/harness/src/test/java/org/apache/geode/perftest/jvms/rmi/ChildJVMTest.java b/harness/src/test/java/org/apache/geode/perftest/jvms/rmi/ChildJVMTest.java
index 3fa21ca..2d61883 100644
--- a/harness/src/test/java/org/apache/geode/perftest/jvms/rmi/ChildJVMTest.java
+++ b/harness/src/test/java/org/apache/geode/perftest/jvms/rmi/ChildJVMTest.java
@@ -17,6 +17,10 @@
 
 package org.apache.geode.perftest.jvms.rmi;
 
+import static org.apache.geode.perftest.jvms.RemoteJVMFactory.OUTPUT_DIR;
+import static org.apache.geode.perftest.jvms.RemoteJVMFactory.RMI_HOST;
+import static org.apache.geode.perftest.jvms.RemoteJVMFactory.RMI_PORT_PROPERTY;
+import static org.junit.Assert.assertFalse;
 import static org.mockito.Matchers.any;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
@@ -47,12 +51,17 @@
   private ChildJVM jvm;
   private SystemInterface system;
   private Controller controller;
+  private File folder;
 
   @Before
   public void setUp() throws IOException, NotBoundException {
     system = mock(SystemInterface.class);
+    when(system.getProperty(RMI_HOST)).thenReturn("something");
+    when(system.getProperty(RMI_PORT_PROPERTY)).thenReturn("0");
+    folder = temporaryFolder.newFolder();
+    when(system.getProperty(OUTPUT_DIR)).thenReturn(folder.getAbsolutePath());
     rmi = mock(RMI.class);
-    jvm = new ChildJVM(rmi, system, 1, temporaryFolder.newFolder());
+    jvm = new ChildJVM(rmi, system, 1);
 
     controller = mock(Controller.class);
     when(rmi.lookup(any())).thenReturn(controller);
@@ -75,4 +84,14 @@
     verify(controller, times(3)).ping();
   }
 
+  @Test
+  public void childCleansOutputDir() throws IOException {
+    File expectedFile = new File(folder, "somefile.txt");
+    expectedFile.createNewFile();
+
+    jvm.run();
+
+    assertFalse(expectedFile.exists());
+  }
+
 }
\ No newline at end of file
diff --git a/harness/src/test/java/org/apache/geode/perftest/yardstick/YardstickTaskTest.java b/harness/src/test/java/org/apache/geode/perftest/yardstick/YardstickTaskTest.java
index e7351e7..8a29d2e 100644
--- a/harness/src/test/java/org/apache/geode/perftest/yardstick/YardstickTaskTest.java
+++ b/harness/src/test/java/org/apache/geode/perftest/yardstick/YardstickTaskTest.java
@@ -17,14 +17,21 @@
 
 package org.apache.geode.perftest.yardstick;
 
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.nio.file.Files;
+
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
 import org.apache.geode.perftest.Task;
+import org.apache.geode.perftest.TestContext;
 import org.apache.geode.perftest.WorkloadConfig;
 import org.apache.geode.perftest.benchmarks.EmptyBenchmark;
+import org.apache.geode.perftest.runner.DefaultTestContext;
 
 public class YardstickTaskTest {
 
@@ -36,15 +43,17 @@
     EmptyBenchmark benchmark = new EmptyBenchmark();
     WorkloadConfig workloadConfig = new WorkloadConfig();
     workloadConfig.threads(1);
-    Task task = new YardstickTask(benchmark, workloadConfig, folder.newFolder().getAbsolutePath());
-    task.run(null);
+    Task task = new YardstickTask(benchmark, workloadConfig);
+    File outputDir = folder.newFolder();
+    TestContext context = new DefaultTestContext(null, outputDir);
+    task.run(context);
 
-    Assert.assertTrue(1 <= benchmark.getInvocations());
+    assertTrue(1 <= benchmark.getInvocations());
+
+    assertTrue(Files.walk(outputDir.toPath()).findFirst().isPresent());
 
     //TODO -verify probes are shutdown
     //TODO -verify benchmark is shutdown
-    //TODO - pass in probes to yardstick util, turn it into a real class
-
   }
 
 }
\ No newline at end of file