RFR: 8244010: Simplify usages of ProcessTools.createJavaProcessBuilder in our tests

David Holmes david.holmes at oracle.com
Wed Apr 29 05:12:46 UTC 2020


Hi Stefan,

On 28/04/2020 11:54 pm, Stefan Karlsson wrote:
> Hi again,
> 
> I realized that we probably want to give ProcessTools.executeTestJvm the 
> same treatment.
> 
> Side-note: It's very awkard that createJavaProcessBuilder defaults to 
> not adding user-specifed flags, but executeTestJvm does. I think it 
> would be good to unify this as a separate RFE. I think *a lot* of 
> callers to createJavaProcessBuilder could be simplified by either using 
> executeTestJvm directly, or a simplified version of that.

createJavaProcessBuilder is the primitive and over time we have added 
higher-level APIs to abstract away the boiler-plate that deal with the 
externally passed flags, gives you an OutputAnalyzer etc.

The underlying java.lang.ProcessBuilder supports both List<String> and 
String[] for passing arguments, but returns the command as List<String>, 
so this has also affected the ProcessTools API. As Leonid suggests 
adding in a List<String> overload suffices rather than Collection<String>.

> I'm running testing through mach5 and found a few things to fix, I might 
> find more when the testing has proceeded further.
> 
> This is the current patch:
> https://cr.openjdk.java.net/~stefank/8244010/webrev.02.delta
> https://cr.openjdk.java.net/~stefank/8244010/webrev.02

One thing I noticed, as you copied it, is that this comment to all the 
createJavaProcessBuilder methods seems wrong:

271      * with any platform specific arguments prepended

as we only add the other arguments if we pass "true" for 
addTestVmAndJavaOptions. ??

Also regarding the String[]/List conversions ... as ProcessBuilder 
supports both I really don't see why we are doing:

  334         return new ProcessBuilder(args.toArray(new 
String[args.size()]));

and the "reporting" section could just iterate the args rather than 
creating a StringBuilder.

Cheers,
David

> Thanks,
> StefanK
> 
> On 2020-04-28 13:58, Stefan Karlsson wrote:
>> Hi all,
>>
>> Please review this patch to simplify usages of 
>> ProcessTools.createJavaProcessBuilder in our tests.
>>
>> https://cr.openjdk.java.net/~stefank/8244010/webrev.01/
>> https://bugs.openjdk.java.net/browse/JDK-8244010
>>
>> I saw all this code when reviewing changes to how we pass flags in our 
>> tests. There are a many places where arguments are converted and 
>> passed back and forth in String[] and Collections.
>>
>> For example:
>>   ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
>>           argsList.toArray(new String[argsList.size()]));
>>
>> If we add an overload the createJavaProcessBuilder, that takes a 
>> Collection<String> as an argument, then we can write the code above as:
>>    ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(argsList);
>>
>> Other places temporarily put the flags in a String[], where most calls 
>> simply lists the arguments in the call:
>>   String[] opts = {Xmx, "-XX:NativeMemoryTracking=detail", 
>> "-XX:+UseParallelGC", "-version"};
>>   ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(opts);
>>
>> And some places put the args in a temporary Collection:
>>   LinkedList<String> vmOptions = new LinkedList<>();
>>   vmOptions.add(gc);
>>   vmOptions.add("-Xmx" + minMaxHeap);
>>   vmOptions.add("-XX:+PrintFlagsFinal");
>>   vmOptions.add(VerifyHeapSize.class.getName());
>>
>>   ProcessBuilder pb = 
>> ProcessTools.createJavaProcessBuilder(vmOptions.toArray(new String[0]));
>>
>> I'd like to cleanup, simplify, and unify many of these usages.
>>
>> I've tested this by running all the changed tests locally.
>>
>> Thanks,
>> StefanK
> 


More information about the hotspot-dev mailing list