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 18:24:55 UTC 2018
Yeah, this was all new to me. Before this I didn't know anything about
jtreg IO other than the use of OutputAnalyzer for capture and verification.
Thanks for reviewing.
Chris
On 3/21/18 11:08 AM, serguei.spitsyn at oracle.com wrote:
> Hi Chris,
>
> It looks good to me.
> It is a little bit more complicated than one would expect but reasonable.
>
> Thanks,
> Serguei
>
>
> On 3/21/18 09:31, Chris Plummer wrote:
>> 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