]> git.ipfire.org Git - thirdparty/autoconf.git/commitdiff
add AT_CHECK_EUNIT autotest macro
authorRomain Lenglet <romain.lenglet@berabera.info>
Sat, 1 Aug 2009 13:28:56 +0000 (22:28 +0900)
committerPaolo Bonzini <bonzini@gnu.org>
Sun, 2 Aug 2009 06:20:57 +0000 (08:20 +0200)
* lib/autotest/specific.m4: New file.
* lib/autotest/Makefile.am (dist_autotestlib_DATA): Add specific.m4.
* lib/autoconf/autotest.m4 (AC_CONFIG_TESTDIR): Add definitions of
variables used by AT_CHECK_EUNIT macro: ERL, ERLC, ERLCFLAGS.
* tests/autotest.at (Erlang Eunit unit tests): Add test for macro
AT_CHECK_EUNIT.
* doc/autoconf.texi (Writing Testsuites): Document macro AT_CHECK_EUNIT.
* NEWS: Mention macro AT_CHECK_EUNIT.

ChangeLog
NEWS
doc/autoconf.texi
lib/autoconf/autotest.m4
lib/autotest/Makefile.am
lib/autotest/autotest.m4
lib/autotest/specific.m4 [new file with mode: 0644]
tests/autotest.at

index c30770174471661f91ba2933c32020dda750b967..bd77e86d5ca491370d4f4782d9e0c825da806b3a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2009-08-01  Romain Lenglet  <romain.lenglet@laposte.net>
+           Paolo Bonzini  <bonzini@gnu.org>
+
+       * lib/autotest/specific.m4 (AT_CHECK_EUNIT): New file.
+       * lib/autotest/Makefile.am (dist_autotestlib_DATA): Add specific.m4.
+       * lib/autoconf/autotest.m4 (AC_CONFIG_TESTDIR): Add definitions of
+       variables used by AT_CHECK_EUNIT macro: ERL, ERLC, ERLCFLAGS.
+       * tests/autotest.at (Erlang Eunit unit tests): Add test for macro
+       AT_CHECK_EUNIT.
+       * doc/autoconf.texi (Writing Testsuites): Document macro
+       AT_CHECK_EUNIT.
+       * NEWS: Mention macro AT_CHECK_EUNIT.
+
 2009-07-30  Paolo Bonzini  <bonzini@gnu.org>
            Joel E. Denny  <jdenny@clemson.edu>
 
diff --git a/NEWS b/NEWS
index 7e8a522560ad000a055e7ac03d3a32c390f864d7..50f4e0efd816de3243d0d85980ad982d91c9c9ec 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -9,6 +9,9 @@ GNU Autoconf NEWS - User visible changes.
 
    These macros are present only for backwards compatibility purposes.
 
+** The following documented autotest macros are new:
+   AT_CHECK_EUNIT
+
 * Major changes in Autoconf 2.64 (2009-07-26) [stable]
   Released by Eric Blake, based on git versions 2.63b.*.
 
index c920d737c6f61185593bbc5fbeea5b313f801728..b1b38da7f789b2bd5e361522d47128fa8b696433 100644 (file)
@@ -22527,6 +22527,8 @@ of debugging scripts has the purpose of easing the chase for bugs.
 
 @item all the files created with @code{AT_DATA}
 
+@item all the Erlang source code files created with @code{AT_CHECK_EUNIT}
+
 @item a log of the run, named @file{testsuite.log}
 @end itemize
 
@@ -22901,6 +22903,56 @@ parameter, and the standard error contents are compared with
 @end table
 @end defmac
 
