Newbie help needed getting setup to build SigTest + discussion about adding a exclude class by name option ...
Scott Marlow
smarlow at redhat.com
Wed Jan 27 14:49:28 UTC 2021
On 1/26/21 12:21 PM, Scott Marlow wrote:
>
> Hi,
>
> https://gist.github.com/scottmarlow/0cebe942116fc1d3aef38c61b09e3395
> shows the `java.lang.ClassNotFoundException: java.util.EventObject`
> that is thrown due to the "package list" not being checked (I think)
> by com.sun.tdk.signaturetest.core.MemberCollectionBuilder.createMembers.
>
I added another example call stack to the end of
https://gist.github.com/scottmarlow/0cebe942116fc1d3aef38c61b09e3395
that shows a need for passing a PackageChecker to ClassHierarchyImpl so
that classes that are not on the "package list" or are excluded are not
referenced.
I will try hard coding some class packages to ignore in
ClassHierarchyImpl + MemberCollectionBuilder so that I can make progress
with proving that a change is possible (even if done via code changes
that will never get merged in). If I can demonstrate that it is helpful
to be able to exclude certain classes from ClassHierarchyImpl +
MemberCollectionBuilder, we will then need to consider if it makes sense
for SigTest to be adapted to more deeply respect the package/exclude lists.
I am not surprised that with my hard coding of the exclude list to
ignore more Java SE classes, that I am seeing a "APICheck 1" test
failure due to "Missing Methods". I will see if I can disable tests
that fail for now (not a good long term idea and not something I would
include in a pull request). :-)
Scott
> I am hacking some local changes via
> https://github.com/scottmarlow/sigtest/tree/explore_more_changes to
> try some changes.
>
> Would it make sense create a PackageChecker interface that could be
> passed to MemberCollectionBuilder#createMembers so that
> MemberCollectionBuilder would have the "package list" and know not to
> reference classes that are not on the "package list"?
>
> Are github pull requests accepted?
>
> Scott
>
> On 1/21/21 10:28 AM, Scott Marlow wrote:
>>
>>
>> On 1/19/21 5:35 PM, Scott Marlow wrote:
>>>
>>>
>>> On 1/7/21 5:23 PM, victor.rudometov at oracle.com wrote:
>>>> Hi Scott,
>>>>
>>>> Technically the signatures do change when we switch from 8 to 11
>>>> and annotations are either added to finalize() method or default
>>>> empty parameters are added to Deprecated. Annotation changes can
>>>> affect the behavior of reflective APIs that work with annotations,
>>>> therefore Sigtest is correct to report an error.
>>>>
>>>> If we do not want to track these I see exclude plugin as one of
>>>> possible options (through check() method there). Another one is to
>>>> work through PluginAPI and either transform or filter the signature.
>>>
>>> Thanks, I will try the exclude plugin check() method.
>>>
>> A. I tried updating the (com.sun.tdk.signaturetest)
>> DefaultExcludeList to exclude `java.lang.Deprecated` during signature
>> testing (using our original recorded signatures that do include
>> `java.lang.Deprecated`) but the `java.lang.Deprecated` are still
>> being verified and complained about.
>> https://gist.github.com/scottmarlow/e4e7d33088c42ca3433bde98e4ed1d1c
>> shows the callstack of the invocation to my modified
>> DefaultExcludeList and some debug prints of passed information.
>>
>> B. I tried another hack to exclude everything during signature
>> testing by having DefaultExcludeList#check always throw
>> `ExcludeException` for all invocations and I still had various
>> missing classes, added classes, missing super classes, Added
>> Annotations reported as well
>> (https://gist.github.com/scottmarlow/9cbcf5703d87f1779a1c73d5ef750d8e
>> has output from that using the Jakarta EE Signature test tooling that
>> uses SigTest).
>>
>> Should my second hack (B) that throws `ExcludeException` for all
>> calls to Except#check, result in there being zero Signature Test
>> failures?
>>
>> Note that for this testing, we are only passing in the `jakarta`
>> package names to be checked (via our sig-test-pkg-list_se11.txt
>> package list file).
>>
>>> Also, below is a list of what I am trying to accomplish (pending
>>> more discussion + feedback):
>>>
>>> 1. Do verify that the super class name doesn't change but do not
>>> verify the super class contents (e.g. no JDK class content checking).
>>> 2. Do verify that each annotation name is as expected but do not
>>> verify the actual annotation signature.
>>> 3. Do verify each public class method/field signature.
>>> 4. Do fail if any public class method/field are added (for no
>>> super-setting rule).
>>> 5. Do fail if any public class method/field are removed (for no
>>> sub-setting rule).
>>> 6. To be clear, any JDK class referenced by name in the Jakarta EE
>>> SPEC API class will still be verified to still reference the same
>>> class name
>>>
>>> Thanks,
>>>
>>> Scott
>>>
>>>>
>>>> Thanks,
>>>>
>>>> Victor.
>>>>
>>>> On 1/6/21 18:52, Scott Marlow wrote:
>>>>>
>>>>> Fyi, the underlying goal is to allow the Jakarta EE TCK signature
>>>>> tests to be run against newer Java SE versions than the base Java
>>>>> SE version used to generate the signatures.
>>>>>
>>>>> Some text from the jakartaee-tck/issues/156 tracking issue [1]:
>>>>> "
>>>>>
>>>>> The recorded signatures include every field and method in every
>>>>> class and
>>>>> interface in the API, as well as the information for every
>>>>> superclass or
>>>>> interface. A consequence of this is that it records the signatures of
>>>>> every JDK class used by the API.
>>>>>
>>>>> That means that a different signature file is needed to test an
>>>>> API on
>>>>> JDK 12 vs JDK 11 (for example), even though the API works
>>>>> identically on
>>>>> both. There's no way to say "this API requires JDK 11 or newer".
>>>>> "
>>>>>
>>>>> With regard to my previous email below asking about the Deprecated
>>>>> annotation checking, I am wondering if the two different
>>>>> Deprecated annotation signatures (Java SE 8 vs SE 11) should be
>>>>> considered compatible since either form (zero, one or two
>>>>> parameters) could be executed? If the answer is that it could
>>>>> depend on the behaviour expected by the user of the SigTest
>>>>> tooling, perhaps an extension could be introduced.
>>>>>
>>>>> Scott
>>>>>
>>>>> [1] https://github.com/eclipse-ee4j/jakartaee-tck/issues/156
>>>>>
>>>>> On 1/6/21 1:44 PM, Scott Marlow wrote:
>>>>>>
>>>>>> Hi Victor,
>>>>>>
>>>>>> On 1/5/21 5:33 PM, victor.rudometov at oracle.com wrote:
>>>>>>> Hi Scott,
>>>>>>>
>>>>>>> I would eliminate -exclude java in your setup command making it:
>>>>>>>
>>>>>>> 4. java -Xmx2g -jar $SIGTEST/sigtestdev.jar Setup -classpath
>>>>>>> jakarta.persistence-api-3.0.0.jar:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/jre/lib/jce.jar
>>>>>>> -filename /tmp/jakarta.persistence-api-3.0.0.sig -package jakarta
>>>>>>>
>>>>>>> So the file will store signatures of super classes and
>>>>>>> interfaces as well (from java* packages).
>>>>>>>
>>>>>>> When running the test -package jakarta option will limit testing
>>>>>>> to jakarta package and subpackages. It will check members and
>>>>>>> super classes (so no Map instead of Object is allowed).
>>>>>>
>>>>>>
>>>>>> Thanks, I am trying this now. It seems to be an improvement.
>>>>>>
>>>>>> However, when generating signatures on Java SE 8 but testing on
>>>>>> Java SE 11, I cannot seem to ignore/exclude Deprecated annotation
>>>>>> that changed in Java SE 9.
>>>>>>
>>>>>> The Java SE 8 signature for the jakarta.persistence.Persistence
>>>>>> class contains:
>>>>>>
>>>>>> " anno 0 java.lang.Deprecated()
>>>>>> "
>>>>>>
>>>>>> The Java SE 11 signature for the jakarta.persistence.Persistence
>>>>>> class contains:
>>>>>>
>>>>>> "anno 0 java.lang.Deprecated(boolean forRemoval=false,
>>>>>> java.lang.String since="")
>>>>>> "
>>>>>>
>>>>>> When running the test command on Java SE 11 with the signature
>>>>>> generated under Java SE 8 I see:
>>>>>>
>>>>>> "Class jakarta.persistence.Persistence
>>>>>> Missed Annotations
>>>>>> PERSISTENCE_PROVIDER:anno 0 java.lang.Deprecated()
>>>>>> providers:anno 0 java.lang.Deprecated()
>>>>>> Added Annotations
>>>>>> PERSISTENCE_PROVIDER:anno 0 java.lang.Deprecated(boolean
>>>>>> forRemoval=false, java.lang.String since="")
>>>>>> providers:anno 0 java.lang.Deprecated(boolean
>>>>>> forRemoval=false, java.lang.String since="")
>>>>>> finalize():anno 0 java.lang.Deprecated(boolean
>>>>>> forRemoval=false, java.lang.String since="9")
>>>>>> "
>>>>>>
>>>>>> Is there any SigTest magic built in to ignore the Deprecated
>>>>>> annotation changes?
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> Scott
>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Thanks.
>>>>>>>
>>>>>>> Victor.
>>>>>>
>>>>>>
>>>>>>
>>>>
More information about the sigtest-dev
mailing list