#! /bin/sh
# Copyright (C) 2011-2021 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
# Test on compilation and execution of Java class files.
# Also meddle with wrapper scripts, as would be probably seen in a real
# "UNIX-style" use case.
# This test uses a "flat" setup for the source tree (i.e., everything in
# the top-level directory), and forces the use of the old, non-parallel
# testsuite driver. The sister test 'java-compile-run-nested.sh' do
# similar checks with a more usual, "nested" setup, and using the older
# 'serial-tests' driver.
required='java javac'
am_serial_tests=yes
. test-init.sh
echo "AC_SUBST([PATH_SEPARATOR], ['$PATH_SEPARATOR'])" >> configure.ac
cat >> configure.ac <<'END'
AC_SUBST([JAVA], [java])
AC_CONFIG_SRCDIR([PkgLocation.jin])
AC_CONFIG_FILES([PkgLocation.java:PkgLocation.jin])
AC_OUTPUT
END
## TOP-LEVEL SETUP AND TARGETS ##
cat > Makefile.am <<'END'
EXTRA_DIST = # Will be updated later.
test-built:
ls -l $(srcdir) ;: For debugging.
test $(srcdir) = . || ls -l . ;: Likewise.
test -f $(srcdir)/Main.java
test -f $(srcdir)/HelloStream.java
test -f $(srcdir)/PkgLocation.jin
test -f PkgLocation.java
test -f HelloStream.class
test -f PkgLocation.class
test -f Main.class
test -f classjava.stamp
test-installed:
ls -l $(javadir) ;: For debugging.
test -f $(javadir)/HelloStream.class
test -f $(javadir)/PkgLocation.class
test -f $(javadir)/Main.class
if find $(prefix) | grep '\.stamp$$'; then exit 1; else :; fi
run-installed:
jprog_doing_installcheck=yes $(MAKE) $(AM_MAKEFLAGS) check
check-local: test-built
installcheck-local: test-installed run-installed
.PHONY: test-built test-installed run-installed
END
## WRAPPER SCRIPT ##
cat >> Makefile.am <<'END'
bin_SCRIPTS = jprog
edit_script = sed -e 's|[@]JAVA@|$(JAVA)|g' \
-e 's|[@]javadir@|$(javadir)|g' \
-e 's|[@]SHELL@|$(SHELL)|g' \
-e 's|[@]PATH_SEPARATOR@|$(PATH_SEPARATOR)|g'
jprog: jprog.sh
rm -f $@ $@-t
$(edit_script) `test -f '$@.sh' || echo $(srcdir)/`$@.sh >$@-t
chmod a-w $@-t && chmod a+x $@-t && mv -f $@-t $@
sed 's/^/ | /' $@ ;: for debugging.
EXTRA_DIST += jprog.sh
CLEANFILES = jprog
END
cat > jprog.sh <<'END'
#!@SHELL@
CLASSPATH=${jprog_classpath-'@javadir@'}${CLASSPATH+"@PATH_SEPARATOR@$CLASSPATH"}
export CLASSPATH
case $# in
0) exec @JAVA@ Main;;
*) exec @JAVA@ Main "$@";;
esac
END
## JAVA SOURCES ##
cat >> Makefile.am <<'END'
javadir = $(pkgdatadir)/java
dist_java_JAVA = Main.java HelloStream.java
nodist_java_JAVA = PkgLocation.java
END
cat > PkgLocation.jin <<'END'
public class PkgLocation {
public static String prefix() {
return new String("@prefix@");
}
}
END
cat > Main.java <<'END'
public class Main {
public static void main(String[] args) {
for (int i = 0; i < args.length; i++) {
if (args[i].equals("--print-prefix")) {
System.out.println(PkgLocation.prefix());
} else if (args[i].equals("--hello-stdout")) {
HelloStream.to(System.out);
} else if (args[i].equals("--hello-stderr")) {
HelloStream.to(System.err);
} else {
System.err.println("jprog: invalid option '" + args[i] +
"'");
System.exit(2);
}
}
System.exit(0);
}
}
END
cat > HelloStream.java <<'END'
import java.io.PrintStream;
class HelloStream {
public static void to(PrintStream stream) {
stream.println("Hello, Stream!");
}
}
END
## TESTS ##
cat >> Makefile.am <<'END'
## We must use 'TESTS_ENVIRONMENT', not 'AM_TESTS_ENVIRONMENT',
## because the latter is not hnoured by the old serial test
## harness.
TESTS_ENVIRONMENT = \
if test x"$$jprog_doing_installcheck" != x"yes"; then \
jprog_classpath='$(abs_top_builddir):$(abs_top_srcdir)'; \
export jprog_classpath; \
PATH='$(abs_top_builddir)$(PATH_SEPARATOR)'$$PATH; \
export PATH; \
else \
unset jprog_classpath || :; \
PATH='$(prefix)/bin$(PATH_SEPARATOR)'$$PATH; \
export PATH; \
fi; \
config_time_prefix='@prefix@'; export config_time_prefix;
TESTS = \
simple.test \
prefix.test \
stdout.test \
stderr.test \
badarg.test
XFAIL_TESTS = badarg.test
EXTRA_DIST += $(TESTS)
# Tell GNU make not to parallelize, since the tests can result in, for example:
# /usr/bin/install: cannot change permissions of '/tmp/am-dc-13378//u/karl/gnu/src/akarl/t/java-compile-run-flat.dir/java-compile-run-flat-1.0/_inst/share/java-compile-run-flat/java/HelloStream.class': No such file or directory
# /usr/bin/install: cannot create regular file '/tmp/am-dc-13378//u/karl/gnu/src/akarl/t/java-compile-run-flat.dir/java-compile-run-flat-1.0/_inst/share/java-compile-run-flat/java/PkgLocation.class': File exists
# make[2]: *** [Makefile:393: install-dist_javaJAVA] Error 1
# make[2]: Leaving directory '/u/karl/gnu/src/akarl/t/java-compile-run-flat.dir/java-compile-run-flat-1.0/_build/sub'
# No evident way to debug or reliably reproduce.
.NOTPARALLEL:
END
cat > simple.test <<'END'
#!/bin/sh
jprog
END
cat > prefix.test <<'END'
#!/bin/sh
jprefix=`jprog --print-prefix` || exit 1
echo "$0: exp prefix: $config_time_prefix"
echo "$0: got prefix: $jprefix"
test x"$jprefix" = x"$config_time_prefix"
END
cat > stdout.test <<'END'
#!/bin/sh
rc=0
jprog --hello-stdout >stdout.out 2>stdout.err || { echo \$?=$?; rc=1; }
sed 's/^/out:/' &2 # Likewise.
test -s stdout.err && rc=1
test "`cat stdout.out`" = 'Hello, Stream!' || rc=1
rm -f stdout.out stdout.err || rc=1
exit $rc
END
cat > stderr.test <<'END'
#!/bin/sh
rc=0
jprog --hello-stderr >stderr.out 2>stderr.err || { echo \$?=$?; rc=1; }
sed 's/^/out:/' &2 # Likewise.
test -s stderr.out && rc=1
test "`cat stderr.err`" = 'Hello, Stream!' || rc=1
rm -f stderr.out stderr.err || rc=1
exit $rc
END
cat > badarg.test <<'END'
#!/bin/sh
jprog --bad-argument
END
chmod a+x *.test
## DO CHECKS ##
$ACLOCAL
$AUTOCONF
$AUTOMAKE
# To have the parallel testsuite more verbose.
VERBOSE=yes; export VERBOSE
./configure --prefix="$(pwd)/_inst"
cat PkgLocation.java # For debugging.
$MAKE check
$MAKE install
$MAKE test-installed
$MAKE run-installed
$MAKE distcheck
: