8015497: Take new fixes from hotspot/test/testlibrary to jdk/test/lib/testlibrary
Reviewed-by: sla
--- /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;
/**