diff --git a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
index 3bb27c2..22d1e0a 100644
--- a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
+++ b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
@@ -14,16 +14,12 @@
 import java.util.ArrayList;
 import java.util.List;
 import org.junit.Assume;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 @RunWith(Parameterized.class)
-public class BackportedMethodListTest {
-
-  @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+public class BackportedMethodListTest extends TestBase {
 
   enum Mode {
     NO_LIBRARY,
diff --git a/src/test/java/com/android/tools/r8/R8CodeCanonicalizationTest.java b/src/test/java/com/android/tools/r8/R8CodeCanonicalizationTest.java
index 65aea6e..90343b7 100644
--- a/src/test/java/com/android/tools/r8/R8CodeCanonicalizationTest.java
+++ b/src/test/java/com/android/tools/r8/R8CodeCanonicalizationTest.java
@@ -10,11 +10,9 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import org.junit.Assert;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class R8CodeCanonicalizationTest {
+public class R8CodeCanonicalizationTest extends TestBase {
 
   private static final Path SOURCE_DEX = Paths.get(
       ToolHelper.EXAMPLES_BUILD_DIR, "invokeempty", "classes.dex");
@@ -29,9 +27,6 @@
     return 0;
   }
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void testNumberOfCodeItemsUnchanged() throws Exception {
     int numberOfCodes = readNumberOfCodes(SOURCE_DEX);
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index f3c3dc5..367a7c8 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -56,13 +56,12 @@
 import org.junit.ComparisonFailure;
 import org.junit.Rule;
 import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
 
 /**
  * This test class is not invoked directly. Instead, the gradle script generates one subclass per
  * actual art test. This allows us to run these in parallel.
  */
-public abstract class R8RunArtTestsTest {
+public abstract class R8RunArtTestsTest extends TestBase {
 
   private static final boolean DEX_COMPARE_WITH_DEX_REFERENCE_ON_FAILURE = true;
 
@@ -1504,9 +1503,6 @@
   }
 
   @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  @Rule
   public TestDescriptionWatcher watcher = new TestDescriptionWatcher();
 
   public R8RunArtTestsTest(String name, DexTool toolchain) {
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index 6065b96..2c1b299 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -20,7 +20,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class R8RunExamplesTest extends R8RunExamplesCommon {
+public class R8RunExamplesTest extends R8RunExamplesTestBase {
 
   @Parameters(name = "{0}_{1}_{2}_{3}_{5}_{6}")
   public static Collection<String[]> data() {
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java b/src/test/java/com/android/tools/r8/R8RunExamplesTestBase.java
similarity index 95%
rename from src/test/java/com/android/tools/r8/R8RunExamplesCommon.java
rename to src/test/java/com/android/tools/r8/R8RunExamplesTestBase.java
index 8866236..62b9ca4 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesCommon.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTestBase.java
@@ -28,9 +28,8 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
 
-public abstract class R8RunExamplesCommon {
+public abstract class R8RunExamplesTestBase extends TestBase {
 
   protected enum Input {
     JAVAC,
@@ -59,9 +58,6 @@
   }
 
   @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  @Rule
   public TestDescriptionWatcher watcher = new TestDescriptionWatcher();
 
   private final Input input;
@@ -71,13 +67,8 @@
   private final String mainClass;
   protected final Output output;
 
-  public R8RunExamplesCommon(
-      String pkg,
-      String input,
-      String compiler,
-      String mode,
-      String mainClass,
-      String output) {
+  public R8RunExamplesTestBase(
+      String pkg, String input, String compiler, String mode, String mainClass, String output) {
     this.pkg = pkg;
     this.input = Input.valueOf(input);
     this.compiler = CompilerUnderTest.valueOf(compiler);
diff --git a/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java b/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
index a5d61e9..0ef9446 100644
--- a/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunSmaliTestsTest.java
@@ -178,9 +178,6 @@
   );
 
   @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  @Rule
   public TestDescriptionWatcher watcher = new TestDescriptionWatcher();
 
   private final TestParameters parameters;
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
index f062988..4154c30 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
@@ -27,9 +27,8 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
 
-public abstract class RunExamplesAndroidNTest<B> {
+public abstract class RunExamplesAndroidNTest<B> extends TestBase {
 
   private static final String EXAMPLE_DIR = ToolHelper.EXAMPLES_ANDROID_N_BUILD_DIR;
 
@@ -119,8 +118,6 @@
           DexVm.Version.DEFAULT,
           ImmutableList.of());
 
-  @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Rule public ExpectedException thrown = ExpectedException.none();
 
   @Rule public TestDescriptionWatcher watcher = new TestDescriptionWatcher();
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
index c2c74a4..9e22135 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
@@ -312,9 +312,6 @@
   }
 
   @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  @Rule
   public ExpectedException thrown = ExpectedException.none();
 
   @Rule
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
index c8b6cc4..30ad72e 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
@@ -197,9 +197,6 @@
           .build();
 
   @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  @Rule
   public ExpectedException thrown = ExpectedException.none();
 
   @Rule
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index 485ac54..811c18f 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -36,10 +36,9 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
 
-public abstract class RunExamplesJava9Test
-    <B extends BaseCommand.Builder<? extends BaseCommand, B>> {
+public abstract class RunExamplesJava9Test<B extends BaseCommand.Builder<? extends BaseCommand, B>>
+    extends TestBase {
 
   private static final String EXAMPLE_DIR = ToolHelper.EXAMPLES_JAVA9_BUILD_DIR;
 
@@ -148,9 +147,6 @@
           "0: s>i>a\n" + "1: d>i>s>i>a\n" + "2: l>i>s>i>a\n" + "3: x>s\n" + "4: c>d>i>s>i>a\n");
 
   @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  @Rule
   public ExpectedException thrown = ExpectedException.none();
 
   @Rule
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index 4f99c46..89d5749 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -241,7 +241,7 @@
   public TestBuilder<? extends SingleTestRunResult<?>, ?> testForRuntime(
       TestRuntime runtime, Consumer<D8TestBuilder> d8TestBuilderConsumer) {
     if (runtime.isCf()) {
-      return testForJvm();
+      return testForJvm(temp);
     } else {
       assert runtime.isDex();
       D8TestBuilder d8TestBuilder = testForD8();
diff --git a/src/test/java/com/android/tools/r8/cf/AnnotationTestRunner.java b/src/test/java/com/android/tools/r8/cf/AnnotationTestRunner.java
index e9b4755..481ee2a 100644
--- a/src/test/java/com/android/tools/r8/cf/AnnotationTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/AnnotationTestRunner.java
@@ -9,21 +9,17 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.origin.Origin;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class AnnotationTestRunner {
+public class AnnotationTestRunner extends TestBase {
   static final Class CLASS = AnnotationTest.class;
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void test() throws Exception {
     ProcessResult runInput =
diff --git a/src/test/java/com/android/tools/r8/cf/BaseDefaultMethodTestRunner.java b/src/test/java/com/android/tools/r8/cf/BaseDefaultMethodTestRunner.java
index 91216e4..b1b77fe 100644
--- a/src/test/java/com/android/tools/r8/cf/BaseDefaultMethodTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/BaseDefaultMethodTestRunner.java
@@ -9,23 +9,19 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.R8Command.Builder;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.origin.Origin;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.List;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class BaseDefaultMethodTestRunner {
+public class BaseDefaultMethodTestRunner extends TestBase {
   static final Class CLASS = BaseDefaultMethodTest.class;
   static final Class[] CLASSES = BaseDefaultMethodTest.CLASSES;
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void test() throws Exception {
     ProcessResult runInput =
diff --git a/src/test/java/com/android/tools/r8/cf/CallLoopTestRunner.java b/src/test/java/com/android/tools/r8/cf/CallLoopTestRunner.java
index 1ed7481..76df19f 100644
--- a/src/test/java/com/android/tools/r8/cf/CallLoopTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/CallLoopTestRunner.java
@@ -7,16 +7,14 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import java.nio.file.Path;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class CallLoopTestRunner {
-  static final Class CLASS = CallLoopTest.class;
-  @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+public class CallLoopTestRunner extends TestBase {
+  static final Class<?> CLASS = CallLoopTest.class;
 
   @Test
   public void test() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java b/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
index 077c7a7..81621a7 100644
--- a/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/LambdaTestRunner.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.cf.code.CfInstruction;
@@ -23,18 +24,13 @@
 import java.util.Collections;
 import java.util.List;
 import org.junit.Assert;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class LambdaTestRunner {
+public class LambdaTestRunner extends TestBase {
 
   private static final Class<?> CLASS = LambdaTest.class;
   private static final String METHOD = "main";
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void test() throws Exception {
     // Test that the InvokeDynamic instruction in LambdaTest.main()
diff --git a/src/test/java/com/android/tools/r8/cf/NegativeZeroTestRunner.java b/src/test/java/com/android/tools/r8/cf/NegativeZeroTestRunner.java
index a38bf60..87f1294 100644
--- a/src/test/java/com/android/tools/r8/cf/NegativeZeroTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/NegativeZeroTestRunner.java
@@ -7,16 +7,15 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import java.nio.file.Path;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class NegativeZeroTestRunner {
+public class NegativeZeroTestRunner extends TestBase {
+
   static final Class CLASS = NegativeZeroTest.class;
-  @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   @Test
   public void test() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java b/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
index 2cc8a66..cc8a5cc 100644
--- a/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/NestedExceptionTestRunner.java
@@ -9,18 +9,16 @@
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import java.nio.file.Path;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class NestedExceptionTestRunner {
+public class NestedExceptionTestRunner extends TestBase {
   static final Class CLASS = NestedExceptionTest.class;
-  @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
   @Test
   public void testNestedException() throws Exception {
diff --git a/src/test/java/com/android/tools/r8/cf/UninitializedInFrameTestRunner.java b/src/test/java/com/android/tools/r8/cf/UninitializedInFrameTestRunner.java
index 466ac41..9f80fe5 100644
--- a/src/test/java/com/android/tools/r8/cf/UninitializedInFrameTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/UninitializedInFrameTestRunner.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8;
 import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.origin.Origin;
@@ -16,16 +17,11 @@
 import java.io.IOException;
 import java.nio.file.Path;
 import org.junit.Assert;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class UninitializedInFrameTestRunner {
+public class UninitializedInFrameTestRunner extends TestBase {
   static final Class CLASS = UninitializedInFrameTest.class;
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void test() throws Exception {
     test(ToolHelper.getClassAsBytes(CLASS));
diff --git a/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java b/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
index 06dce87..522c18e 100644
--- a/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/ArrayDimensionGreaterThanSevenTestRunner.java
@@ -25,7 +25,7 @@
 
 public class ArrayDimensionGreaterThanSevenTestRunner extends DebugTestBase {
 
-  private static final Class CLASS = ArrayDimensionGreaterThanSevenTest.class;
+  private static final Class<?> CLASS = ArrayDimensionGreaterThanSevenTest.class;
   private static final String NAME = CLASS.getCanonicalName();
 
   private DebugTestConfig getR8CfConfig(String s)
diff --git a/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTestRunner.java b/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTestRunner.java
index 6de8589..0646cb1 100644
--- a/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/ArraySimplificationLineNumberTestRunner.java
@@ -29,12 +29,16 @@
         "Skipping test " + testName.getMethodName() + " because debugging not enabled in 12.0.0",
         !ToolHelper.getDexVm().isNewerThanOrEqual(DexVm.ART_12_0_0_HOST));
     DebugTestConfig cf = new CfDebugTestConfig().addPaths(ToolHelper.getClassPathForTests());
-    DebugTestConfig d8 = new D8DebugTestConfig().compileAndAdd(
-        temp, Collections.singletonList(ToolHelper.getClassFileForTestClass(CLASS)));
-    DebugTestConfig d8NoLocals = new D8DebugTestConfig().compileAndAdd(
-        temp,
-        Collections.singletonList(ToolHelper.getClassFileForTestClass(CLASS)),
-        options -> options.testing.noLocalsTableOnInput = true);
+    DebugTestConfig d8 =
+        new D8DebugTestConfig()
+            .compileAndAdd(
+                temp, Collections.singletonList(ToolHelper.getClassFileForTestClass(CLASS)));
+    DebugTestConfig d8NoLocals =
+        new D8DebugTestConfig()
+            .compileAndAdd(
+                temp,
+                Collections.singletonList(ToolHelper.getClassFileForTestClass(CLASS)),
+                options -> options.testing.noLocalsTableOnInput = true);
 
     new DebugStreamComparator()
         .add("CF", streamDebugTest(cf, NAME, NO_FILTER))
diff --git a/src/test/java/com/android/tools/r8/debug/BlockReorderingTest.java b/src/test/java/com/android/tools/r8/debug/BlockReorderingTest.java
index 4d4844f..f8dfef5 100644
--- a/src/test/java/com/android/tools/r8/debug/BlockReorderingTest.java
+++ b/src/test/java/com/android/tools/r8/debug/BlockReorderingTest.java
@@ -8,9 +8,7 @@
 import java.util.Collections;
 import org.junit.Assume;
 import org.junit.BeforeClass;
-import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
 /**
  * Test single stepping behaviour across reordered blocks.
@@ -22,9 +20,6 @@
 
   private static D8DebugTestConfig d8Config;
 
-  @ClassRule
-  public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @BeforeClass
   public static void setup() throws Exception {
     // Force inversion of all conditionals to reliably construct a regression test for incorrect
@@ -32,7 +27,7 @@
     d8Config =
         new D8DebugTestConfig()
             .compileAndAdd(
-                temp,
+                getStaticTemp(),
                 Collections.singletonList(DEBUGGEE_JAR),
                 options -> options.testing.invertConditionals = true);
   }
diff --git a/src/test/java/com/android/tools/r8/debug/BreakAtTryAndCatchTestRunner.java b/src/test/java/com/android/tools/r8/debug/BreakAtTryAndCatchTestRunner.java
index ca2f53f..62ffe57 100644
--- a/src/test/java/com/android/tools/r8/debug/BreakAtTryAndCatchTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/BreakAtTryAndCatchTestRunner.java
@@ -16,7 +16,7 @@
 @RunWith(Parameterized.class)
 public class BreakAtTryAndCatchTestRunner extends DebugTestBase {
 
-  private static final Class CLASS = BreakAtTryAndCatchTest.class;
+  private static final Class<?> CLASS = BreakAtTryAndCatchTest.class;
   private static final String FILE = CLASS.getSimpleName() + ".java";
   private static final String NAME = CLASS.getCanonicalName();
 
@@ -43,7 +43,7 @@
 
   public BreakAtTryAndCatchTestRunner(String name, DelayedDebugTestConfig config) {
     this.name = name;
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/BreakInOneLineFinallyTestRunner.java b/src/test/java/com/android/tools/r8/debug/BreakInOneLineFinallyTestRunner.java
index 6d7d1a9..6059e43 100644
--- a/src/test/java/com/android/tools/r8/debug/BreakInOneLineFinallyTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/BreakInOneLineFinallyTestRunner.java
@@ -14,7 +14,7 @@
 @RunWith(Parameterized.class)
 public class BreakInOneLineFinallyTestRunner extends DebugTestBase {
 
-  private static final Class CLASS = BreakInOneLineFinallyTest.class;
+  private static final Class<?> CLASS = BreakInOneLineFinallyTest.class;
   private static final String FILE = CLASS.getSimpleName() + ".java";
   private static final String NAME = CLASS.getCanonicalName();
 
@@ -30,7 +30,7 @@
   }
 
   public BreakInOneLineFinallyTestRunner(String name, DelayedDebugTestConfig config) {
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/BreakInTwoLinesFinallyTestRunner.java b/src/test/java/com/android/tools/r8/debug/BreakInTwoLinesFinallyTestRunner.java
index 7691a2f..888ea87 100644
--- a/src/test/java/com/android/tools/r8/debug/BreakInTwoLinesFinallyTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/BreakInTwoLinesFinallyTestRunner.java
@@ -31,7 +31,7 @@
   }
 
   public BreakInTwoLinesFinallyTestRunner(String name, DelayedDebugTestConfig config) {
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/BreakOnIfTestRunner.java b/src/test/java/com/android/tools/r8/debug/BreakOnIfTestRunner.java
index e61d6f8..6e7bec1 100644
--- a/src/test/java/com/android/tools/r8/debug/BreakOnIfTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/BreakOnIfTestRunner.java
@@ -29,7 +29,7 @@
   }
 
   public BreakOnIfTestRunner(String name, DelayedDebugTestConfig config) {
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/BreakPointEventsTestRunner.java b/src/test/java/com/android/tools/r8/debug/BreakPointEventsTestRunner.java
index 7d90a93..cee1fec 100644
--- a/src/test/java/com/android/tools/r8/debug/BreakPointEventsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/BreakPointEventsTestRunner.java
@@ -37,11 +37,11 @@
   }
 
   public static DebugTestConfig d8Config() throws Exception {
-    return new D8DebugTestConfig().compileAndAdd(temp, getClassFilePath());
+    return new D8DebugTestConfig().compileAndAdd(getStaticTemp(), getClassFilePath());
   }
 
   public static DebugTestConfig r8CfConfig() throws Exception {
-    Path outCf = temp.getRoot().toPath().resolve("cf.jar");
+    Path outCf = getStaticTemp().getRoot().toPath().resolve("cf.jar");
     R8.run(
         R8Command.builder()
             .setMode(CompilationMode.DEBUG)
@@ -55,7 +55,7 @@
   public static DebugTestConfig dxConfig() throws Exception {
     Path cwd = ToolHelper.getClassPathForTests().toAbsolutePath();
     Path test = cwd.relativize(getClassFilePath().toAbsolutePath());
-    Path out = temp.newFolder().toPath().resolve("classes.dex").toAbsolutePath();
+    Path out = getStaticTemp().newFolder().toPath().resolve("classes.dex").toAbsolutePath();
     ProcessResult result = ToolHelper.runDX(cwd, "--output=" + out, test.toString());
     assertTrue(result.stderr, 0 == result.exitCode);
     DebugTestConfig config = new DexDebugTestConfig();
@@ -76,7 +76,7 @@
   // The main method will single-step each configuration of the test. It cannot be made a test as
   // the event streams are unequal due to ART vs JVM line change on return and DX incorrect locals.
   public static void main(String[] args) throws Exception {
-    temp.create();
+    getStaticTemp().create();
     try {
       BreakPointEventsTestRunner runner = new BreakPointEventsTestRunner("unused name");
       System.out.println("\n============== CF single stepping: ");
@@ -86,7 +86,7 @@
       System.out.println("\n============== DX single stepping: ");
       runner.printConfig("DX", dxConfig());
     } finally {
-      temp.delete();
+      getStaticTemp().delete();
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index 50a8842..5f69b7c 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -142,9 +142,6 @@
     return new DebugTestParameters();
   }
 
-  @ClassRule
-  public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Rule
   public TestName testName = new TestName();
 
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestExamples.java b/src/test/java/com/android/tools/r8/debug/DebugTestExamples.java
index a27c1d9..92a8408 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestExamples.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestExamples.java
@@ -19,7 +19,7 @@
 
   @BeforeClass
   public static void setup() {
-    config = new D8DebugTestResourcesConfig(temp);
+    config = new D8DebugTestResourcesConfig(getStaticTemp());
   }
 
   /**
diff --git a/src/test/java/com/android/tools/r8/debug/DoNotCrashOnAccessToThisRunner.java b/src/test/java/com/android/tools/r8/debug/DoNotCrashOnAccessToThisRunner.java
index 53d4d26..6b7109c 100644
--- a/src/test/java/com/android/tools/r8/debug/DoNotCrashOnAccessToThisRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/DoNotCrashOnAccessToThisRunner.java
@@ -44,7 +44,7 @@
   }
 
   public DoNotCrashOnAccessToThisRunner(String name, DelayedDebugTestConfig config) {
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/EmptyLineAfterJoinTestRunner.java b/src/test/java/com/android/tools/r8/debug/EmptyLineAfterJoinTestRunner.java
index 37782dd..3d4c3fc 100644
--- a/src/test/java/com/android/tools/r8/debug/EmptyLineAfterJoinTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/EmptyLineAfterJoinTestRunner.java
@@ -19,14 +19,13 @@
 @RunWith(Parameterized.class)
 public class EmptyLineAfterJoinTestRunner extends DebugTestBase {
 
-  static final Class CLASS = EmptyLineAfterJoinTest.class;
+  static final Class<?> CLASS = EmptyLineAfterJoinTest.class;
   static final String NAME = CLASS.getCanonicalName();
   static final String DESC = DescriptorUtils.javaTypeToDescriptor(NAME);
   static final String FILE = CLASS.getSimpleName() + ".java";
 
   private static Path inputJarCache = null;
 
-  private final String name;
   private final DebugTestConfig config;
 
   @Parameters(name = "{0}")
@@ -52,8 +51,7 @@
   }
 
   public EmptyLineAfterJoinTestRunner(String name, DelayedDebugTestConfig config) {
-    this.name = name;
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java b/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
index 1c811da..99ec6c9 100644
--- a/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
@@ -18,9 +18,6 @@
   final String sourcefile = className + ".j";
   final String methodName = "test";
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void testUselessCheckcastCF() throws Throwable {
     JasminBuilder builder = getBuilderForUselessCheckcast(className, methodName);
diff --git a/src/test/java/com/android/tools/r8/debug/LambdaTest.java b/src/test/java/com/android/tools/r8/debug/LambdaTest.java
index 749c4b4..719e651 100644
--- a/src/test/java/com/android/tools/r8/debug/LambdaTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LambdaTest.java
@@ -32,7 +32,7 @@
   private final DebugTestConfig config;
 
   public LambdaTest(String name, DelayedDebugTestConfig delayedConfig) {
-    this.config = delayedConfig.getConfig(temp);
+    this.config = delayedConfig.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/LoadInvokeLoadOptimizationTestRunner.java b/src/test/java/com/android/tools/r8/debug/LoadInvokeLoadOptimizationTestRunner.java
index 9cd5079..e33be2e 100644
--- a/src/test/java/com/android/tools/r8/debug/LoadInvokeLoadOptimizationTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/LoadInvokeLoadOptimizationTestRunner.java
@@ -38,7 +38,7 @@
   @Test
   public void testReference() throws Throwable {
     assumeTrue(parameters.isCfRuntime());
-    testForJvm(temp)
+    testForJvm(parameters)
         .addProgramClasses(CLASS)
         .run(parameters.getRuntime(), CLASS)
         .assertSuccessWithOutput(EXPECTED)
diff --git a/src/test/java/com/android/tools/r8/debug/LocalChangeOnSameLineTestRunner.java b/src/test/java/com/android/tools/r8/debug/LocalChangeOnSameLineTestRunner.java
index 9fe7e23..2ef0b4b 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalChangeOnSameLineTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalChangeOnSameLineTestRunner.java
@@ -15,7 +15,7 @@
 @RunWith(Parameterized.class)
 public class LocalChangeOnSameLineTestRunner extends DebugTestBase {
 
-  private static final Class CLASS = LocalChangeOnSameLineTest.class;
+  private static final Class<?> CLASS = LocalChangeOnSameLineTest.class;
   private static final String FILE = CLASS.getSimpleName() + ".java";
   private static final String NAME = CLASS.getCanonicalName();
 
@@ -33,7 +33,7 @@
 
   public LocalChangeOnSameLineTestRunner(String name, DelayedDebugTestConfig config) {
     this.name = name;
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   /** Test that only hit the break point at line 15 once. */
diff --git a/src/test/java/com/android/tools/r8/debug/LocalEndTestRunner.java b/src/test/java/com/android/tools/r8/debug/LocalEndTestRunner.java
index af89b16..e406922 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalEndTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalEndTestRunner.java
@@ -20,14 +20,13 @@
 @RunWith(Parameterized.class)
 public class LocalEndTestRunner extends DebugTestBase {
 
-  static final Class CLASS = LocalEndTest.class;
+  static final Class<?> CLASS = LocalEndTest.class;
   static final String NAME = CLASS.getCanonicalName();
   static final String DESC = DescriptorUtils.javaTypeToDescriptor(NAME);
   static final String FILE = CLASS.getSimpleName() + ".java";
 
   private static Path inputJarCache = null;
 
-  private final String name;
   private final DebugTestConfig config;
 
   @Parameters(name = "{0}")
@@ -49,8 +48,7 @@
   }
 
   public LocalEndTestRunner(String name, DelayedDebugTestConfig config) {
-    this.name = name;
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java b/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
index 85749ab..84bb292 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalsLiveAtBlockEntryDebugTest.java
@@ -35,9 +35,6 @@
   final String sourcefile = className + ".j";
   final String methodName = "test";
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void testCF() throws Throwable {
     JasminBuilder builder = getBuilderForTest(className, methodName);
diff --git a/src/test/java/com/android/tools/r8/debug/LocalsTest.java b/src/test/java/com/android/tools/r8/debug/LocalsTest.java
index 68b67a9..35178f8 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalsTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalsTest.java
@@ -35,7 +35,7 @@
   private final DebugTestConfig config;
 
   public LocalsTest(String name, DelayedDebugTestConfig config) {
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/NonExitingMethodTestRunner.java b/src/test/java/com/android/tools/r8/debug/NonExitingMethodTestRunner.java
index 65d5504..fc81883 100644
--- a/src/test/java/com/android/tools/r8/debug/NonExitingMethodTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debug/NonExitingMethodTestRunner.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.VmTestRunner.IgnoreIfVmOlderThan;
 import com.android.tools.r8.origin.Origin;
 import com.google.common.collect.ImmutableList;
-import java.io.IOException;
 import java.nio.file.Path;
 import org.junit.Assume;
 import org.junit.Test;
@@ -38,7 +37,7 @@
     return new D8DebugTestConfig().compileAndAdd(temp, getClassFilePath());
   }
 
-  public DebugTestConfig r8CfConfig() throws CompilationFailedException, IOException {
+  public DebugTestConfig r8CfConfig() throws CompilationFailedException {
     Path path = temp.getRoot().toPath().resolve("out.jar");
     ToolHelper.runR8(
         R8Command.builder()
diff --git a/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java b/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
index 1d4a205..71dd6fc 100644
--- a/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
@@ -28,9 +28,6 @@
   static final String FILE = "SmaliDebugTestDebuggee.smali";
   static final String CLASS = "SmaliDebugTestDebuggee";
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   /**
    * Simple test to check setup works for the Java source, ala:
    *
diff --git a/src/test/java/com/android/tools/r8/debug/SynchronizedBlockTest.java b/src/test/java/com/android/tools/r8/debug/SynchronizedBlockTest.java
index 208c2cb..0c3f81d 100644
--- a/src/test/java/com/android/tools/r8/debug/SynchronizedBlockTest.java
+++ b/src/test/java/com/android/tools/r8/debug/SynchronizedBlockTest.java
@@ -38,7 +38,7 @@
 
   public SynchronizedBlockTest(String name, DelayedDebugTestConfig config) {
     this.name = name;
-    this.config = config.getConfig(temp);
+    this.config = config.getConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/SyntheticMethodTest.java b/src/test/java/com/android/tools/r8/debug/SyntheticMethodTest.java
index ef09ce2..0872225 100644
--- a/src/test/java/com/android/tools/r8/debug/SyntheticMethodTest.java
+++ b/src/test/java/com/android/tools/r8/debug/SyntheticMethodTest.java
@@ -16,7 +16,7 @@
 
   @BeforeClass
   public static void setup() {
-    config = new D8DebugTestResourcesConfig(temp);
+    config = new D8DebugTestResourcesConfig(getStaticTemp());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoTestBase.java b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoTestBase.java
index 10d301d..5019708 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DebugInfoTestBase.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DebugInfoTestBase.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -21,12 +22,8 @@
 import java.nio.file.Path;
 import java.util.concurrent.ExecutionException;
 import org.junit.Rule;
-import org.junit.rules.TemporaryFolder;
 
-public class DebugInfoTestBase {
-
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+public class DebugInfoTestBase extends TestBase {
 
   @Rule
   public TestDescriptionWatcher watcher = new TestDescriptionWatcher();
diff --git a/src/test/java/com/android/tools/r8/debuginfo/PreamblePositionTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/PreamblePositionTestRunner.java
index 90239e7..5dafac1 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/PreamblePositionTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/PreamblePositionTestRunner.java
@@ -10,22 +10,19 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class PreamblePositionTestRunner {
+public class PreamblePositionTestRunner extends TestBase {
 
   private static final String TEST_CLASS = "PreamblePositionTestSource";
   private static final String TEST_PACKAGE = "com.android.tools.r8.debuginfo";
 
-  @ClassRule public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void testBothBranchesDefaultConditionals() throws Exception {
     testBothBranches(false);
diff --git a/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithSelfReferenceTestRunner.java b/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithSelfReferenceTestRunner.java
index ef56abd..130b7fe 100644
--- a/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithSelfReferenceTestRunner.java
+++ b/src/test/java/com/android/tools/r8/desugar/DefaultLambdaWithSelfReferenceTestRunner.java
@@ -30,6 +30,7 @@
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
@@ -38,17 +39,14 @@
   private static final Class<?> CLASS = DefaultLambdaWithSelfReferenceTest.class;
   private static final String EXPECTED = StringUtils.lines("stateful(stateless)");
 
-  private final TestParameters parameters;
+  @Parameter(0)
+  public TestParameters parameters;
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
     return getTestParameters().withAllRuntimesAndApiLevels().build();
   }
 
-  public DefaultLambdaWithSelfReferenceTestRunner(TestParameters parameters) {
-    this.parameters = parameters;
-  }
-
   private void runDebugger(DebugTestConfig config, boolean isR8) throws Throwable {
     MethodReference main = Reference.methodFromMethod(CLASS.getMethod("main", String[].class));
     Command checkThisLambda =
diff --git a/src/test/java/com/android/tools/r8/examples/newarray/NewArrayTestRunner.java b/src/test/java/com/android/tools/r8/examples/newarray/NewArrayTestRunner.java
index b36fa2c..be1d789 100644
--- a/src/test/java/com/android/tools/r8/examples/newarray/NewArrayTestRunner.java
+++ b/src/test/java/com/android/tools/r8/examples/newarray/NewArrayTestRunner.java
@@ -76,10 +76,10 @@
 
   @Test
   public void runReference() throws Exception {
+    parameters.assumeJvmTestParameters();
     assumeFalse(enableMultiANewArrayDesugaringForClassFiles);
-    assumeTrue(parameters.isCfRuntime());
     assumeTrue(mode == CompilationMode.DEBUG);
-    testForJvm(getStaticTemp())
+    testForJvm(parameters)
         .addProgramClassesAndInnerClasses(CLASS)
         .run(parameters.getRuntime(), CLASS)
         .assertSuccessWithOutputLines(EXPECTED);
@@ -87,8 +87,8 @@
 
   @Test
   public void testD8() throws Exception {
+    parameters.assumeDexRuntime();
     assumeFalse(enableMultiANewArrayDesugaringForClassFiles);
-    assumeTrue(parameters.isDexRuntime());
     testForD8()
         .addProgramClassesAndInnerClasses(CLASS)
         .setMinApi(parameters)
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index 41ef5ee..8d11903 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -61,9 +61,6 @@
   protected KeepingDiagnosticHandler handler;
   protected Reporter reporter;
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Before
   public void reset() {
     handler = new KeepingDiagnosticHandler();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringLengthDebugTestRunner.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringLengthDebugTestRunner.java
index 21033e5..4eaf16f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringLengthDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringLengthDebugTestRunner.java
@@ -23,8 +23,8 @@
   @IgnoreIfVmOlderThan(Version.V5_1_1)
   public void test() throws Throwable {
     Class<?> main = StringLengthDebugTest.class;
-    DebugTestConfig config = new D8DebugTestConfig()
-        .compileAndAdd(temp, ToolHelper.getClassFileForTestClass(main));
+    DebugTestConfig config =
+        new D8DebugTestConfig().compileAndAdd(temp, ToolHelper.getClassFileForTestClass(main));
     runDebugTest(config, main.getCanonicalName(),
         breakpoint(main.getCanonicalName(), "main"),
         run(),
diff --git a/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java b/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
index f29b349..9b41eec 100644
--- a/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
+++ b/src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSetRegressionTest.java
@@ -5,6 +5,7 @@
 
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
@@ -16,18 +17,13 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
-public class UnicodeSetRegressionTest {
+public class UnicodeSetRegressionTest extends TestBase {
 
   private static final String JAR_FILE =
       "src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSet.jar";
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   private AndroidApp dexFromDX() throws IOException {
     return ToolHelper.runDexer(JAR_FILE, temp.newFolder("dx-dex").getPath());
   }
diff --git a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
index a831fb0..a7c2581 100644
--- a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
+++ b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.D8;
 import com.android.tools.r8.D8Command;
 import com.android.tools.r8.OutputMode;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
@@ -30,13 +31,11 @@
 import java.util.Set;
 import org.junit.Assume;
 import org.junit.BeforeClass;
-import org.junit.ClassRule;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
 /** Wrapper for the art JDWP tests. */
-public class RunJdwpTests {
+public class RunJdwpTests extends TestBase {
 
   enum Tool {
     JAVAC,
@@ -266,9 +265,6 @@
 
   private static File d8Out = null;
 
-  @ClassRule
-  public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Rule
   public TestDescriptionWatcher watcher = new TestDescriptionWatcher();
 
@@ -284,7 +280,7 @@
       extraTestResources.add(testPath.resolve(test + ".class"));
       extraTestResources.add(testPath.resolve(test.replace("Test", "Debuggee") + ".class"));
     }
-    d8Out = temp.newFolder("d8-out");
+    d8Out = getStaticTemp().newFolder("d8-out");
     D8.run(
         D8Command.builder()
             .addProgramFiles(jdwpTestsJar)
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
index 605ddf7..1abcddd 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
@@ -35,13 +35,12 @@
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class MemberRebindingTest {
+public class MemberRebindingTest extends TestBase {
 
   private static final Path JAR_LIBRARY =
       Paths.get(ToolHelper.EXAMPLES_BUILD_DIR + "memberrebindinglib.jar");
@@ -65,9 +64,6 @@
   private final int minApiLevel;
 
   @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  @Rule
   public TestDescriptionWatcher watcher = new TestDescriptionWatcher();
 
   public MemberRebindingTest(TestConfiguration configuration) {
diff --git a/src/test/java/com/android/tools/r8/naming/InterfaceConstructorRenamingTest.java b/src/test/java/com/android/tools/r8/naming/InterfaceConstructorRenamingTest.java
index 7ec2589..0b6f53f 100644
--- a/src/test/java/com/android/tools/r8/naming/InterfaceConstructorRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/InterfaceConstructorRenamingTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
@@ -18,9 +17,7 @@
 import java.io.IOException;
 import java.util.Collections;
 import java.util.function.Function;
-import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
@@ -38,12 +35,10 @@
   private static Function<Backend, R8TestCompileResult> compilation =
       memoizeFunction(InterfaceConstructorRenamingTest::compile);
 
-  @ClassRule public static TemporaryFolder staticTemp = ToolHelper.getTemporaryFolderForTest();
-
   private static R8TestCompileResult compile(Backend backend)
       throws com.android.tools.r8.CompilationFailedException, IOException {
     R8TestCompileResult compileResult =
-        testForR8(staticTemp, backend)
+        testForR8(getStaticTemp(), backend)
             .addProgramClasses(TestInterface.class, TestClass.class)
             .addKeepMainRule(TestClass.class)
             .setMinApi(AndroidApiLevel.B)
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
index 6d8982a..7723243 100644
--- a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
+++ b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
@@ -39,7 +39,7 @@
   @BeforeClass
   public static void initDebuggeePath() throws Exception {
     for (Backend backend : ToolHelper.getBackends()) {
-      Path outdir = temp.newFolder().toPath();
+      Path outdir = getStaticTemp().newFolder().toPath();
       Path outjar = outdir.resolve("r8_compiled.jar");
       Path proguardMapPath = outdir.resolve("proguard.map");
       R8Command.Builder builder =
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingAfterVerticalMergingMethodTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingAfterVerticalMergingMethodTest.java
index 8c0274e..6e84651 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingAfterVerticalMergingMethodTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingAfterVerticalMergingMethodTest.java
@@ -15,18 +15,14 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.List;
-import java.util.concurrent.ExecutionException;
 import java.util.function.Function;
-import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
@@ -92,11 +88,8 @@
   private static Function<Backend, CompilationResult> compilationResults =
       memoizeFunction(ApplyMappingAfterVerticalMergingMethodTest::compile);
 
-  @ClassRule
-  public static TemporaryFolder staticTemp = ToolHelper.getTemporaryFolderForTest();
-
   public static CompilationResult compile(Backend backend)
-      throws ExecutionException, CompilationFailedException, IOException {
+      throws CompilationFailedException, IOException {
     R8TestCompileResult library = compileLibrary(backend);
     R8TestCompileResult program = compileProgram(backend, library.getProguardMap());
     return new CompilationResult(library, program, library.writeToZip());
@@ -104,7 +97,7 @@
 
   private static R8TestCompileResult compileLibrary(Backend backend)
       throws CompilationFailedException, IOException {
-    return testForR8(staticTemp, backend)
+    return testForR8(getStaticTemp(), backend)
         .enableInliningAnnotations()
         .enableMemberValuePropagationAnnotations()
         .addProgramClasses(LIBRARY_CLASSES)
@@ -132,7 +125,7 @@
 
   private static R8TestCompileResult compileProgram(Backend backend, String proguardMap)
       throws CompilationFailedException {
-    return testForR8(staticTemp, backend)
+    return testForR8(getStaticTemp(), backend)
         .noTreeShaking()
         .addDontObfuscate()
         .addProgramClasses(PROGRAM_CLASSES)
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/shared/NameClashTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/shared/NameClashTest.java
index 5d1c231..4a2c79e 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/shared/NameClashTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/shared/NameClashTest.java
@@ -19,16 +19,11 @@
 import java.nio.file.Path;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.ClassRule;
 import org.junit.Ignore;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 
 public class NameClashTest extends TestBase {
 
-  @ClassRule
-  public static TemporaryFolder temporaryFolder = ToolHelper.getTemporaryFolderForTest();
-
   private static Class<?> MAIN = ProgramClass.class;
   private static String EXPECTED_OUTPUT =
       StringUtils.lines(
@@ -42,13 +37,13 @@
   @BeforeClass
   public static void setUpJars() throws Exception {
     prgJarThatUsesOriginalLib =
-        temporaryFolder.newFile("prgOrginalLib.jar").toPath().toAbsolutePath();
+        getStaticTemp().newFile("prgOrginalLib.jar").toPath().toAbsolutePath();
     writeClassFileDataToJar(
         prgJarThatUsesOriginalLib, ImmutableList.of(ToolHelper.getClassAsBytes(MAIN)));
     prgJarThatUsesMinifiedLib =
-        temporaryFolder.newFile("prgMinifiedLib.jar").toPath().toAbsolutePath();
+        getStaticTemp().newFile("prgMinifiedLib.jar").toPath().toAbsolutePath();
     writeClassFileDataToJar(prgJarThatUsesMinifiedLib, ImmutableList.of(ProgramClassDump.dump()));
-    libJar = temporaryFolder.newFile("lib.jar").toPath().toAbsolutePath();
+    libJar = getStaticTemp().newFile("lib.jar").toPath().toAbsolutePath();
     writeClassesToJar(
         libJar,
         ImmutableList.of(
diff --git a/src/test/java/com/android/tools/r8/regress/b79498926/B79498926.java b/src/test/java/com/android/tools/r8/regress/b79498926/B79498926.java
index d10454d..481cb2c 100644
--- a/src/test/java/com/android/tools/r8/regress/b79498926/B79498926.java
+++ b/src/test/java/com/android/tools/r8/regress/b79498926/B79498926.java
@@ -33,9 +33,6 @@
     return getTestParameters().withDexRuntimes().build();
   }
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   @Test
   public void test() throws CompilationFailedException, IOException {
     Path outDex = temp.getRoot().toPath().resolve("out.zip");
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
index fc880c9..235ef00 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/RemoveAssertionsTest.java
@@ -28,9 +28,7 @@
 import java.nio.file.Path;
 import java.util.Collection;
 import java.util.function.Function;
-import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.objectweb.asm.ClassReader;
@@ -178,14 +176,12 @@
     this.parameters = parameters;
   }
 
-  @ClassRule public static TemporaryFolder staticTemp = ToolHelper.getTemporaryFolderForTest();
-
   private static Function<Backend, CompilationResults> compilationResults =
       memoizeFunction(RemoveAssertionsTest::compileAll);
 
   private static R8TestCompileResult compileWithAccessModification(Backend backend)
       throws CompilationFailedException {
-    return testForR8(staticTemp, backend)
+    return testForR8(getStaticTemp(), backend)
         .addProgramClasses(ClassWithAssertions.class)
         .addKeepMainRule(ClassWithAssertions.class)
         .addOptionsModification(o -> o.inlinerOptions().enableInlining = false)
@@ -198,7 +194,7 @@
   private static R8TestCompileResult compileCf(
       Function<AssertionsConfiguration.Builder, AssertionsConfiguration> transformation)
       throws CompilationFailedException {
-    return testForR8(staticTemp, Backend.CF)
+    return testForR8(getStaticTemp(), Backend.CF)
         .addProgramClasses(ClassWithAssertions.class)
         .debug()
         .noTreeShaking()
@@ -219,7 +215,7 @@
 
   private static R8TestCompileResult compileRegress110887293(Function<byte[], byte[]> rewriter)
       throws CompilationFailedException, IOException {
-    return testForR8(staticTemp, Backend.DEX)
+    return testForR8(getStaticTemp(), Backend.DEX)
         .addProgramClassFileData(
             rewriter.apply(ToolHelper.getClassAsBytes(ClassWithAssertions.class)))
         .addProgramClasses(ChromuimAssertionHookMock.class)
diff --git a/src/test/java/com/android/tools/r8/shaking/NonVirtualOverrideTest.java b/src/test/java/com/android/tools/r8/shaking/NonVirtualOverrideTest.java
index 163a63f..8ce1d80 100644
--- a/src/test/java/com/android/tools/r8/shaking/NonVirtualOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/NonVirtualOverrideTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfRuntime;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.ir.optimize.Inliner.Reason;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -29,9 +28,7 @@
 import java.util.Collection;
 import java.util.Objects;
 import java.util.function.Function;
-import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.objectweb.asm.ClassWriter;
@@ -83,8 +80,6 @@
     this.enableVerticalClassMerging = enableVerticalClassMerging;
   }
 
-  @ClassRule public static TemporaryFolder staticTemp = ToolHelper.getTemporaryFolderForTest();
-
   private static Function<Boolean, String> expectedResults =
       memoizeFunction(NonVirtualOverrideTest::getExpectedResult);
 
@@ -92,7 +87,7 @@
       memoizeFunction(NonVirtualOverrideTest::compile);
 
   public static String getExpectedResult(boolean isOldVm) throws Exception {
-    Path referenceJar = staticTemp.getRoot().toPath().resolve("input.jar");
+    Path referenceJar = getStaticTemp().getRoot().toPath().resolve("input.jar");
     ArchiveConsumer inputConsumer = new ArchiveConsumer(referenceJar);
     inputConsumer.accept(
         ByteDataView.of(NonVirtualOverrideTestClassDump.dump()),
@@ -128,7 +123,7 @@
   }
 
   public static R8TestCompileResult compile(Dimensions dimensions) throws Exception {
-    return testForR8(staticTemp, dimensions.backend)
+    return testForR8(getStaticTemp(), dimensions.backend)
         .addProgramClassFileData(
             NonVirtualOverrideTestClassDump.dump(), ADump.dump(), BDump.dump(), CDump.dump())
         .addKeepMainRule(NonVirtualOverrideTestClass.class)
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
index eacb522..a5a7c88 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
@@ -50,9 +50,6 @@
     parameters.assertNoneRuntime();
   }
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   private Path getProgramFiles(String test) {
     return Paths.get(EXAMPLES_BUILD_DIR, test + ".jar");
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsVisibleMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsVisibleMethodsTest.java
index 05fa461..bb3c520 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsVisibleMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsVisibleMethodsTest.java
@@ -17,9 +17,7 @@
 import java.nio.file.Path;
 import java.util.Collection;
 import org.junit.BeforeClass;
-import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
@@ -130,18 +128,15 @@
     this.config = config;
   }
 
-  @ClassRule
-  public static TemporaryFolder staticTemp = ToolHelper.getTemporaryFolderForTest();
-
   private static Path libJarPath;
   private static Path libDexPath;
 
   @BeforeClass
   public static void prepareLib() throws Exception {
-    libJarPath = staticTemp.newFile("lib.jar").toPath().toAbsolutePath();
+    libJarPath = getStaticTemp().newFile("lib.jar").toPath().toAbsolutePath();
     writeClassesToJar(libJarPath, ImmutableList.of(LibraryBase.class));
-    libDexPath = staticTemp.newFile("lib.dex").toPath().toAbsolutePath();
-    testForD8(staticTemp)
+    libDexPath = getStaticTemp().newFile("lib.dex").toPath().toAbsolutePath();
+    testForD8(getStaticTemp())
         .addProgramFiles(libJarPath)
         .setMinApi(AndroidApiLevel.B)
         .setProgramConsumer(new ArchiveConsumer(libDexPath))
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithoutMatchingDefinitionTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithoutMatchingDefinitionTest.java
index a7f1914..65687cc4 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithoutMatchingDefinitionTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithoutMatchingDefinitionTest.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.DexIndexedConsumer.ArchiveConsumer;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
@@ -21,9 +20,7 @@
 import java.nio.file.Path;
 import java.util.Collection;
 import org.junit.BeforeClass;
-import org.junit.ClassRule;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
@@ -88,18 +85,15 @@
   @Parameter(1)
   public TestConfig config;
 
-  @ClassRule
-  public static TemporaryFolder staticTemp = ToolHelper.getTemporaryFolderForTest();
-
   private static Path libJarPath;
   private static Path libDexPath;
 
   @BeforeClass
   public static void prepareLibJar() throws Exception {
-    libJarPath = staticTemp.newFile("lib.jar").toPath().toAbsolutePath();
+    libJarPath = getStaticTemp().newFile("lib.jar").toPath().toAbsolutePath();
     writeClassesToJar(libJarPath, ImmutableList.of(LibraryBase.class, LibrarySub.class));
-    libDexPath = staticTemp.newFile("lib.dex").toPath().toAbsolutePath();
-    testForD8(staticTemp)
+    libDexPath = getStaticTemp().newFile("lib.dex").toPath().toAbsolutePath();
+    testForD8(getStaticTemp())
         .addProgramFiles(libJarPath)
         .setMinApi(AndroidApiLevel.B)
         .setProgramConsumer(new ArchiveConsumer(libDexPath))
diff --git a/src/test/java/com/android/tools/r8/utils/GenerateMainDexListCommandTest.java b/src/test/java/com/android/tools/r8/utils/GenerateMainDexListCommandTest.java
index f681673..becf21f 100644
--- a/src/test/java/com/android/tools/r8/utils/GenerateMainDexListCommandTest.java
+++ b/src/test/java/com/android/tools/r8/utils/GenerateMainDexListCommandTest.java
@@ -14,6 +14,7 @@
 import com.android.tools.r8.GenerateMainDexList;
 import com.android.tools.r8.GenerateMainDexListCommand;
 import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.origin.Origin;
@@ -30,16 +31,12 @@
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
 
-public class GenerateMainDexListCommandTest {
+public class GenerateMainDexListCommandTest extends TestBase {
 
   @Rule
   public ExpectedException thrown = ExpectedException.none();
 
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
   private Path getOutputPath(GenerateMainDexListCommand command) {
     StringConsumer consumer = command.getMainDexListConsumer();
     if (consumer instanceof JoiningStringConsumer) {
