Re: JavaHL jar file containing class files for unit tests
Branko Čibej <[email protected]>
| Newsgroups | gmane.comp.version-control.subversion.devel |
|---|---|
| Organization | The Apache Software Foundation |
| Message-ID | <[email protected]> |
On 6. 8. 2026 18:13, Daniel Sahlberg wrote: > Den tors 6 aug. 2026 kl 16:18 skrev Branko Čibej <[email protected]>: > > On 2. 8. 2026 15:07, Daniel Sahlberg wrote: >> Den ons 29 juli 2026 kl 12:52 skrev Branko Čibej <[email protected]>: >> >> On 29. 7. 2026 10:58, Daniel Sahlberg wrote: >>> >>> >>> Den ons 29 juli 2026 kl 04:32 skrev Jun Omae >>> <[email protected]>: >>> >>> On 2026/07/28 23:58, Daniel Sahlberg wrote: >>> > Den mån 27 juli 2026 kl 00:09 skrev Jun Omae >>> <[email protected] <mailto:[email protected]>>: >>> > >>> > > Is there a problem if we include the test classes? >>> > >>> > No direct issues have been found so far. However, >>> static initializers within test classes are executed >>> simply by loading the class. >>> > >>> > [[[ >>> > $ grep -r 'static *{' subversion/bindings/javahl >>> > >>> subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java: >>> static { >>> > >>> subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTests.java: >>> static { >>> > ]]] >>> > >>> > >>> > Thank you! >>> > >>> > I think I got it working on 1.14.x, successfully >>> created a JAR file without the tests. >>> > >>> > It still seems to fail on trunk. Can you do the same >>> steps above on trunk? >>> > >>> > Cheers, >>> > Daniel >>> > >>> >>> Hm, I get the same failures on trunk. >>> It seems that the changes of the behavior is introduced >>> in r1933892. >>> At least, ./configure should stop and/or warn it if the >>> junit is NOT optional when javahl enabled. >>> >>> [[[ >>> $ /bin/sh autogen.sh >>> $ ./configure --prefix=/dev/shm/svn/trunk --without-apxs >>> --without-swig --without-swig-{perl,python,ruby} >>> --enable-javahl >>> --with-jdk=/usr/lib/jvm/java-11-openjdk-amd64 >>> --without-junit PYTHON=/usr/bin/python3 >>> $ make -j$(nproc) all >>> $ make javahl >>> >>> $ find subversion/bindings/javahl -name '*.class' | wc -l >>> 277 >>> $ find subversion/bindings/javahl -name '*Test*.class' | >>> wc -l >>> 0 #==> tests/**/*.java are compiled yet. >>> >>> $ make install >>> $ make install-javahl # Why this task builds >>> tests/**/*.java? >>> ... >>> /dev/shm/subversion-trunk/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java:1708: >>> error: cannot find symbol >>> assertEquals("wrong revision from commit", >>> ^ >>> symbol: method assertEquals(String,long,int) >>> location: class BasicTests >>> /dev/shm/subversion-trunk/subversion/bindings/javahl/tests/org/tigris/subversion/javahl/BasicTests.java:1756: >>> error: cannot find symbol >>> assertEquals("wrong revision from update", >>> ^ >>> symbol: method assertEquals(String,long,int) >>> location: class BasicTests >>> Note: Some input files use or override a deprecated API. >>> Note: Recompile with -Xlint:deprecation for details. >>> 100 errors >>> ]]] >>> >>> >>> Thanks for confirming! It seems like 1.15.x is also affected >>> by this (I'll bring it up on the release thread). >>> >>> To add three more data points to the discussion, I checked >>> Fedora 43, 44 and FreeBSD 14. The tests are present in >>> Fedora's svn-javahl.jar but not in FreeBSD's svn-javahl.jar. >>> Obviously different distributors use different options when >>> building. That is unfortunate since we are distributing >>> different ABIs. >>> >>> I think it would be cleaner to have the tests in >>> svn-javahl-tests.jar if built. Maybe we want to install this >>> alongside svn-javahl.jar. That way Fedora and Ubuntu can >>> keep distributing the tests and FreeBSD not, while >>> everyone's svn-javahl.jar is the same. >>> >>> Does that make sense? >> >> >> The following makes sense: >> >> 1. There is no regression in autotools. It is what it is. >> Note that putting test classes in a separate jar has wider >> consequences than just the ABI. For example, JavaHL tests >> would fail in autotools builds. We'd have to change the way >> the classpath is constructed in `make check-*-javahl`. >> >> 2. No change is needed in 1.15.x. Autotools are consistent >> with earlier releases and CMake doesn't build JavaHL. IFF we >> want to change this in CMake for 1.15, then we have further >> questions to consider: >> >> 2.1. CMake and Autotools/vcxproj should produce identical >> results given identical options. In this case >> specifically I mean that the CMake build should create >> the same lib/dll names and the same JavaHL jar (singular) >> as the vcxproj generator. >> >> >> 3. Regardless of the answer to 2: If we decide to not include >> test classes in svn-javhl.jar, then we have to consider how >> to mitigate the ABI change. >> >> Personally I'd prefer changing the build requirements to >> changing the ABI in svn-javahl.jar. That means that >> --enable-javahl implies that JUnit is mandatory. >> >> -- Brane >> >> >> Is the patch below an acceptable way of requiring --with-junit? >> >> Cheers, >> Daniel >> >> >> [[[ >> Index: configure.ac <http://configure.ac> >> =================================================================== >> --- configure.ac <http://configure.ac> (revision 1936330) >> +++ configure.ac <http://configure.ac> (working copy) >> @@ -1748,6 +1748,7 @@ >> >> dnl Possibly compile JavaHL >> do_javahl_build=no >> +has_junit=no > > This initialisation is not needed. > >> AC_ARG_ENABLE(javahl, >> AS_HELP_STRING([--enable-javahl], >> [Enable compilation of Java high-level bindings >> (requires C++)]), >> @@ -1755,6 +1756,21 @@ >> do_javahl_build="yes" >> fi >> ]) >> +AC_ARG_WITH(junit, >> +AS_HELP_STRING([--with-junit=PATH], >> + [Specify a path to the junit JAR file.]), >> +[ >> + if test "$withval" != "no"; then >> + if test -n "$JAVA_CLASSPATH"; then >> + JAVA_CLASSPATH="$withval:$JAVA_CLASSPATH" >> + else >> + JAVA_CLASSPATH="$withval" >> + fi >> + JAVAHL_TESTS_TARGET="javahl-tests" >> + JAVAHL_COMPAT_TESTS_TARGET="javahl-compat-tests" >> + has_junit="yes" >> >> Should be; >> have_junit="yes" >> >> + fi >> +]) >> >> JAVAHL_OBJDIR="" >> INSTALL_EXTRA_JAVAHL_LIB="" >> @@ -1763,6 +1779,12 @@ >> JAVAHL_COMPAT_TESTS_TARGET="" >> LT_CXX_LIBADD="" >> if test "$do_javahl_build" = "yes"; then >> + dnl Since r1933892 junit is required to build the JavaHL bindings >> + if test "$has_junit" = "no"; then > > And here: > > if test "$have_junit" != "yes"; then > > > The idea is to set the have_junit variable exactly once. If it's > not set, "$have_junit" will be an empty string. > >> + AC_MSG_ERROR([--with-junit must be specified if building the >> Java high-level >> + bindings.]) >> + fi >> + >> dnl Check for suitable JDK >> if test "$JDK_SUITABLE" = "no"; then >> AC_MSG_ERROR([Cannot compile JavaHL without a suitable JDK. >> @@ -1802,21 +1824,6 @@ >> AC_SUBST(JAVAHL_OBJDIR) >> AC_SUBST(FIX_JAVAHL_LIB) >> AC_SUBST(LT_CXX_LIBADD) >> - >> -AC_ARG_WITH(junit, >> -AS_HELP_STRING([--with-junit=PATH], >> - [Specify a path to the junit JAR file.]), >> -[ >> - if test "$withval" != "no"; then >> - if test -n "$JAVA_CLASSPATH"; then >> - JAVA_CLASSPATH="$withval:$JAVA_CLASSPATH" >> - else >> - JAVA_CLASSPATH="$withval" >> - fi >> - JAVAHL_TESTS_TARGET="javahl-tests" >> - JAVAHL_COMPAT_TESTS_TARGET="javahl-compat-tests" >> - fi >> -]) >> AC_SUBST(JAVA_CLASSPATH) >> AC_SUBST(JAVAHL_TESTS_TARGET) >> AC_SUBST(JAVAHL_COMPAT_TESTS_TARGET) >> ]]] >> > > > Out of curiosity, why do $do_javahl_build and others follow another > pattern? Because of Emerson. [1] -- Brane [1] https://en.wikipedia.org/wiki/Wikipedia:Emerson_and_Wilde_on_consistency