blob: 4d861a08ff4006d54149df3c039426e589e87c81 [file] [log] [blame]
// Copyright (c) 2021, 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.desugar.desugaredlibrary.specification;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import com.android.tools.r8.StringResource;
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.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanRewritingFlags;
import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanTopLevelFlags;
import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.MultiAPILevelHumanDesugaredLibrarySpecification;
import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.MultiAPILevelHumanDesugaredLibrarySpecificationJsonExporter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.MultiAPILevelHumanDesugaredLibrarySpecificationParser;
import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.MultiAPILevelLegacyDesugaredLibrarySpecification;
import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.MultiAPILevelLegacyDesugaredLibrarySpecificationParser;
import com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion.LegacyToHumanSpecificationConverter;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.Box;
import com.android.tools.r8.utils.InternalOptions;
import java.io.IOException;
import java.util.Map;
import org.junit.Assume;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class ConvertExportReadTest extends TestBase {
private final TestParameters parameters;
@Parameterized.Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withNoneRuntime().build();
}
public ConvertExportReadTest(TestParameters parameters) {
this.parameters = parameters;
}
@Test
public void testMultiLevel() throws IOException {
Assume.assumeTrue(ToolHelper.isLocalDevelopment());
LegacyToHumanSpecificationConverter converter = new LegacyToHumanSpecificationConverter();
InternalOptions options = new InternalOptions();
MultiAPILevelLegacyDesugaredLibrarySpecification spec =
new MultiAPILevelLegacyDesugaredLibrarySpecificationParser(
options.dexItemFactory(), options.reporter)
.parseMultiLevelConfiguration(
StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()));
MultiAPILevelHumanDesugaredLibrarySpecification humanSpec1 =
converter.convertAllAPILevels(spec, ToolHelper.getAndroidJar(31), options);
Box<String> json = new Box<>();
MultiAPILevelHumanDesugaredLibrarySpecificationJsonExporter.export(
humanSpec1, (string, handler) -> json.set(string));
MultiAPILevelHumanDesugaredLibrarySpecification humanSpec2 =
new MultiAPILevelHumanDesugaredLibrarySpecificationParser(
options.dexItemFactory(), options.reporter)
.parseMultiLevelConfiguration(StringResource.fromString(json.get(), Origin.unknown()));
assertSpecEquals(humanSpec1, humanSpec2);
}
private void assertSpecEquals(
MultiAPILevelHumanDesugaredLibrarySpecification humanSpec1,
MultiAPILevelHumanDesugaredLibrarySpecification humanSpec2) {
assertTopLevelFlagsEquals(humanSpec1.getTopLevelFlags(), humanSpec2.getTopLevelFlags());
assertFlagMapEquals(
humanSpec1.getCommonFlagsForTesting(), humanSpec2.getCommonFlagsForTesting());
assertFlagMapEquals(
humanSpec1.getLibraryFlagsForTesting(), humanSpec2.getLibraryFlagsForTesting());
assertFlagMapEquals(
humanSpec1.getProgramFlagsForTesting(), humanSpec2.getProgramFlagsForTesting());
}
private void assertFlagMapEquals(
Map<Integer, HumanRewritingFlags> commonFlags1,
Map<Integer, HumanRewritingFlags> commonFlags2) {
assertEquals(commonFlags1.size(), commonFlags2.size());
for (int integer : commonFlags1.keySet()) {
assertTrue(commonFlags2.containsKey(integer));
assertFlagsEquals(commonFlags1.get(integer), commonFlags2.get(integer));
}
}
private void assertFlagsEquals(
HumanRewritingFlags humanRewritingFlags1, HumanRewritingFlags humanRewritingFlags2) {
assertEquals(humanRewritingFlags1.getRewritePrefix(), humanRewritingFlags2.getRewritePrefix());
assertEquals(
humanRewritingFlags1.getBackportCoreLibraryMember(),
humanRewritingFlags2.getBackportCoreLibraryMember());
assertEquals(
humanRewritingFlags1.getCustomConversions(), humanRewritingFlags2.getCustomConversions());
assertEquals(
humanRewritingFlags1.getEmulateLibraryInterface(),
humanRewritingFlags2.getEmulateLibraryInterface());
assertEquals(
humanRewritingFlags1.getRetargetCoreLibMember(),
humanRewritingFlags2.getRetargetCoreLibMember());
assertEquals(
humanRewritingFlags1.getDontRetargetLibMember(),
humanRewritingFlags2.getDontRetargetLibMember());
assertEquals(
humanRewritingFlags1.getDontRewriteInvocation(),
humanRewritingFlags2.getDontRewriteInvocation());
assertEquals(
humanRewritingFlags1.getWrapperConversions(), humanRewritingFlags2.getWrapperConversions());
}
private void assertTopLevelFlagsEquals(
HumanTopLevelFlags topLevelFlags1, HumanTopLevelFlags topLevelFlags2) {
assertEquals(topLevelFlags1.getExtraKeepRules(), topLevelFlags2.getExtraKeepRules());
assertEquals(topLevelFlags1.getIdentifier(), topLevelFlags2.getIdentifier());
assertEquals(
topLevelFlags1.getRequiredCompilationAPILevel().getLevel(),
topLevelFlags2.getRequiredCompilationAPILevel().getLevel());
assertEquals(
topLevelFlags1.getSynthesizedLibraryClassesPackagePrefix(),
topLevelFlags2.getSynthesizedLibraryClassesPackagePrefix());
}
}