On Wed, 23 Feb 2022 13:59:19 GMT, Kevin Walls <kev...@openjdk.org> wrote:

> Test fails occasionally due to a port clash.
> Presumably the port that was returned by Utils.getFreePort(), is no longer 
> free.
> The test creates a ProcessBuilder with the parameters for JMX, including port 
> number, and uses that to create a new Process.
> It should retry with a new port if we fail due to a port in use, for some 
> limited number of attempts.
> 
> main already has some retry logic, but not working:
> it checks for an InvocationTargetException to contain a BindException, but it 
> simply gets a BindException, thrown by TestAppRun.start().
> TestAppRun.start() runs the new process and scans for errors, but on failure 
> its predicate has only seen the first line of a failure, so a BindException 
> is never recognised and thrown.
> Also main does not limit the retries, and handling the port retry in main() 
> is duplicated, for each run of the test method.
> 
> So...
> 
> Make the error-scanning predicate in TestAppRun recognise a "port in use" 
> message and throw a BindExeption.  This is a notification to the caller that 
> it failed, it's not the actual BindException as that was thrown in a 
> different process.
> Make the testDefaultAgent method (the main part of the test) handle retrying 
> with a new port, a limited number of times.

The test uses warm-up predicate in a strange way - it returns true for any 
output from child process.
The main purpose of the predicate is to wait until some expected output is 
produced, and return false to skip other lines (for example in some 
environments VM may print some warnings).
For this test it may be "main enter" (printed from TestApp.main()).
To handle "port in use" error the predicate can search for "bindexception" or 
"port already in use" line.
I don't think check for "exception" and "error" makes much sense here.

-------------

PR: https://git.openjdk.java.net/jdk/pull/7589

Reply via email to