Skip to content

Commit ac9412f

Browse files
committed
Parametrise some error message parser tests
Relates to #336.
1 parent 4377aa9 commit ac9412f

File tree

3 files changed

+142
-38
lines changed

3 files changed

+142
-38
lines changed

plexus-compilers/plexus-compiler-javac/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
<artifactId>junit-jupiter-api</artifactId>
2828
<scope>test</scope>
2929
</dependency>
30+
<dependency>
31+
<groupId>org.junit.jupiter</groupId>
32+
<artifactId>junit-jupiter-params</artifactId>
33+
<scope>test</scope>
34+
</dependency>
3035
<dependency>
3136
<groupId>org.hamcrest</groupId>
3237
<artifactId>hamcrest</artifactId>

plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/ErrorMessageParserTest.java

+77-12
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,25 @@
2828
import java.io.StringReader;
2929
import java.util.ArrayList;
3030
import java.util.List;
31+
import java.util.stream.Stream;
3132

3233
import org.codehaus.plexus.compiler.CompilerMessage;
3334
import org.codehaus.plexus.util.Os;
3435
import org.junit.jupiter.api.Test;
36+
import org.junit.jupiter.params.ParameterizedTest;
37+
import org.junit.jupiter.params.provider.Arguments;
38+
import org.junit.jupiter.params.provider.MethodSource;
3539

40+
import static org.hamcrest.CoreMatchers.endsWith;
41+
import static org.hamcrest.CoreMatchers.startsWith;
3642
import static org.hamcrest.MatcherAssert.assertThat;
3743
import static org.hamcrest.Matchers.hasSize;
3844
import static org.hamcrest.Matchers.is;
3945
import static org.hamcrest.Matchers.notNullValue;
40-
import static org.hamcrest.core.StringEndsWith.endsWith;
41-
import static org.hamcrest.core.StringStartsWith.startsWith;
4246

