Add --enable-installed-tests configure option
authorColin Walters <walters@verbum.org>
Mon, 6 May 2013 13:47:00 +0000 (09:47 -0400)
committerColin Walters <walters@verbum.org>
Thu, 16 May 2013 12:51:57 +0000 (08:51 -0400)
See https://live.gnome.org/GnomeGoals/InstalledTests for more
information.

The tests now support being run both uninstalled and installed, so
'make check' works for those who want it.  For tests which need data
files, the way this works is they look in the compiled in value of
SRCDIR by default, and the generated tests use "env G_TEST_DATA=" to
override that.

This patch only converts glib/tests for now; if this patch looks good,
I'll do the rest of the tests.

https://bugzilla.gnome.org/show_bug.cgi?id=699079

.gitignore
configure.ac
glib/tests/Makefile.am
glib/tests/bookmarkfile.c
glib/tests/keyfile.c
glib/tests/mappedfile.c
glib/tests/markup-parse.c
glib/tests/protocol.c

index 52cb21d..7243e1f 100644 (file)
@@ -18,6 +18,7 @@ TAGS
 *.stp
 *.exe
 *.def
+*.test
 
 # autofoo stuff here
 compile
index 47bcfb4..787334c 100644 (file)
@@ -258,7 +258,12 @@ AC_ARG_ENABLE(modular_tests,
               AS_HELP_STRING([--disable-modular-tests],
                              [Disable build of test programs (default: no)]),,
               [enable_modular_tests=yes])
