Add test for injecting a field into multiple classes

This commit is contained in:
Lucwousin
2022-01-25 20:56:05 +01:00
parent 3ec6dfd113
commit d731d12a9d

View File

@@ -24,7 +24,6 @@
*/
package com.openosrs.injector.injectors;
import com.google.common.io.ByteStreams;
import com.openosrs.injector.TestInjection;
import com.openosrs.injector.rsapi.RSApi;
import java.io.IOException;
@@ -50,14 +49,12 @@ import net.runelite.asm.attributes.code.instructions.InvokeVirtual;
import net.runelite.asm.attributes.code.instructions.LDC;
import net.runelite.asm.signature.Signature;
import net.runelite.asm.visitors.ClassFileVisitor;
import net.runelite.deob.util.JarUtil;
import net.runelite.mapping.ObfuscatedGetter;
import net.runelite.mapping.ObfuscatedName;
import net.runelite.mapping.ObfuscatedSignature;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.objectweb.asm.ClassReader;
import static org.junit.Assert.*;
import static org.objectweb.asm.Opcodes.ACC_PUBLIC;
import static org.objectweb.asm.Opcodes.ACC_STATIC;
@@ -80,6 +77,25 @@ class DeobTarget
}
}
@ObfuscatedName("com/openosrs/injector/injectors/VanillaTarget2")
class DeobTarget2
{
@ObfuscatedName("ob_foo5")
@ObfuscatedGetter(intValue = 1157381415)
static int foo5;
@ObfuscatedName("ob_foo6")
@ObfuscatedSignature(
descriptor = "(I)V",
garbageValue = "123"
)
private void foo6()
{
// De-obfuscated foo6
System.out.println("foo6");
}
}
class VanillaTarget
{
static int ob_foo4;
@@ -95,6 +111,21 @@ class VanillaTarget
}
}
class VanillaTarget2
{
static int ob_foo5;
private void ob_foo6(int garbageValue)
{
// Obfuscated foo6
if (garbageValue != 123)
{
return;
}
System.out.println("foo6");
}
}
abstract class Source
{
@net.runelite.api.mixins.Inject
@@ -130,26 +161,36 @@ abstract class Source2
}
}
// Test injecting a field into multiple vanilla classes (@Mixins)
abstract class Source3
{
@net.runelite.api.mixins.Inject
private boolean injectMe;
}
public class MixinInjectorTest
{
@Test
public void testInject() throws Exception
{
InputStream deobIn = getClass().getResourceAsStream("DeobTarget.class");
ClassFile deobTarget = JarUtil.loadClass(ByteStreams.toByteArray(deobIn));
ClassFile deobTarget = loadClass(DeobTarget.class);
ClassFile deobTarget2 = loadClass(DeobTarget2.class);
ClassGroup deob = new ClassGroup();
deob.addClass(deobTarget);
deob.addClass(deobTarget2);
InputStream vanillaIn = getClass().getResourceAsStream("VanillaTarget.class");
ClassFile vanillaTarget = JarUtil.loadClass(ByteStreams.toByteArray(vanillaIn));
ClassFile vanillaTarget = loadClass(VanillaTarget.class);
ClassFile vanillaTarget2 = loadClass(VanillaTarget2.class);
ClassGroup vanilla = new ClassGroup();
vanilla.addClass(vanillaTarget);
vanilla.addClass(vanillaTarget2);
Map<Provider<ClassFile>, List<ClassFile>> mixinClasses = new HashMap<>();
mixinClasses.put(() -> loadClass(Source.class), Collections.singletonList(vanillaTarget));
mixinClasses.put(() -> loadClass(Source2.class), Collections.singletonList(vanillaTarget));
mixinClasses.put(() -> loadClass(Source3.class), List.of(vanillaTarget, vanillaTarget2));
TestInjection inject = new TestInjection(vanilla, deob, new ClassGroup(), new RSApi());
inject.initToVanilla();
@@ -276,6 +317,8 @@ public class MixinInjectorTest
return true;
})
.count(), 1);
assertTrue(fieldExists(List.of(vanillaTarget, vanillaTarget2), "injectMe"));
}
private boolean getStaticHasGetter(Method ob_foo3, String gottenField)
@@ -292,6 +335,15 @@ public class MixinInjectorTest
it.next() instanceof IMul;
}
private boolean fieldExists(List<ClassFile> classes, String name)
{
for (ClassFile c : classes)
if (c.findField(name) == null)
return false;
return true;
}
private static ClassFile loadClass(Class<?> clazz)
{
try (InputStream is = clazz.getClassLoader().getResourceAsStream(clazz.getName().replace('.', '/') + ".class"))