1 package org.codehaus.plexus.compiler.javac;
2
3 import java.io.BufferedReader;
4 import java.io.IOException;
5 import java.io.StringReader;
6 import java.util.List;
7 import java.util.stream.Stream;
8
9 import org.codehaus.plexus.compiler.CompilerMessage;
10 import org.codehaus.plexus.compiler.javac.JavacCompiler.JavaVersion;
11 import org.junit.jupiter.api.BeforeEach;
12 import org.junit.jupiter.api.Test;
13 import org.junit.jupiter.params.ParameterizedTest;
14 import org.junit.jupiter.params.provider.Arguments;
15 import org.junit.jupiter.params.provider.MethodSource;
16
17 import static org.hamcrest.CoreMatchers.endsWith;
18 import static org.hamcrest.CoreMatchers.not;
19 import static org.hamcrest.CoreMatchers.startsWith;
20 import static org.hamcrest.MatcherAssert.assertThat;
21 import static org.hamcrest.Matchers.hasSize;
22 import static org.hamcrest.Matchers.notNullValue;
23 import static org.junit.jupiter.api.Assertions.assertEquals;
24 import static org.junit.jupiter.api.Assertions.assertFalse;
25 import static org.junit.jupiter.api.Assertions.assertTrue;
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 public class JavacCompilerTest extends AbstractJavacCompilerTest {
51 private static final String EOL = System.getProperty("line.separator");
52
53 @BeforeEach
54 public void setUp() {
55 super.setUp();
56 setForceJavacCompilerUse(true);
57 }
58
59 @ParameterizedTest(name = "{0}")
60 @MethodSource("testParseModernStream_withAnnotationProcessingErrors_args")
61 void testParseModernStream_withAnnotationProcessingErrors(String jdkAndLocale, String stackTraceHeader)
62 throws IOException {
63 String stackTraceWithHeader = stackTraceHeader + stackTraceAnnotationProcessingError;
64 List<CompilerMessage> compilerMessages =
65 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(stackTraceWithHeader)));
66
67 assertThat(compilerMessages, notNullValue());
68 assertThat(compilerMessages, hasSize(1));
69
70 String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
71
72 assertThat(message, not(startsWith(stackTraceHeader)));
73 assertThat(message, endsWith(stackTraceAnnotationProcessingError));
74 }
75
76 private static final String stackTraceAnnotationProcessingError =
77 "java.lang.IllegalAccessError: class lombok.javac.apt.LombokProcessor (in unnamed module @0x1da51a35) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x1da51a35\n"
78 + "\tat lombok.javac.apt.LombokProcessor.getJavacProcessingEnvironment(LombokProcessor.java:433)\n"
79 + "\tat lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:92)\n"
80 + "\tat lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:160)\n"
81 + "\tat lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:213)\n"
82 + "\tat lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:64)\n"
83 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:702)\n"
84 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:829)\n"
85 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:925)\n"
86 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1269)\n"
87 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1384)\n"
88 + "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1261)\n"
89 + "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:935)\n"
90 + "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)\n"
91 + "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)\n"
92 + "\tat jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)\n"
93 + "\tat jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)\n";
94
95 private static Stream<Arguments> testParseModernStream_withAnnotationProcessingErrors_args() {
96 return Stream.of(
97 Arguments.of(
98 "JDK 8 English",
99 "\n\nAn annotation processor threw an uncaught exception.\nConsult the following stack trace for details.\n\n"),
100 Arguments.of("JDK 8 Japanese", "\n\n注釈処理で捕捉されない例外がスローされました。\n詳細は次のスタック・トレースで調査してください。\n\n"),
101 Arguments.of("JDK 8 Chinese", "\n\n注释处理程序抛出未捕获的异常错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n\n"),
102 Arguments.of(
103 "JDK 21 English",
104 "\n\nAn annotation processor threw an uncaught exception.\nConsult the following stack trace for details.\n\n"),
105 Arguments.of("JDK 21 Japanese", "\n\n注釈処理で捕捉されない例外がスローされました。\n詳細は次のスタックトレースで調査してください。\n\n"),
106 Arguments.of("JDK 21 Chinese", "\n\n批注处理程序抛出未捕获的异常错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n\n"),
107 Arguments.of(
108 "JDK 21 German",
109 "\n\nEin Annotationsprozessor hat eine nicht abgefangene Ausnahme ausgelöst.\nDetails finden Sie im folgenden Stacktrace.\n\n"));
110 }
111
112 @Test
113 void testJavaVersionPrefixes() {
114 assertFalse(JavaVersion.JAVA_1_4.isOlderOrEqualTo("1.3"));
115 assertTrue(JavaVersion.JAVA_1_4.isOlderOrEqualTo("1.4"));
116 assertTrue(JavaVersion.JAVA_1_4.isOlderOrEqualTo("1.4.0_something"));
117 assertFalse(JavaVersion.JAVA_1_5.isOlderOrEqualTo("1.4"));
118 assertTrue(JavaVersion.JAVA_1_8.isOlderOrEqualTo("1.8"));
119 assertTrue(JavaVersion.JAVA_1_8.isOlderOrEqualTo("22.0.2-something"));
120 assertTrue(JavaVersion.JAVA_1_8.isOlderOrEqualTo("unknown"));
121 }
122
123 @Test
124 void testExtractMajorAndMinorVersion() {
125 assertEquals("11.0", JavacCompiler.extractMajorAndMinorVersion("javac 11.0.22"));
126 assertEquals("11.0", JavacCompiler.extractMajorAndMinorVersion("11.0.22"));
127 assertEquals("21", JavacCompiler.extractMajorAndMinorVersion("javac 21"));
128 }
129 }