RFC: add starred module(s)

Jonathan Gibbons jonathan.gibbons at oracle.com
Wed Feb 7 16:14:54 UTC 2018


Jiri,

I would not expect to see functionality like this available while tests 
are running. It might be reasonable to provide it as a separate utility, 
such that a test author can run it, and decide whether to incorporate or 
augment the output from such a utility in the test code, in the same way 
that import statements are not inferred by javac, but can be generated 
by an IDE.

-- Jon


On 2/6/18 2:54 AM, Jiri Vanek wrote:
> 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.
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>
>>>
>>
>
>



More information about the jtreg-dev mailing list