-AM_CONDITIONAL(BUILD_MODULAR_TESTS, test x$enable_modular_tests = xyes)
+AC_ARG_ENABLE(installed_tests,
+              AS_HELP_STRING([--enable-installed-tests],
+                             [Install test programs (default: no)]),,
+              [enable_installed_tests=no])
+AM_CONDITIONAL(BUILD_MODULAR_TESTS, test x$enable_modular_tests = xyes || test x$enable_installed_tests=xyes)
+AM_CONDITIONAL(BUILDOPT_INSTALL_TESTS, test x$enable_installed_tests = xyes)
 
 AC_MSG_CHECKING([whether to enable garbage collector friendliness])
 AS_IF([test "x$enable_gc_friendly" = "xyes"], [
index 9d19871..c1a3dd9 100644 (file)
@@ -1,6 +1,8 @@
 include $(top_srcdir)/Makefile.decl
 NULL =
 
+insttestdir=$(pkglibexecdir)/installed-tests
+
 bookmark_test_files = \
        bookmarks/fail-01.xbel \
        bookmarks/fail-02.xbel \
@@ -65,7 +67,12 @@ AM_CFLAGS = $(GLIB_WARN_CFLAGS)
 
 LDADD = $(top_builddir)/glib/libglib-2.0.la -lm
 
-TEST_PROGS +=                          \
+TEST_PROGS +=                          \
+       1bit-emufutex                   \
+       gwakeup                         \
+       $(NULL)
+
+all_test_programs =                    \
        array-test                      \
        asyncqueue                      \
        atomic                          \
@@ -86,7 +93,6 @@ TEST_PROGS +=                                 \
        fileutils                       \
        gdatetime                       \
        gvariant                        \
-       gwakeup                         \
        hash                            \
        hmac                            \
        hook                            \
@@ -137,11 +143,43 @@ TEST_PROGS +=                             \
        unicode                         \
        uri                             \
        1bit-mutex                      \
-       1bit-emufutex                   \
        642026                          \
        642026-ec
 
-noinst_PROGRAMS = $(TEST_PROGS) test-spawn-echo
+if OS_UNIX
+all_test_programs += unix
+all_test_programs += include
+endif
+
+extra_test_binaries = test-spawn-echo
+
+if BUILD_MODULAR_TESTS
+TEST_PROGS += $(all_test_programs)
+noinst_PROGRAMS = $(TEST_PROGS) $(extra_test_binaries)
+endif
+
+if BUILDOPT_INSTALL_TESTS
+insttest_PROGRAMS = $(all_test_programs) $(extra_test_binaries)
+testmetadir = $(datadir)/installed-tests/$(PACKAGE)
+testmeta_DATA = $(all_test_programs:=.test)
+
+testdatadir=$(insttestdir)
+testdata_DATA = $(test_files)
+
+testdata_SCRIPTS = $(test_script_files)
+
+bookmarksdir=$(insttestdir)/bookmarks
+bookmarks_DATA = $(bookmark_test_files)
+
+markupsdir=$(insttestdir)/markups
+markups_DATA = $(all_markup_test_files)
+endif
+
+%.test: % Makefile
+       $(AM_V_GEN) (echo '[Test]' > $@.tmp; \
+        echo 'Type=session' >> $@.tmp; \
+        echo 'Exec=env G_TEST_DATA=$(pkglibexecdir)/installed-tests $(pkglibexecdir)/installed-tests/$<' >> $@.tmp; \
+        mv $@.tmp $@)
 
 atomic_CFLAGS  = $(AM_CFLAGS)
 if HAVE_GCC
@@ -164,9 +202,6 @@ endif
 
 if OS_UNIX
 
-TEST_PROGS += unix
-TEST_PROGS += include
-
 # some testing of gtester functionality
 XMLLINT = xmllint
 
index 10efaa5..22df6a9 100644 (file)
@@ -268,6 +268,7 @@ main (int argc, char *argv[])
   GError *error;
   const gchar *name;
   gchar *path;
+  const gchar *datapath;
 
   g_test_init (&argc, &argv, NULL);
 
@@ -278,12 +279,18 @@ main (int argc, char *argv[])
     }
 
   error = NULL;
-  dir = g_dir_open (SRCDIR "/bookmarks", 0, &error);
+  if (g_getenv ("G_TEST_DATA"))
+    datapath = g_getenv ("G_TEST_DATA");
+  else
+    datapath = SRCDIR;
+  path = g_build_filename (datapath, "bookmarks", NULL);
+  dir = g_dir_open (path, 0, &error);
+  g_free (path);
   g_assert_no_error (error);
   while ((name = g_dir_read_name (dir)) != NULL)
     {
       path = g_strdup_printf ("/bookmarks/parse/%s", name);
-      g_test_add_data_func_full (path, g_build_filename (SRCDIR, "bookmarks", name, NULL),
+      g_test_add_data_func_full (path, g_build_filename (datapath, "bookmarks", name, NULL),
                                  test_file, g_free);
       g_free (path);
     }
index 671637b..d37a9a0 100644 (file)
@@ -3,6 +3,8 @@
 #include <string.h>
 #include <stdlib.h>
 
+static const gchar *datapath;
+
 static GKeyFile *
 load_data (const gchar   *data,
            GKeyFileFlags  flags)
@@ -1337,10 +1339,13 @@ test_load_fail (void)
 {
   GKeyFile *file;
   GError *error;
+  gchar *path;
 
   file = g_key_file_new ();
   error = NULL;
-  g_assert (!g_key_file_load_from_file (file, SRCDIR "/keyfile.c", 0, &error));
+  path = g_build_filename (datapath, "keyfile.c", NULL);
+  g_assert (!g_key_file_load_from_file (file, path, 0, &error));
+  g_free (path);
   g_assert_error (error, G_KEY_FILE_ERROR, G_KEY_FILE_ERROR_PARSE);
   g_clear_error (&error);
   g_assert (!g_key_file_load_from_file (file, "/nosuchfile", 0, &error));
@@ -1395,6 +1400,7 @@ test_page_boundary (void)
   GKeyFile *file;
   GError *error;
   gint i;
+  gchar *path;
 
 #define GROUP "main_section"
 #define KEY_PREFIX "fill_abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvw_"
@@ -1407,7 +1413,9 @@ test_page_boundary (void)
   file = g_key_file_new ();
 
   error = NULL;
-  g_key_file_load_from_file (file, SRCDIR "/pages.ini", G_KEY_FILE_NONE, &error);
+  path = g_build_filename (datapath, "pages.ini", NULL);
+  g_key_file_load_from_file (file, path, G_KEY_FILE_NONE, &error);
+  g_free (path);
   g_assert_no_error (error);
 
   for (i = FIRST_KEY; i <= LAST_KEY; i++)
@@ -1569,8 +1577,13 @@ test_roundtrip (void)
 int
 main (int argc, char *argv[])
 {
+  if (g_getenv ("G_TEST_DATA"))
+    datapath = g_getenv ("G_TEST_DATA");
+  else
+    datapath = SRCDIR;
+
 #ifdef G_OS_UNIX
-  g_setenv ("XDG_DATA_HOME", SRCDIR, TRUE);
+  g_setenv ("XDG_DATA_HOME", datapath, TRUE);
 #endif
 
   g_test_init (&argc, &argv, NULL);
index caa3ee6..f366ee9 100644 (file)
 #include <sys/types.h>
 #include <fcntl.h>
 
+static const gchar *datapath;
+
 static void
 test_basic (void)
 {
   GMappedFile *file;
   GError *error;
+  gchar *path;
 
   error = NULL;
-  file = g_mapped_file_new (SRCDIR "/empty", FALSE, &error);
+  path = g_build_filename (datapath, "empty", NULL);
+  file = g_mapped_file_new (path, FALSE, &error);
+  g_free (path);
   g_assert_no_error (error);
 
   g_mapped_file_ref (file);
@@ -32,9 +37,12 @@ test_empty (void)
 {
   GMappedFile *file;
   GError *error;
+  gchar *path;
 
   error = NULL;
-  file = g_mapped_file_new (SRCDIR "/empty", FALSE, &error);
+  path = g_build_filename (datapath, "empty", NULL);
+  file = g_mapped_file_new (path, FALSE, &error);
+  g_free (path);
   g_assert_no_error (error);
 
   g_assert (g_mapped_file_get_contents (file) == NULL);
@@ -82,7 +90,7 @@ test_writable (void)
   char *srcpath;
   gchar *tmp_copy_path;
 
-  srcpath = g_build_filename (SRCDIR, "4096-random-bytes", NULL);
+  srcpath = g_build_filename (datapath, "4096-random-bytes", NULL);
   tmp_copy_path = g_build_filename (g_get_user_runtime_dir (), "glib-test-4096-random-bytes", NULL);
 
   g_file_get_contents (srcpath, &contents, &len, &error);
@@ -129,7 +137,7 @@ test_writable_fd (void)
   char *srcpath;
   gchar *tmp_copy_path;
 
-  srcpath = g_build_filename (SRCDIR, "4096-random-bytes", NULL);
+  srcpath = g_build_filename (datapath, "4096-random-bytes", NULL);
   tmp_copy_path = g_build_filename (g_get_user_runtime_dir (), "glib-test-4096-random-bytes", NULL);
 
   g_file_get_contents (srcpath, &contents, &len, &error);
@@ -174,9 +182,12 @@ test_gbytes (void)
   GMappedFile *file;
   GBytes *bytes;
   GError *error;
+  gchar *path;
 
   error = NULL;
-  file = g_mapped_file_new (SRCDIR "/empty", FALSE, &error);
+  path = g_build_filename (datapath, "empty", NULL);
+  file = g_mapped_file_new (path, FALSE, &error);
+  g_free (path);
   g_assert_no_error (error);
 
   bytes = g_mapped_file_get_bytes (file);
@@ -189,6 +200,11 @@ test_gbytes (void)
 int
 main (int argc, char *argv[])
 {
+  if (g_getenv ("G_TEST_DATA"))
+    datapath = g_getenv ("G_TEST_DATA");
+  else
+    datapath = SRCDIR;
+
   g_test_init (&argc, &argv, NULL);
 
   g_test_add_func ("/mappedfile/basic", test_basic);
index 4083946..e2c8e9a 100644 (file)
@@ -8,6 +8,7 @@
 
 static int depth = 0;
 static GString *string;
+static const gchar *datapath;
 
 static void
 indent (int extra)
@@ -277,6 +278,11 @@ main (int argc, char *argv[])
   const gchar *name;
   gchar *path;
 
+  if (g_getenv ("G_TEST_DATA"))
+    datapath = g_getenv ("G_TEST_DATA");
+  else
+    datapath = SRCDIR;
+
   g_setenv ("LANG", "en_US.utf-8", TRUE);
   setlocale (LC_ALL, "");
 
@@ -292,7 +298,9 @@ main (int argc, char *argv[])
     }
 
   error = NULL;
-  dir = g_dir_open (SRCDIR "/markups", 0, &error);
+  path = g_build_filename (datapath, "markups", NULL);
+  dir = g_dir_open (path, 0, &error);
+  g_free (path);
   g_assert_no_error (error);
   while ((name = g_dir_read_name (dir)) != NULL)
     {
@@ -300,7 +308,7 @@ main (int argc, char *argv[])
         continue;
 
       path = g_strdup_printf ("/markup/parse/%s", name);
-      g_test_add_data_func_full (path, g_build_filename (SRCDIR, "markups", name, NULL),
+      g_test_add_data_func_full (path, g_build_filename (datapath, "markups", name, NULL),
                                  test_parse, g_free);
       g_free (path);
     }
index cad7ed3..1783630 100644 (file)
@@ -30,6 +30,8 @@
 #define pipe(fds) _pipe(fds, 4096, _O_BINARY)
 #endif
 
+static const char *argv0;
+
 static void
 debug (void)
 {
@@ -119,7 +121,7 @@ static void
 test_message (void)
 {
   gchar* argv[] = {
-          "./protocol",
+          argv0,
           NULL,
           "--GTestSubprocess",
           "-p", "/glib/testing/protocol/debug",
@@ -239,7 +241,7 @@ test_error (void)
   for (i = 0; i < G_N_ELEMENTS (tests); i++)
     {
       gchar* argv[] = {
-              "./protocol",
+              argv0,
               NULL,
               "--GTestSubprocess",
               "-p", tests[i],
@@ -336,6 +338,8 @@ int
 main (int   argc,
       char**argv)
 {
+  argv0 = argv[0];
+
   g_test_init (&argc, &argv, NULL);
 
   /* we use ourself as the testcase, these are the ones we need internally */