Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

ExtensionAnnotationProcessorTest.java 6.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /*
  2. * Copyright (C) 2012-present the original author or authors.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package org.pf4j;
  17. import com.google.testing.compile.Compilation;
  18. import com.google.testing.compile.Compiler;
  19. import com.google.testing.compile.JavaFileObjects;
  20. import org.junit.jupiter.api.BeforeEach;
  21. import org.junit.jupiter.api.Test;
  22. import org.pf4j.processor.ExtensionAnnotationProcessor;
  23. import org.pf4j.processor.LegacyExtensionStorage;
  24. import org.pf4j.test.JavaSources;
  25. import javax.tools.JavaFileObject;
  26. import java.io.IOException;
  27. import java.util.Collections;
  28. import java.util.HashMap;
  29. import java.util.HashSet;
  30. import java.util.Map;
  31. import java.util.Set;
  32. import static com.google.testing.compile.CompilationSubject.assertThat;
  33. import static com.google.testing.compile.Compiler.javac;
  34. import static org.junit.jupiter.api.Assertions.assertEquals;
  35. /**
  36. * @author Mario Franco
  37. * @author Decebal Suiu
  38. */
  39. public class ExtensionAnnotationProcessorTest {
  40. public static final JavaFileObject WhazzupGreeting_NoExtensionPoint = JavaFileObjects.forSourceLines("WhazzupGreeting",
  41. "package test;",
  42. "import org.pf4j.Extension;",
  43. "",
  44. "@Extension",
  45. "public class WhazzupGreeting {",
  46. " @Override",
  47. " public String getGreeting() {",
  48. " return \"Whazzup\";",
  49. " }",
  50. "}");
  51. public static final JavaFileObject SpinnakerExtension = JavaFileObjects.forSourceLines("SpinnakerExtension",
  52. "package test;",
  53. "",
  54. "import org.pf4j.Extension;",
  55. "import java.lang.annotation.Documented;",
  56. "import java.lang.annotation.ElementType;",
  57. "import java.lang.annotation.Retention;",
  58. "import java.lang.annotation.RetentionPolicy;",
  59. "import java.lang.annotation.Target;",
  60. "",
  61. "@Extension",
  62. "@Retention(RetentionPolicy.RUNTIME)",
  63. "@Target(ElementType.TYPE)",
  64. "@Documented",
  65. "public @interface SpinnakerExtension {",
  66. "}");
  67. public static final JavaFileObject WhazzupGreeting_SpinnakerExtension = JavaFileObjects.forSourceLines("WhazzupGreeting",
  68. "package test;",
  69. "",
  70. "@SpinnakerExtension",
  71. "public class WhazzupGreeting implements Greeting {",
  72. " @Override",
  73. " public String getGreeting() {",
  74. " return \"Whazzup\";",
  75. " }",
  76. "}");
  77. /**
  78. * The same as {@link #SpinnakerExtension} but without {@code Extension} annotation.
  79. */
  80. public static final JavaFileObject SpinnakerExtension_NoExtension = JavaFileObjects.forSourceLines("SpinnakerExtension",
  81. "package test;",
  82. "",
  83. "import org.pf4j.Extension;",
  84. "import java.lang.annotation.Documented;",
  85. "import java.lang.annotation.ElementType;",
  86. "import java.lang.annotation.Retention;",
  87. "import java.lang.annotation.RetentionPolicy;",
  88. "import java.lang.annotation.Target;",
  89. "",
  90. // "@Extension",
  91. "@Retention(RetentionPolicy.RUNTIME)",
  92. "@Target(ElementType.TYPE)",
  93. "@Documented",
  94. "public @interface SpinnakerExtension {",
  95. "}");
  96. private ExtensionAnnotationProcessor annotationProcessor;
  97. @BeforeEach
  98. public void setUp() throws IOException {
  99. annotationProcessor = new ExtensionAnnotationProcessor();
  100. }
  101. @Test
  102. public void getSupportedAnnotationTypes() {
  103. Set<String> result = annotationProcessor.getSupportedAnnotationTypes();
  104. assertEquals(1, result.size());
  105. assertEquals("*", result.iterator().next());
  106. }
  107. @Test
  108. public void getSupportedOptions() {
  109. Set<String> result = annotationProcessor.getSupportedOptions();
  110. assertEquals(2, result.size());
  111. }
  112. @Test
  113. public void options() {
  114. Compilation compilation = compiler().withOptions("-Ab=2", "-Ac=3")
  115. .compile(JavaSources.Greeting, JavaSources.WhazzupGreeting);
  116. assertEquals(Compilation.Status.SUCCESS, compilation.status());
  117. Map<String, String> options = new HashMap<>();
  118. options.put("b", "2");
  119. options.put("c", "3");
  120. assertEquals(options, annotationProcessor.getProcessingEnvironment().getOptions());
  121. }
  122. @Test
  123. public void storage() {
  124. Compilation compilation = compile(JavaSources.Greeting, JavaSources.WhazzupGreeting);
  125. assertEquals(Compilation.Status.SUCCESS, compilation.status());
  126. assertEquals(annotationProcessor.getStorage().getClass(), LegacyExtensionStorage.class);
  127. }
  128. @Test
  129. public void compileWithoutError() {
  130. Compilation compilation = compile(JavaSources.Greeting, JavaSources.WhazzupGreeting);
  131. assertThat(compilation).succeededWithoutWarnings();
  132. }
  133. @Test
  134. public void compileWithError() {
  135. Compilation compilation = compile(JavaSources.Greeting, WhazzupGreeting_NoExtensionPoint);
  136. assertThat(compilation).failed();
  137. assertThat(compilation).hadErrorContaining("it doesn't implement ExtensionPoint")
  138. .inFile(WhazzupGreeting_NoExtensionPoint)
  139. .onLine(5)
  140. .atColumn(8);
  141. }
  142. @Test
  143. public void getExtensions() {
  144. Compilation compilation = compile(JavaSources.Greeting, JavaSources.WhazzupGreeting);
  145. assertThat(compilation).succeededWithoutWarnings();
  146. Map<String, Set<String>> extensions = new HashMap<>();
  147. extensions.put("test.Greeting", new HashSet<>(Collections.singletonList("test.WhazzupGreeting")));
  148. assertEquals(extensions, annotationProcessor.getExtensions());
  149. }
  150. @Test
  151. public void compileNestedExtensionAnnotation() {
  152. Compilation compilation = compile(JavaSources.Greeting, SpinnakerExtension, WhazzupGreeting_SpinnakerExtension);
  153. assertThat(compilation).succeededWithoutWarnings();
  154. Map<String, Set<String>> extensions = new HashMap<>();
  155. extensions.put("test.Greeting", new HashSet<>(Collections.singletonList("test.WhazzupGreeting")));
  156. assertEquals(extensions, annotationProcessor.getExtensions());
  157. }
  158. private Compiler compiler() {
  159. return javac().withProcessors(annotationProcessor);
  160. }
  161. private Compilation compile(JavaFileObject... sources) {
  162. return compiler().compile(sources);
  163. }
  164. }