8142385: [Testbug] RandomCommandsTest fails with error: Could not parse method pattern
authorppunegov
Tue, 24 Nov 2015 20:58:53 +0300
changeset 34217 fb4d7b34e67e
parent 34216 2818af1ce748
child 34218 4b22b04519e6
8142385: [Testbug] RandomCommandsTest fails with error: Could not parse method pattern Summary: Fix CompileCommand output processing Reviewed-by: kvn, iignatyev, neliasso
hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java
hotspot/test/compiler/compilercontrol/share/processors/QuietProcessor.java
hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java
--- a/hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java	Tue Nov 24 20:55:46 2015 +0300
+++ b/hotspot/test/compiler/compilercontrol/share/processors/CommandProcessor.java	Tue Nov 24 20:58:53 2015 +0300
@@ -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();
+    }
 }
--- a/hotspot/test/compiler/compilercontrol/share/processors/QuietProcessor.java	Tue Nov 24 20:55:46 2015 +0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -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)");
-            }
-        }
-    }
-}
--- a/hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java	Tue Nov 24 20:55:46 2015 +0300
+++ b/hotspot/test/compiler/compilercontrol/share/scenario/Scenario.java	Tue Nov 24 20:58:53 2015 +0300
@@ -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) {