Newbie help needed getting setup to build SigTest + discussion about adding a exclude class by name option ...

Scott Marlow smarlow at redhat.com
Tue Jan 26 17:21:35 UTC 2021


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 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