From 633e6dc0e6a28830c12c94e5806101c211fe1d91 Mon Sep 17 00:00:00 2001 From: Lucwousin Date: Tue, 29 Oct 2019 01:17:01 +0100 Subject: [PATCH] remove manual tests and add validator interface/rsapi validator --- .../java/com/openosrs/injector/Injection.java | 15 +++- .../openosrs/injector/InjectorValidator.java | 78 +++++++++++++++++++ .../com/openosrs/injector/RSApiValidator.java | 37 --------- .../java/com/openosrs/injector/Validator.java | 13 ++++ .../injector/injectors/InjectHook.java | 5 -- .../openosrs/injector/injectors/Injector.java | 11 +-- .../openosrs/injector/rsapi/RSApiMethod.java | 5 ++ src/test/java/RSApiTest.java | 47 ----------- src/test/java/TTest.java | 26 ------- 9 files changed, 109 insertions(+), 128 deletions(-) create mode 100644 src/main/java/com/openosrs/injector/InjectorValidator.java delete mode 100644 src/main/java/com/openosrs/injector/RSApiValidator.java create mode 100644 src/main/java/com/openosrs/injector/Validator.java delete mode 100644 src/test/java/RSApiTest.java delete mode 100644 src/test/java/TTest.java diff --git a/src/main/java/com/openosrs/injector/Injection.java b/src/main/java/com/openosrs/injector/Injection.java index 9555169..2ba149a 100644 --- a/src/main/java/com/openosrs/injector/Injection.java +++ b/src/main/java/com/openosrs/injector/Injection.java @@ -9,7 +9,6 @@ import com.openosrs.injector.injectors.MixinInjector; import com.openosrs.injector.injectors.RSApiInjector; import com.openosrs.injector.injectors.raw.ClearColorBuffer; import com.openosrs.injector.injectors.raw.DrawAfterWidgets; -import com.openosrs.injector.injectors.raw.HidePlayerAttacks; import com.openosrs.injector.injectors.raw.Occluder; import com.openosrs.injector.injectors.raw.RasterizerHook; import com.openosrs.injector.injectors.raw.RenderDraw; @@ -69,7 +68,7 @@ public class Injection extends InjectData implements InjectTaskHandler // inject(new HidePlayerAttacks(this)); - new RSApiValidator(this).validate(); + new InjectorValidator(this).validate(); } public void save(File outputJar) throws IOException @@ -91,9 +90,17 @@ public class Injection extends InjectData implements InjectTaskHandler log.lifecycle("{} {}", name, injector.getCompletionMsg()); - if (!injector.validate()) + if (injector instanceof Validator) + validate((Validator) injector); + } + + private void validate(Validator validator) throws Injexception + { + final String name = validator.getName(); + + if (!validator.validate()) { - throw new Injexception(String.format("%s failed validation", name)); + throw new Injexception(name + " failed validation"); } } diff --git a/src/main/java/com/openosrs/injector/InjectorValidator.java b/src/main/java/com/openosrs/injector/InjectorValidator.java new file mode 100644 index 0000000..a947a80 --- /dev/null +++ b/src/main/java/com/openosrs/injector/InjectorValidator.java @@ -0,0 +1,78 @@ +package com.openosrs.injector; + +import com.openosrs.injector.injection.InjectData; +import com.openosrs.injector.rsapi.RSApi; +import static com.openosrs.injector.rsapi.RSApi.API_BASE; +import com.openosrs.injector.rsapi.RSApiClass; +import com.openosrs.injector.rsapi.RSApiMethod; +import net.runelite.asm.ClassFile; +import net.runelite.asm.pool.Class; +import org.gradle.api.logging.Logger; +import org.gradle.api.logging.Logging; + +public class InjectorValidator implements Validator +{ + private static final Logger log = Logging.getLogger(InjectorValidator.class); + private static final String OK = "OK", ERROR = "ERROR", WTF = "WTF"; + private final InjectData inject; + + private int missing = 0, okay = 0, wtf = 0; + + InjectorValidator(InjectData inject) + { + this.inject = inject; + } + + public boolean validate() + { + final RSApi rsApi = inject.getRsApi(); + for (ClassFile cf : inject.getVanilla()) + { + for (Class intf : cf.getInterfaces()) + { + if (intf.getName().startsWith(API_BASE)) + { + continue; + } + + RSApiClass apiC = rsApi.findClass(intf.getName()); + if (apiC == null) + { + log.error("{} is rs api type implemented by {} but it doesn't exist in rsapi. wtf", intf, cf.getPoolClass()); + ++wtf; + continue; + } + + check(cf, apiC); + } + } + + String status = wtf > 0 ? WTF : missing > 0 ? ERROR : OK; + log.info("RSApiValidator completed. Status [{}] {} overridden methods, {} missing", status, okay, missing); + + // valid, ref to static final field + return status == OK; + } + + private void check(ClassFile clazz, RSApiClass apiClass) + { + for (RSApiMethod apiMethod : apiClass) + { + if (apiMethod.isSynthetic() || apiMethod.isDefault()) + { + continue; + } + + if (clazz.findMethodDeep(apiMethod.getName(), apiMethod.getSignature()) == null) + { + log.warn("Class {} implements interface {} but doesn't implement {}", + clazz.getPoolClass(), apiClass.getClazz(), apiMethod.getMethod()); + ++missing; + } + else + { + ++okay; + } + } + } +} diff --git a/src/main/java/com/openosrs/injector/RSApiValidator.java b/src/main/java/com/openosrs/injector/RSApiValidator.java deleted file mode 100644 index 55f4c0a..0000000 --- a/src/main/java/com/openosrs/injector/RSApiValidator.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.openosrs.injector; - -import com.openosrs.injector.injection.InjectData; -import com.openosrs.injector.rsapi.RSApi; -import com.openosrs.injector.rsapi.RSApiClass; -import com.openosrs.injector.rsapi.RSApiMethod; -import org.gradle.api.logging.Logger; -import org.gradle.api.logging.Logging; -import org.gradle.internal.impldep.aQute.libg.cryptography.RSA; - -public class RSApiValidator -{ - private static final Logger log = Logging.getLogger(RSApiValidator.class); - private final InjectData inject; - - public RSApiValidator(InjectData inject) - { - this.inject = inject; - } - - public boolean validate() throws Injexception - { - RSApi rsApi = inject.getRsApi(); - for (RSApiClass apiClass : rsApi) - { - for (RSApiMethod apiMethod : apiClass) - { - if (!apiMethod.isInjected()) - if (!apiMethod.isSynthetic()) - if (inject.toVanilla(inject.toDeob(apiClass.getName())).findMethod(apiMethod.getName(), apiMethod.getSignature()) == null) - log.warn("{} not injected", apiMethod.getMethod()); - } - } - - return false; - } -} diff --git a/src/main/java/com/openosrs/injector/Validator.java b/src/main/java/com/openosrs/injector/Validator.java new file mode 100644 index 0000000..bb9d099 --- /dev/null +++ b/src/main/java/com/openosrs/injector/Validator.java @@ -0,0 +1,13 @@ +package com.openosrs.injector; + +import net.runelite.asm.Named; + +public interface Validator extends Named +{ + boolean validate(); + + default String getName() + { + return this.getClass().getSimpleName(); + } +} diff --git a/src/main/java/com/openosrs/injector/injectors/InjectHook.java b/src/main/java/com/openosrs/injector/injectors/InjectHook.java index 78d52de..ffa0fa9 100644 --- a/src/main/java/com/openosrs/injector/injectors/InjectHook.java +++ b/src/main/java/com/openosrs/injector/injectors/InjectHook.java @@ -413,11 +413,6 @@ public class InjectHook extends AbstractInjector } } - public String getName() - { - return super.getName(); - } - @AllArgsConstructor static class HookInfo { diff --git a/src/main/java/com/openosrs/injector/injectors/Injector.java b/src/main/java/com/openosrs/injector/injectors/Injector.java index b206c0e..108b9f3 100644 --- a/src/main/java/com/openosrs/injector/injectors/Injector.java +++ b/src/main/java/com/openosrs/injector/injectors/Injector.java @@ -1,22 +1,15 @@ package com.openosrs.injector.injectors; import com.openosrs.injector.Injexception; +import net.runelite.asm.Named; -public interface Injector +public interface Injector extends Named { /** * Where all the injection should be done */ void inject() throws Injexception; - /** - * Should return `true` if injection was succesful, `false` otherwise. - */ - default boolean validate() - { - return true; - } - /** * Get a name the injector is going to be referred to in logging */ diff --git a/src/main/java/com/openosrs/injector/rsapi/RSApiMethod.java b/src/main/java/com/openosrs/injector/rsapi/RSApiMethod.java index cd6a9e1..d78d4fe 100644 --- a/src/main/java/com/openosrs/injector/rsapi/RSApiMethod.java +++ b/src/main/java/com/openosrs/injector/rsapi/RSApiMethod.java @@ -38,4 +38,9 @@ public class RSApiMethod implements Annotated, Named { return (accessFlags & Opcodes.ACC_SYNTHETIC) != 0; } + + public boolean isDefault() + { + return (accessFlags & (Opcodes.ACC_ABSTRACT | Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC)) == 1; + } } diff --git a/src/test/java/RSApiTest.java b/src/test/java/RSApiTest.java deleted file mode 100644 index d3ab001..0000000 --- a/src/test/java/RSApiTest.java +++ /dev/null @@ -1,47 +0,0 @@ -import com.openosrs.injector.rsapi.RSApi; -import com.openosrs.injector.rsapi.RSApiClass; -import com.openosrs.injector.rsapi.RSApiClassVisitor; -import java.io.IOException; -import java.io.InputStream; -import java.util.List; -import org.junit.Ignore; -import org.junit.Test; -import org.objectweb.asm.ClassReader; - -public class RSApiTest -{ - private final RSApi api = new RSApi(); - - @Test - @Ignore - public void test() throws IOException - { - loadAndAdd("/net/runelite/rs/api/RSTest.class"); - loadAndAdd("/net/runelite/rs/api/RSInterface.class"); - api.init(); - - List classes = api.getClasses(); - assert classes.size() == 2; - RSApiClass clazz = api.findClass("net/runelite/rs/api/RSTest"); - assert clazz != null; - assert clazz.getMethods().size() == 4; - } - - private void loadAndAdd(String path) throws IOException - { - List classes = api.getClasses(); - - try (InputStream is = RSApiTest.class.getResourceAsStream(path)) - { - ClassReader reader = new ClassReader(is); - RSApiClass apiClass = new RSApiClass(); - - reader.accept( - new RSApiClassVisitor(apiClass), - ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES - ); - - classes.add(apiClass); - } - } -} diff --git a/src/test/java/TTest.java b/src/test/java/TTest.java deleted file mode 100644 index b8e0033..0000000 --- a/src/test/java/TTest.java +++ /dev/null @@ -1,26 +0,0 @@ -import com.openosrs.injector.InjectPlugin; -import com.openosrs.injector.Injection; -import com.openosrs.injector.injection.InjectTaskHandler; -import java.io.File; -import org.gradle.api.Project; -import org.gradle.api.file.FileTree; -import org.gradle.testfixtures.ProjectBuilder; -import org.junit.Test; - -public class TTest -{ - private static final File VAN = new File("C:\\Users\\Lucas\\.gradle\\caches\\modules-2\\files-2.1\\net.runelite.rs\\vanilla\\184\\1bdb54d90d696598a8ee5ff793155482970180a\\vanilla-184.jar"); - private static final Project project = ProjectBuilder.builder().withProjectDir(new File("C:\\Users\\Lucas\\IdeaProjects\\runelite")).build(); - private static final FileTree API = project.zipTree("/runescape-api/build/libs/runescape-api-1.5.37-SNAPSHOT.jar"), - DEOB = project.zipTree("/runescape-client/build/libs/rs-client-1.5.37-SNAPSHOT.jar"), - MIXINS = project.zipTree("/runelite-mixins/build/libs/mixins-1.5.37-SNAPSHOT.jar"); - - - @Test - public void test() throws Exception - { - InjectTaskHandler inj = new Injection(VAN, DEOB, API, MIXINS); - - inj.inject(); - } -}