blob: 689824f696a688bde4f887c9096b989d668aeb4b [file] [log] [blame]
// Copyright (c) 2016, 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.jar.UnicodeSetRegression;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.AndroidAppConsumers;
import com.android.tools.r8.utils.ArtErrorParser;
import com.android.tools.r8.utils.ArtErrorParser.ArtErrorInfo;
import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
import com.android.tools.r8.utils.codeinspector.CodeInspector;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import org.junit.ComparisonFailure;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TemporaryFolder;
public class UnicodeSetRegressionTest {
private static final String JAR_FILE =
"src/test/java/com/android/tools/r8/jar/UnicodeSetRegression/UnicodeSet.jar";
@Rule
public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
private AndroidApp dexFromDX() throws IOException {
return ToolHelper.runDexer(JAR_FILE, temp.newFolder("dx-dex").getPath());
}
@Test
public void testUnicodeSetFromDex() throws Throwable {
Path combinedInput = temp.getRoot().toPath().resolve("all.zip");
Path oatFile = temp.getRoot().toPath().resolve("all.oat");
AndroidApp output =
ToolHelper.runR8(dexFromDX(), options -> options.ignoreMissingClasses = true);
output.write(combinedInput, OutputMode.DexIndexed);
ToolHelper.runDex2Oat(combinedInput, oatFile);
}
@Test
public void testUnicodeSetFromJar() throws Throwable {
Path combinedInput = temp.getRoot().toPath().resolve("all.zip");
Path oatFile = temp.getRoot().toPath().resolve("all.oat");
R8Command.Builder builder =
R8Command.builder()
.addProgramFiles(Paths.get(JAR_FILE))
.setDisableTreeShaking(true)
.setDisableMinification(true)
.setOutput(Paths.get(combinedInput.toString()), OutputMode.DexIndexed);
AndroidAppConsumers compatSink = new AndroidAppConsumers(builder);
// Ignore missing classes since we don't want to link to the IBM text library.
ToolHelper.runR8(builder.build(), options -> options.ignoreMissingClasses = true);
AndroidApp result = compatSink.build();
try {
ToolHelper.runDex2Oat(combinedInput, oatFile);
} catch (AssertionError e) {
AndroidApp fromDexApp =
ToolHelper.runR8(dexFromDX(), options -> options.ignoreMissingClasses = true);
CodeInspector fromDex = new CodeInspector(fromDexApp);
CodeInspector fromJar = new CodeInspector(result);
List<ArtErrorInfo> errors;
try {
errors = ArtErrorParser.parse(e.getMessage());
} catch (ArtErrorParserException parserException) {
System.err.println(parserException.toString());
throw e;
}
if (errors.isEmpty()) {
throw e;
}
for (ArtErrorInfo error : errors.subList(0, errors.size() - 1)) {
System.err.println(new ComparisonFailure(error.getMessage(),
"REFERENCE\n" + error.dump(fromDex, false) + "\nEND REFERENCE",
"PROCESSED\n" + error.dump(fromJar, true) + "\nEND PROCESSED").toString());
}
ArtErrorInfo error = errors.get(errors.size() - 1);
throw new ComparisonFailure(error.getMessage(),
"REFERENCE\n" + error.dump(fromDex, false) + "\nEND REFERENCE",
"PROCESSED\n" + error.dump(fromJar, true) + "\nEND PROCESSED");
}
}
@Test
public void testUnicodeSetFromJarToCF() throws Throwable {
Path combinedInput = temp.getRoot().toPath().resolve("all.zip");
R8Command.Builder builder =
R8Command.builder()
.addProgramFiles(Paths.get(JAR_FILE))
.setOutput(Paths.get(combinedInput.toString()), OutputMode.ClassFile)
.addLibraryFiles(ToolHelper.getJava8RuntimeJar());
AndroidAppConsumers compatSink = new AndroidAppConsumers(builder);
// Ignore missing classes since we don't want to link to the IBM text library.
ToolHelper.runR8(builder.build(), options -> options.ignoreMissingClasses = true);
compatSink.build();
}
}