OpenJDK / jdk / jdk10
changeset 21662:b37eb0c9db8d
8015497: Take new fixes from hotspot/test/testlibrary to jdk/test/lib/testlibrary
Reviewed-by: sla
author | ykantser |
---|---|
date | Wed, 13 Nov 2013 11:46:05 +0100 |
parents | e6b6a0b1fc26 |
children | f364900c7cc5 |
files | jdk/test/lib/testlibrary/AssertsTest.java jdk/test/lib/testlibrary/OutputAnalyzerReportingTest.java jdk/test/lib/testlibrary/jdk/testlibrary/InputArguments.java jdk/test/lib/testlibrary/jdk/testlibrary/JcmdBase.java jdk/test/lib/testlibrary/jdk/testlibrary/JdkFinder.java jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java |
diffstat | 8 files changed, 583 insertions(+), 159 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/lib/testlibrary/AssertsTest.java Wed Nov 13 11:46:05 2013 +0100 @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2013, 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. + */ + +import static jdk.testlibrary.Asserts.*; + +/* @test + * @summary Tests the different assertions in the Assert class + * @library /testlibrary + */ +public class AssertsTest { + private static class Foo implements Comparable<Foo> { + final int id; + public Foo(int id) { + this.id = id; + } + + public int compareTo(Foo f) { + return new Integer(id).compareTo(new Integer(f.id)); + } + } + + public static void main(String[] args) throws Exception { + testLessThan(); + testLessThanOrEqual(); + testEquals(); + testGreaterThanOrEqual(); + testGreaterThan(); + testNotEquals(); + testNull(); + testNotNull(); + testTrue(); + testFalse(); + } + + private static void testLessThan() throws Exception { + expectPass(Assertion.LT, 1, 2); + + expectFail(Assertion.LT, 2, 2); + expectFail(Assertion.LT, 2, 1); + expectFail(Assertion.LT, null, 2); + expectFail(Assertion.LT, 2, null); + } + + private static void testLessThanOrEqual() throws Exception { + expectPass(Assertion.LTE, 1, 2); + expectPass(Assertion.LTE, 2, 2); + + expectFail(Assertion.LTE, 3, 2); + expectFail(Assertion.LTE, null, 2); + expectFail(Assertion.LTE, 2, null); + } + + private static void testEquals() throws Exception { + expectPass(Assertion.EQ, 1, 1); + expectPass(Assertion.EQ, null, null); + + Foo f1 = new Foo(1); + expectPass(Assertion.EQ, f1, f1); + + Foo f2 = new Foo(1); + expectFail(Assertion.EQ, f1, f2); + expectFail(Assertion.LTE, null, 2); + expectFail(Assertion.LTE, 2, null); + } + + private static void testGreaterThanOrEqual() throws Exception { + expectPass(Assertion.GTE, 1, 1); + expectPass(Assertion.GTE, 2, 1); + + expectFail(Assertion.GTE, 1, 2); + expectFail(Assertion.GTE, null, 2); + expectFail(Assertion.GTE, 2, null); + } + + private static void testGreaterThan() throws Exception { + expectPass(Assertion.GT, 2, 1); + + expectFail(Assertion.GT, 1, 1); + expectFail(Assertion.GT, 1, 2); + expectFail(Assertion.GT, null, 2); + expectFail(Assertion.GT, 2, null); + } + + private static void testNotEquals() throws Exception { + expectPass(Assertion.NE, null, 1); + expectPass(Assertion.NE, 1, null); + + Foo f1 = new Foo(1); + Foo f2 = new Foo(1); + expectPass(Assertion.NE, f1, f2); + + expectFail(Assertion.NE, null, null); + expectFail(Assertion.NE, f1, f1); + expectFail(Assertion.NE, 1, 1); + } + + private static void testNull() throws Exception { + expectPass(Assertion.NULL, null); + + expectFail(Assertion.NULL, 1); + } + + private static void testNotNull() throws Exception { + expectPass(Assertion.NOTNULL, 1); + + expectFail(Assertion.NOTNULL, null); + } + + private static void testTrue() throws Exception { + expectPass(Assertion.TRUE, true); + + expectFail(Assertion.TRUE, false); + } + + private static void testFalse() throws Exception { + expectPass(Assertion.FALSE, false); + + expectFail(Assertion.FALSE, true); + } + + private static <T extends Comparable<T>> void expectPass(Assertion assertion, T ... args) + throws Exception { + Assertion.run(assertion, args); + } + + private static <T extends Comparable<T>> void expectFail(Assertion assertion, T ... args) + throws Exception { + try { + Assertion.run(assertion, args); + } catch (RuntimeException e) { + return; + } + throw new Exception("Expected " + Assertion.format(assertion, (Object[]) args) + + " to throw a RuntimeException"); + } + +} + +enum Assertion { + LT, LTE, EQ, GTE, GT, NE, NULL, NOTNULL, FALSE, TRUE; + + public static <T extends Comparable<T>> void run(Assertion assertion, T ... args) { + String msg = "Expected " + format(assertion, args) + " to pass"; + switch (assertion) { + case LT: + assertLessThan(args[0], args[1], msg); + break; + case LTE: + assertLessThanOrEqual(args[0], args[1], msg); + break; + case EQ: + assertEquals(args[0], args[1], msg); + break; + case GTE: + assertGreaterThanOrEqual(args[0], args[1], msg); + break; + case GT: + assertGreaterThan(args[0], args[1], msg); + break; + case NE: + assertNotEquals(args[0], args[1], msg); + break; + case NULL: + assertNull(args == null ? args : args[0], msg); + break; + case NOTNULL: + assertNotNull(args == null ? args : args[0], msg); + break; + case FALSE: + assertFalse((Boolean) args[0], msg); + break; + case TRUE: + assertTrue((Boolean) args[0], msg); + break; + default: + // do nothing + } + } + + public static String format(Assertion assertion, Object ... args) { + switch (assertion) { + case LT: + return asString("assertLessThan", args); + case LTE: + return asString("assertLessThanOrEqual", args); + case EQ: + return asString("assertEquals", args); + case GTE: + return asString("assertGreaterThanOrEquals", args); + case GT: + return asString("assertGreaterThan", args); + case NE: + return asString("assertNotEquals", args); + case NULL: + return asString("assertNull", args); + case NOTNULL: + return asString("assertNotNull", args); + case FALSE: + return asString("assertFalse", args); + case TRUE: + return asString("assertTrue", args); + default: + return ""; + } + } + + private static String asString(String assertion, Object ... args) { + if (args == null) { + return String.format("%s(null)", assertion); + } + if (args.length == 1) { + return String.format("%s(%s)", assertion, args[0]); + } else { + return String.format("%s(%s, %s)", assertion, args[0], args[1]); + } + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/lib/testlibrary/OutputAnalyzerReportingTest.java Wed Nov 13 11:46:05 2013 +0100 @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2013, 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. + */ + + +/* + * @test + * @summary Test the OutputAnalyzer reporting functionality, + * such as printing additional diagnostic info + * (exit code, stdout, stderr, command line, etc.) + * @library /testlibrary + */ + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +import jdk.testlibrary.OutputAnalyzer; + +public class OutputAnalyzerReportingTest { + + public static void main(String[] args) throws Exception { + // Create the output analyzer under test + String stdout = "aaaaaa"; + String stderr = "bbbbbb"; + OutputAnalyzer output = new OutputAnalyzer(stdout, stderr); + + // Expected summary values should be the same for all cases, + // since the outputAnalyzer object is the same + String expectedExitValue = "-1"; + String expectedSummary = + " stdout: [" + stdout + "];\n" + + " stderr: [" + stderr + "]\n" + + " exitValue = " + expectedExitValue + "\n"; + + + DiagnosticSummaryTestRunner testRunner = + new DiagnosticSummaryTestRunner(); + + // should have exit value + testRunner.init(expectedSummary); + int unexpectedExitValue = 2; + try { + output.shouldHaveExitValue(unexpectedExitValue); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + // should not contain + testRunner.init(expectedSummary); + try { + output.shouldNotContain(stdout); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + // should contain + testRunner.init(expectedSummary); + try { + output.shouldContain("unexpected-stuff"); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + // should not match + testRunner.init(expectedSummary); + try { + output.shouldNotMatch("[a]"); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + // should match + testRunner.init(expectedSummary); + try { + output.shouldMatch("[qwerty]"); + } catch (RuntimeException e) { } + testRunner.closeAndCheckResults(); + + } + + private static class DiagnosticSummaryTestRunner { + private ByteArrayOutputStream byteStream = + new ByteArrayOutputStream(10000); + + private String expectedSummary = ""; + private PrintStream errStream; + + + public void init(String expectedSummary) { + this.expectedSummary = expectedSummary; + byteStream.reset(); + errStream = new PrintStream(byteStream); + System.setErr(errStream); + } + + public void closeAndCheckResults() { + // check results + errStream.close(); + String stdErrStr = byteStream.toString(); + if (!stdErrStr.contains(expectedSummary)) { + throw new RuntimeException("The output does not contain " + + "the diagnostic message, or the message is incorrect"); + } + } + } + +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/lib/testlibrary/jdk/testlibrary/InputArguments.java Wed Nov 13 11:46:05 2013 +0100 @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2013, 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 jdk.testlibrary; + +import java.lang.management.RuntimeMXBean; +import java.lang.management.ManagementFactory; +import java.util.List; + +/** + * This class provides access to the input arguments to the VM. + */ +public class InputArguments { + private static final List<String> args; + + static { + RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean(); + args = runtimeMxBean.getInputArguments(); + } + + /** + * Returns true if {@code arg} is an input argument to the VM. + * + * This is useful for checking boolean flags such as -XX:+UseSerialGC or + * -XX:-UsePerfData. + * + * @param arg The name of the argument. + * @return {@code true} if the given argument is an input argument, + * otherwise {@code false}. + */ + public static boolean contains(String arg) { + return args.contains(arg); + } + + /** + * Returns true if {@code prefix} is the start of an input argument to the + * VM. + * + * This is useful for checking if flags describing a quantity, such as + * -XX:+MaxMetaspaceSize=100m, is set without having to know the quantity. + * To check if the flag -XX:MaxMetaspaceSize is set, use + * {@code InputArguments.containsPrefix("-XX:MaxMetaspaceSize")}. + * + * @param prefix The start of the argument. + * @return {@code true} if the given argument is the start of an input + * argument, otherwise {@code false}. + */ + public static boolean containsPrefix(String prefix) { + for (String arg : args) { + if (arg.startsWith(prefix)) { + return true; + } + } + return false; + } + + /** + * Get the string containing input arguments passed to the VM + */ + public static String getInputArguments() { + StringBuilder result = new StringBuilder(); + for (String arg : args) + result.append(arg).append(' '); + + return result.toString(); + } + +}
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/JcmdBase.java Wed Nov 13 15:21:53 2013 +0100 +++ b/jdk/test/lib/testlibrary/jdk/testlibrary/JcmdBase.java Wed Nov 13 11:46:05 2013 +0100 @@ -23,8 +23,11 @@ package jdk.testlibrary; -import java.util.ArrayList; +import java.util.Arrays; +/** + * Super class for tests which need to attach jcmd to the current process. + */ public class JcmdBase { private static ProcessBuilder processBuilder = new ProcessBuilder(); @@ -32,46 +35,24 @@ /** * Attach jcmd to the current process * - * @param commandArgs - * jcmd command line parameters, e.g. JFR.start + * @param toolArgs + * jcmd command line parameters, e.g. VM.flags * @return jcmd output * @throws Exception */ - public final static OutputAnalyzer jcmd(String... commandArgs) + public final static OutputAnalyzer jcmd(String... toolArgs) throws Exception { - ArrayList<String> cmd = new ArrayList<String>(); - String cmdString = ""; - - // jcmd from the jdk to be tested - String jcmdPath = JdkFinder.getTool("jcmd", false); - cmd.add(jcmdPath); - cmdString += jcmdPath; - - String pid = Integer.toString(ProcessTools.getProcessId()); - cmd.add(pid); - cmdString += " " + pid; - - for (int i = 0; i < commandArgs.length; i++) { - cmd.add(commandArgs[i]); - cmdString += " " + commandArgs[i]; + JDKToolLauncher launcher = JDKToolLauncher.createUsingTestJDK("jcmd"); + launcher.addToolArg(Integer.toString(ProcessTools.getProcessId())); + for (String toolArg : toolArgs) { + launcher.addToolArg(toolArg); } - - // Log command line for debugging purpose - System.out.println("Command line:"); - System.out.println(cmdString); - - processBuilder.command(cmd); + processBuilder.command(launcher.getCommand()); + System.out.println(Arrays.toString(processBuilder.command().toArray()).replace(",", "")); OutputAnalyzer output = new OutputAnalyzer(processBuilder.start()); - - // Log output for debugging purpose - System.out.println("Command output:"); System.out.println(output.getOutput()); - if (output.getExitValue() != 0) { - throw new Exception(processBuilder.command() - + " resulted in exit value " + output.getExitValue() - + " , expected to get 0"); - } + output.shouldHaveExitValue(0); return output; }
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/JdkFinder.java Wed Nov 13 15:21:53 2013 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,78 +0,0 @@ -/* - * Copyright (c) 2013, 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 jdk.testlibrary; - -import java.io.File; - -public final class JdkFinder { - - private JdkFinder() { - } - - private static String getExecutable(String executable, String property) { - String binPath = System.getProperty(property); - if (binPath == null) { - throw new RuntimeException( - "System property '" + property + "' not set"); - } - - binPath += File.separatorChar + "bin" + File.separatorChar + executable; - - return binPath; - } - - /** - * Returns the full path to a java launcher in jdk/bin based on system - * property. - * - * @param stableJdk - * see {@link #getTool(String, boolean)} - * @return Full path to a java launcher in jdk/bin. - */ - public static String getJavaLauncher(boolean stableJdk) { - return getTool("java", stableJdk); - } - - /** - * Returns the full path to an executable in jdk/bin based on system - * property. Depending on value of {@code stableJdk} the method will look for - * either 'compile.jdk' or 'test.jdk' system properties. - * 'test.jdk' is normally set by jtreg. When running test separately, - * set this property using '-Dtest.jdk=/path/to/jdk'. - * - * @param stableJdk - * If {@code true} the {@code tool} will be retrieved - * from the compile (stable) JDK. - * If {@code false} the {@code tool} will be retrieved - * from the test JDK. - * @return Full path to an executable in jdk/bin. - */ - public static String getTool(String tool, boolean stableJdk) { - if (stableJdk) { - return getExecutable(tool, "compile.jdk"); - } else { - return getExecutable(tool, "test.jdk"); - } - } -}
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java Wed Nov 13 15:21:53 2013 +0100 +++ b/jdk/test/lib/testlibrary/jdk/testlibrary/OutputAnalyzer.java Wed Nov 13 11:46:05 2013 +0100 @@ -27,6 +27,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +/** + * Utility class for verifying output and exit value from a {@code Process}. + */ public final class OutputAnalyzer { private final String stdout; @@ -85,9 +88,9 @@ public void shouldContain(String expectedString) { if (!stdout.contains(expectedString) && !stderr.contains(expectedString)) { + reportDiagnosticSummary(); throw new RuntimeException("'" + expectedString - + "' missing from stdout/stderr: [" + stdout + stderr - + "]\n"); + + "' missing from stdout/stderr \n"); } } @@ -101,8 +104,9 @@ */ public void stdoutShouldContain(String expectedString) { if (!stdout.contains(expectedString)) { + reportDiagnosticSummary(); throw new RuntimeException("'" + expectedString - + "' missing from stdout: [" + stdout + "]\n"); + + "' missing from stdout \n"); } } @@ -116,8 +120,9 @@ */ public void stderrShouldContain(String expectedString) { if (!stderr.contains(expectedString)) { + reportDiagnosticSummary(); throw new RuntimeException("'" + expectedString - + "' missing from stderr: [" + stderr + "]\n"); + + "' missing from stderr \n"); } } @@ -132,12 +137,14 @@ */ public void shouldNotContain(String notExpectedString) { if (stdout.contains(notExpectedString)) { + reportDiagnosticSummary(); throw new RuntimeException("'" + notExpectedString - + "' found in stdout: [" + stdout + "]\n"); + + "' found in stdout \n"); } if (stderr.contains(notExpectedString)) { + reportDiagnosticSummary(); throw new RuntimeException("'" + notExpectedString - + "' found in stderr: [" + stderr + "]\n"); + + "' found in stderr \n"); } } @@ -152,8 +159,9 @@ */ public void stdoutShouldNotContain(String notExpectedString) { if (stdout.contains(notExpectedString)) { + reportDiagnosticSummary(); throw new RuntimeException("'" + notExpectedString - + "' found in stdout: [" + stdout + "]\n"); + + "' found in stdout \n"); } } @@ -168,55 +176,63 @@ */ public void stderrShouldNotContain(String notExpectedString) { if (stderr.contains(notExpectedString)) { + reportDiagnosticSummary(); throw new RuntimeException("'" + notExpectedString - + "' found in stderr: [" + stderr + "]\n"); + + "' found in stderr \n"); } } /** - * Verify that the stdout and stderr contents of output buffer matches - * the pattern + * Verify that the stdout and stderr contents of output buffer matches the + * pattern * * @param pattern - * @throws RuntimeException If the pattern was not found + * @throws RuntimeException + * If the pattern was not found */ public void shouldMatch(String pattern) { - Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); - Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); + Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE) + .matcher(stdout); + Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE) + .matcher(stderr); if (!stdoutMatcher.find() && !stderrMatcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' missing from stdout/stderr: [" + stdout + stderr - + "]\n"); + + "' missing from stdout/stderr \n"); } } /** - * Verify that the stdout contents of output buffer matches the - * pattern + * Verify that the stdout contents of output buffer matches the pattern * * @param pattern - * @throws RuntimeException If the pattern was not found + * @throws RuntimeException + * If the pattern was not found */ public void stdoutShouldMatch(String pattern) { - Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); + Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher( + stdout); if (!matcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' missing from stdout: [" + stdout + "]\n"); + + "' missing from stdout \n"); } } /** - * Verify that the stderr contents of output buffer matches the - * pattern + * Verify that the stderr contents of output buffer matches the pattern * * @param pattern - * @throws RuntimeException If the pattern was not found + * @throws RuntimeException + * If the pattern was not found */ public void stderrShouldMatch(String pattern) { - Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); + Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher( + stderr); if (!matcher.find()) { + reportDiagnosticSummary(); throw new RuntimeException("'" + pattern - + "' missing from stderr: [" + stderr + "]\n"); + + "' missing from stderr \n"); } } @@ -225,18 +241,22 @@ * match the pattern * * @param pattern - * @throws RuntimeException If the pattern was found + * @throws RuntimeException + * If the pattern was found */ public void shouldNotMatch(String pattern) { - Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); + Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher( + stdout); if (matcher.find()) { - throw new RuntimeException("'" + pattern - + "' found in stdout: [" + stdout + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + pattern + "' found in stdout: '" + + matcher.group() + "' \n"); } matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); if (matcher.find()) { - throw new RuntimeException("'" + pattern - + "' found in stderr: [" + stderr + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + pattern + "' found in stderr: '" + + matcher.group() + "' \n"); } } @@ -245,13 +265,15 @@ * pattern * * @param pattern - * @throws RuntimeException If the pattern was found + * @throws RuntimeException + * If the pattern was found */ public void stdoutShouldNotMatch(String pattern) { - Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stdout); + Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher( + stdout); if (matcher.find()) { - throw new RuntimeException("'" + pattern - + "' found in stdout: [" + stdout + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + pattern + "' found in stdout \n"); } } @@ -260,18 +282,56 @@ * pattern * * @param pattern - * @throws RuntimeException If the pattern was found + * @throws RuntimeException + * If the pattern was found */ public void stderrShouldNotMatch(String pattern) { - Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher(stderr); + Matcher matcher = Pattern.compile(pattern, Pattern.MULTILINE).matcher( + stderr); if (matcher.find()) { - throw new RuntimeException("'" + pattern - + "' found in stderr: [" + stderr + "]\n"); + reportDiagnosticSummary(); + throw new RuntimeException("'" + pattern + "' found in stderr \n"); } } /** - * Verifiy the exit value of the process + * Get the captured group of the first string matching the pattern. stderr + * is searched before stdout. + * + * @param pattern + * The multi-line pattern to match + * @param group + * The group to capture + * @return The matched string or null if no match was found + */ + public String firstMatch(String pattern, int group) { + Matcher stderrMatcher = Pattern.compile(pattern, Pattern.MULTILINE) + .matcher(stderr); + Matcher stdoutMatcher = Pattern.compile(pattern, Pattern.MULTILINE) + .matcher(stdout); + if (stderrMatcher.find()) { + return stderrMatcher.group(group); + } + if (stdoutMatcher.find()) { + return stdoutMatcher.group(group); + } + return null; + } + + /** + * Get the first string matching the pattern. stderr is searched before + * stdout. + * + * @param pattern + * The multi-line pattern to match + * @return The matched string or null if no match was found + */ + public String firstMatch(String pattern) { + return firstMatch(pattern, 0); + } + + /** + * Verify the exit value of the process * * @param expectedExitValue * Expected exit value from process @@ -281,12 +341,25 @@ */ public void shouldHaveExitValue(int expectedExitValue) { if (getExitValue() != expectedExitValue) { - throw new RuntimeException("Exit value " + getExitValue() - + " , expected to get " + expectedExitValue); + reportDiagnosticSummary(); + throw new RuntimeException("Expected to get exit value of [" + + expectedExitValue + "]\n"); } } /** + * Report summary that will help to diagnose the problem Currently includes: + * - standard input produced by the process under test - standard output - + * exit code Note: the command line is printed by the ProcessTools + */ + private void reportDiagnosticSummary() { + String msg = " stdout: [" + stdout + "];\n" + " stderr: [" + stderr + + "]\n" + " exitValue = " + getExitValue() + "\n"; + + System.err.println(msg); + } + + /** * Get the contents of the output buffer (stdout and stderr) * * @return Content of the output buffer
--- a/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java Wed Nov 13 15:21:53 2013 +0100 +++ b/jdk/test/lib/testlibrary/jdk/testlibrary/ProcessTools.java Wed Nov 13 11:46:05 2013 +0100 @@ -25,10 +25,7 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; import java.io.PrintStream; -import java.io.PrintWriter; import java.lang.management.ManagementFactory; import java.lang.management.RuntimeMXBean; import java.lang.reflect.Field; @@ -237,15 +234,20 @@ */ public static ProcessBuilder createJavaProcessBuilder(String... command) throws Exception { - String javapath = JdkFinder.getJavaLauncher(false); + String javapath = JDKToolFinder.getJDKTool("java"); ArrayList<String> args = new ArrayList<>(); args.add(javapath); Collections.addAll(args, getPlatformSpecificVMArgs()); Collections.addAll(args, command); + // Reporting + StringBuilder cmdLine = new StringBuilder(); + for (String cmd : args) + cmdLine.append(cmd).append(' '); + System.out.println("Command line: [" + cmdLine.toString() + "]"); + return new ProcessBuilder(args.toArray(new String[args.size()])); - } }
--- a/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Wed Nov 13 15:21:53 2013 +0100 +++ b/jdk/test/sun/management/jmxremote/bootstrap/CustomLauncherTest.java Wed Nov 13 11:46:05 2013 +0100 @@ -29,7 +29,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; -import jdk.testlibrary.JdkFinder; import jdk.testlibrary.ProcessTools; /**