blob: 473ca53d31a5ef0b7fc3d23e11f154670367b5e0 [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.naming;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.Timing;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.BiConsumer;
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 MinifierTest extends NamingTestBase {
public MinifierTest(
String test,
List<String> keepRulesFiles,
BiConsumer<DexItemFactory, NamingLens> inspection) {
super(test, keepRulesFiles, inspection, new Timing("MinifierTest"));
}
@Test
public void minifierTest() throws Exception {
NamingLens naming = runMinifier(ListUtils.map(keepRulesFiles, Paths::get));
inspection.accept(dexItemFactory, naming);
}
@Parameters(name = "test: {0} keep: {1}")
public static Collection<Object[]> data() {
List<String> tests = Arrays.asList("naming001");
Map<String, BiConsumer<DexItemFactory, NamingLens>> inspections = new HashMap<>();
inspections.put("naming001:keep-rules-001.txt", MinifierTest::test001_rule001);
inspections.put("naming001:keep-rules-002.txt", MinifierTest::test001_rule002);
inspections.put("naming001:keep-rules-003.txt", MinifierTest::test001_rule003);
inspections.put("naming001:keep-rules-005.txt", MinifierTest::test001_rule005);
inspections.put("naming001:keep-rules-006.txt", MinifierTest::test001_rule006);
inspections.put("naming001:keep-rules-014.txt", MinifierTest::test001_rule014);
inspections.put("naming001:keep-rules-017.txt", MinifierTest::test001_rule017);
return createTests(tests, inspections);
}
private static void test001_rule001(DexItemFactory dexItemFactory, NamingLens naming) {
DexType a = dexItemFactory.createType("Lnaming001/A;");
// class naming001.A should be kept, according to the keep rule.
assertEquals("Lnaming001/A;", naming.lookupDescriptor(a).toSourceString());
DexMethod m = dexItemFactory.createMethod(
a, dexItemFactory.createProto(dexItemFactory.voidType), "m");
// method naming001.A.m would be renamed.
assertNotEquals("m", naming.lookupName(m).toSourceString());
DexMethod p = dexItemFactory.createMethod(
a, dexItemFactory.createProto(dexItemFactory.voidType), "privateFunc");
// method naming001.A.privateFunc would be renamed.
assertNotEquals("privateFunc", naming.lookupName(p).toSourceString());
}
private static void test001_rule002(DexItemFactory dexItemFactory, NamingLens naming) {
DexType a = dexItemFactory.createType("Lnaming001/A;");
// class naming001.A should be kept, according to the keep rule.
assertEquals("Lnaming001/A;", naming.lookupDescriptor(a).toSourceString());
DexMethod m = dexItemFactory.createMethod(
a, dexItemFactory.createProto(dexItemFactory.voidType), "m");
// method naming001.A.m would be renamed.
assertNotEquals("m", naming.lookupName(m).toSourceString());
DexMethod p = dexItemFactory.createMethod(
a, dexItemFactory.createProto(dexItemFactory.voidType), "privateFunc");
// method naming001.A.privateFunc should be kept, according to the keep rule.
assertEquals("privateFunc", naming.lookupName(p).toSourceString());
}
private static void test001_rule003(DexItemFactory dexItemFactory, NamingLens naming) {
DexType a = dexItemFactory.createType("Lnaming001/A;");
// class naming001.A should be kept, according to the keep rule.
assertEquals("Lnaming001/A;", naming.lookupDescriptor(a).toSourceString());
DexMethod m = dexItemFactory.createMethod(
a, dexItemFactory.createProto(dexItemFactory.voidType), "m");
// method naming001.A.m should be kept, according to the keep rule.
assertEquals("m", naming.lookupName(m).toSourceString());
// method naming001.A.privateFunc is not private in the input and should therefore be renamed.
DexMethod p =
dexItemFactory.createMethod(
a, dexItemFactory.createProto(dexItemFactory.voidType), "privateFunc");
assertNotEquals("privateFunc", naming.lookupName(p).toSourceString());
}
private static void test001_rule005(DexItemFactory dexItemFactory, NamingLens naming) {
DexType d = dexItemFactory.createType("Lnaming001/D;");
// class naming001.D should be kept, according to the keep rule.
assertEquals("Lnaming001/D;", naming.lookupDescriptor(d).toSourceString());
DexMethod main = dexItemFactory.createMethod(
d,
dexItemFactory.createProto(dexItemFactory.voidType, dexItemFactory.stringArrayType),
"main");
// method naming001.D.main should be kept, according to the keep rule.
assertEquals("main", naming.lookupName(main).toSourceString());
DexMethod k = dexItemFactory.createMethod(
d, dexItemFactory.createProto(dexItemFactory.voidType), "keep");
// method naming001.D.keep would be renamed.
assertNotEquals("keep", naming.lookupName(k).toSourceString());
// Note that naming001.E extends naming001.D.
DexType e = dexItemFactory.createType("Lnaming001/E;");
DexMethod inherited_k = dexItemFactory.createMethod(
e, dexItemFactory.createProto(dexItemFactory.voidType), "keep");
// method naming001.E.keep should be renamed to the same name as naming001.D.keep.
assertEquals(
naming.lookupName(inherited_k).toSourceString(), naming.lookupName(k).toSourceString());
}
private static void test001_rule006(DexItemFactory dexItemFactory, NamingLens naming) {
DexType g = dexItemFactory.createType("Lnaming001/G;");
// class naming001.G should be kept, according to the keep rule.
assertEquals("Lnaming001/G;", naming.lookupDescriptor(g).toSourceString());
DexMethod main = dexItemFactory.createMethod(
g,
dexItemFactory.createProto(dexItemFactory.voidType, dexItemFactory.stringArrayType),
"main");
// method naming001.G.main should be kept, according to the keep rule.
assertEquals("main", naming.lookupName(main).toSourceString());
DexMethod impl_m = dexItemFactory.createMethod(
g, dexItemFactory.createProto(dexItemFactory.voidType), "m");
// method naming001.G.m would be renamed.
assertNotEquals("m", naming.lookupName(impl_m).toSourceString());
// Note that naming001.G implements H that extends I, where method m is declared.
DexType i = dexItemFactory.createType("Lnaming001/I;");
DexMethod def_m = dexItemFactory.createMethod(
i, dexItemFactory.createProto(dexItemFactory.voidType), "m");
// method naming001.I.m should be renamed to the same name as naming001.G.m.
assertEquals(
naming.lookupName(impl_m).toSourceString(), naming.lookupName(def_m).toSourceString());
}
private static void test001_rule014(DexItemFactory dexItemFactory, NamingLens naming) {
DexType reflect = dexItemFactory.createType("Lnaming001/Reflect;");
// class naming001.Reflect should be kept, according to the keep rule.
assertEquals("Lnaming001/Reflect;", naming.lookupDescriptor(reflect).toSourceString());
DexMethod keep6 = dexItemFactory.createMethod(
reflect, dexItemFactory.createProto(dexItemFactory.voidType), "keep6");
// method naming001.Reflect.keep6 should be kept, according to the keep rule.
assertEquals("keep6", naming.lookupName(keep6).toSourceString());
}
private static void test001_rule017(DexItemFactory dexItemFactory, NamingLens naming) {
DexType k = dexItemFactory.createType("Lnaming001/K;");
// class naming001.K should be kept, according to the keep rule.
assertEquals("Lnaming001/K;", naming.lookupDescriptor(k).toSourceString());
DexMethod keep = dexItemFactory.createMethod(
k, dexItemFactory.createProto(dexItemFactory.voidType), "keep");
// method naming001.K.keep should be kept, according to the keep rule.
assertEquals("keep", naming.lookupName(keep).toSourceString());
DexField i = dexItemFactory.createField(k, dexItemFactory.intType, "i");
// field naming001.K.i would be renamed
assertNotEquals("i", naming.lookupName(i).toSourceString());
DexField j = dexItemFactory.createField(k, dexItemFactory.intType, "j");
// field naming001.K.j would be renamed
assertNotEquals("j", naming.lookupName(j).toSourceString());
}
}