Files
gentoo/dev-java/stringtemplate/stringtemplate-4.3.1.ebuild
Yuan Liao 74072f9f3f dev-java/stringtemplate: Fix 4.3.1 test failure when upgrading slot 4
A test failure (as reported in the linked bug) might occur when an older
version of ST 4 is already installed on the system.  The failure is
caused by multiple factors: the way java-pkg-simple.eclass generates the
test classpath, the fact that the tests launch new JVM instances under a
different working directory, and the behavior of the JVM upon an invalid
path in the classpath.

As of the time when this commit is created, the test classpath computed
by java-pkg-simple.eclass will contain the following elements, in order:
1. The directory containing the test classes compiled by the eclass
2. The path to the JAR built by the eclass **relative to ${S}**
3. Absolute paths to dependency JARs, for both compile and test
   dependencies

ST 4 has an implicit test dependency on itself via ANTLR 3.5 (which is
yet another issue pertaining to the troublesome, malformed ANTLR 3.5 and
ST 4 circular dependency).  This means a version of slot 4 that is
possibly older than 4.3.1 might be installed on the system and added to
the test classpath within element No. 3 when the tests are being run.

Some of the tests will call the 'java' command to execute ST 4 in a new
JVM instance; the test classpath generated by java-pkg-simple.eclass
will be reused in the classpath of the new JVM.  The unfortunate factor
that triggers the test failure is that the new JVM's working directory
can become different from the one of the original JVM running the JUnit
tests, which is ${S} when this package is being built by Portage.

Note that element No. 2 in the test classpath is a relative path: after
the working directory is changed, it will be invalid.  However, JVM is
lax in invalid path elements in the classpath: it will just ignore them
and emit a "class not found" error or alike only after it has tried all
other paths in the classpath to locate a class.

With this behavior, JVM will pick up the copy of ST 4 already installed
on the system from element No. 3 in the classpath after it detects that
element No. 2 is an invalid path.  Therefore, the tests will be run
against ST 4 that is *installed on the system* instead of the copy that
has just been built.

This explains why some tests would fail when an older version of ST 4 is
already installed; effectively, that old version was being tested by the
test suite for the new version, and there is no guarantee that all tests
would pass in this case.  A corollary conclusion is that if the same
version of ST 4 is being built and installed twice, and the second build
has tests enabled, then the tests would pass, although effectively it
would be the artifact produced by the first build being tested against.

Closes: https://bugs.gentoo.org/834138
Signed-off-by: Yuan Liao <liaoyuan@gmail.com>
Closes: https://github.com/gentoo/gentoo/pull/24368
Signed-off-by: Miroslav Šulc <fordfrog@gentoo.org>
2022-02-27 09:11:26 +01:00

98 lines
2.9 KiB
Bash

# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
JAVA_PKG_IUSE="doc source test"
MAVEN_ID="org.antlr:ST4:4.3.1"
JAVA_TESTING_FRAMEWORKS="junit-4"
inherit java-pkg-2 java-pkg-simple
DESCRIPTION="A Java template engine"
HOMEPAGE="https://www.stringtemplate.org/"
# Maven Central sources JAR for *.java sources pre-generated from *.g files;
# the source generation requires antlr-tool-3.5, which depends on this package.
# Tarball for the test suite and DOCS files
SRC_URI="
https://repo1.maven.org/maven2/org/antlr/ST4/${PV}/ST4-${PV}-sources.jar
https://github.com/antlr/${PN}4/archive/${PV}.tar.gz -> ${P}.tar.gz
"
LICENSE="BSD"
SLOT="4"
KEYWORDS="amd64 ~arm arm64 ~ppc64 x86 ~amd64-linux ~x86-linux ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
CP_DEPEND="
dev-java/antlr-runtime:3.5
"
BDEPEND="
app-arch/unzip
"
DEPEND="
>=virtual/jdk-1.8:*
${CP_DEPEND}
test? (
dev-java/antlr-tool:3.5
)
"
RDEPEND="
>=virtual/jre-1.8:*
${CP_DEPEND}
"
S="${WORKDIR}"
TARBALL_S="${S}/${PN}4-${PV}"
JAVA_SRC_DIR="org"
JAVA_TEST_GENTOO_CLASSPATH="junit-4,antlr-tool-3.5"
JAVA_TEST_SRC_DIR="${TARBALL_S}/test"
DOCS=( "${TARBALL_S}/"{CHANGES.txt,contributors.txt,README.md} )
src_prepare() {
java-pkg_clean # Just in case Maven Central sources JAR contains binary
if use test; then
pushd "${TARBALL_S}" > /dev/null ||
die "Failed to enter directory storing tarball contents"
eapply "${FILESDIR}/${P}-BaseTest-javac-source-target.patch"
popd > /dev/null ||
die "Failed to leave directory storing tarball contents"
fi
java-pkg-2_src_prepare
# Some of these tests requires a graphical display.
rm -v "${JAVA_TEST_SRC_DIR}/org/stringtemplate/v4/test/TestEarlyEvaluation.java" || die
}
src_test() {
# Make sure no older versions of this slot are present in the classpath
# https://bugs.gentoo.org/834138#c4
local old_ver_cp="$(nonfatal java-pkg_getjars "${PN}-${SLOT}")"
local new_test_cp="$(\
java-pkg_getjars --with-dependencies "${JAVA_TEST_GENTOO_CLASSPATH}")"
new_test_cp="${new_test_cp//"${old_ver_cp}"/}"
# Some of the test cases require an absolute path to the JAR being tested
# against to be in the classpath, due to the fact that they call the 'java'
# command outside ${S} and reuse the classpath for the tests:
# https://github.com/antlr/stringtemplate4/blob/4.3.1/test/org/stringtemplate/v4/test/TestImports.java#L103
# https://github.com/antlr/stringtemplate4/blob/4.3.1/test/org/stringtemplate/v4/test/BaseTest.java#L174
new_test_cp="${S}/${JAVA_JAR_FILENAME}:${new_test_cp}"
# Use JAVA_GENTOO_CLASSPATH_EXTRA to set test classpath
local JAVA_TEST_GENTOO_CLASSPATH=""
[[ -n "${JAVA_GENTOO_CLASSPATH_EXTRA}" ]] &&
JAVA_GENTOO_CLASSPATH_EXTRA+=":"
JAVA_GENTOO_CLASSPATH_EXTRA+="${new_test_cp}"
java-pkg-simple_src_test
}
src_install() {
java-pkg-simple_src_install
einstalldocs # https://bugs.gentoo.org/789582
}