8142385: [Testbug] RandomCommandsTest fails with error: Could not parse method pattern
Fix CompileCommand output processing
Reviewed-by: kvn, iignatyev, neliasso
diff --git a/hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java b/hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java
index b792687..6d28e1e 100644
--- a/hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java
+++ b/hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java
@@ -24,8 +24,10 @@
package compiler.compilercontrol.share.processors;
import compiler.compilercontrol.share.scenario.CompileCommand;
+import jdk.test.lib.Asserts;
import jdk.test.lib.OutputAnalyzer;
+import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
@@ -33,26 +35,56 @@
* Checks that output contains a string with commands and full method pattern
*/
public class CommandProcessor implements Consumer<OutputAnalyzer> {
- protected final List<CompileCommand> commands;
+ private static final String INVALID_COMMAND_MSG = "CompileCommand: "
+ + "\\b(unrecognized command|Bad pattern|"
+ + "An error occurred during parsing)\\b";
+ private final Iterator<CompileCommand> nonQuietedIterator;
+ private final Iterator<CompileCommand> quietedIterator;
- public CommandProcessor(List<CompileCommand> commands) {
- this.commands = commands;
+ public CommandProcessor(List<CompileCommand> nonQuieted,
+ List<CompileCommand> quieted) {
+ this.nonQuietedIterator = nonQuieted.iterator();
+ this.quietedIterator = quieted.iterator();
}
@Override
public void accept(OutputAnalyzer outputAnalyzer) {
- for (CompileCommand command : commands) {
+ try {
+ outputAnalyzer.asLines().stream()
+ .filter(s -> s.startsWith("CompileCommand:"))
+ .forEachOrdered(this::check);
+ } catch (Exception e) {
+ System.err.println(outputAnalyzer.getOutput());
+ throw e;
+ }
+ }
+
+ private void check(String input) {
+ if (nonQuietedIterator.hasNext()) {
+ CompileCommand command = nonQuietedIterator.next();
if (command.isValid()) {
- outputAnalyzer.shouldContain("CompileCommand: "
- + command.command.name + " "
- + command.methodDescriptor.getCanonicalString());
- outputAnalyzer.shouldNotContain("CompileCommand: An error "
- + "occurred during parsing");
+ Asserts.assertTrue(input.contains(getOutputString(command)),
+ getOutputString(command) + "missing in output");
} else {
- outputAnalyzer.shouldMatch("(CompileCommand: )"
- + "(unrecognized command)|(Bad pattern)|"
- + "(An error occurred during parsing)");
+ Asserts.assertTrue(input.matches(INVALID_COMMAND_MSG),
+ "Error message missing for: " + getOutputString(
+ command));
+ }
+ } else if (quietedIterator.hasNext()) {
+ CompileCommand command = quietedIterator.next();
+ if (command.isValid()) {
+ Asserts.assertFalse(input.contains(getOutputString(command)));
+ } else {
+ Asserts.assertTrue(input.matches(INVALID_COMMAND_MSG),
+ "Error message missing for: " + getOutputString(
+ command));
}
}
}
+
+ private String getOutputString(CompileCommand command) {
+ return "CompileCommand: "
+ + command.command.name + " "
+ + command.methodDescriptor.getCanonicalString();
+ }
}
diff --git a/hotspot/test/compiler/compilercontrol/share/processors/QuietProcessor.java b/hotspot/test/compiler/compilercontrol/share/processors/QuietProcessor.java
deleted file mode 100644
index 1426c4c..0000000
--- a/hotspot/test/compiler/compilercontrol/share/processors/QuietProcessor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
- * or visit www.oracle.com if you need additional information or have any
- * questions.
- */
-
-package compiler.compilercontrol.share.processors;
-
-import compiler.compilercontrol.share.scenario.CompileCommand;
-import jdk.test.lib.OutputAnalyzer;
-
-import java.util.List;
-import java.util.function.Consumer;
-
-public class QuietProcessor implements Consumer<OutputAnalyzer> {
- private final List<CompileCommand> commands;
-
- public QuietProcessor(List<CompileCommand> compileCommands) {
- commands = compileCommands;
- }
-
- @Override
- public void accept(OutputAnalyzer outputAnalyzer) {
- for (CompileCommand command : commands) {
- if (command.isValid()) {
- outputAnalyzer.shouldNotContain("CompileCommand: "
- + command.command.name + " "
- + command.methodDescriptor.getCanonicalString());
- outputAnalyzer.shouldNotContain("CompileCommand: An error "
- + "occurred during parsing");
- } else {
- outputAnalyzer.shouldMatch("(CompileCommand: )"
- + "(unrecognized command)|(Bad pattern)|"
- + "(An error occurred during parsing)");
- }
- }
- }
-}
diff --git a/hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java b/hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java
index 170bda7..d94c2f2 100644
--- a/hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java
@@ -28,7 +28,6 @@
import compiler.compilercontrol.share.processors.LogProcessor;
import compiler.compilercontrol.share.processors.PrintDirectivesProcessor;
import compiler.compilercontrol.share.processors.PrintProcessor;
-import compiler.compilercontrol.share.processors.QuietProcessor;
import jdk.test.lib.Asserts;
import jdk.test.lib.OutputAnalyzer;
import jdk.test.lib.Pair;
@@ -77,8 +76,7 @@
nonQuieted.add(cc);
}
}
- processors.add(new CommandProcessor(nonQuieted));
- processors.add(new QuietProcessor(quieted));
+ processors.add(new CommandProcessor(nonQuieted, quieted));
List<String> jcmdExecCommands = new ArrayList<>();
boolean addCommandMet = false;
boolean printCommandMet = false;
@@ -273,9 +271,7 @@
ccList.addAll(builders.get(Type.OPTION).getCompileCommands());
ccList.addAll(builders.get(Type.FILE).getCompileCommands());
- /*
- * Create a list of directives to check which one was printed
- */
+ // Create a list of directives to check which one was printed
List<CompileCommand> directives = new ArrayList<>();
if (jcmdContainsCommand(JcmdType.PRINT)) {
if (!isClearedState) {