Merge "Allow to setup timeout instead of waiting for OOM."
diff --git a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
index f0e758d..c710ed2 100644
--- a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
@@ -8,6 +8,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
@@ -31,11 +32,24 @@
     }
 
     @Override
+    R8CFTestRunner withKeepAll() {
+      return withBuilderTransformation(
+          builder ->
+              builder
+                  .setMode(CompilationMode.DEBUG)
+                  .setDisableTreeShaking(true)
+                  .setDisableMinification(true)
+                  .addProguardConfiguration(
+                      ImmutableList.of("-keepattributes *"), Origin.unknown()));
+    }
+
+    @Override
     void build(Path inputFile, Path out) throws Throwable {
       R8Command.Builder builder = R8Command.builder();
       for (UnaryOperator<R8Command.Builder> transformation : builderTransformations) {
         builder = transformation.apply(builder);
       }
+      // TODO(b/124041175): We should not be linking against the Java 8 runtime for Java 9 inputs.
       builder.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
       R8Command command =
           builder.addProgramFiles(inputFile).setOutput(out, OutputMode.ClassFile).build();
@@ -67,7 +81,7 @@
         }
       }
 
-      execute(testName, qualifiedMainClass, new Path[] {inputFile}, new Path[] {out});
+      execute(testName, qualifiedMainClass, new Path[] {inputFile}, new Path[] {out}, args);
 
       if (expectedToThrow) {
         System.out.println("Did not throw ApiLevelException as expected");
@@ -85,15 +99,23 @@
     return new R8CFTestRunner(testName, packageName, mainClass);
   }
 
-  void execute(String testName, String qualifiedMainClass, Path[] inputJars, Path[] outputJars)
+  @Override
+  void execute(
+      String testName,
+      String qualifiedMainClass,
+      Path[] inputJars,
+      Path[] outputJars,
+      List<String> args)
       throws IOException {
     boolean expectedToFail = expectedToFailCf(testName);
     if (expectedToFail) {
       thrown.expect(Throwable.class);
     }
-    ProcessResult outputResult = ToolHelper.runJava(Arrays.asList(outputJars), qualifiedMainClass);
+    String[] mainAndArgs =
+        ImmutableList.builder().add(qualifiedMainClass).addAll(args).build().toArray(new String[0]);
+    ProcessResult outputResult = ToolHelper.runJava(Arrays.asList(outputJars), mainAndArgs);
     ToolHelper.ProcessResult inputResult =
-        ToolHelper.runJava(ImmutableList.copyOf(inputJars), qualifiedMainClass);
+        ToolHelper.runJava(ImmutableList.copyOf(inputJars), mainAndArgs);
     assertEquals(inputResult.toString(), outputResult.toString());
     if (inputResult.exitCode != 0) {
       System.out.println(inputResult);
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index c95d8a6..f3f5339 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -10,6 +10,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
 
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter;
@@ -274,6 +275,7 @@
 
   @Test
   public void desugaredPrivateInterfaceMethods() throws Throwable {
+    assumeFalse("CF backend does not desugar", this instanceof R8CFRunExamplesJava9Test);
     final String iName = "privateinterfacemethods.I";
     test("desugared-private-interface-methods",
         "privateinterfacemethods", "PrivateInterfaceMethods")
@@ -297,6 +299,7 @@
   public void varHandle() throws Throwable {
     test("varhandle", "varhandle", "VarHandleTests")
         .withMinApiLevel(AndroidApiLevel.P.getLevel())
+        .withKeepAll()
         .run();
   }
 
diff --git a/tools/run_on_as_app.py b/tools/run_on_as_app.py
index 55c8857..2889d74 100755
--- a/tools/run_on_as_app.py
+++ b/tools/run_on_as_app.py
@@ -222,7 +222,7 @@
 def UninstallApkOnEmulator(app, config, options):
   app_id = config.get('app_id')
   process = subprocess.Popen(
-      ['adb', 'uninstall', app_id],
+      ['adb', '-s', emulator_id, 'uninstall', app_id],
       stdout=subprocess.PIPE, stderr=subprocess.PIPE)
   stdout, stderr = process.communicate()