RFR(S): 8198655: test/lib/jdk/test/lib/apps/LingeredApp shouldn't inherit cout/cerr
Chris Plummer
chris.plummer at oracle.com
Wed Mar 21 16:31:49 UTC 2018
Ping. I still need a couple of reviews for this.
thanks,
Chris
On 3/19/18 3:50 PM, Chris Plummer wrote:
> I looked into modifying OutputAnalyzer (actually ended up being
> ProcessTools that needed all the changes) to be more flexible so it
> could support LingeredApp. The problem I ran into is that ProcessTools
> is all static, but I needed to create and return a context. It ended
> up being too much disruption, so I instead have the
> ProcessTools.getOutput() code as part of LingeredApp.
>
> Another thing I discovered is that you can use OutputAnalyzer with
> already generated output, so this option is still available to users
> of LingeredApp. You just need to do something like:
>
> OutputAnalyzer out = new
> OutputAnalyzer(lingeredApp.getOutput().getStdout(),
> lingeredApp.getOutput().getStderr());
>
> I didn't change any test to take advantage of this, but it's there if
> someone wants it.
>
> I've included another webrev below (completely different from the
> original). In the end, all LingeredApp stdout and stderr is dumped
> after the app exits. The old way of storing away the stdout using an
> InputGobbler is gone. Since getAppOutput() depended on this, and the
> new way of saving stdout saves it as one big string rather than a List
> of lines, getAppOutput() needed some changes to convert to the List form.
>
> http://cr.openjdk.java.net/~cjplummer/8198655/webrev.03
>
> thanks,
>
> Chris
>
> On 3/19/18 9:39 AM, Chris Plummer wrote:
>> Hi David,
>>
>> Just to clarify one point, most of the tests that use OutputAnalyzer
>> do not display process output unless there is an error. So part of
>> the decision here with LingeredApp is when to display the output.
>> Currently the stdout is captured, but not displayed, unless the tests
>> does the work to display it, which none do. Currently stderr goes to
>> the console. Note that some negative tests actually cause some
>> expected stderr output, although the tests don't check for it.
>>
>> One thought I just had is to create an async option for
>> OutputAnalyzer so it doesn't block until the process exits. Basically
>> that means splitting ProcessTools.getOutput() so it doesn't block.
>> What I currently have is essentially doing that. It copies
>> ProcessTools.getOutput(), splitting it into two parts. But all this
>> logic is in LingeredApp, and of course doesn't have any of the output
>> error checking support that OutputAnalyzer, which might be useful for
>> LingeredApp. For example, the negative tests only test that launching
>> the app failed. They could be improved by checking for specific error
>> output.
>>
>> Chris
>>
>> On 3/17/18 12:11 AM, David Holmes wrote:
>>> I'm afraid I'm losing track of this change.
>>>
>>> The key thing is that we should not have a test that launches any
>>> other process for which we can not see the output of that process.
>>>
>>> David
>>>
>>> On 17/03/2018 7:48 AM, Chris Plummer wrote:
>>>> On 3/16/18 1:25 PM, serguei.spitsyn at oracle.com wrote:
>>>>> Hi Chris,
>>>>>
>>>>> Thank you for taking care about this issue!
>>>>>
>>>>> On 3/16/18 11:20, Chris Plummer wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I've resolved the issues I had before with not seeing all the
>>>>>> stderr output when I tried to capture it. What I'd like to do now
>>>>>> is have us decide how the output should be handled from the
>>>>>> perspective a LingeredApp user (driver app). Currently all
>>>>>> LingeredApp stdout is captured and gets be returned the the
>>>>>> driver app by calling app.getAppOutput(). It does not appear in
>>>>>> the .jtr file, but the test would have the option of dumping it
>>>>>> there it it cared to. Only one test uses app.getAppOutput().
>>>>>> Currently all the LingeredApp stderr is redirected to the
>>>>>> console, so it does not appear in the .jtr file.
>>>>>
>>>>> Just a general comment to make sure I understand it and ensure we
>>>>> are in sync.
>>>>> It seems much more safe to always have both stdout and stderr
>>>>> outputs present in the .jtr automatically file independently of of
>>>>> what the test does.
>>>>>
>>>>>
>>>>>> So how do we want this changed? Some possibilities are:
>>>>>>
>>>>>> (1) capture stderr just like stdout currently is, and leave is up
>>>>>> the the driver app to decide if it wants to display it (after the
>>>>>> app terminates).
>>>>>
>>>>> It does not look good to me (see above) but maybe I'm missing
>>>>> something important here.
>>>>>
>>>>>> (2) capture stderr just like stdout currently is, but have
>>>>>> LingeredApp automatically send captured output to driver app's
>>>>>> stdout and stderr (after the app terminates).
>>>>>
>>>>> The stdout and std err will be separated in this case, right?
>>>>> Do you have a webrev for this?
>>>> I currently have it working like this, although I need to fix
>>>> LingeredApp.getAppOutput(). I had to make it return a single String
>>>> instead of a List of Strings, so this breaks the one test that uses
>>>> this API. It's easily fixed. Just haven't gotten around to it yet.
>>>>>
>>>>>
>>>>>> (3) send the LingeredApp's stdout and stderr to the driver app's
>>>>>> stdout as it is being captured (this was the original fix Igor
>>>>>> suggested and the webrev supported). A minor alternative to this
>>>>>> is to keep the two streams separated instead of sending both to
>>>>>> stdout.
>>>>>>
>>>>>> Let me know what you think. I'm inclined to go with 2, especially
>>>>>> since normally there is little to no output from the LingeredApp.
>>>>>
>>>>> The choice (2) looks good enough.
>>>>> Not sure it is that important to have output from stdout and
>>>>> stderr sync'ed
>>>>> but is is important to have the stderr present in the .jtr
>>>>> automatically.
>>>>>
>>>>> The choice (3) looks even better if it is going to work well.
>>>> This is basically what the original webrev did. It sent
>>>> LingeredApp's stderr and stdout to the the driver apps stdout. It's
>>>> a 1 word change to make it send stderr to stderr. I think it has a
>>>> bug though that did not manifest itself. It seems the new copy()
>>>> code that is capturing stdout would be contending with the existing
>>>> InputGlobbler code that is doing the same. I would need to fix this
>>>> to make sure LingeredApp.getAppOutput() still returns all the apps
>>>> stdout output.
>>>>
>>>> Chris
>>>>> Not sure, it is really necessary.
>>>>>
>>>>> Thanks,
>>>>> Serguei
>>>>>
>>>>>
>>>>>>
>>>>>> BTW, here's the CR and original webrev for reference:
>>>>>>
>>>>>> https://bugs.openjdk.java.net/browse/JDK-8198655
>>>>>> http://cr.openjdk.java.net/~cjplummer/8198655/webrev.00/webrev/
>>>>>>
>>>>>> thanks,
>>>>>>
>>>>>> Chris
>>>>>>
>>>>>
>>>>
>>
>
>
More information about the serviceability-dev
mailing list