4347
/**
4448
* @author <a href="mailto:[email protected]">Trygve Laugst&oslash;l</a>
49+
* @author Alexander Kriegisch
4550
*/
4651
public class ErrorMessageParserTest {
4752
private static final String EOL = System.getProperty("line.separator");
@@ -775,19 +780,79 @@ public void testJava7Error() throws Exception {
775780
assertThat(message2.getEndLine(), is(3));
776781
}
777782

778-
@Test
779-
public void testBugParade() throws Exception {
780-
String out = "An exception has occurred in the compiler (1.7.0_80). "
781-
+ "Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. "
782-
+ "Include your program and the following diagnostic in your report. Thank you." + EOL
783-
+ "com.sun.tools.javac.code.Symbol$CompletionFailure: class file for java.util.Optional not found";
783+
@ParameterizedTest(name = "{0}")
784+
@MethodSource("testBugParade_args")
785+
public void testBugParade(String jdkAndLocale, String stackTraceHeader) throws Exception {
786+
String stackTraceWithHeader = stackTraceHeader + stackTraceInternalCompilerError;
784787

785-
List<CompilerMessage> compilerErrors =
786-
JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(out)));
788+
List<CompilerMessage> compilerMessages =
789+
JavacCompiler.parseModernStream(4, new BufferedReader(new StringReader(stackTraceWithHeader)));
787790

788-
assertThat(compilerErrors, notNullValue());
791+
assertThat(compilerMessages, notNullValue());
792+
assertThat(compilerMessages, hasSize(1));
789793

790-
assertThat(compilerErrors.size(), is(1));
794+
String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
795+
// Parser retains stack trace header
796+
assertThat(message, startsWith(stackTraceHeader));
797+
assertThat(message, endsWith(stackTraceInternalCompilerError));
798+
}
799+
800+
private static final String stackTraceInternalCompilerError =
801+
"\tat com.sun.tools.javac.comp.MemberEnter.baseEnv(MemberEnter.java:1388)\n"
802+
+ "\tat com.sun.tools.javac.comp.MemberEnter.complete(MemberEnter.java:1046)\n"
803+
+ "\tat com.sun.tools.javac.code.Symbol.complete(Symbol.java:574)\n"
804+
+ "\tat com.sun.tools.javac.code.Symbol$ClassSymbol.complete(Symbol.java:1037)\n"
805+
+ "\tat com.sun.tools.javac.code.Symbol$ClassSymbol.flags(Symbol.java:973)\n"
806+
+ "\tat com.sun.tools.javac.code.Symbol$ClassSymbol.getKind(Symbol.java:1101)\n"
807+
+ "\tat com.sun.tools.javac.code.Kinds.kindName(Kinds.java:162)\n"
808+
+ "\tat com.sun.tools.javac.comp.Check.duplicateError(Check.java:329)\n"
809+
+ "\tat com.sun.tools.javac.comp.Check.checkUnique(Check.java:3435)\n"
810+
+ "\tat com.sun.tools.javac.comp.Enter.visitTypeParameter(Enter.java:454)\n"
811+
+ "\tat com.sun.tools.javac.tree.JCTree$JCTypeParameter.accept(JCTree.java:2224)\n"
812+
+ "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:258)\n"
813+
+ "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:272)\n"
814+
+ "\tat com.sun.tools.javac.comp.Enter.visitClassDef(Enter.java:418)\n"
815+
+ "\tat com.sun.tools.javac.tree.JCTree$JCClassDecl.accept(JCTree.java:693)\n"
816+
+ "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:258)\n"
817+
+ "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:272)\n"
818+
+ "\tat com.sun.tools.javac.comp.Enter.visitTopLevel(Enter.java:334)\n"
819+
+ "\tat com.sun.tools.javac.tree.JCTree$JCCompilationUnit.accept(JCTree.java:518)\n"
820+
+ "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:258)\n"
821+
+ "\tat com.sun.tools.javac.comp.Enter.classEnter(Enter.java:272)\n"
822+
+ "\tat com.sun.tools.javac.comp.Enter.complete(Enter.java:486)\n"
823+
+ "\tat com.sun.tools.javac.comp.Enter.main(Enter.java:471)\n"
824+
+ "\tat com.sun.tools.javac.main.JavaCompiler.enterTrees(JavaCompiler.java:982)\n"
825+
+ "\tat com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:857)\n"
826+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:523)\n"
827+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:381)\n"
828+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:370)\n"
829+
+ "\tat com.sun.tools.javac.main.Main.compile(Main.java:361)\n"
830+
+ "\tat com.sun.tools.javac.Main.compile(Main.java:56)\n"
831+
+ "\tat com.sun.tools.javac.Main.main(Main.java:42)\n";
832+
833+
private static Stream<Arguments> testBugParade_args() {
834+
return Stream.of(
835+
Arguments.of(
836+
"JDK 8 English",
837+
"An exception has occurred in the compiler ({0}). Please file a bug at the Java Developer Connection (http://java.sun.com/webapps/bugreport) after checking the Bug Parade for duplicates. Include your program and the following diagnostic in your report. Thank you.\n"),
838+
Arguments.of(
839+
"JDK 8 Japanese",
840+
"コンパイラで例外が発生しました({0})。Bug Paradeで重複がないかをご確認のうえ、Java Developer Connection (http://java.sun.com/webapps/bugreport)でbugの登録をお願いいたします。レポートには、そのプログラムと下記の診断内容を含めてください。ご協力ありがとうございます。\n"),
841+
Arguments.of(
842+
"JDK 8 Chinese",
843+
"编译器 ({0}) 中出现异常错误。 如果在 Bug Parade 中没有找到该错误, 请在 Java Developer Connection (http://java.sun.com/webapps/bugreport) 中建立 Bug。请在报告中附上您的程序和以下诊断信息。谢谢。\n"),
844+
Arguments.of(
845+
"JDK 21 English",
846+
"An exception has occurred in the compiler ({0}). Please file a bug against the Java compiler via the Java bug reporting page (https://bugreport.java.com) after checking the Bug Database (https://bugs.java.com) for duplicates. Include your program, the following diagnostic, and the parameters passed to the Java compiler in your report. Thank you.\n"),
847+
Arguments.of(
848+
"JDK 21 Japanese",
849+
"コンパイラで例外が発生しました({0})。バグ・データベース(https://bugs.java.com)で重複がないかをご確認のうえ、Javaのバグ・レポート・ページ(https://bugreport.java.com)から、Javaコンパイラに対するバグの登録をお願いいたします。レポートには、該当のプログラム、次の診断内容、およびJavaコンパイラに渡されたパラメータをご入力ください。ご協力ありがとうございます。\n"),
850+
Arguments.of(
851+
"JDK 21 Chinese",
852+
"编译器 ({0}) 中出现异常错误。如果在 Bug Database (https://bugs.java.com) 中没有找到有关该错误的 Java 编译器 Bug,请通过 Java Bug 报告页 (https://bugreport.java.com) 提交 Java 编译器 Bug。请在报告中附上您的程序、以下诊断信息以及传递到 Java 编译器的参数。谢谢。\n"),
853+
Arguments.of(
854+
"JDK 21 German",
855+
"Im Compiler ({0}) ist eine Ausnahme aufgetreten. Erstellen Sie auf der Java-Seite zum Melden von Bugs (https://bugreport.java.com) einen Bugbericht, nachdem Sie die Bugdatenbank (https://bugs.java.com) auf Duplikate geprüft haben. Geben Sie in Ihrem Bericht Ihr Programm, die folgende Diagnose und die Parameter an, die Sie dem Java-Compiler übergeben haben. Vielen Dank.\n"));
791856
}
792857

