Fix art cache for art tests that match on file paths relative to repo root

Change-Id: Id514a144d549edbd7f22e50fa5be6361f241eb3d
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 1c8634c..6c31a91 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -1174,6 +1174,11 @@
           "958-methodhandle-stackframe",
           "1338-gc-no-los");
 
+  // These tests match on paths relative to the execution directory (normally the repo root).
+  // Cached stdout might be from a different directory.
+  private static List<String> noArtCommandCaching =
+      ImmutableList.of("068-classloader", "086-null-superTest", "087-gc-after-linkTest");
+
   private static final String NO_CLASS_ACCESS_MODIFICATION_RULE =
       "-keep,allowobfuscation,allowoptimization,allowshrinking class *";
   private static final String NO_MEMBER_ACCESS_MODIFICATION_RULE =
@@ -1299,6 +1304,8 @@
     private final boolean hasMissingClasses;
     // Explicitly disable desugaring.
     private final boolean disableDesugaring;
+    // Don't cache art invocations, used for tests that match on path outputs.
+    private final boolean noCaching;
     // Extra keep rules to use when running with R8.
     private final List<String> keepRules;
     private final Consumer<InternalOptions> configuration;
@@ -1320,6 +1327,7 @@
         boolean disableClassInlining,
         boolean hasMissingClasses,
         boolean disableDesugaring,
+        boolean noCaching,
         List<String> keepRules,
         Consumer<InternalOptions> configuration) {
       this.name = name;
@@ -1338,6 +1346,7 @@
       this.disableClassInlining = disableClassInlining;
       this.hasMissingClasses = hasMissingClasses;
       this.disableDesugaring = disableDesugaring;
+      this.noCaching = noCaching;
       this.keepRules = keepRules;
       this.configuration = configuration;
     }
@@ -1507,6 +1516,7 @@
                 requireClassInliningToBeDisabled.contains(name),
                 hasMissingClasses.contains(name),
                 false,
+                noArtCommandCaching.contains(name),
                 keepRules.getOrDefault(name, ImmutableList.of()),
                 configurations.get(name)));
       }
@@ -1549,6 +1559,9 @@
       File dexFile, TestSpecification specification, DexVm artVersion) {
     ArtCommandBuilder builder = new ArtCommandBuilder(artVersion);
     builder.appendClasspath(dexFile.toString());
+    if (specification.noCaching) {
+      builder.setNoCaching(true);
+    }
     // All Art tests have the main class Main.
     builder.setMainClass("Main");
     if (specification.nativeLibrary != null) {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 59b00db..3db86ba 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -557,6 +557,7 @@
     private DexVm version;
     private boolean withArtFrameworks;
     private ArtResultCacheLookupKey artResultCacheLookupKey;
+    private boolean noCaching = false;
 
     public ArtCommandBuilder() {
       this.version = getDexVm();
@@ -574,6 +575,10 @@
       return isMac();
     }
 
+    public void setNoCaching(boolean noCaching) {
+      this.noCaching = noCaching;
+    }
+
     @Override
     protected String getExecutable() {
       if (withArtFrameworks && version.isNewerThan(DexVm.ART_4_4_4_HOST)) {
@@ -606,7 +611,7 @@
     }
 
     private boolean useCache() {
-      return CommandResultCache.getInstance() != null;
+      return !noCaching && CommandResultCache.getInstance() != null;
     }
 
     public void cacheResult(ProcessResult result) {