RFR (S): 8006413: Add utility classes for writing better multiprocess tests in jtreg
Stuart Marks
stuart.marks at oracle.com
Wed Jan 16 13:54:09 PST 2013
Hi everybody,
I work on the JDK core libraries. It turns out that there is a similar library
used for testing RMI. Take a look at jdk/test/java/rmi/testlibrary. It's been
around for quite some time already, but I've been doing some maintenance on it
recently. (Also, it still needs more work.)
Since the RMI library is in the jdk repo and these test utilities are in
hotspot, it seems like sharing of code might be difficult. But we might want to
compare notes. Here are some observations and comments (though not an actual
code review).
* The use of a pair of threads (StreamPumper) to collect output from the
subprocess is very similar to what RMI does. See the StreamPipe class in RMI's
test library, which are used by the JavaVM utility class. One thing I did do
recently was to make sure that the subprocess is waited for and the threads are
joined. This hadn't been done before, leading to race conditions where some
subprocess output was dropped.
* Since these threads are specifically joined, I'm not sure of the utility of
making them daemon threads.
* My style in writing test code and test library code is to be quite verbose
about everything and to check every possible error condition. Nothing is worse
than seeing a test fail and not having enough information in the log to find
out why. Actually, I can think of something worse: having a test pass
erroneously because some error condition wasn't checked. (Yes, this has happened.)
* Another style point is that I think it's OK for test library code just to
throw exceptions out to the caller. My test code usually has 'throws
IOException' or even 'throws Exception' on most of the methods, including main,
so having test library code throw checked exceptions is reasonable. Jtreg will
catch exceptions thrown from main and log them. Usually you want tests to fail
quickly at the point of error. So, I concur with Vitaly's concern about
ProcessTools handling of IOException and about letting interrupts propagate.
* Actually I have a suggestion from Mandy Chung for RMI's StreamPipe threads to
catch exceptions and report them back to their "parent" JavaVM. This is
probably a rare occurrence but it does ensure that any errors that occur here
won't go unnoticed. See JDK-8005827 (
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=8005827 )
* Regarding jtreg and test library code, it's pretty simple to use. In each
test that uses the library code, one adds the @library tag to declare the
library. It's probably a good idea to add an @build tag to build each library
class that's used in the test. Things usually work in the absence of @build
tags, because of implicit compilation, but it's kind of fragile.
Anyway, I just wanted to share some notes and ideas.
s'marks
On 1/16/13 4:34 AM, Christian Törnqvist wrote:
> Hi everyone,
>
> ?
>
> This RFE adds a few utility classes to make it a bit easier to write multi-process tests in jtreg, webrev can be found at http://cr.openjdk.java.net/~brutisso/8006413/webrev.00/
>
> ?
>
> Thanks,
>
> Christian
>
More information about the hotspot-dev
mailing list