View Javadoc
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   * Licensed to the Apache Software Foundation (ASF) under one
29   * or more contributor license agreements.  See the NOTICE file
30   * distributed with this work for additional information
31   * regarding copyright ownership.  The ASF licenses this file
32   * to you under the Apache License, Version 2.0 (the
33   * "License"); you may not use this file except in compliance
34   * with the License.  You may obtain a copy of the License at
35   *
36   *   http://www.apache.org/licenses/LICENSE-2.0
37   *
38   * Unless required by applicable law or agreed to in writing,
39   * software distributed under the License is distributed on an
40   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
41   * KIND, either express or implied.  See the License for the
42   * specific language governing permissions and limitations
43   * under the License.
44   */
45  
46  /**
47   * @author Olivier Lamy
48   * @author Alexander Kriegisch
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          // Parser does not retain stack trace header, because it is hard to identify in a locale-independent way
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 }