Test that the setup of the default test parameters.
This should help avoid an error in the building of test parameters that could
cause tests to silently stop running.
Change-Id: I698970dbc101c4e8aeaf5350fad16f4b1738d71c
diff --git a/src/test/java/com/android/tools/r8/TestParameters.java b/src/test/java/com/android/tools/r8/TestParameters.java
index d73f975..fc9c8db 100644
--- a/src/test/java/com/android/tools/r8/TestParameters.java
+++ b/src/test/java/com/android/tools/r8/TestParameters.java
@@ -4,6 +4,7 @@
package com.android.tools.r8;
import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.TestRuntime.NoneRuntime;
import com.android.tools.r8.utils.AndroidApiLevel;
// Actual test parameters for a specific configuration. Currently just the runtime configuration.
@@ -31,6 +32,10 @@
return runtime.isCf();
}
+ public boolean isNoneRuntime() {
+ return runtime == NoneRuntime.getInstance();
+ }
+
public AndroidApiLevel getApiLevel() {
if (runtime.isDex() && apiLevel == null) {
throw new RuntimeException(
diff --git a/src/test/java/com/android/tools/r8/TestParametersBuilder.java b/src/test/java/com/android/tools/r8/TestParametersBuilder.java
index 8d784e7..f2504f2 100644
--- a/src/test/java/com/android/tools/r8/TestParametersBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestParametersBuilder.java
@@ -235,12 +235,19 @@
return isSystemJdk(vm) || TestRuntime.isCheckedInJDK(vm);
}
+ public static boolean isRuntimesPropertySet() {
+ return getRuntimesProperty() != null;
+ }
+
+ private static String getRuntimesProperty() {
+ return System.getProperty("runtimes");
+ }
+
private static Stream<TestRuntime> getAvailableRuntimes() {
- String runtimesProperty = System.getProperty("runtimes");
Stream<TestRuntime> runtimes;
- if (runtimesProperty != null) {
+ if (isRuntimesPropertySet()) {
runtimes =
- Arrays.stream(runtimesProperty.split(":"))
+ Arrays.stream(getRuntimesProperty().split(":"))
.filter(s -> !s.isEmpty())
.map(
name -> {
diff --git a/src/test/java/com/android/tools/r8/utils/TestParametersTest.java b/src/test/java/com/android/tools/r8/utils/TestParametersTest.java
new file mode 100644
index 0000000..2d26e5d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/TestParametersTest.java
@@ -0,0 +1,74 @@
+// 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.utils;
+
+import static org.hamcrest.CoreMatchers.hasItem;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeFalse;
+
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersBuilder;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime.DexRuntime;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Map;
+import java.util.Set;
+import org.junit.Test;
+
+// This test is should explicitly not be parameterized and using the test parameters as it is
+// testing the correctness of the test-parameters set up.
+public class TestParametersTest {
+
+ @Test
+ public void testNoneRuntime() {
+ assumeFalse(
+ "Test is only valid when no runtimes property is set",
+ TestParametersBuilder.isRuntimesPropertySet());
+ TestParametersCollection params = TestParametersBuilder.builder().withNoneRuntime().build();
+ assertTrue(params.stream().anyMatch(TestParameters::isNoneRuntime));
+ }
+
+ @Test
+ public void testAllRuntimes() {
+ assumeFalse(
+ "Test is only valid when no runtimes property is set",
+ TestParametersBuilder.isRuntimesPropertySet());
+ TestParametersCollection params = TestParametersBuilder.builder().withAllRuntimes().build();
+ assertTrue(params.stream().noneMatch(TestParameters::isNoneRuntime));
+ assertTrue(params.stream().anyMatch(TestParameters::isDexRuntime));
+ assertTrue(params.stream().anyMatch(TestParameters::isCfRuntime));
+ }
+
+ @Test
+ public void testAllApiLevels() {
+ assumeFalse(
+ "Test is only valid when no runtimes property is set",
+ TestParametersBuilder.isRuntimesPropertySet());
+ // This test may also fail once the tests can be configured for with API levels to run.
+ TestParametersCollection params =
+ TestParametersBuilder.builder().withAllRuntimesAndApiLevels().build();
+ assertTrue(params.stream().noneMatch(TestParameters::isNoneRuntime));
+ assertTrue(params.stream().anyMatch(p -> p.isCfRuntime() && p.getApiLevel() == null));
+ // Default API levels are min and max for each DEX VM.
+ Map<DexRuntime, Set<AndroidApiLevel>> levels = new IdentityHashMap<>();
+ params.stream()
+ .forEach(
+ p -> {
+ if (p.isDexRuntime()) {
+ levels
+ .computeIfAbsent(p.getRuntime().asDex(), key -> new HashSet<>())
+ .add(p.getApiLevel());
+ }
+ });
+ assertFalse(levels.isEmpty());
+ levels.forEach(
+ (dexRuntime, apiLevels) -> {
+ assertThat(apiLevels, hasItem(AndroidApiLevel.getDefault()));
+ assertThat(apiLevels, hasItem(dexRuntime.getMinApiLevel()));
+ });
+ }
+}