Add the possibility of passing VM arguments to JVM tests

Change-Id: I243198707099ed7d90ff45cbfd38b1c2c0531d42
diff --git a/src/test/java/com/android/tools/r8/JvmTestBuilder.java b/src/test/java/com/android/tools/r8/JvmTestBuilder.java
index bef8a14..0e510a9 100644
--- a/src/test/java/com/android/tools/r8/JvmTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/JvmTestBuilder.java
@@ -22,6 +22,7 @@
 
   // Ordered list of classpath entries.
   private List<Path> classpath = new ArrayList<>();
+  private List<String> vmArguments = new ArrayList<>();
 
   private AndroidApp.Builder builder = AndroidApp.builder();
 
@@ -49,7 +50,8 @@
       throws IOException {
     assert runtime.isCf();
     ProcessResult result =
-        ToolHelper.runJava(runtime.asCf(), classpath, ObjectArrays.concat(mainClass, args));
+        ToolHelper.runJava(
+            runtime.asCf(), vmArguments, classpath, ObjectArrays.concat(mainClass, args));
     return new JvmTestRunResult(builder.build(), runtime, result);
   }
 
@@ -136,4 +138,13 @@
   public JvmTestBuilder addTestClasspath() {
     return addClasspath(ToolHelper.getClassPathForTests());
   }
+
+  public JvmTestBuilder addVmArguments(Collection<String> arguments) {
+    vmArguments.addAll(arguments);
+    return self();
+  }
+
+  public JvmTestBuilder addVmArguments(String... arguments) {
+    return addVmArguments(Arrays.asList(arguments));
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/testing/JvmVmArgumentsTest.java b/src/test/java/com/android/tools/r8/testing/JvmVmArgumentsTest.java
new file mode 100644
index 0000000..8fdc339
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/testing/JvmVmArgumentsTest.java
@@ -0,0 +1,76 @@
+// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.testing;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class JvmVmArgumentsTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withCfRuntimes().build();
+  }
+
+  public JvmVmArgumentsTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testArguments() throws Exception {
+    testForJvm()
+        .addTestClasspath()
+        .addVmArguments("-ea")
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines("AssertionError!", "DONE");
+  }
+
+  @Test
+  public void testMultipleArguments() throws Exception {
+    testForJvm()
+        .addTestClasspath()
+        .addVmArguments("-ea", "-da")
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines("DONE");
+
+    testForJvm()
+        .addTestClasspath()
+        .addVmArguments("-ea")
+        .addVmArguments("-da")
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines("DONE");
+  }
+
+  @Test
+  public void testNoArguments() throws Exception {
+    testForJvm()
+        .addTestClasspath()
+        .addVmArguments()
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutputLines("DONE");
+  }
+
+  static class TestClass {
+    public static void m() {
+      assert false;
+    }
+
+    public static void main(String[] args) {
+      try {
+        m();
+      } catch (AssertionError e) {
+        System.out.println("AssertionError!");
+      }
+      System.out.println("DONE");
+    }
+  }
+}