Test invoke-super of a default method in desugared library
Bug: 177221295
Change-Id: Ifc6c2578abb2729a15d455e8ab298687db09e292
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
index 3e40117..efb77c9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
@@ -5,12 +5,15 @@
package com.android.tools.r8.desugar.desugaredlibrary;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.anyOf;
+import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestCompileResult;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestRunResult;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
@@ -26,6 +29,12 @@
import com.android.tools.r8.utils.codeinspector.TypeSubject;
import com.google.common.collect.ImmutableSet;
import java.nio.file.Path;
+import java.time.DateTimeException;
+import java.time.ZoneId;
+import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalField;
+import java.time.temporal.TemporalQueries;
+import java.time.temporal.TemporalQuery;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -48,7 +57,9 @@
"1970-01-02T10:17:36.789Z",
"GMT",
"GMT",
+ "true",
"Hello, world");
+ boolean canUseDefaultAndStaticInterfaceMethods;
@Parameters(name = "{2}, shrinkDesugaredLibrary: {0}, traceReferencesKeepRules {1}")
public static List<Object[]> data() {
@@ -67,6 +78,10 @@
this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
this.traceReferencesKeepRules = traceReferencesKeepRules;
this.parameters = parameters;
+ this.canUseDefaultAndStaticInterfaceMethods =
+ parameters
+ .getApiLevel()
+ .isGreaterThanOrEqualTo(apiLevelWithDefaultInterfaceMethodsSupport());
}
private void checkRewrittenInvokes(CodeInspector inspector) {
@@ -162,27 +177,37 @@
}
// Determine desugared library keep rules.
+ TestRunResult<?> result;
if (parameters.getRuntime().isDex()) {
// Convert to DEX without desugaring and run.
- testForD8()
- .addProgramFiles(jar)
- .setMinApi(parameters.getApiLevel())
- .disableDesugaring()
- .compile()
- .addDesugaredCoreLibraryRunClassPath(
- this::buildDesugaredLibrary,
- parameters.getApiLevel(),
- desugaredLibraryKeepRules,
- shrinkDesugaredLibrary)
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutput(expectedOutput);
+ result =
+ testForD8()
+ .addProgramFiles(jar)
+ .setMinApi(parameters.getApiLevel())
+ .disableDesugaring()
+ .compile()
+ .addDesugaredCoreLibraryRunClassPath(
+ this::buildDesugaredLibrary,
+ parameters.getApiLevel(),
+ desugaredLibraryKeepRules,
+ shrinkDesugaredLibrary)
+ .run(parameters.getRuntime(), TestClass.class);
} else {
// Run on the JVM with desugared library on classpath.
- testForJvm()
- .addProgramFiles(jar)
- .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel()))
- .run(parameters.getRuntime(), TestClass.class)
- .assertSuccessWithOutput(expectedOutput);
+ result =
+ testForJvm()
+ .addProgramFiles(jar)
+ .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel()))
+ .run(parameters.getRuntime(), TestClass.class);
+ }
+ if (canUseDefaultAndStaticInterfaceMethods) {
+ result.assertSuccessWithOutput(expectedOutput);
+ } else {
+ result.assertFailureWithErrorThatMatches(
+ anyOf(
+ containsString(VerifyError.class.getName()),
+ containsString(IncompatibleClassChangeError.class.getName()),
+ containsString(AbstractMethodError.class.getName())));
}
}
@@ -246,6 +271,31 @@
return System.currentTimeMillis() > 0 ? null : new Object();
}
+ public static void superInvokeOnLibraryDesugaredDefaultMethod() {
+ TemporalAccessor mock =
+ new TemporalAccessor() {
+ @Override
+ public boolean isSupported(TemporalField field) {
+ return false;
+ }
+
+ @Override
+ public long getLong(TemporalField field) {
+ throw new DateTimeException("Mock");
+ }
+
+ @SuppressWarnings("unchecked")
+ @Override
+ public <R> R query(TemporalQuery<R> query) {
+ if (query == TemporalQueries.zoneId()) {
+ return (R) ZoneId.of("GMT");
+ }
+ return TemporalAccessor.super.query(query);
+ }
+ };
+ System.out.println(ZoneId.from(mock).equals(ZoneId.of("GMT")));
+ }
+
public static void main(String[] args) {
java.time.Clock.systemDefaultZone();
try {
@@ -266,6 +316,8 @@
System.out.println(timeZone.getID());
System.out.println(timeZone.toZoneId().getId());
+ superInvokeOnLibraryDesugaredDefaultMethod();
+
System.out.println("Hello, world");
}
}