793858
@Test

plexus-compilers/plexus-compiler-javac/src/test/java/org/codehaus/plexus/compiler/javac/JavacCompilerTest.java

+60-26
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,20 @@
44
import java.io.IOException;
55
import java.io.StringReader;
66
import java.util.List;
7+
import java.util.stream.Stream;
78

89
import org.codehaus.plexus.compiler.CompilerMessage;
910
import org.junit.jupiter.api.BeforeEach;
10-
import org.junit.jupiter.api.Test;
11+
import org.junit.jupiter.params.ParameterizedTest;
12+
import org.junit.jupiter.params.provider.Arguments;
13+
import org.junit.jupiter.params.provider.MethodSource;
1114

15+
import static org.hamcrest.CoreMatchers.endsWith;
16+
import static org.hamcrest.CoreMatchers.not;
17+
import static org.hamcrest.CoreMatchers.startsWith;
1218
import static org.hamcrest.MatcherAssert.assertThat;
13-
import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
19+
import static org.hamcrest.Matchers.hasSize;
20+
import static org.hamcrest.Matchers.notNullValue;
1421

1522
/*
1623
* Licensed to the Apache Software Foundation (ASF) under one
@@ -33,40 +40,67 @@
3340

3441
/**
3542
* @author Olivier Lamy
43+
* @author Alexander Kriegisch
3644
*/
3745
public class JavacCompilerTest extends AbstractJavacCompilerTest {
46+
private static final String EOL = System.getProperty("line.separator");
47+
3848
@BeforeEach
3949
public void setUp() {
4050
super.setUp();
4151
setForceJavacCompilerUse(true);
4252
}
4353

44-
@Test
45-
void parseModernStream_withAnnotationProcessingErrors() throws IOException {
46-
String input = "\n" + "\n"
47-
+ "An annotation processor threw an uncaught exception.\n"
48-
+ "Consult the following stack trace for details.\n"
49-
+ "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"
50-
+ "\tat lombok.javac.apt.LombokProcessor.getJavacProcessingEnvironment(LombokProcessor.java:433)\n"
51-
+ "\tat lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:92)\n"
52-
+ "\tat lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:160)\n"
53-
+ "\tat lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:213)\n"
54-
+ "\tat lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:64)\n"
55-
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:702)\n"
56-
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:829)\n"
57-
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:925)\n"
58-
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1269)\n"
59-
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1384)\n"
60-
+ "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1261)\n"
61-
+ "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:935)\n"
62-
+ "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)\n"
63-
+ "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)\n"
64-
+ "\tat jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)\n"
65-
+ "\tat jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)\n";
66-
54+
@ParameterizedTest(name = "{0}")
55+
@MethodSource("testParseModernStream_withAnnotationProcessingErrors_args")
56+
void testParseModernStream_withAnnotationProcessingErrors(String jdkAndLocale, String stackTraceHeader)
57+
throws IOException {
58+
String stackTraceWithHeader = stackTraceHeader + stackTraceAnnotationProcessingError;
6759
List<CompilerMessage> compilerMessages =
68-
JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(input)));
60+
JavacCompiler.parseModernStream(1, new BufferedReader(new StringReader(stackTraceWithHeader)));
6961

