From 2f1d0e3eb007daf2cf5f3dcf9132fdabd173b47c Mon Sep 17 00:00:00 2001 From: Thiakil Date: Sun, 19 Jul 2020 13:06:44 +0800 Subject: add MappingValidator based test --- enigma/build.gradle | 2 +- .../java/cuchaz/enigma/TestAllowableClashes.java | 52 ++++++++++++++++++++++ .../cuchaz/enigma/ValidationContextMatcher.java | 35 +++++++++++++++ .../cuchaz/enigma/inputs/visibility/ClassA.java | 28 ++++++++++++ .../cuchaz/enigma/inputs/visibility/ClassB.java | 31 +++++++++++++ 5 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 enigma/src/test/java/cuchaz/enigma/TestAllowableClashes.java create mode 100644 enigma/src/test/java/cuchaz/enigma/ValidationContextMatcher.java create mode 100644 enigma/src/test/java/cuchaz/enigma/inputs/visibility/ClassA.java create mode 100644 enigma/src/test/java/cuchaz/enigma/inputs/visibility/ClassB.java diff --git a/enigma/build.gradle b/enigma/build.gradle index 7cebcd1..8d08145 100644 --- a/enigma/build.gradle +++ b/enigma/build.gradle @@ -53,7 +53,7 @@ file('src/test/java/cuchaz/enigma/inputs').listFiles().each { theFile -> args '@src/test/resources/proguard-test.conf', '-injars', file('build/test-inputs/' + "${theFile.name}.jar"), '-libraryjars', libraryJarsArg, - '-outjars', file('build/test-obf/' + "${theFile.name}.jar") + '-outjars', file('build/test-obf/' + "${theFile.name}.jar"), '-printmapping', file("build/test-obf/${theFile.name}-mapping.txt") } test.dependsOn "${theFile.name}TestObf" diff --git a/enigma/src/test/java/cuchaz/enigma/TestAllowableClashes.java b/enigma/src/test/java/cuchaz/enigma/TestAllowableClashes.java new file mode 100644 index 0000000..bfc21de --- /dev/null +++ b/enigma/src/test/java/cuchaz/enigma/TestAllowableClashes.java @@ -0,0 +1,52 @@ +package cuchaz.enigma; + +import cuchaz.enigma.classprovider.ClasspathClassProvider; +import cuchaz.enigma.translation.mapping.EntryMapping; +import cuchaz.enigma.translation.mapping.EntryRemapper; +import cuchaz.enigma.translation.mapping.serde.MappingFormat; +import cuchaz.enigma.translation.mapping.serde.MappingParseException; +import cuchaz.enigma.translation.mapping.tree.EntryTree; +import cuchaz.enigma.translation.mapping.tree.EntryTreeNode; +import cuchaz.enigma.translation.representation.entry.MethodEntry; +import cuchaz.enigma.utils.validation.ValidationContext; +import org.hamcrest.MatcherAssert; +import org.junit.Assert; +import org.junit.Test; + +import java.io.IOException; +import java.nio.file.Paths; + +/** + * Test that we can accept some name clashes that are allowed by javac + */ +public class TestAllowableClashes { + + private static final String inputBaseName = "build/test-obf/visibility"; + + @Test + public void test() throws IOException, MappingParseException { + //Load produced mappings + Enigma enigma = Enigma.create(); + EnigmaProject project = enigma.openJar(Paths.get(inputBaseName + ".jar"), new ClasspathClassProvider(), ProgressListener.none()); + EntryTree obfToDeobf = MappingFormat.PROGUARD.read(Paths.get(inputBaseName + "-mapping.txt"), ProgressListener.none(), null); + + //Load them into enigma, none should conflict + EntryRemapper mapper = project.getMapper(); + for (int round=0; round<2; round++) { + for (EntryTreeNode node : obfToDeobf) { + Assert.assertNotEquals(null, node.getValue()); + if (node.getEntry() instanceof MethodEntry && (node.getEntry() + .getName() + .equals("") || node.getEntry().getName().equals(""))) { + //skip proguard's constructor entries + continue; + } + System.out.println(node.getEntry().toString() + " -> " + node.getValue().getTargetName()); + ValidationContext vc = new ValidationContext(); + mapper.mapFromObf(vc, node.getEntry(), node.getValue()); + MatcherAssert.assertThat(vc, ValidationContextMatcher.INSTANCE); + } + } + } + +} diff --git a/enigma/src/test/java/cuchaz/enigma/ValidationContextMatcher.java b/enigma/src/test/java/cuchaz/enigma/ValidationContextMatcher.java new file mode 100644 index 0000000..5404077 --- /dev/null +++ b/enigma/src/test/java/cuchaz/enigma/ValidationContextMatcher.java @@ -0,0 +1,35 @@ +package cuchaz.enigma; + +import cuchaz.enigma.utils.validation.ParameterizedMessage; +import cuchaz.enigma.utils.validation.ValidationContext; +import org.hamcrest.CustomMatcher; +import org.hamcrest.Description; + +class ValidationContextMatcher extends CustomMatcher { + public static final ValidationContextMatcher INSTANCE = new ValidationContextMatcher(); + + private ValidationContextMatcher() { + super("ValidationContext can proceed"); + } + + @Override + public boolean matches(Object item) { + return item instanceof ValidationContext && ((ValidationContext) item).canProceed(); + } + + @Override + public void describeMismatch(Object item, Description description) { + if (!(item instanceof ValidationContext)) { + description.appendText("expected ValidationContext, was").appendValue(item); + return; + } + ValidationContext vc = (ValidationContext) item; + for (ParameterizedMessage message : vc.getMessages()) { + description.appendText(message.getText()); + String longMessage = message.getLongText(); + if (longMessage != null && !longMessage.trim().isEmpty()){ + description.appendText(longMessage); + } + } + } +} diff --git a/enigma/src/test/java/cuchaz/enigma/inputs/visibility/ClassA.java b/enigma/src/test/java/cuchaz/enigma/inputs/visibility/ClassA.java new file mode 100644 index 0000000..458f7c0 --- /dev/null +++ b/enigma/src/test/java/cuchaz/enigma/inputs/visibility/ClassA.java @@ -0,0 +1,28 @@ +package cuchaz.enigma.inputs.visibility; + +class ClassA { + + protected Object protectedParentPrivateChild; + public Object publicParentPrivateChild; + + public static Object LOGGER = null; + + protected static Object LOGGER2 = null; + + public Object publicPublic; + + public static void equalAccessStatic() {} + + protected static void protectedPublicStatic(){} + + private static void privateStaticParentPublicStaticChild(){} + + private void privateParentPublicStaticChild() {} + + static void packagePrivateParentProtectedChild(){} + + private static void packagePrivateChild(){} + + public ClassA returningSubclass(){return null;} + +} \ No newline at end of file diff --git a/enigma/src/test/java/cuchaz/enigma/inputs/visibility/ClassB.java b/enigma/src/test/java/cuchaz/enigma/inputs/visibility/ClassB.java new file mode 100644 index 0000000..2a1b68a --- /dev/null +++ b/enigma/src/test/java/cuchaz/enigma/inputs/visibility/ClassB.java @@ -0,0 +1,31 @@ +package cuchaz.enigma.inputs.visibility; + +public class ClassB extends ClassA { + private Object protectedParentPrivateChild; + + private Object publicParentPrivateChild; + + public Object publicPublic; + + public static Object LOGGER; + + public static Object LOGGER2 = null; + + public static void equalAccessStatic() { + } + + public static void protectedPublicStatic() { + } + + public static void privateStaticParentPublicStaticChild() { + } + + public static void privateParentPublicStaticChild() { + } + + protected static void packagePrivateParentProtectedChild(){} + + static void packagePrivateChild(){} + + public ClassB returningSubclass(){return null;} +} -- cgit v1.2.3