blob: 2c53667c6925c7b01506fb857f1383151505c262 [file] [log] [blame]
// Copyright (c) 2017, 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;
import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.FileUtils;
import com.google.common.collect.ImmutableList;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.stream.Collectors;
import org.junit.Assert;
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 D8ApiBinaryCompatibilityTests extends TestBase {
@Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withNoneRuntime().build();
}
public D8ApiBinaryCompatibilityTests(TestParameters parameters) {
parameters.assertNoneRuntime();
}
@Test
public void testCompatibility() throws IOException {
Path jar = ToolHelper.API_SAMPLE_JAR;
String main = "com.android.tools.apiusagesample.D8ApiUsageSample";
int minApiLevel = AndroidApiLevel.K.getLevel();
Path lib1 =
Paths.get(
ToolHelper.EXAMPLES_ANDROID_O_BUILD_DIR,
"desugaringwithmissingclasslib1" + JAR_EXTENSION);
Path lib2 =
Paths.get(
ToolHelper.EXAMPLES_ANDROID_O_BUILD_DIR,
"desugaringwithmissingclasslib2" + JAR_EXTENSION);
Path inputDir =
Paths.get(
ToolHelper.EXAMPLES_ANDROID_O_BUILD_DIR, "classes", "desugaringwithmissingclasstest1");
List<Path> input =
ImmutableList.of(
inputDir.resolve("ImplementMethodsWithDefault.class"), inputDir.resolve("Main.class"));
Path mainDexList = temp.getRoot().toPath().resolve("maindexlist.txt");
FileUtils.writeTextFile(mainDexList, "desugaringwithmissingclasstest1/Main.class");
// It is important to place the api usage sample jar after the current classpath because we want
// to find D8/R8 classes before the ones in the jar, otherwise renamed classes and fields cannot
// be found.
String classPath = System.getProperty("java.class.path") + File.pathSeparator + jar.toString();
List<String> command =
ImmutableList.<String>builder()
.addAll(
ImmutableList.of(
ToolHelper.getJavaExecutable(),
"-cp", classPath,
main,
// Compiler arguments.
"--output",
temp.newFolder().getAbsolutePath(),
"--min-api",
Integer.toString(minApiLevel),
"--main-dex-list",
mainDexList.toString(),
"--lib",
ToolHelper.getAndroidJar(
AndroidApiLevel.getAndroidApiLevel(minApiLevel)).toString(),
"--classpath",
lib1.toString(),
"--classpath",
lib2.toString()))
.addAll(input.stream().map(Path::toString).collect(Collectors.toList()))
.build();
ProcessBuilder builder = new ProcessBuilder(command);
ProcessResult result = ToolHelper.runProcess(builder);
assertEquals(result.stderr + "\n" + result.stdout, 0, result.exitCode);
Assert.assertTrue(result.stdout, result.stdout.isEmpty());
Assert.assertTrue(result.stderr, result.stderr.isEmpty());
}
}