62+
assertThat(compilerMessages, notNullValue());
7063
assertThat(compilerMessages, hasSize(1));
64+
65+
String message = compilerMessages.get(0).getMessage().replaceAll(EOL, "\n");
66+
// Parser does not retain stack trace header, because it is hard to identify in a locale-independent way
67+
assertThat(message, not(startsWith(stackTraceHeader)));
68+
assertThat(message, endsWith(stackTraceAnnotationProcessingError));
69+
}
70+
71+
private static final String stackTraceAnnotationProcessingError =
72+
"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"
73+
+ "\tat lombok.javac.apt.LombokProcessor.getJavacProcessingEnvironment(LombokProcessor.java:433)\n"
74+
+ "\tat lombok.javac.apt.LombokProcessor.init(LombokProcessor.java:92)\n"
75+
+ "\tat lombok.core.AnnotationProcessor$JavacDescriptor.want(AnnotationProcessor.java:160)\n"
76+
+ "\tat lombok.core.AnnotationProcessor.init(AnnotationProcessor.java:213)\n"
77+
+ "\tat lombok.launch.AnnotationProcessorHider$AnnotationProcessor.init(AnnotationProcessor.java:64)\n"
78+
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.<init>(JavacProcessingEnvironment.java:702)\n"
79+
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:829)\n"
80+
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:925)\n"
81+
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1269)\n"
82+
+ "\tat jdk.compiler/com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1384)\n"
83+
+ "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1261)\n"
84+
+ "\tat jdk.compiler/com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:935)\n"
85+
+ "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:317)\n"
86+
+ "\tat jdk.compiler/com.sun.tools.javac.main.Main.compile(Main.java:176)\n"
87+
+ "\tat jdk.compiler/com.sun.tools.javac.Main.compile(Main.java:64)\n"
88+
+ "\tat jdk.compiler/com.sun.tools.javac.Main.main(Main.java:50)\n";
89+
90+
private static Stream<Arguments> testParseModernStream_withAnnotationProcessingErrors_args() {
91+
return Stream.of(
92+
Arguments.of(
93+
"JDK 8 English",
94+
"\n\nAn annotation processor threw an uncaught exception.\nConsult the following stack trace for details.\n\n"),
95+
Arguments.of("JDK 8 Japanese", "\n\n注釈処理で捕捉されない例外がスローされました。\n詳細は次のスタック・トレースで調査してください。\n\n"),
96+
Arguments.of("JDK 8 Chinese", "\n\n注释处理程序抛出未捕获的异常错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n\n"),
97+
Arguments.of(
98+
"JDK 21 English",
99+
"\n\nAn annotation processor threw an uncaught exception.\nConsult the following stack trace for details.\n\n"),
100+
Arguments.of("JDK 21 Japanese", "\n\n注釈処理で捕捉されない例外がスローされました。\n詳細は次のスタックトレースで調査してください。\n\n"),
101+
Arguments.of("JDK 21 Chinese", "\n\n批注处理程序抛出未捕获的异常错误。\n有关详细信息, 请参阅以下堆栈跟踪。\n\n"),
102+
Arguments.of(
103+
"JDK 21 German",
104+
"\n\nEin Annotationsprozessor hat eine nicht abgefangene Ausnahme ausgelöst.\nDetails finden Sie im folgenden Stacktrace.\n\n"));
71105
}
72106
}

0 commit comments

Comments
 (0)