[TEST] Тесты для InjectClassAcceptor

This commit is contained in:
Gravit 2020-01-18 13:31:30 +07:00
parent 567e2fefaf
commit 036b593356
No known key found for this signature in database
GPG key ID: 061981E1E85D3216
2 changed files with 67 additions and 1 deletions

View file

@ -22,7 +22,7 @@ public class InjectClassAcceptor {
public static final String INJ_DESC = Type.getDescriptor(LauncherInject.class); public static final String INJ_DESC = Type.getDescriptor(LauncherInject.class);
public static void checkMap(Map<String,Object> object) { public static void checkMap(Map<String,Object> object) {
if (!object.values().stream().allMatch(zPrimitivesList::contains)) if (!zPrimitivesList.containsAll(object.values()))
throw new IllegalArgumentException("Only primitives in values..."); throw new IllegalArgumentException("Only primitives in values...");
} }

View file

@ -0,0 +1,66 @@
package pro.gravit.launchserver;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.FieldNode;
import pro.gravit.launcher.LauncherInject;
import pro.gravit.launchserver.asm.InjectClassAcceptor;
import pro.gravit.utils.PublicURLClassLoader;
import pro.gravit.utils.helper.LogHelper;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;
public class ASMTransformersTest {
public static class ASMClassLoader extends ClassLoader
{
public ASMClassLoader(ClassLoader parent) {
super(parent);
}
public void rawDefineClass(String name, byte[] bytes, int offset, int length)
{
defineClass(name, bytes, offset, length);
}
}
public static ASMClassLoader classLoader;
public static class TestClass
{
@LauncherInject(value = "testprop")
public static int test = 1;
}
@BeforeAll
public static void prepare() throws Exception {
classLoader = new ASMClassLoader(ASMTransformersTest.class.getClassLoader());
}
InputStream getClass(Class<?> clazz)
{
String className = clazz.getName();
String classAsPath = className.replace('.', '/') + ".class";
return clazz.getClassLoader().getResourceAsStream(classAsPath);
}
@Test
void testASM() throws Exception
{
ClassReader reader = new ClassReader(getClass(TestClass.class));
ClassNode node = new ClassNode();
reader.accept(node, ClassReader.SKIP_DEBUG);
node.name = "ASMTestClass";
Map<String, Object> map = new HashMap<>();
map.put("testprop", 1234);
InjectClassAcceptor.visit(node, map);
ClassWriter writer = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
node.accept(writer);
byte[] bytes = writer.toByteArray();
classLoader.rawDefineClass("ASMTestClass", bytes, 0, bytes.length);
Class<?> clazz = classLoader.loadClass("ASMTestClass");
Field field = clazz.getField("test");
Object result = field.get(null);
Assertions.assertEquals(1234, (int) (Integer) result);
}
}