blob: c5c08596caf3de2e7c8b6b6b4527471da8c1e9f4 [file] [log] [blame]
// Copyright (c) 2018, 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.shaking;
import static org.hamcrest.CoreMatchers.containsString;
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.google.common.collect.ImmutableList;
import java.nio.file.Path;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
@RunWith(Parameterized.class)
public class MissingInterfaceTest extends TestBase {
private final TestParameters parameters;
private final String[] EXPECTED = new String[] {"B112849320", "8"};
@Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withDexRuntimes().withAllApiLevels().build();
}
public MissingInterfaceTest(TestParameters parameters) {
this.parameters = parameters;
}
@Test
public void test_missingInterface() throws Exception {
testForR8(parameters.getBackend())
.addProgramClasses(TestClassForB112849320.class)
.addDontWarn(GoingToBeMissed.class)
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(TestClassForB112849320.class)
.addOptionsModification(options -> options.enableInlining = false)
.addKeepPackageNamesRule(GoingToBeMissed.class.getPackage())
.compile()
.addRunClasspathFiles(
buildOnDexRuntime(
parameters,
writeToJar(ImmutableList.of(ToolHelper.getClassAsBytes(GoingToBeMissed.class)))))
.run(parameters.getRuntime(), TestClassForB112849320.class)
.forCfRuntime(r -> r.assertSuccessWithOutputLines(EXPECTED))
.otherwise(
r -> {
r.assertStdoutMatches(containsString("B112849320"));
r.assertFailureWithErrorThatThrows(AbstractMethodError.class);
});
}
@Test
public void test_passingInterfaceAsLib() throws Exception {
Path lib = writeToJar(ImmutableList.of(ToolHelper.getClassAsBytes(GoingToBeMissed.class)));
testForR8(parameters.getBackend())
.addProgramClasses(TestClassForB112849320.class)
.addLibraryFiles(lib)
.addDefaultRuntimeLibrary(parameters)
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(TestClassForB112849320.class)
.addOptionsModification(options -> options.enableInlining = false)
.addRunClasspathFiles(buildOnDexRuntime(parameters, lib))
.run(parameters.getRuntime(), TestClassForB112849320.class)
.assertSuccessWithOutputLines(EXPECTED);
}
interface GoingToBeMissed {
void onSomeEvent(long soLong);
}
public static class TestClassForB112849320 {
GoingToBeMissed instance;
void foo(GoingToBeMissed instance) {
System.out.println("B112849320");
this.instance = instance;
}
void bar() {
instance.onSomeEvent(8L);
}
public static void main(String[] args) {
TestClassForB112849320 self = new TestClassForB112849320();
self.foo(
l -> {
if (l > 0) {
System.out.println(l);
}
});
self.bar();
}
}
}