RFC: add starred module(s)

Jiri Vanek jvanek at redhat.com
Tue Feb 6 10:54:10 UTC 2018


Hi guys!

Thank you for all you detailed answers. Really appreciated.
We created generator of @module tag from javac+java output to workaround it.

Is there possible desire to include something like it into jtreg itself?

Thanx again!
   J.
On 12/20/2017 06:27 PM, Jonathan Gibbons wrote:
> 
> 
> On 12/20/17 9:14 AM, Jiri Vanek wrote:
>> On 12/18/2017 10:13 PM, Alexandre (Shura) Iline wrote:
>>> Hi.
>>>
>>> I just wanted to commend on enhancing JTreg to automatically calculate module dependencies. Yes, 
>>> compiler knows the direct static dependencies of the compiler code, but that is not all that is 
>>> needed to be known. @module annotation is used for a few not completely related things. Besides 
>>> requesting "--add-exports”, it can also request "--add-opens" and it can influence test selection 
>>> during execution. Of this three usages, only one could be covered by static dependency analysis.
>>>
>>
>>
>> Thank you very much for this input!
>>
>> From what you are saying, the need for more support of @module-whatever is needed - and doable.
>> Current @modules is adding --add-exports and --add-opens  of the modules you specified to the  
>> command.
>> If there will be way to add exports and opens of those, which can be covered by static analyse, 
>> then it will be already more then helpfull! Especially if you will be able to add some more manually.
>> Of course more granular support like @modules-export and @modules-opens and similar would be nice, 
>> but Thats more far away from this proposal.
>>
>> J.
> 
> Jiri,
> 
> To be clear ... it is not reasonable to add such support for an enhanced @modules for use at the 
> time the test is selected for execution and then subsequently executed.  If nothing else, there is a 
> big chicken-and-egg problem here  ... you cannot analyse the test code until it has been compiled, 
> and you cannot compile it until you know the module dependencies.
> 
> In general, for existing JDK tests, the @modules have been determined. For new tests, I recommend 
> you look to your IDE or other development-time tools, to help determine the dependencies of the test 
> code, and then record the results in an @modules tag in the test description.
> 
> -- Jon
> 
>>
>>>
>>>> On Dec 14, 2017, at 7:56 AM, Jiri Vanek <jvanek at redhat.com> wrote:
>>>>
>>>> Hi Jonathan!
>>>>
>>>> Thank you very much for great answer. Few remarks inline.
>>>>
>>>>
>>>> On 12/09/2017 02:51 AM, Jonathan Gibbons wrote:
>>>>> Jiri, Mila,
>>>>> There are three significant questions here.
>>>>> 1. @modules all-needed
>>>>> This is a non-starter. @modules participates in a relatively light-weight test selection mechanism
>>>>
>>>> Sure. It is last step, if it will be ever started.
>>>>
>>>>> ... i.e. tests are not selected if the specified modules are not available in the system image. 
>>>>> Having jtreg analyse the source code to determine the set of necessary modules is just not 
>>>>> practical.
>>>>> 2. Starred modules, as in @modules java.security.jgss/sun.security.krb5.internal.*
>>>>> Setting aside whether this is desirable or not, this is not necessarily an easy thing to do. It 
>>>>> requires that we can list the (internal) packages of a module. Yes, there may be a attribute 
>>>>> that provides the info, but the attribute is not guaranteed to be available, and if it's not, 
>>>>> you're
>>>> terrible truth. see at bottom.
>>>>
>>>>> reduced to scanning the module contents.  On the desirability point of view, the use of this 
>>>>> sort of syntax was discussed, and rejected, for module declarations, and while that is separate 
>>>>> from what is
>>>>
>>>> I was reading most of this discussion, and I can agree with it for final deployment, but not for 
>>>> testing.
>>>>> proposed here, it does lend guidance. Neither is the '*' syntax supported by the options for 
>>>>> the Java launcher or javac, and this construct is intended to be a thinly-veiled wrapper for 
>>>>> those options.
>>>>
>>>> This is probably the only sentence I moreover disagree with you. Jtreg is far away fro being 
>>>> tinny wrapper, and it always did huge help for tests authors.  So helping testers with setting 
>>>> up module path a bit, may be good step.
>>>>> One minor comment ... you can reduce the "wordiness" of your examples by almost 50% by just 
>>>>> having a single @modules directive with many arg values, possibly spanning many lines, as in ...
>>>>>    * ....
>>>>>    * @modules java.security.jgss/sun.security.krb5.internal
>>>>>    * java.security.jgss/sun.security.krb5.internal.ccache
>>>>>    * java.security.jgss/sun.security.krb5.internal.crypto
>>>>>    * java.security.jgss/sun.security.krb5.internal.ktab
>>>>>    * java.base/sun.security.util
>>>>>    * java.security.jgss/sun.security.jgss
>>>>
>>>> Still you need to enumerate them all. That mean to run javac and jmod in loops  one by one, 
>>>> untill you get collect them.
>>>>> 3. Shell scripts.
>>>>> Using shell scripts for jtreg tests is generally discouraged, these days, to the point that we 
>>>>> have made efforts to convert many/most JDK shell tests to Java code. The general experience was 
>>>>> that such tests were very fragile, and were often wrong/broken. They typically execute slower 
>>>>> than equivalent Java code, especially when using libraries providing commonly-used or 
>>>>> domain-specific functionality.
>>>>
>>>> Well, shell lunchers have theirs dark sides, thats right. But are awesome feature without 
>>>> replacement.
>>>>> And as you note below, processing variables like TESTMODULES is problematic. (It is a bug if 
>>>>> present for JDK 8 tests).
>>>>
>>>> Its a bug :)
>>>>> When using Java code instead of shell scripts, you can look to libraries in the various test 
>>>>> suites for suggestions on useful methods to provide, such as invoking generating and compiling 
>>>>> source code, providing simple equivalents for regex search (simple grep), comparison (simple 
>>>>> diff), etc, as well as support for running subprocesses when necessary. One common pattern is 
>>>>> to use Java code to validate whether it is appropriate to run a test in the current 
>>>>> configuration and to then launch a JVM with a selected combination of options. This sort of 
>>>>> mode has explicit support in jtreg:  "@run driver" is similar to "@run main" for running a 
>>>>> class, but it is not run with any JVM options intended for test JVMs. This makes it suitable 
>>>>> for running "test driver" classes which spawn JVMs to run the "real" test code.  And if you're 
>>>>> just writing API tests, then I recommend using plain old Java code and "agentvm" mode to have 
>>>>> the tests as fast as possible.
>>>>
>>>>
>>>> You are mostly right. But consider this: The locating of modules is painful when you are dealing 
>>>> with private apis. And that is what you do in jtregs for half of the time...
>>>> So naturally, the help would be easy.
>>>> On contrary, the help do not come from JDK itself in any "supported" way (or am I missing 
>>>> something?)
>>>> Still the javac can do so. So it would be natural to enahnce javac to help with this a bit more 
>>>> via some more solid api. Maybe you know something here?
>>>>
>>>> One would say, that writing private api jtreg is one or two modules usage only. Unluckily, 
>>>> oposite is true, and Mila's * idea is another proof of it. And If I look to past to my recent 
>>>> work, I was facing the same. Just got angry later.
>>>>
>>>>
>>>> So generally - some help should be provided in JDK to deal with it. And as JDK looks to have its 
>>>> reasons to not to do so, Jtregs should.
>>>>
>>>>
>>>> Thanx for again for your reply!
>>>>   J.
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>
>>
> 


-- 
Jiri Vanek
Senior QE engineer, OpenJDK QE lead, Mgr.
Red Hat Czech
jvanek at redhat.com    M: +420775390109


More information about the jtreg-dev mailing list