Re: JavaHL jar file containing class files for unit tests

Daniel Sahlberg <[email protected]> Wed, 29 Jul 2026 14:28:51 +0200
Newsgroups gmane.comp.version-control.subversion.devel
Message-ID <CAMHy98OymLSnSeGupcELpN=BRMe13qyOaFJkhfyVXK2WCFG9MA@mail.gmail.com>
--000000000000de72010657bf1990
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Den ons 29 juli 2026 kl 12:52 skrev Branko =C4=8Cibej <[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=C3=A5n 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 clas=
s.
>> >
>> >     [[[
>> >     $ 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=3D/dev/shm/svn/trunk --without-apxs --without-swi=
g
>> --without-swig-{perl,python,ruby} --enable-javahl
>> --with-jdk=3D/usr/lib/jvm/java-11-openjdk-amd64 --without-junit
>> PYTHON=3D/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    #=3D=3D> 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/su=
bversion/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/su=
bversion/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'l=
l
> 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 t=
he
> 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`.
>

autotools (in 1.14) produce different results depending on if you use
--with-junit or without. Depending on how I read your arguments ("changing
the ABI" below), it could be an ABI violation/bug that we sometimes produce
a svn-javahl.jar without the test classes.


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

Autotools currently fail when building when using options that were working
in 1.14. That for me is a regression.  Changing build requirements and
refusing to run configure is not a regression. More below.


>
> 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) a=
s
> the vcxproj generator.
>
>
Agree that it should produce identical results given identical options.

>
> 3. Regardless of the answer to 2: If we decide to not include test classe=
s
> 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.
>

Good! That is exactly what we need to figure out.

Cheers,
Daniel

--000000000000de72010657bf1990
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div dir=3D"ltr"><div dir=3D"ltr"><span style=3D"backgroun=
d-color:transparent">Den ons 29 juli 2026 kl 12:52 skrev Branko =C4=8Cibej =
&lt;<a href=3D"mailto:[email protected]" target=3D"_blank">[email protected]<=
/a>&gt;:</span></div><div class=3D"gmail_quote"><blockquote class=3D"gmail_=
quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,=
204);padding-left:1ex"><u></u>

 =20
   =20
 =20
  <div>
    <div>On 29. 7. 2026 10:58, Daniel Sahlberg
      wrote:<br>
    </div>
    <blockquote type=3D"cite">
     =20
      <div dir=3D"ltr">
        <div dir=3D"ltr"><br>
        </div>
        <br>
        <div class=3D"gmail_quote">
          <div dir=3D"ltr" class=3D"gmail_attr">Den ons 29 juli 2026 kl
            04:32 skrev Jun Omae &lt;<a href=3D"mailto:[email protected]" t=
arget=3D"_blank">[email protected]</a>&gt;:<br>
          </div>
          <blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On
            2026/07/28 23:58, Daniel Sahlberg wrote:<br>
            &gt; Den m=C3=A5n 27 juli 2026 kl 00:09 skrev Jun Omae &lt;<a h=
ref=3D"mailto:[email protected]" target=3D"_blank">[email protected]</a>
            &lt;mailto:<a href=3D"mailto:[email protected]" target=3D"_blan=
k">[email protected]</a>&gt;&gt;:<br>
            &gt; <br>
            &gt;=C2=A0 =C2=A0 =C2=A0&gt; Is there a problem if we include t=
he test
            classes?<br>
            &gt; <br>
            &gt;=C2=A0 =C2=A0 =C2=A0No direct issues have been found so far=
. However,
            static initializers within test classes are executed simply
            by loading the class.<br>
            &gt; <br>
            &gt;=C2=A0 =C2=A0 =C2=A0[[[<br>
            &gt;=C2=A0 =C2=A0 =C2=A0$ grep -r &#39;static *{&#39; subversio=
n/bindings/javahl<br>
            &gt;=C2=A0 =C2=A0
=C2=A0subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTes=
ts.java:
            =C2=A0 =C2=A0static {<br>
            &gt;=C2=A0 =C2=A0
=C2=A0subversion/bindings/javahl/tests/org/apache/subversion/javahl/UtilTes=
ts.java:
            =C2=A0 =C2=A0static {<br>
            &gt;=C2=A0 =C2=A0 =C2=A0]]]<br>
            &gt; <br>
            &gt; <br>
            &gt; Thank you!<br>
            &gt; <br>
            &gt; I think I got it working on 1.14.x, successfully
            created a JAR file without the tests.<br>
            &gt; <br>
            &gt; It still seems to fail on trunk. Can you do the same
            steps above on trunk?<br>
            &gt; <br>
            &gt; Cheers,<br>
            &gt; Daniel<br>
            &gt; <br>
            <br>
            Hm, I get the same failures on trunk.<br>
            It seems that the changes of the behavior is introduced in
            r1933892.<br>
            At least, ./configure should stop and/or warn it if the
            junit is NOT optional when javahl enabled.<br>
            <br>
            [[[<br>
            $ /bin/sh autogen.sh<br>
            $ ./configure --prefix=3D/dev/shm/svn/trunk --without-apxs
            --without-swig --without-swig-{perl,python,ruby}
            --enable-javahl
            --with-jdk=3D/usr/lib/jvm/java-11-openjdk-amd64
            --without-junit PYTHON=3D/usr/bin/python3<br>
            $ make -j$(nproc) all<br>
            $ make javahl<br>
            <br>
            $ find subversion/bindings/javahl -name &#39;*.class&#39; | wc =
-l<br>
            277<br>
            $ find subversion/bindings/javahl -name &#39;*Test*.class&#39; =
| wc
            -l<br>
            0=C2=A0 =C2=A0 #=3D=3D&gt; tests/**/*.java are compiled yet.<br=
>
            <br>
            $ make install<br>
            $ make install-javahl=C2=A0 =C2=A0 # Why this task builds
            tests/**/*.java?<br>
            ...<br>
/dev/shm/subversion-trunk/subversion/bindings/javahl/tests/org/tigris/subve=
rsion/javahl/BasicTests.java:1708:
            error: cannot find symbol<br>
            =C2=A0 =C2=A0 =C2=A0 =C2=A0 assertEquals(&quot;wrong revision f=
rom commit&quot;,<br>
            =C2=A0 =C2=A0 =C2=A0 =C2=A0 ^<br>
            =C2=A0 symbol:=C2=A0 =C2=A0method assertEquals(String,long,int)=
<br>
            =C2=A0 location: class BasicTests<br>
/dev/shm/subversion-trunk/subversion/bindings/javahl/tests/org/tigris/subve=
rsion/javahl/BasicTests.java:1756:
            error: cannot find symbol<br>
            =C2=A0 =C2=A0 =C2=A0 =C2=A0 assertEquals(&quot;wrong revision f=
rom update&quot;,<br>
            =C2=A0 =C2=A0 =C2=A0 =C2=A0 ^<br>
            =C2=A0 symbol:=C2=A0 =C2=A0method assertEquals(String,long,int)=
<br>
            =C2=A0 location: class BasicTests<br>
            Note: Some input files use or override a deprecated API.<br>
            Note: Recompile with -Xlint:deprecation for details.<br>
            100 errors<br>
            ]]]<br>
          </blockquote>
          <div><br>
          </div>
          <div>Thanks for confirming! It seems like 1.15.x is also
            affected by this (I&#39;ll bring it up on the release thread).<=
/div>
          <div><br>
          </div>
          <div>
            <div>To add three more data points to the discussion, I
              checked Fedora 43, 44 and FreeBSD 14. The tests are
              present in Fedora&#39;s svn-javahl.jar but not in FreeBSD&#39=
;s
              svn-javahl.jar. Obviously different distributors use
              different options when building. That is unfortunate since
              we are distributing different ABIs.</div>
            <div><br>
            </div>
            <div><span style=3D"background-color:transparent">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&#39;s svn-javahl.jar is the same.</span></di=
v>
            <div><span style=3D"background-color:transparent"><br>
              </span></div>
            <div><span style=3D"background-color:transparent">Does that
                make sense?</span></div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    <br>
    The following makes sense:<br>
    <br>
    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&#39;d have to change the way the classpath is constructed in
    `make check-*-javahl`.<span style=3D"background-color:transparent">=C2=
=A0</span></div></blockquote><div><br></div><div>autotools (in 1.14) produc=
e different results depending on if you use --with-junit or without. Depend=
ing on how I read your arguments (&quot;changing the ABI&quot; below), it c=
ould be an ABI violation/bug that we sometimes produce a svn-javahl.jar wit=
hout the test classes.</div><div><br></div><blockquote class=3D"gmail_quote=
" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);=
padding-left:1ex"><div><br>
    2. No change is needed in 1.15.x. Autotools are consistent with
    earlier releases and CMake doesn&#39;t build JavaHL. IFF we want to
    change this in CMake for 1.15, then we have further questions to
    consider:<br></div></blockquote><div><br></div><div>Autotools currently=
 fail when building when using options that were working in 1.14. That for =
me is a regression.=C2=A0 Changing build requirements and refusing to run c=
onfigure is not a regression. More below.</div><div>=C2=A0</div><blockquote=
 class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px so=
lid rgb(204,204,204);padding-left:1ex"><div><br>
    <blockquote>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.<br></blockquote></div></blockquote><div><br></div><div>Agr=
ee that it should produce identical results given identical options.</div><=
blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-l=
eft:1px solid rgb(204,204,204);padding-left:1ex"><div><blockquote>
    </blockquote>
    <br>
    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.<br>
    <br>
    Personally I&#39;d prefer changing the build requirements to changing
    the ABI in svn-javahl.jar. That means that --enable-javahl implies
    that JUnit is mandatory.<br></div></blockquote><div><br></div><div>Good=
! That is exactly what we need to figure out.</div><div><br></div><div><spa=
n style=3D"background-color:transparent">Cheers,</span></div><div>Daniel</d=
iv><div>=C2=A0</div></div></div>
</div>

--000000000000de72010657bf1990--