You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by kr...@apache.org on 2012/02/10 06:39:02 UTC
svn commit: r1242681 - in
/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit:
BaseTestCase.java SpawnedProcess.java
Author: kristwaa
Date: Fri Feb 10 05:39:01 2012
New Revision: 1242681
URL: http://svn.apache.org/viewvc?rev=1242681&view=rev
Log:
DERBY-5608: BaseTestCase.readProcessOutput should read getInputStream() and getErrorStream() in separate threads
Use SpawnedProcess to read stdout/stderr from the subprocess, since it already
has code to do this in separate threads.
Patch file: derby-5608-1a-use_spawnedprocess.diff
Modified:
db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java
db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/SpawnedProcess.java
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java?rev=1242681&r1=1242680&r2=1242681&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/BaseTestCase.java Fri Feb 10 05:39:01 2012
@@ -28,12 +28,9 @@ import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
import java.io.FilenameFilter;
import java.io.IOException;
import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
import java.io.Reader;
import java.io.PrintStream;
import java.io.PrintWriter;
@@ -758,60 +755,33 @@ public abstract class BaseTestCase
return ("IBM Corporation".equals(
getSystemProperty("java.vendor")));
}
-
- /**
- * Reads output from a process and returns it as a string.
- * This will block until the process terminates.
- *
- * @param pr a running process
- * @return output of the process, both STDOUT and STDERR
- * @throws InterruptedException
- */
- public static String readProcessOutput(Process pr) throws InterruptedException {
- InputStream is = pr.getInputStream();
- InputStream es = pr.getErrorStream();
- if (is == null) {
- fail("Unexpectedly receiving no text from the process");
- }
- String output = "";
- try {
- output += "<STDOUT> " + inputStreamToString(is) + "<END STDOUT>\n";
- output += "<STDERR>" + inputStreamToString(es) + "<END STDERR>\n";
- } catch (Exception e) {
- fail("Exception accessing inputstream from process", e);
- }
-
- // wait until the process exits
- pr.waitFor();
-
- return output;
- }
-
/**
- * Read contents of an input stream to a String
+ * Reads output from a process and returns it as a string.
+ * <p>
+ * This will block until the process terminates.
*
- * @param is
- * @return String with input stream contents
- * @throws IOException
- */
- private static String inputStreamToString(InputStream is) throws IOException {
-
- String isout = "";
- char[] ca = new char[1024];
- // Create an InputStreamReader with default encoding; we're hoping
- // this to be en.
- InputStreamReader inStream;
- inStream = new InputStreamReader(is);
-
- // keep reading from the stream until all done
- int charsRead;
- while ((charsRead = inStream.read(ca, 0, ca.length)) != -1) {
- isout = isout + new String(ca, 0, charsRead);
- }
- return isout;
+ * @param pr a running process
+ * @return Output of the process, both STDOUT and STDERR.
+ * @throws InterruptedException if interrupted while waiting for the
+ * subprocess or one of the output collector threads to terminate
+ */
+ public static String readProcessOutput(Process pr)
+ throws InterruptedException {
+ SpawnedProcess wrapper = new SpawnedProcess(pr, "readProcessOutput");
+ wrapper.suppressOutputOnComplete();
+ try {
+ wrapper.complete(false);
+ } catch (IOException ioe) {
+ fail("process completion method failed", ioe);
+ }
+ String output = "<STDOUT> " + wrapper.getFullServerOutput() +
+ "<END STDOUT>\n";
+ output += "<STDERR>" + wrapper.getFullServerError() +
+ "<END STDERR>\n";
+ return output;
}
-
+
/**
* Remove the directory and its contents.
* @param path Path of the directory
Modified: db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/SpawnedProcess.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/SpawnedProcess.java?rev=1242681&r1=1242680&r2=1242681&view=diff
==============================================================================
--- db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/SpawnedProcess.java (original)
+++ db/derby/code/trunk/java/testing/org/apache/derbyTesting/junit/SpawnedProcess.java Fri Feb 10 05:39:01 2012
@@ -41,6 +41,8 @@ public final class SpawnedProcess {
private final StreamSaver outSaver;
+ private boolean suppressOutput;
+
public SpawnedProcess(Process javaProcess, String name) {
this.javaProcess = javaProcess;
this.name = name;
@@ -52,6 +54,17 @@ public final class SpawnedProcess {
}
/**
+ * Causes output obtained from the subprocess to be suppressed when
+ * executing the {@code complete}-methods.
+ *
+ * @see #getFullServerOutput() to obtain suppressed output from stdout
+ * @see #getFullServerError() to obtain suppressed output from stderr
+ */
+ public void suppressOutputOnComplete() {
+ suppressOutput = true;
+ }
+
+ /**
* Get the Java Process object
*/
public Process getProcess() {
@@ -70,7 +83,7 @@ public final class SpawnedProcess {
* should be called first.
* </p>
*/
- public String getFullServerOutput() throws Exception {
+ public String getFullServerOutput() throws InterruptedException {
// First wait until we've read all the output.
outSaver.thread.join();
@@ -80,6 +93,23 @@ public final class SpawnedProcess {
}
/**
+ * Get the full server error output (stderr) as a string using the default
+ * encoding which is assumed is how it was originally written.
+ * <p>
+ * This method should only be called after the process has completed.
+ * That is, {@link #complete(boolean)} or {@link #complete(boolean, long)}
+ * should be called first.
+ */
+ public String getFullServerError() throws InterruptedException {
+ // First wait until we've read all the output on stderr.
+ errSaver.thread.join();
+
+ synchronized (this) {
+ return errSaver.stream.toString();
+ }
+ }
+
+ /**
* Position offset for getNextServerOutput().
*/
int stdOutReadOffset;
@@ -191,7 +221,7 @@ public final class SpawnedProcess {
// Always write the error
ByteArrayOutputStream err = errSaver.stream;
- if (err.size() != 0) {
+ if (!suppressOutput && err.size() != 0) {
System.err.println("START-SPAWNED:" + name + " ERROR OUTPUT:");
err.writeTo(System.err);
System.err.println("END-SPAWNED :" + name + " ERROR OUTPUT:");
@@ -200,7 +230,8 @@ public final class SpawnedProcess {
// Only write the error if it appeared the server
// failed in some way.
ByteArrayOutputStream out = outSaver.stream;
- if ((destroy || exitCode != 0) && out.size() != 0) {
+ if (!suppressOutput && (destroy || exitCode != 0) &&
+ out.size() != 0) {
System.out.println("START-SPAWNED:" + name
+ " STANDARD OUTPUT: exit code=" + exitCode);
out.writeTo(System.out);