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.codehaus.plexus.compiler.javac.JavacCompiler.Messages.*;
18 import static org.hamcrest.CoreMatchers.endsWith;
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 private static final String UNIDENTIFIABLE_LOG_LINES =
53 "These log lines should be cut off\n" + "when preceding known error message headers\n";
54
55 @BeforeEach
56 public void setUp() {
57 super.setUp();
58 setForceJavacCompilerUse(true);
59 }
60
61 @ParameterizedTest(name = "{0}")
62 @MethodSource("testParseModernStream_withAnnotationProcessingErrors_args")
63 void testParseModernStream_withAnnotationProcessingErrors(String jdkAndLocale, String stackTraceHeader)
64 throws IOException {
65 String stackTraceWithHeader = UNIDENTIFIABLE_LOG_LINES + stackTraceHeader + stackTraceAnnotationProcessingError;
66 List<CompilerMessage> compilerMessages =
67 JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(stackTraceWithHeader)));
68
69 assertThat(compilerMessages, notNullValue());
70 assertThat(compilerMessages, hasSize(1));
71
72 String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
73
74 assertThat(message, startsWith(stackTraceHeader));
75 assertThat(message, endsWith(stackTraceAnnotationProcessingError));
76 }
77
78 private static final String stackTraceAnnotationProcessingError =
79 "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"
80 + "\tat lombok.javac.apt.LombokProcessor.getJavacProcessingEnvironment(LombokProcessor.java:433)\n"
81 + "\tat lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:92)\n"
82 + "\tat lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:160)\n"
83 + "\tat lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:213)\n"
84 + "\tat lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:64)\n"
85 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:702)\n"
86 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:829)\n"
87 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:925)\n"
88 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1269)\n"
89 + "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1384)\n"
90 + "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1261)\n"
91 + "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:935)\n"
92 + "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)\n"
93 + "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)\n"
94 + "\tat jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)\n"
95 + "\tat jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)\n";
96
97 private static Stream<Arguments> testParseModernStream_withAnnotationProcessingErrors_args() {
98 return Stream.of(
99 Arguments.of("JDK 8 English", ANNOTATION_PROCESSING_ERROR_HEADERS[0]),
100 Arguments.of("JDK 8 Japanese", ANNOTATION_PROCESSING_ERROR_HEADERS[1]),
101 Arguments.of("JDK 8 Chinese", ANNOTATION_PROCESSING_ERROR_HEADERS[2]),
102 Arguments.of("JDK 21 English", ANNOTATION_PROCESSING_ERROR_HEADERS[3]),
103 Arguments.of("JDK 21 Japanese", ANNOTATION_PROCESSING_ERROR_HEADERS[4]),
104 Arguments.of("JDK 21 Chinese", ANNOTATION_PROCESSING_ERROR_HEADERS[5]),
105 Arguments.of("JDK 21 German", ANNOTATION_PROCESSING_ERROR_HEADERS[6]));
106 }
107
108 @Test
109 void testJavaVersionPrefixes() {
110 assertFalse(JavaVersion.JAVA_1_4.isOlderOrEqualTo("1.3"));
111 assertTrue(JavaVersion.JAVA_1_4.isOlderOrEqualTo("1.4"));
112 assertTrue(JavaVersion.JAVA_1_4.isOlderOrEqualTo("1.4.0_something"));
113 assertFalse(JavaVersion.JAVA_1_5.isOlderOrEqualTo("1.4"));
114 assertTrue(JavaVersion.JAVA_1_8.isOlderOrEqualTo("1.8"));
115 assertTrue(JavaVersion.JAVA_1_8.isOlderOrEqualTo("22.0.2-something"));
116 assertTrue(JavaVersion.JAVA_1_8.isOlderOrEqualTo("unknown"));
117 }
118
119 @Test
120 void testExtractMajorAndMinorVersion() {
121 assertEquals("11.0", JavacCompiler.extractMajorAndMinorVersion("javac 11.0.22"));
122 assertEquals("11.0", JavacCompiler.extractMajorAndMinorVersion("11.0.22"));
123 assertEquals("21", JavacCompiler.extractMajorAndMinorVersion("javac 21"));
124 assertEquals("1.8", JavacCompiler.extractMajorAndMinorVersion("javac 1.8.0_432"));
125 }
126 }