diff options
| author | 2015-02-23 23:29:22 -0500 | |
|---|---|---|
| committer | 2015-02-23 23:29:22 -0500 | |
| commit | 2dc7428e37bdd7a119f53d02ce157675509b0d63 (patch) | |
| tree | 68f409ac726166e427eea3a199eb462130c53ccd /test | |
| parent | make types serializable (diff) | |
| download | enigma-2dc7428e37bdd7a119f53d02ce157675509b0d63.tar.gz enigma-2dc7428e37bdd7a119f53d02ce157675509b0d63.tar.xz enigma-2dc7428e37bdd7a119f53d02ce157675509b0d63.zip | |
lots of work in better handling of inner classes
also working on recognizing unobfuscated and deobfuscated jars
(needed for M3L)
Diffstat (limited to 'test')
| -rw-r--r-- | test/cuchaz/enigma/TestInnerClasses.java | 67 | ||||
| -rw-r--r-- | test/cuchaz/enigma/TestJarIndexLoneClass.java | 7 | ||||
| -rw-r--r-- | test/cuchaz/enigma/TestTranslator.java | 36 | ||||
| -rw-r--r-- | test/cuchaz/enigma/inputs/innerClasses/F_ClassTree.java | 20 | ||||
| -rw-r--r-- | test/cuchaz/enigma/inputs/translation/G_ObjectMethods.java (renamed from test/cuchaz/enigma/inputs/translation/F_ObjectMethods.java) | 2 | ||||
| -rw-r--r-- | test/cuchaz/enigma/inputs/translation/H_OuterClass.java | 26 | ||||
| -rw-r--r-- | test/cuchaz/enigma/inputs/translation/M_NamelessClass.java | 26 | ||||
| -rw-r--r-- | test/cuchaz/enigma/resources/translation.mappings | 12 |
8 files changed, 179 insertions, 17 deletions
diff --git a/test/cuchaz/enigma/TestInnerClasses.java b/test/cuchaz/enigma/TestInnerClasses.java index 2e16a330..2eb5accc 100644 --- a/test/cuchaz/enigma/TestInnerClasses.java +++ b/test/cuchaz/enigma/TestInnerClasses.java | |||
| @@ -18,23 +18,30 @@ import java.util.jar.JarFile; | |||
| 18 | 18 | ||
| 19 | import org.junit.Test; | 19 | import org.junit.Test; |
| 20 | 20 | ||
| 21 | import static cuchaz.enigma.TestEntryFactory.*; | ||
| 22 | |||
| 21 | import cuchaz.enigma.analysis.JarIndex; | 23 | import cuchaz.enigma.analysis.JarIndex; |
| 24 | import cuchaz.enigma.mapping.ClassEntry; | ||
| 22 | 25 | ||
| 23 | public class TestInnerClasses { | 26 | public class TestInnerClasses { |
| 24 | 27 | ||
| 25 | private JarIndex m_index; | 28 | private JarIndex m_index; |
| 26 | private Deobfuscator m_deobfuscator; | 29 | private Deobfuscator m_deobfuscator; |
| 27 | 30 | ||
| 28 | private static final String AnonymousOuter = "none/a"; | 31 | private static final ClassEntry AnonymousOuter = newClass("none/a"); |
| 29 | private static final String AnonymousInner = "b"; | 32 | private static final ClassEntry AnonymousInner = newClass("none/b"); |
| 30 | private static final String SimpleOuter = "none/g"; | 33 | private static final ClassEntry SimpleOuter = newClass("none/g"); |
| 31 | private static final String SimpleInner = "h"; | 34 | private static final ClassEntry SimpleInner = newClass("none/h"); |
| 32 | private static final String ConstructorArgsOuter = "none/e"; | 35 | private static final ClassEntry ConstructorArgsOuter = newClass("none/e"); |
| 33 | private static final String ConstructorArgsInner = "f"; | 36 | private static final ClassEntry ConstructorArgsInner = newClass("none/f"); |
| 34 | private static final String AnonymousWithScopeArgsOuter = "none/c"; | 37 | private static final ClassEntry AnonymousWithScopeArgsOuter = newClass("none/c"); |
| 35 | private static final String AnonymousWithScopeArgsInner = "d"; | 38 | private static final ClassEntry AnonymousWithScopeArgsInner = newClass("none/d"); |
| 36 | private static final String AnonymousWithOuterAccessOuter = "none/i"; | 39 | private static final ClassEntry AnonymousWithOuterAccessOuter = newClass("none/i"); |
| 37 | private static final String AnonymousWithOuterAccessInner = "j"; | 40 | private static final ClassEntry AnonymousWithOuterAccessInner = newClass("none/j"); |
| 41 | private static final ClassEntry ClassTreeRoot = newClass("none/k"); | ||
| 42 | private static final ClassEntry ClassTreeLevel1 = newClass("none/l"); | ||
| 43 | private static final ClassEntry ClassTreeLevel2 = newClass("none/m"); | ||
| 44 | private static final ClassEntry ClassTreeLevel3 = newClass("none/n"); | ||
| 38 | 45 | ||
| 39 | public TestInnerClasses() | 46 | public TestInnerClasses() |
| 40 | throws Exception { | 47 | throws Exception { |
| @@ -84,7 +91,43 @@ public class TestInnerClasses { | |||
| 84 | decompile(AnonymousWithOuterAccessOuter); | 91 | decompile(AnonymousWithOuterAccessOuter); |
| 85 | } | 92 | } |
| 86 | 93 | ||
| 87 | private void decompile(String name) { | 94 | @Test |
| 88 | m_deobfuscator.getSourceTree(name); | 95 | public void classTree() { |
| 96 | |||
| 97 | // root level | ||
| 98 | assertThat(m_index.containsObfClass(ClassTreeRoot), is(true)); | ||
| 99 | assertThat(m_index.getOuterClass(ClassTreeRoot), is(nullValue())); | ||
| 100 | assertThat(m_index.getInnerClasses(ClassTreeRoot), containsInAnyOrder(ClassTreeLevel1)); | ||
| 101 | |||
| 102 | // level 1 | ||
| 103 | ClassEntry fullClassEntry = new ClassEntry(ClassTreeRoot.getName() | ||
| 104 | + "$" + ClassTreeLevel1.getSimpleName() | ||
| 105 | ); | ||
| 106 | assertThat(m_index.containsObfClass(fullClassEntry), is(true)); | ||
| 107 | assertThat(m_index.getOuterClass(ClassTreeLevel1), is(ClassTreeRoot)); | ||
| 108 | assertThat(m_index.getInnerClasses(ClassTreeLevel1), containsInAnyOrder(ClassTreeLevel2)); | ||
| 109 | |||
| 110 | // level 2 | ||
| 111 | fullClassEntry = new ClassEntry(ClassTreeRoot.getName() | ||
| 112 | + "$" + ClassTreeLevel1.getSimpleName() | ||
| 113 | + "$" + ClassTreeLevel2.getSimpleName() | ||
| 114 | ); | ||
| 115 | assertThat(m_index.containsObfClass(fullClassEntry), is(true)); | ||
| 116 | assertThat(m_index.getOuterClass(ClassTreeLevel2), is(ClassTreeLevel1)); | ||
| 117 | assertThat(m_index.getInnerClasses(ClassTreeLevel2), containsInAnyOrder(ClassTreeLevel3)); | ||
| 118 | |||
| 119 | // level 3 | ||
| 120 | fullClassEntry = new ClassEntry(ClassTreeRoot.getName() | ||
| 121 | + "$" + ClassTreeLevel1.getSimpleName() | ||
| 122 | + "$" + ClassTreeLevel2.getSimpleName() | ||
| 123 | + "$" + ClassTreeLevel3.getSimpleName() | ||
| 124 | ); | ||
| 125 | assertThat(m_index.containsObfClass(fullClassEntry), is(true)); | ||
| 126 | assertThat(m_index.getOuterClass(ClassTreeLevel3), is(ClassTreeLevel2)); | ||
| 127 | assertThat(m_index.getInnerClasses(ClassTreeLevel3), is(empty())); | ||
| 128 | } | ||
| 129 | |||
| 130 | private void decompile(ClassEntry classEntry) { | ||
| 131 | m_deobfuscator.getSourceTree(classEntry.getName()); | ||
| 89 | } | 132 | } |
| 90 | } | 133 | } |
diff --git a/test/cuchaz/enigma/TestJarIndexLoneClass.java b/test/cuchaz/enigma/TestJarIndexLoneClass.java index 768284f9..0c126ad0 100644 --- a/test/cuchaz/enigma/TestJarIndexLoneClass.java +++ b/test/cuchaz/enigma/TestJarIndexLoneClass.java | |||
| @@ -26,7 +26,6 @@ import cuchaz.enigma.analysis.ClassImplementationsTreeNode; | |||
| 26 | import cuchaz.enigma.analysis.ClassInheritanceTreeNode; | 26 | import cuchaz.enigma.analysis.ClassInheritanceTreeNode; |
| 27 | import cuchaz.enigma.analysis.EntryReference; | 27 | import cuchaz.enigma.analysis.EntryReference; |
| 28 | import cuchaz.enigma.analysis.JarIndex; | 28 | import cuchaz.enigma.analysis.JarIndex; |
| 29 | import cuchaz.enigma.analysis.MethodImplementationsTreeNode; | ||
| 30 | import cuchaz.enigma.analysis.MethodInheritanceTreeNode; | 29 | import cuchaz.enigma.analysis.MethodInheritanceTreeNode; |
| 31 | import cuchaz.enigma.mapping.BehaviorEntry; | 30 | import cuchaz.enigma.mapping.BehaviorEntry; |
| 32 | import cuchaz.enigma.mapping.ClassEntry; | 31 | import cuchaz.enigma.mapping.ClassEntry; |
| @@ -125,17 +124,17 @@ public class TestJarIndexLoneClass { | |||
| 125 | 124 | ||
| 126 | @Test | 125 | @Test |
| 127 | public void innerClasses() { | 126 | public void innerClasses() { |
| 128 | assertThat(m_index.getInnerClasses("none/a"), is(empty())); | 127 | assertThat(m_index.getInnerClasses(newClass("none/a")), is(empty())); |
| 129 | } | 128 | } |
| 130 | 129 | ||
| 131 | @Test | 130 | @Test |
| 132 | public void outerClass() { | 131 | public void outerClass() { |
| 133 | assertThat(m_index.getOuterClass("a"), is(nullValue())); | 132 | assertThat(m_index.getOuterClass(newClass("a")), is(nullValue())); |
| 134 | } | 133 | } |
| 135 | 134 | ||
| 136 | @Test | 135 | @Test |
| 137 | public void isAnonymousClass() { | 136 | public void isAnonymousClass() { |
| 138 | assertThat(m_index.isAnonymousClass("none/a"), is(false)); | 137 | assertThat(m_index.isAnonymousClass(newClass("none/a")), is(false)); |
| 139 | } | 138 | } |
| 140 | 139 | ||
| 141 | @Test | 140 | @Test |
diff --git a/test/cuchaz/enigma/TestTranslator.java b/test/cuchaz/enigma/TestTranslator.java index 3fe1680f..02526050 100644 --- a/test/cuchaz/enigma/TestTranslator.java +++ b/test/cuchaz/enigma/TestTranslator.java | |||
| @@ -97,8 +97,44 @@ public class TestTranslator { | |||
| 97 | assertMapping(newMethod("none/c", "b", "()I"), newMethod("deobf/C_SubClass", "m2", "()I")); | 97 | assertMapping(newMethod("none/c", "b", "()I"), newMethod("deobf/C_SubClass", "m2", "()I")); |
| 98 | } | 98 | } |
| 99 | 99 | ||
| 100 | @Test | ||
| 101 | public void innerClasses() { | ||
| 102 | |||
| 103 | // classes | ||
| 104 | assertMapping(newClass("none/h"), newClass("deobf/H_OuterClass")); | ||
| 105 | assertMapping(newClass("none/h$i"), newClass("deobf/H_OuterClass$I_InnerClass")); | ||
| 106 | assertMapping(newClass("none/h$i$j"), newClass("deobf/H_OuterClass$I_InnerClass$J_InnerInnerClass")); | ||
| 107 | assertMapping(newClass("none/h$k"), newClass("deobf/H_OuterClass$k")); | ||
| 108 | assertMapping(newClass("none/h$k$l"), newClass("deobf/H_OuterClass$k$L_NamedInnerClass")); | ||
| 109 | |||
| 110 | // fields | ||
| 111 | assertMapping(newField("none/h$i", "a", "I"), newField("deobf/H_OuterClass$I_InnerClass", "f1", "I")); | ||
| 112 | assertMapping(newField("none/h$i", "a", "Ljava/lang/String;"), newField("deobf/H_OuterClass$I_InnerClass", "f2", "Ljava/lang/String;")); | ||
| 113 | assertMapping(newField("none/h$i$j", "a", "I"), newField("deobf/H_OuterClass$I_InnerClass$J_InnerInnerClass", "f3", "I")); | ||
| 114 | assertMapping(newField("none/h$k$l", "a", "I"), newField("deobf/H_OuterClass$k$L_NamedInnerClass", "f4", "I")); | ||
| 115 | |||
| 116 | // methods | ||
| 117 | assertMapping(newMethod("none/h$i", "a", "()V"), newMethod("deobf/H_OuterClass$I_InnerClass", "m1", "()V")); | ||
| 118 | assertMapping(newMethod("none/h$i$j", "a", "()V"), newMethod("deobf/H_OuterClass$I_InnerClass$J_InnerInnerClass", "m2", "()V")); | ||
| 119 | } | ||
| 120 | |||
| 121 | @Test | ||
| 122 | public void namelessClass() { | ||
| 123 | assertMapping(newClass("none/m"), newClass("none/m")); | ||
| 124 | } | ||
| 125 | |||
| 100 | private void assertMapping(Entry obf, Entry deobf) { | 126 | private void assertMapping(Entry obf, Entry deobf) { |
| 101 | assertThat(m_deobfTranslator.translateEntry(obf), is(deobf)); | 127 | assertThat(m_deobfTranslator.translateEntry(obf), is(deobf)); |
| 102 | assertThat(m_obfTranslator.translateEntry(deobf), is(obf)); | 128 | assertThat(m_obfTranslator.translateEntry(deobf), is(obf)); |
| 129 | |||
| 130 | String deobfName = m_deobfTranslator.translate(obf); | ||
| 131 | if (deobfName != null) { | ||
| 132 | assertThat(deobfName, is(deobf.getName())); | ||
| 133 | } | ||
| 134 | |||
| 135 | String obfName = m_obfTranslator.translate(deobf); | ||
| 136 | if (obfName != null) { | ||
| 137 | assertThat(obfName, is(obf.getName())); | ||
| 138 | } | ||
| 103 | } | 139 | } |
| 104 | } | 140 | } |
diff --git a/test/cuchaz/enigma/inputs/innerClasses/F_ClassTree.java b/test/cuchaz/enigma/inputs/innerClasses/F_ClassTree.java new file mode 100644 index 00000000..6552d8a6 --- /dev/null +++ b/test/cuchaz/enigma/inputs/innerClasses/F_ClassTree.java | |||
| @@ -0,0 +1,20 @@ | |||
| 1 | package cuchaz.enigma.inputs.innerClasses; | ||
| 2 | |||
| 3 | |||
| 4 | public class F_ClassTree { | ||
| 5 | |||
| 6 | public class Level1 { | ||
| 7 | |||
| 8 | public int f1; | ||
| 9 | |||
| 10 | public class Level2 { | ||
| 11 | |||
| 12 | public int f2; | ||
| 13 | |||
| 14 | public class Level3 { | ||
| 15 | |||
| 16 | public int f3; | ||
| 17 | } | ||
| 18 | } | ||
| 19 | } | ||
| 20 | } | ||
diff --git a/test/cuchaz/enigma/inputs/translation/F_ObjectMethods.java b/test/cuchaz/enigma/inputs/translation/G_ObjectMethods.java index 4e091797..ebad5a38 100644 --- a/test/cuchaz/enigma/inputs/translation/F_ObjectMethods.java +++ b/test/cuchaz/enigma/inputs/translation/G_ObjectMethods.java | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | package cuchaz.enigma.inputs.translation; | 1 | package cuchaz.enigma.inputs.translation; |
| 2 | 2 | ||
| 3 | public class F_ObjectMethods { | 3 | public class G_ObjectMethods { |
| 4 | 4 | ||
| 5 | public void callEmAll() | 5 | public void callEmAll() |
| 6 | throws Throwable { | 6 | throws Throwable { |
diff --git a/test/cuchaz/enigma/inputs/translation/H_OuterClass.java b/test/cuchaz/enigma/inputs/translation/H_OuterClass.java new file mode 100644 index 00000000..995c65d2 --- /dev/null +++ b/test/cuchaz/enigma/inputs/translation/H_OuterClass.java | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | package cuchaz.enigma.inputs.translation; | ||
| 2 | |||
| 3 | |||
| 4 | public class H_OuterClass { | ||
| 5 | |||
| 6 | public class I_InnerClass { | ||
| 7 | |||
| 8 | public int f1; | ||
| 9 | public String f2; | ||
| 10 | |||
| 11 | public void m1() {} | ||
| 12 | |||
| 13 | public class J_InnerInnerClass { | ||
| 14 | |||
| 15 | public int f3; | ||
| 16 | |||
| 17 | public void m2() {} | ||
| 18 | } | ||
| 19 | } | ||
| 20 | |||
| 21 | public class K_NamelessClass { | ||
| 22 | public class L_NamedInnerClass { | ||
| 23 | public int f4; | ||
| 24 | } | ||
| 25 | } | ||
| 26 | } | ||
diff --git a/test/cuchaz/enigma/inputs/translation/M_NamelessClass.java b/test/cuchaz/enigma/inputs/translation/M_NamelessClass.java new file mode 100644 index 00000000..afc9a9a5 --- /dev/null +++ b/test/cuchaz/enigma/inputs/translation/M_NamelessClass.java | |||
| @@ -0,0 +1,26 @@ | |||
| 1 | package cuchaz.enigma.inputs.translation; | ||
| 2 | |||
| 3 | |||
| 4 | public class M_NamelessClass { | ||
| 5 | |||
| 6 | public class I_InnerClass { | ||
| 7 | |||
| 8 | public int f1; | ||
| 9 | public String f2; | ||
| 10 | |||
| 11 | public void m1() {} | ||
| 12 | |||
| 13 | public class J_InnerInnerClass { | ||
| 14 | |||
| 15 | public int f3; | ||
| 16 | |||
| 17 | public void m2() {} | ||
| 18 | } | ||
| 19 | } | ||
| 20 | |||
| 21 | public class K_NamelessClass { | ||
| 22 | public class L_NamedInnerClass { | ||
| 23 | public int f4; | ||
| 24 | } | ||
| 25 | } | ||
| 26 | } | ||
diff --git a/test/cuchaz/enigma/resources/translation.mappings b/test/cuchaz/enigma/resources/translation.mappings index d87d437c..5dffaf1d 100644 --- a/test/cuchaz/enigma/resources/translation.mappings +++ b/test/cuchaz/enigma/resources/translation.mappings | |||
| @@ -17,3 +17,15 @@ CLASS none/c deobf/C_SubClass | |||
| 17 | FIELD c f4 I | 17 | FIELD c f4 I |
| 18 | METHOD a m1 ()I | 18 | METHOD a m1 ()I |
| 19 | METHOD c m3 ()I | 19 | METHOD c m3 ()I |
| 20 | CLASS none/h deobf/H_OuterClass | ||
| 21 | CLASS none/i I_InnerClass | ||
| 22 | CLASS none/j J_InnerInnerClass | ||
| 23 | FIELD a f3 I | ||
| 24 | METHOD a m2 ()V | ||
| 25 | FIELD a f1 I | ||
| 26 | FIELD a f2 Ljava/lang/String; | ||
| 27 | METHOD a m1 ()V | ||
| 28 | CLASS none/k | ||
| 29 | CLASS none/l L_NamedInnerClass | ||
| 30 | FIELD a f4 I | ||
| 31 | CLASS none/m \ No newline at end of file | ||