aboutsummaryrefslogtreecommitdiffhomepage
path: root/patches/api/0003-Test-changes.patch
diff options
context:
space:
mode:
authorNassim Jahnke <[email protected]>2023-12-05 18:33:18 +0100
committerNassim Jahnke <[email protected]>2023-12-05 18:33:18 +0100
commit8e8d6aeeb0381b0c648605238f5445a4b7b041f3 (patch)
treee686fa54547d5cc1e2e9c5494f02b83832371c12 /patches/api/0003-Test-changes.patch
parent2a1ace0cf289870e82d23cf6cbcd87493f26a188 (diff)
downloadPaper-8e8d6aeeb0381b0c648605238f5445a4b7b041f3.tar.gz
Paper-8e8d6aeeb0381b0c648605238f5445a4b7b041f3.zip
Finish API
Diffstat (limited to 'patches/api/0003-Test-changes.patch')
-rw-r--r--patches/api/0003-Test-changes.patch250
1 files changed, 250 insertions, 0 deletions
diff --git a/patches/api/0003-Test-changes.patch b/patches/api/0003-Test-changes.patch
new file mode 100644
index 0000000000..5bd26772c4
--- /dev/null
+++ b/patches/api/0003-Test-changes.patch
@@ -0,0 +1,250 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Shane Freeder <[email protected]>
+Date: Sun, 17 Mar 2019 23:04:30 +0000
+Subject: [PATCH] Test changes
+
+- Allow use of TYPE_USE annotations
+- Ignore package-private methods for nullability annotations
+- Add excludes for classes which don't pass
+- Disable stupid BukkitMirrorTest
+
+Co-authored-by: Riley Park <[email protected]>
+Co-authored-by: Jake Potrebic <[email protected]>
+
+diff --git a/build.gradle.kts b/build.gradle.kts
+index d86ee6acb78d249424c5df98a851178c0f62eec1..75bfb0ab8049ebbb52240abf661d469de5526767 100644
+--- a/build.gradle.kts
++++ b/build.gradle.kts
+@@ -106,6 +106,12 @@ tasks.test {
+ useJUnitPlatform()
+ }
+
++// Paper start - compile tests with -parameters for better junit parameterized test names
++tasks.compileTestJava {
++ options.compilerArgs.add("-parameters")
++}
++// Paper end
++
+ // Paper start
+ val scanJar = tasks.register("scanJarForBadCalls", io.papermc.paperweight.tasks.ScanJarForBadCalls::class) {
+ badAnnotations.add("Lio/papermc/paper/annotation/DoNotUse;")
+diff --git a/src/test/java/io/papermc/paper/testing/EmptyTag.java b/src/test/java/io/papermc/paper/testing/EmptyTag.java
+new file mode 100644
+index 0000000000000000000000000000000000000000..77154095cfb8b259bdb318e8ff40cb6f559ebc18
+--- /dev/null
++++ b/src/test/java/io/papermc/paper/testing/EmptyTag.java
+@@ -0,0 +1,31 @@
++package io.papermc.paper.testing;
++
++import java.util.Collections;
++import java.util.Set;
++import org.bukkit.Keyed;
++import org.bukkit.NamespacedKey;
++import org.bukkit.Tag;
++import org.jetbrains.annotations.NotNull;
++
++public record EmptyTag(NamespacedKey key) implements Tag<Keyed> {
++
++ @SuppressWarnings("deprecation")
++ public EmptyTag() {
++ this(NamespacedKey.randomKey());
++ }
++
++ @Override
++ public @NotNull NamespacedKey getKey() {
++ return this.key;
++ }
++
++ @Override
++ public boolean isTagged(@NotNull final Keyed item) {
++ return false;
++ }
++
++ @Override
++ public @NotNull Set<Keyed> getValues() {
++ return Collections.emptySet();
++ }
++}
+diff --git a/src/test/java/org/bukkit/AnnotationTest.java b/src/test/java/org/bukkit/AnnotationTest.java
+index 64e7aef6220097edefdff3b98a771b988365930d..abadff47166722fdc756afdbc6ac7242b6bd4fb0 100644
+--- a/src/test/java/org/bukkit/AnnotationTest.java
++++ b/src/test/java/org/bukkit/AnnotationTest.java
+@@ -29,7 +29,13 @@ public class AnnotationTest {
+ "Lorg/jetbrains/annotations/Nullable;",
+ "Lorg/jetbrains/annotations/NotNull;",
+ "Lorg/jetbrains/annotations/Contract;",
+- "Lorg/bukkit/UndefinedNullability;"
++ "Lorg/bukkit/UndefinedNullability;",
++ // Paper start
++ "Lorg/checkerframework/checker/nullness/qual/MonotonicNonNull;",
++ "Lorg/checkerframework/checker/nullness/qual/NonNull;",
++ "Lorg/checkerframework/checker/nullness/qual/Nullable;",
++ "Lorg/checkerframework/checker/nullness/qual/PolyNull;",
++ // Paper end
+ };
+
+ private static final String[] EXCLUDED_CLASSES = {
+@@ -40,7 +46,17 @@ public class AnnotationTest {
+ "org/bukkit/util/io/Wrapper",
+ "org/bukkit/plugin/java/PluginClassLoader",
+ // Generic functional interface
+- "org/bukkit/util/Consumer"
++ "org/bukkit/util/Consumer",
++ // Paper start
++ // Timings history is broken in terms of nullability due to guavas Function defining that the param is NonNull
++ "co/aikar/timings/TimingHistory$2",
++ "co/aikar/timings/TimingHistory$2$1",
++ "co/aikar/timings/TimingHistory$2$1$1",
++ "co/aikar/timings/TimingHistory$2$1$2",
++ "co/aikar/timings/TimingHistory$3",
++ "co/aikar/timings/TimingHistory$4",
++ "co/aikar/timings/TimingHistoryEntry$1"
++ // Paper end
+ };
+
+ @Test
+@@ -67,14 +83,40 @@ public class AnnotationTest {
+ }
+
+ if (mustBeAnnotated(Type.getReturnType(method.desc)) && !isWellAnnotated(method.invisibleAnnotations)) {
++ // Paper start - Allow use of TYPE_USE annotations
++ boolean warn = true;
++ if (isWellAnnotated(method.visibleTypeAnnotations)) {
++ warn = false;
++ } else if (method.invisibleTypeAnnotations != null) {
++ dance: for (final org.objectweb.asm.tree.TypeAnnotationNode invisibleTypeAnnotation : method.invisibleTypeAnnotations) {
++ final org.objectweb.asm.TypeReference ref = new org.objectweb.asm.TypeReference(invisibleTypeAnnotation.typeRef);
++ if (ref.getSort() == org.objectweb.asm.TypeReference.METHOD_RETURN && java.util.Arrays.asList(ACCEPTED_ANNOTATIONS).contains(invisibleTypeAnnotation.desc)) {
++ warn = false;
++ break dance; // cha cha real smooth
++ }
++ }
++ }
++ if (warn)
++ // Paper end
+ warn(errors, clazz, method, "return value");
+ }
+
+ Type[] paramTypes = Type.getArgumentTypes(method.desc);
+ List<ParameterNode> parameters = method.parameters;
+
++ dancing: // Paper
+ for (int i = 0; i < paramTypes.length; i++) {
+ if (mustBeAnnotated(paramTypes[i]) ^ isWellAnnotated(method.invisibleParameterAnnotations == null ? null : method.invisibleParameterAnnotations[i])) {
++ // Paper start
++ if (method.invisibleTypeAnnotations != null) {
++ for (final org.objectweb.asm.tree.TypeAnnotationNode invisibleTypeAnnotation : method.invisibleTypeAnnotations) {
++ final org.objectweb.asm.TypeReference ref = new org.objectweb.asm.TypeReference(invisibleTypeAnnotation.typeRef);
++ if (ref.getSort() == org.objectweb.asm.TypeReference.METHOD_FORMAL_PARAMETER && ref.getTypeParameterIndex() == i && java.util.Arrays.asList(ACCEPTED_ANNOTATIONS).contains(invisibleTypeAnnotation.desc)) {
++ continue dancing;
++ }
++ }
++ }
++ // Paper end - Allow use of TYPE_USE annotations
+ ParameterNode paramNode = parameters == null ? null : parameters.get(i);
+ String paramName = paramNode == null ? null : paramNode.name;
+
+@@ -91,13 +133,18 @@ public class AnnotationTest {
+
+ Collections.sort(errors);
+
+- System.out.println(errors.size() + " missing annotation(s):");
++ StringBuilder builder = new StringBuilder()
++ .append("There ")
++ .append(errors.size() != 1 ? "are " : "is ")
++ .append(errors.size())
++ .append(" missing annotation")
++ .append(errors.size() != 1 ? "s:\n" : ":\n");
++
+ for (String message : errors) {
+- System.out.print("\t");
+- System.out.println(message);
++ builder.append("\t").append(message).append("\n");
+ }
+
+- fail("There " + errors.size() + " are missing annotation(s)");
++ fail(builder.toString());
+ }
+
+ private static void collectClasses(@NotNull File from, @NotNull Map<String, ClassNode> to) throws IOException {
+@@ -140,6 +187,11 @@ public class AnnotationTest {
+ // Exceptions are excluded
+ return false;
+ }
++ // Paper start
++ if (isInternal(clazz.invisibleAnnotations)) {
++ return false;
++ }
++ // Paper end
+
+ for (String excludedClass : EXCLUDED_CLASSES) {
+ if (excludedClass.equals(clazz.name)) {
+@@ -152,7 +204,7 @@ public class AnnotationTest {
+
+ private static boolean isMethodIncluded(@NotNull ClassNode clazz, @NotNull MethodNode method, @NotNull Map<String, ClassNode> allClasses) {
+ // Exclude private, synthetic and deprecated methods
+- if ((method.access & (Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_DEPRECATED)) != 0) {
++ if ((method.access & (Opcodes.ACC_PRIVATE | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_DEPRECATED)) != 0 || (method.access & (Opcodes.ACC_PRIVATE | Opcodes.ACC_PROTECTED | Opcodes.ACC_PUBLIC)) == 0) { // Paper - ignore package-private
+ return false;
+ }
+
+@@ -170,11 +222,30 @@ public class AnnotationTest {
+ if ("<init>".equals(method.name) && isAnonymous(clazz)) {
+ return false;
+ }
++ // Paper start
++ if (isInternal(method.invisibleAnnotations)) {
++ return false;
++ }
++ // Paper end
+
+ return true;
+ }
++ // Paper start
++ private static boolean isInternal(List<? extends AnnotationNode> annotations) {
++ if (annotations == null) {
++ return false;
++ }
++ for (AnnotationNode node : annotations) {
++ if (node.desc.equals("Lorg/jetbrains/annotations/ApiStatus$Internal;")) {
++ return true;
++ }
++ }
++
++ return false;
++ }
++ // Paper end
+
+- private static boolean isWellAnnotated(@Nullable List<AnnotationNode> annotations) {
++ private static boolean isWellAnnotated(@Nullable List<? extends AnnotationNode> annotations) { // Paper
+ if (annotations == null) {
+ return false;
+ }
+diff --git a/src/test/java/org/bukkit/BukkitMirrorTest.java b/src/test/java/org/bukkit/BukkitMirrorTest.java
+index 89ca06ebecdaadd5dfc7bc74473ca15ad36f6eff..5974ceea58940e1799f3589eac0e39b925a42c3b 100644
+--- a/src/test/java/org/bukkit/BukkitMirrorTest.java
++++ b/src/test/java/org/bukkit/BukkitMirrorTest.java
+@@ -9,6 +9,7 @@ import org.junit.jupiter.params.ParameterizedTest;
+ import org.junit.jupiter.params.provider.Arguments;
+ import org.junit.jupiter.params.provider.MethodSource;
+
+ public class BukkitMirrorTest {
+
+ public static Stream<Arguments> data() {
+diff --git a/src/test/java/org/bukkit/support/TestServer.java b/src/test/java/org/bukkit/support/TestServer.java
+index 79173d6ed844f1e640e3aa745a9b560ec5e6a2bc..73ec679ac0d1f398b417bd174b47f9af93351e27 100644
+--- a/src/test/java/org/bukkit/support/TestServer.java
++++ b/src/test/java/org/bukkit/support/TestServer.java
+@@ -61,6 +61,11 @@ public final class TestServer {
+ UnsafeValues unsafeValues = mock(withSettings().stubOnly());
+ when(instance.getUnsafe()).thenReturn(unsafeValues);
+
++ // Paper start - testing changes
++ when(instance.getTag(anyString(), any(NamespacedKey.class), any())).thenAnswer(ignored -> new io.papermc.paper.testing.EmptyTag());
++ when(instance.getScoreboardCriteria(anyString())).thenReturn(null);
++ // Paper end - testing changes
++
+ Bukkit.setServer(instance);
+ }
+