--- a/test/lib/jdk/test/lib/process/OutputAnalyzer.java Thu Oct 17 20:27:44 2019 +0100
+++ b/test/lib/jdk/test/lib/process/OutputAnalyzer.java Thu Oct 17 20:53:35 2019 +0100
@@ -27,6 +27,7 @@
import java.io.IOException;
import java.io.PrintStream;
+import java.nio.charset.Charset;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
@@ -43,6 +44,18 @@
* value from a Process
*
* @param process Process to analyze
+ * @param cs The charset used to convert stdout/stderr from bytes to chars
+ * or null for the default charset.
+ * @throws IOException If an I/O error occurs.
+ */
+ public OutputAnalyzer(Process process, Charset cs) throws IOException {
+ buffer = OutputBuffer.of(process, cs);
+ }
+ /**
+ * Create an OutputAnalyzer, a utility class for verifying output and exit
+ * value from a Process
+ *
+ * @param process Process to analyze
* @throws IOException If an I/O error occurs.
*/
public OutputAnalyzer(Process process) throws IOException {
@@ -78,6 +91,18 @@
}
/**
+ * Create an OutputAnalyzer, a utility class for verifying output
+ *
+ * @param stdout stdout buffer to analyze
+ * @param stderr stderr buffer to analyze
+ * @param stderr exitValue result to analyze
+ */
+ public OutputAnalyzer(String stdout, String stderr, int exitValue)
+ {
+ buffer = OutputBuffer.of(stdout, stderr, exitValue);
+ }
+
+ /**
* Verify that the stdout contents of output buffer is empty
*
* @throws RuntimeException
@@ -623,10 +648,10 @@
* just a subset of it.
*
* @param from
- * The line from where output will be matched.
+ * The line (excluded) from where output will be matched.
* Set {@code from} to null for matching from the first line.
* @param to
- * The line until where output will be matched.
+ * The line (excluded) until where output will be matched.
* Set {@code to} to null for matching until the last line.
* @param pattern
* Matching pattern
@@ -641,10 +666,10 @@
* just a subset of it.
*
* @param from
- * The line from where stdout will be matched.
+ * The line (excluded) from where stdout will be matched.
* Set {@code from} to null for matching from the first line.
* @param to
- * The line until where stdout will be matched.
+ * The line (excluded) until where stdout will be matched.
* Set {@code to} to null for matching until the last line.
* @param pattern
* Matching pattern
@@ -658,25 +683,26 @@
int fromIndex = 0;
if (from != null) {
- fromIndex = indexOf(lines, from);
- Asserts.assertGreaterThan(fromIndex, -1,
+ fromIndex = indexOf(lines, from, 0) + 1; // + 1 -> apply 'pattern' to lines after 'from' match
+ Asserts.assertGreaterThan(fromIndex, 0,
"The line/pattern '" + from + "' from where the output should match can not be found");
}
int toIndex = lines.size();
if (to != null) {
- toIndex = indexOf(lines, to);
- Asserts.assertGreaterThan(toIndex, -1,
+ toIndex = indexOf(lines, to, fromIndex);
+ Asserts.assertGreaterThan(toIndex, fromIndex,
"The line/pattern '" + to + "' until where the output should match can not be found");
}
List<String> subList = lines.subList(fromIndex, toIndex);
- Asserts.assertFalse(subList.isEmpty(), "There are no lines to check");
+ Asserts.assertFalse(subList.isEmpty(), "There are no lines to check:"
+ + " range " + fromIndex + ".." + toIndex + ", subList = " + subList);
subList.stream()
.filter(Pattern.compile(pattern).asPredicate().negate())
.findAny()
- .ifPresent(line -> Asserts.assertTrue(false,
+ .ifPresent(line -> Asserts.fail(
"The line '" + line + "' does not match pattern '" + pattern + "'"));
return this;
@@ -686,11 +712,12 @@
* Check if there is a line matching {@code regexp} and return its index
*
* @param regexp Matching pattern
+ * @param fromIndex Start matching after so many lines skipped
* @return Index of first matching line
*/
- private int indexOf(List<String> lines, String regexp) {
+ private int indexOf(List<String> lines, String regexp, int fromIndex) {
Pattern pattern = Pattern.compile(regexp);
- for (int i = 0; i < lines.size(); i++) {
+ for (int i = fromIndex; i < lines.size(); i++) {
if (pattern.matcher(lines.get(i)).matches()) {
return i;
}