+@defmac AT_CHECK_EUNIT (@var{module}, @var{test-spec}, @ovar{erlflags}, @
+  @ovar{run-if-fail}, @ovar{run-if-pass})
+@atindex{CHECK_EUNIT}
+Initialize and execute an Erlang module named @var{module} that performs
+tests following the @var{test-spec} EUnit test specification.
+@var{test-spec} must be a valid EUnit test specification, as defined in
+the @uref{http://@/erlang.org/@/doc/@/apps/@/eunit/@/index.html, EUnit
+Reference Manual}.  @var{erlflags} are optional command-line options
+passed to the Erlang interpreter to execute the test Erlang module.
+Typically, @var{erlflags} defines at least the paths to directories
+containing the compiled Erlang modules under test, as @samp{-pa path1
+path2 ...}.
+
+For example, the unit tests associated with Erlang module @samp{testme},
+which compiled code is in subdirectory @file{src}, can be performed
+with:
+
+@example
+AT_CHECK_EUNIT([testme_testsuite], [@{module, testme@}],
+               [-pa "$@{abs_top_builddir@}/src"])
+@end example
+
+This macro must be invoked in between @code{AT_SETUP} and @code{AT_CLEANUP}.
+
+Variables @code{ERL}, @code{ERLC}, and (optionally) @code{ERLCFLAGS}
+must be defined as the path of the Erlang interpreter, the path of the
+Erlang compiler, and the command-line flags to pass to the compiler,
+respectively.  Those variables should be configured in
+@file{configure.ac} using the @command{AC_ERLANG_PATH_ERL} and
+@command{AC_ERLANG_PATH_ERLC} macros, and the configured values of those
+variables are automatically defined in the testsuite.  If @code{ERL} or
+@code{ERLC} is not defined, the test group is skipped.
+
+If the EUnit library cannot be found, i.e. if module @code{eunit} cannot
+be loaded, the test group is skipped.  Otherwise, if @var{test-spec} is
+an invalid EUnit test specification, the test group fails.  Otherwise,
+if the EUnit test passes, shell commands @var{run-if-pass} are executed
+or, if the EUnit test fails, shell commands @var{run-if-fail} are
+executed and the test group fails.
+
+Only the generated test Erlang module is automatically compiled and
+executed.  If @var{test-spec} involves testing other Erlang modules,
+e.g. module @samp{testme} in the example above, those modules must be
+already compiled.
+
+If the testsuite is run in verbose mode, with option @option{--verbose},
+EUnit is also run in verbose mode to output more details about
+individual unit tests.
+@end defmac
+
 
 @node testsuite Invocation
 @section Running @command{testsuite} Scripts
index 72b4b7fb3cc2a48515f89394e58732c2db56e0cb..aec589b3125746665c30d02505fb43a6df8adecb 100644 (file)
@@ -84,6 +84,16 @@ at_top_builddir=\$at_top_build_prefix
 AUTOTEST_PATH='m4_default([$2], [$1])'
 
 SHELL=\${CONFIG_SHELL-'$SHELL'}
+m4_provide_if([AC_ERLANG_PATH_ERL], [
+ERL='$ERL'
+])dnl
+m4_provide_if([AC_ERLANG_PATH_ERLC], [
+ERLC='$ERLC'
+ERLCFLAGS='$ERLCFLAGS'
+])dnl
 ATEOF
-])
-])# AC_CONFIG_TESTDIR
+],
+[m4_provide_if([AC_ERLANG_PATH_ERL], [ERL="$ERL"
+])m4_provide_if([AC_ERLANG_PATH_ERLC], [ERLC="$ERLC"
+ERLCFLAGS="$ERLCFLAGS"
+])])])# AC_CONFIG_TESTDIR
index d310e460242a914e1c407ea9438f86ef47f2ae18..006b7ef80ce8dfa29f86f2a71c6eeeff6b9f6eac 100644 (file)
@@ -16,7 +16,7 @@
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 autotestlibdir = $(pkgdatadir)/autotest
-dist_autotestlib_DATA = autotest.m4 general.m4
+dist_autotestlib_DATA = autotest.m4 general.m4 specific.m4
 nodist_autotestlib_DATA = autotest.m4f
 CLEANFILES = $(nodist_autotestlib_DATA)
 
index dead4c08cf72763ccbbbdf17f4a178b181722ff1..8e2002dc5f602d17b223c3ce1feb36c196ded58a 100644 (file)
@@ -45,3 +45,4 @@
 # to the GPL from your modified version.
 
 m4_include([autotest/general.m4])
