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.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   * 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      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          // Parser retains stack trace header
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 }