blob: 251880f9fbc37d667fed62578973bde827bfe723 [file] [log] [blame]
// Copyright (c) 2020, 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.kotlin.lambda.b159688129;
import static com.android.tools.r8.ToolHelper.getKotlinCompilers;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.KotlinCompilerTool.KotlinCompiler;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestRuntime;
import com.android.tools.r8.TestRuntime.CfRuntime;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.KotlinTargetVersion;
import com.android.tools.r8.kotlin.AbstractR8KotlinTestBase;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
import com.android.tools.r8.utils.codeinspector.FoundMethodSubject;
import java.nio.file.Path;
import java.util.List;
import java.util.stream.Collectors;
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 LambdaSplitByCodeCorrectnessTest extends AbstractR8KotlinTestBase {
private final TestParameters parameters;
private final KotlinTargetVersion targetVersion;
private final boolean splitGroup;
@Parameters(name = "{0}, kotlinc: {2} targetVersion: {1}, splitGroup: {3}")
public static List<Object[]> data() {
return buildParameters(
getTestParameters().withDexRuntimes().withAllApiLevels().build(),
KotlinTargetVersion.values(),
getKotlinCompilers(),
BooleanUtils.values());
}
public LambdaSplitByCodeCorrectnessTest(
TestParameters parameters,
KotlinTargetVersion targetVersion,
KotlinCompiler kotlinc,
boolean splitGroup) {
super(targetVersion, kotlinc);
this.parameters = parameters;
this.targetVersion = targetVersion;
this.splitGroup = splitGroup;
}
@Test
public void testSplitLambdaGroups() throws Exception {
String PKG_NAME = LambdaSplitByCodeCorrectnessTest.class.getPackage().getName();
String folder = DescriptorUtils.getBinaryNameFromJavaType(PKG_NAME);
CfRuntime cfRuntime =
parameters.isCfRuntime() ? parameters.getRuntime().asCf() : TestRuntime.getCheckedInJdk9();
Path ktClasses =
kotlinc(cfRuntime, kotlinc, targetVersion)
.addSourceFiles(getKotlinFileInTest(folder, "Simple"))
.compile();
testForR8(parameters.getBackend())
.addProgramFiles(ToolHelper.getKotlinStdlibJar(kotlinc))
.addProgramFiles(ktClasses)
.addOptionsModification(
options -> options.horizontalClassMergerOptions().disableKotlinLambdaMerging())
.setMinApi(parameters.getApiLevel())
.addKeepMainRule(PKG_NAME + ".SimpleKt")
.addDontWarnJetBrainsAnnotations()
.applyIf(
splitGroup,
b ->
b.addOptionsModification(
internalOptions ->
// Setting verificationSizeLimitInBytesOverride = 1 will force a a chain
// having only a single implementation method in each.
internalOptions.testing.verificationSizeLimitInBytesOverride =
splitGroup ? 1 : -1))
.noMinification()
.allowDiagnosticWarningMessages()
.compile()
.assertAllWarningMessagesMatch(equalTo("Resource 'META-INF/MANIFEST.MF' already exists."))
.inspect(
codeInspector -> {
List<FoundClassSubject> lambdaGroups =
codeInspector.allClasses().stream()
.filter(c -> c.getFinalName().contains("LambdaGroup"))
.collect(Collectors.toList());
assertEquals(1, lambdaGroups.size());
FoundClassSubject lambdaGroup = lambdaGroups.get(0);
List<FoundMethodSubject> invokeChain =
lambdaGroup.allMethods(method -> method.getFinalName().contains("invoke$"));
assertEquals(splitGroup ? 5 : 0, invokeChain.size());
})
.run(parameters.getRuntime(), PKG_NAME + ".SimpleKt")
.assertSuccessWithOutputLines("Hello1", "Hello2", "Hello3", "Hello4", "Hello5", "Hello6");
}
}