+m4_include([autotest/specific.m4])
diff --git a/lib/autotest/specific.m4 b/lib/autotest/specific.m4
new file mode 100644 (file)
index 0000000..df32cfe
--- /dev/null
@@ -0,0 +1,93 @@
+# This file is part of Autoconf.                          -*- Autoconf -*-
+# M4 macros used in running tests using third-party testing tools.
+m4_define([_AT_COPYRIGHT_YEARS],
+[Copyright (C) 2009 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+# As a special exception, the Free Software Foundation gives unlimited
+# permission to copy, distribute and modify the configure scripts that
+# are the output of Autoconf.  You need not follow the terms of the GNU
+# General Public License when using or distributing such scripts, even
+# though portions of the text of Autoconf appear in them.  The GNU
+# General Public License (GPL) does govern all other use of the material
+# that constitutes the Autoconf program.
+#
+# Certain portions of the Autoconf source text are designed to be copied
+# (in certain cases, depending on the input) into the output of
+# Autoconf.  We call these the "data" portions.  The rest of the Autoconf
+# source text consists of comments plus executable code that decides which
+# of the data portions to output in any given case.  We call these
+# comments and executable code the "non-data" portions.  Autoconf never
+# copies any of the non-data portions into its output.
+#
+# This special exception to the GPL applies to versions of Autoconf
+# released by the Free Software Foundation.  When you make and
+# distribute a modified version of Autoconf, you may extend this special
+# exception to the GPL to apply to your modified version as well, *unless*
+# your modified version has the potential to copy into its output some
+# of the text that was the non-data portion of the version that you started
+# with.  (In other words, unless your change moves or copies text from
+# the non-data portions to the data portions.)  If your modification has
+# such potential, you must delete any notice of this special exception
+# to the GPL from your modified version.
+
+
+## ------------------------ ##
+## Erlang EUnit unit tests.  ##
+## ------------------------ ##
+
+# AT_CHECK_EUNIT(MODULE, SPEC, [ERLFLAGS], [RUN-IF-FAIL], [RUN-IF-PASS])
+# ----------------------------------------------------------------------
+# Check that the EUnit test specification SPEC passes. The ERLFLAGS
+# optional flags are passed to the Erlang interpreter command line to
+# execute the test. The test is executed from an automatically
+# generated Erlang module named MODULE. Each call to this macro should
+# have a distinct MODULE name within each test group, to ease
+# debugging.
+# An Erlang/OTP version which contains the eunit library must be
+# installed, in order to execute this macro in a test suite.  The ERL,
+# ERLC, and ERLCFLAGS variables must be defined in atconfig,
+# typically by using the AC_ERLANG_PATH_ERL and AC_ERLANG_PATH_ERLC
+# Autoconf macros.
+_AT_DEFINE_SETUP([AT_CHECK_EUNIT],
+[AT_SKIP_IF([test ! -f "$ERL" || test ! -f "$ERLC"])
+## A wrapper to EUnit, to exit the Erlang VM with the right exit code:
+AT_DATA([$1.erl],
+[[-module($1).
+-export([test/0, test/1]).
+test() -> test([]).
+test(Options) ->
+  TestSpec = $2,
+  ReturnValue = case code:load_file(eunit) of
+    {module, _} -> case eunit:test(TestSpec, Options) of
+        ok -> 0; %% test passes
+        _  -> 1  %% test fails
+      end;
+    _ -> 77 %% EUnit not found, test skipped
+  end,
+  init:stop(ReturnValue).
+]])
+AT_CHECK(["$ERLC" $ERLCFLAGS -b beam $1.erl])
+## Make EUnit verbose when testsuite is verbose:
+if test -z "$at_verbose"; then
+  at_eunit_options="verbose"
+else
+  at_eunit_options=""
+fi
+AT_CHECK(["$ERL" $3 -s $1 test $at_eunit_options -noshell], [0], [ignore], [],
+         [$4], [$5])
+])
index 78364394d8f830a9c934e68899d68b00f4891307..162bbb7a452e41a23e3a82509fa452111481084d 100644 (file)
@@ -1429,3 +1429,93 @@ m4_include([sub/two  spaces.at])
 AT_CHECK([$CONFIG_SHELL ./suite], [0], [stdout])
 AT_CHECK([grep 'two spaces' suite.log], [1])
 AT_CLEANUP
+
+
+## ------------------------- ##
+## Erlang EUnit unit tests.  ##
+## ------------------------- ##
+
+AT_SETUP([Erlang Eunit unit tests])
+AT_KEYWORDS([Erlang])
+
+mkdir s t
+AT_DATA([configure.ac], [[AC_INIT
+AC_ERLANG_PATH_ERL([not found])
+AC_ERLANG_PATH_ERLC([not found])
+if test "$ERL" = "not found" || test "$ERLC" = "not found"; then
+  HAVE_ERLANG=no
+  HAVE_EUNIT=no
+else
+  HAVE_ERLANG=yes
+  AC_ERLANG_CHECK_LIB([eunit], [HAVE_EUNIT=yes], [HAVE_EUNIT=no])
+fi
+AC_SUBST([HAVE_ERLANG])
+AC_SUBST([HAVE_EUNIT])
+
+AC_CONFIG_TESTDIR([t])
+AC_CONFIG_FILES([s/compile], [chmod +x s/compile])
+AC_CONFIG_FILES([erlang.conf])
+AC_OUTPUT
+]])
+cp "$abs_top_srcdir/build-aux/install-sh" pkg
+
+# File to pass info back to us
+AT_DATA([erlang.conf.in],
+[[HAVE_ERLANG=@HAVE_ERLANG@
+HAVE_EUNIT=@HAVE_EUNIT@
+]])
+
+# Erlang module to test:
+AT_DATA([s/testme.erl],
+[[-module(testme).
+-export([foo/1]).
+foo(1) -> one;
+foo(2) -> two;
+foo(_) -> other.
+]])
+
+# Corresponding Eunit unit test module:
+AT_DATA([s/testme_tests.erl],
+[[-module(testme_tests).
+-include_lib("eunit/include/eunit.hrl").
+foo_one_test() -> ?assertEqual(one, testme:foo(1)).
+foo_two_test() -> ?assertEqual(two, testme:foo(2)).
+foo_other_test() -> ?assertEqual(other, testme:foo(42)).
+]])
+
+# Compilation script:
+AT_DATA([s/compile.in],
+[["@ERLC@" -b beam testme.erl testme_tests.erl
+]])
+
+AT_CHECK_AT_PREP([suite],
+[[AT_INIT([suite to check EUnit integration])
+AT_SETUP([my only test])
+AT_CHECK_EUNIT([my_testsuite], [{module, testme}],
+              [-pa "${abs_top_builddir}/s"])
+AT_CLEANUP
+]], [], [], [], [t])
+
+AT_CHECK_AUTOCONF
+AT_CHECK_CONFIGURE
+. ./erlang.conf
+
+AT_CHECK([grep '^ERL='\''.*'\' t/atconfig], [], [ignore])
+AT_CHECK([grep '^ERLC='\''.*'\' t/atconfig], [], [ignore])
+AT_CHECK([grep '^ERLCFLAGS='\''.*'\' t/atconfig], [], [ignore])
+
+if test "$HAVE_ERLANG" = yes && test "$HAVE_EUNIT" = yes; then
+  AT_CHECK([cd s && $CONFIG_SHELL ./compile])
+fi
+
+AT_CHECK([cd t && $CONFIG_SHELL ./suite], [], [ignore])
+
+if test "$HAVE_EUNIT" = yes; then
+  AT_CHECK([grep 1.*successful t/suite.log], [], [ignore])
+  AT_CHECK([grep -v skipped t/suite.log], [], [ignore])
+else
+  AT_CHECK([grep 1.*skipped t/suite.log], [], [ignore])
+  AT_CHECK([grep 0.*successful t/suite.log], [], [ignore])
+fi
+
+AT_CLEANUP