[gjs] build: Use Automake test driver with TAP output
- From: Philip Chimento <pchimento src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gjs] build: Use Automake test driver with TAP output
- Date: Wed, 30 Nov 2016 06:21:33 +0000 (UTC)
commit 8feb2e491d71b43d04516a5105acc849e9b48a10
Author: Philip Chimento <philip chimento gmail com>
Date: Sat Oct 22 23:21:41 2016 -0700
build: Use Automake test driver with TAP output
For better integration with the build system and nicer output, use
Automake's TAP driver and gtester's TAP output mode.
There are a few things going on in this commit:
- We don't put logs in test_user_data/logs anymore. That really assumed
in the first place that all tests would be run serially, and we want
them to be run in parallel. So we'll let Automake take care of the
stderr and debug outputs and redirect them to a per-test log file.
- We use the significant-to-Automake variable TESTS instead of
TEST_PROGS. TESTS contains whatever is in check_PROGRAMS plus whatever
else we put into it (our test script.)
- TESTS_ENVIRONMENT is also significant to Automake, but should not be
set within Automake, instead the AM_TESTS_ENVIRONMENT variable should
be used so that the developer can override TESTS_ENVIRONMENT from the
command line. This variable consists of a sequence of commands and
needs to end with a semicolon. (So we can stuff XVFB_START in there
too.)
- We need to put the test invocation in a separate script since gtester
doesn't pass the --tap option on to its test binary.
https://bugzilla.gnome.org/show_bug.cgi?id=775205
Makefile-insttest.am | 2 +-
Makefile-test.am | 76 ++++++++++++++++++++++--------------------
Makefile.am | 5 ++-
configure.ac | 2 +
installed-tests/gjs-unit.cpp | 25 ++++++++++---
test/run-test | 9 +++++
6 files changed, 74 insertions(+), 45 deletions(-)
---
diff --git a/Makefile-insttest.am b/Makefile-insttest.am
index d1a56e5..45d95e7 100644
--- a/Makefile-insttest.am
+++ b/Makefile-insttest.am
@@ -21,7 +21,7 @@ if BUILDOPT_INSTALL_TESTS
gjsinsttest_PROGRAMS += jsunit
endif
-TEST_PROGS += jsunit
+check_PROGRAMS += jsunit
TEST_INTROSPECTION_GIRS =
diff --git a/Makefile-test.am b/Makefile-test.am
index 7aff2cd..53a3040 100644
--- a/Makefile-test.am
+++ b/Makefile-test.am
@@ -1,6 +1,9 @@
-EXTRA_DIST += test/test-bus.conf
+EXTRA_DIST += \
+ test/test-bus.conf \
+ test/run-test \
+ $(NULL)
-TEST_PROGS_OPTIONS = 2>test_user_data/logs/stderr.log
+SKIPPED_TESTS =
if XVFB_TESTS
XVFB_INVOCATION = $(XVFB) -ac -noreset -screen 0 1024x768x16
@@ -16,32 +19,25 @@ ${XVFB_INVOCATION} -help 2>/dev/null 1>&2 \
&& { ${XVFB} :$$XID -nolisten tcp -auth /dev/null >/dev/null 2>&1 & \
trap "kill -15 $$! " 0 HUP INT QUIT TRAP USR1 PIPE TERM ; } \
|| { echo "Gtk+Tests:ERROR: Failed to start Xvfb environment for X11 target tests."; exit 1; } \
- && DISPLAY=:$$XID && export DISPLAY &&
+ && export DISPLAY=:$$XID;
else
XVFB_START =
endif
-if DBUS_TESTS
-LOG_COMPILER = $(DBUS_RUN_SESSION)
-AM_LOG_FLAGS = --config-file=$(srcdir)/test/test-bus.conf --
-RUN_WITH_DBUS = $(LOG_COMPILER) $(AM_LOG_FLAGS)
-else
-RUN_WITH_DBUS =
-TEST_PROGS_OPTIONS += -s /js/GDBus
+if !DBUS_TESTS
+SKIPPED_TESTS += /js/GDBus
endif
if !ENABLE_GTK
-TEST_PROGS_OPTIONS += -s /js/Gtk
+SKIPPED_TESTS += /js/Gtk
endif
-GTESTER = ${XVFB_START} ${TESTS_ENVIRONMENT} ${RUN_WITH_DBUS} gtester
-clean-local: test-user-data-clean
-
-test-user-data-clean:
- -rm -fr $(builddir)/test_user_data
+if !ENABLE_CAIRO
+SKIPPED_TESTS += /js/Cairo
+endif
########################################################################
-TEST_PROGS += gjs-tests
+check_PROGRAMS += gjs-tests
gjs_tests_CPPFLAGS = \
$(AM_CPPFLAGS) \
@@ -106,32 +102,40 @@ CLEANFILES += \
mock-js-resources.c \
$(NULL)
-check-local: gjs-tests
- $(MKDIR_P) test_user_data/logs
- @test -z "${TEST_PROGS}" || ${GTESTER} --verbose ${TEST_PROGS} ${TEST_PROGS_OPTIONS}
-
# GJS_PATH is empty here since we want to force the use of our own
-# resources
-TESTS_ENVIRONMENT = \
- TOP_SRCDIR=$(abs_top_srcdir) \
- TOP_BUILDDIR=$(abs_top_builddir) \
- XDG_DATA_HOME=test_user_data \
- GJS_DEBUG_OUTPUT=test_user_data/logs/gjs.log \
- GJS_USE_UNINSTALLED_FILES=1 \
- GJS_TEST_TIMEOUT=420 \
- GJS_PATH= \
- LD_LIBRARY_PATH="$(LD_LIBRARY_PATH):$(FIREFOX_JS_LIBDIR)" \
- G_FILENAME_ENCODING=latin1 # ensure filenames are not utf8 \
+# resources. G_FILENAME_ENCODING ensures filenames are not UTF-8.
+AM_TESTS_ENVIRONMENT = \
+ export TOP_SRCDIR="$(abs_top_srcdir)"; \
+ export TOP_BUILDDIR="$(abs_top_builddir)"; \
+ export GJS_USE_UNINSTALLED_FILES=1; \
+ export GJS_TEST_SKIP="$(SKIPPED_TESTS)"; \
+ export GJS_PATH=; \
+ export G_FILENAME_ENCODING=latin1; \
+ $(XVFB_START) \
$(NULL)
simple_tests = test/testCommandLine.sh
EXTRA_DIST += $(simple_tests)
-TESTS = $(simple_tests)
+TESTS += $(simple_tests)
+
+LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/tap-driver.sh
+
+if DBUS_TESTS
+LOG_COMPILER = $(DBUS_RUN_SESSION)
+AM_LOG_FLAGS = --config-file=$(srcdir)/test/test-bus.conf -- $(top_srcdir)/test/run-test
+else
+LOG_COMPILER = $(top_srcdir)/test/run-test
+AM_LOG_FLAGS =
+endif !DBUS_TESTS
+
+TEST_EXTENSIONS = .sh
+SH_LOG_COMPILER = sh
if CODE_COVERAGE_ENABLED
-TESTS_ENVIRONMENT += \
- GJS_UNIT_COVERAGE_OUTPUT=lcov \
- GJS_UNIT_COVERAGE_PREFIX=resource:///org/gnome/gjs/
+AM_TESTS_ENVIRONMENT += \
+ export GJS_UNIT_COVERAGE_OUTPUT=lcov; \
+ export GJS_UNIT_COVERAGE_PREFIX=resource:///org/gnome/gjs/; \
+ $(NULL)
endif
CODE_COVERAGE_IGNORE_PATTERN = */include/*
diff --git a/Makefile.am b/Makefile.am
index c0df6c2..e3da6a5 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -11,8 +11,8 @@ dist_gjsjs_DATA =
BUILT_SOURCES =
CLEANFILES =
EXTRA_DIST =
-TEST_PROGS =
-check_PROGRAMS = $(TEST_PROGS)
+check_PROGRAMS =
+TESTS = $(check_PROGRAMS)
INTROSPECTION_GIRS =
## ACLOCAL_AMFLAGS can be removed for Automake 1.13
ACLOCAL_AMFLAGS = -I m4
@@ -23,6 +23,7 @@ MAINTAINERCLEANFILES = \
$(GITIGNORE_MAINTAINERCLEANFILES_TOPLEVEL) \
$(GITIGNORE_MAINTAINERCLEANFILES_MAKEFILE_IN) \
$(GITIGNORE_MAINTAINERCLEANFILES_M4_LIBTOOL) \
+ tap-driver.sh \
$(NULL)
GITIGNOREFILES = INSTALL m4
diff --git a/configure.ac b/configure.ac
index afcebe0..8c041f5 100644
--- a/configure.ac
+++ b/configure.ac
@@ -14,6 +14,7 @@ AX_IS_RELEASE([git-directory])
AC_CONFIG_SRCDIR([gjs/console.cpp])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_HEADERS([config.h])
+AC_REQUIRE_AUX_FILE([tap-driver.sh])
AC_DEFINE([GJS_VERSION], pkg_int_version, [The gjs version as an integer])
@@ -39,6 +40,7 @@ LT_INIT([disable-static])
AC_PROG_MKDIR_P
AC_PROG_LN_S
AC_PROG_SED
+AC_PROG_AWK
AX_COMPILER_FLAGS
diff --git a/installed-tests/gjs-unit.cpp b/installed-tests/gjs-unit.cpp
index 034273f..a2075fe 100644
--- a/installed-tests/gjs-unit.cpp
+++ b/installed-tests/gjs-unit.cpp
@@ -35,21 +35,26 @@
#include "gjs/coverage.h"
#include "gjs/mem.h"
+static const char *skip;
+
typedef struct {
const char *coverage_prefix;
const char *coverage_output_path;
char *filename;
+ char *test_name;
} GjsTestData;
static GjsTestData *
gjs_unit_test_data_new(const char *coverage_prefix,
const char *coverage_output_path,
- char *filename)
+ char *filename,
+ char *test_name)
{
GjsTestData *data = (GjsTestData *) g_new0(GjsTestData, 1);
data->coverage_prefix = coverage_prefix;
data->coverage_output_path = coverage_output_path;
data->filename = filename;
+ data->test_name = test_name;
return data;
}
@@ -58,6 +63,7 @@ gjs_unit_test_data_free(gpointer test_data, gpointer user_data)
{
GjsTestData *data = (GjsTestData *) test_data;
g_free(data->filename);
+ g_free(data->test_name);
g_free(data);
}
@@ -118,6 +124,12 @@ test(GjsTestJSFixture *fix,
GjsTestData *data = (GjsTestData *) test_data;
+ if (skip && strstr(skip, data->test_name)) {
+ g_test_message("Skipping %s", data->test_name);
+ g_test_skip("due to GJS_TEST_SKIP environment variable");
+ return;
+ }
+
success = gjs_context_eval_file(fix->context, data->filename, &code, &error);
if (!success)
g_error("%s", error->message);
@@ -179,6 +191,7 @@ main(int argc, char **argv)
const char *coverage_prefix = g_getenv("GJS_UNIT_COVERAGE_PREFIX");
const char *coverage_output_directory = g_getenv("GJS_UNIT_COVERAGE_OUTPUT");
+ skip = g_getenv("GJS_TEST_SKIP");
all_tests = read_all_dir_sorted(js_test_dir);
for (iter = all_tests; iter; iter = iter->next) {
@@ -192,20 +205,20 @@ main(int argc, char **argv)
g_free(name);
continue;
}
- if (g_str_has_prefix (name, "testCairo") && g_getenv ("GJS_TEST_SKIP_CAIRO"))
- continue;
/* pretty print, drop 'test' prefix and '.js' suffix from test name */
test_name = g_strconcat("/js/", name + 4, NULL);
test_name[strlen(test_name)-3] = '\0';
file_name = g_build_filename(js_test_dir, name, NULL);
- test_data = gjs_unit_test_data_new(coverage_prefix, coverage_output_directory, file_name);
+ test_data = gjs_unit_test_data_new(coverage_prefix,
+ coverage_output_directory, file_name,
+ test_name);
g_test_add(test_name, GjsTestJSFixture, test_data, setup, test, teardown);
g_free(name);
- g_free(test_name);
all_registered_test_data = g_slist_prepend(all_registered_test_data, test_data);
- /* not freeing file_name or test_data yet as it's needed while running the test */
+ /* not freeing file_name, test_name, or test_data yet as it's needed
+ * while running the test */
}
g_free(js_test_dir);
g_slist_free(all_tests);
diff --git a/test/run-test b/test/run-test
new file mode 100755
index 0000000..028ffd3
--- /dev/null
+++ b/test/run-test
@@ -0,0 +1,9 @@
+#!/bin/sh -e
+# Run a GTester binary with TAP output
+
+if test -z "$1"; then
+ echo "Need a test-binary filename!"
+ exit 1
+fi
+
+"$1" --tap --keep-going --verbose
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]