diff options
author | Evgeny Vereshchagin <evvers@ya.ru> | 2017-02-17 11:38:23 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-17 11:38:23 +0300 |
commit | f73e6ee687213d8f78a93a9519901d0fe314c228 (patch) | |
tree | 30e41a1b946ad8391f806be4cb85250b97732715 | |
parent | 5c1be4f73082d09011661516c39fb53626d8bdc7 (diff) | |
parent | e53bcabb4b885ec998cc693e0788c3d68617bef2 (diff) |
Merge pull request #5338 from mbiebl/fix-install-tests-target
Fix "make install-tests" when srcdir != builddir, fix valgrind-tests
-rw-r--r-- | ENVIRONMENT.md | 5 | ||||
-rw-r--r-- | Makefile.am | 13 | ||||
-rw-r--r-- | src/resolve/test-dns-packet.c | 5 | ||||
-rw-r--r-- | src/shared/tests.c | 35 | ||||
-rw-r--r-- | src/shared/tests.h | 2 | ||||
-rw-r--r-- | src/test/test-cgroup-mask.c | 6 | ||||
-rw-r--r-- | src/test/test-engine.c | 5 | ||||
-rw-r--r-- | src/test/test-execute.c | 3 | ||||
-rw-r--r-- | src/test/test-helper.h | 5 | ||||
-rw-r--r-- | src/test/test-journal-importer.c | 6 | ||||
-rw-r--r-- | src/test/test-path.c | 2 | ||||
-rw-r--r-- | src/test/test-sched-prio.c | 5 |
12 files changed, 59 insertions, 33 deletions
diff --git a/ENVIRONMENT.md b/ENVIRONMENT.md index 1ad2addfee..e542d4ec6f 100644 --- a/ENVIRONMENT.md +++ b/ENVIRONMENT.md @@ -59,3 +59,8 @@ systemd-logind: * `$SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1` — if set, report that hibernation is available even if the swap devices do not provide enough room for it. + +installed systemd tests: + +* `$SYSTEMD_TEST_DATA` — override the location of test data. This is useful if + a test executable is moved to an arbitrary location. diff --git a/Makefile.am b/Makefile.am index c1f070fd17..dd10aabd36 100644 --- a/Makefile.am +++ b/Makefile.am @@ -152,7 +152,6 @@ endif AM_TESTS_ENVIRONMENT = \ export SYSTEMD_KBD_MODEL_MAP=$(abs_top_srcdir)/src/locale/kbd-model-map; \ export SYSTEMD_LANGUAGE_FALLBACK_MAP=$(abs_top_srcdir)/src/locale/language-fallback-map; \ - export TEST_DIR=$(abs_top_srcdir)/test; \ export PATH=$(abs_top_builddir):$$PATH; if ENABLE_BASH_COMPLETION @@ -252,6 +251,8 @@ AM_CPPFLAGS = \ -I $(top_srcdir)/src/libsystemd/sd-device \ -I $(top_srcdir)/src/libsystemd/sd-id128 \ -I $(top_srcdir)/src/libsystemd-network \ + -DABS_SRC_DIR=\"$(abs_top_srcdir)\" \ + -DABS_BUILD_DIR=\"$(abs_top_builddir)\" \ $(OUR_CPPFLAGS) AM_CFLAGS = $(OUR_CFLAGS) @@ -6615,7 +6616,7 @@ valgrind-tests: $(TESTS) if $(LIBTOOL) --mode=execute file $$f | grep -q shell; then \ echo -e "$${x}Skipping non-binary $$f"; else \ echo -e "$${x}Running $$f"; \ - $(LIBTOOL) --mode=execute valgrind -q --leak-check=full --max-stackframe=5242880 --error-exitcode=55 $(builddir)/$$f ; fi; \ + $(AM_TESTS_ENVIRONMENT) $(LIBTOOL) --mode=execute valgrind -q --leak-check=full --max-stackframe=5242880 --error-exitcode=55 $(builddir)/$$f ; fi; \ x="\n\n"; \ done @@ -6716,14 +6717,14 @@ tests += \ .PHONY: install-tests install-tests: $(tests) $(TEST_DATA_FILES) for f in $(tests); do \ - if [ -x .libs/$$f ]; then \ - install -D -m 755 .libs/$$f $(DESTDIR)/$(testsdir)/$$f; \ + if [ -x $(top_builddir)/.libs/$$f ]; then \ + install -D -m 755 $(top_builddir)/.libs/$$f $(DESTDIR)/$(testsdir)/$$f; \ else \ - install -D -m 755 $$f $(DESTDIR)/$(testsdir)/$$f; \ + install -D -m 755 $(top_builddir)/$$f $(DESTDIR)/$(testsdir)/$$f; \ fi; \ done for f in $(TEST_DATA_FILES); do \ - install -D -m 644 $$f $(DESTDIR)/$(testsdir)/testdata/$${f#test/}; \ + install -D -m 644 $(top_srcdir)/$$f $(DESTDIR)/$(testsdir)/testdata/$${f#test/}; \ done diff --git a/src/resolve/test-dns-packet.c b/src/resolve/test-dns-packet.c index 3ca7e78495..8cbe492526 100644 --- a/src/resolve/test-dns-packet.c +++ b/src/resolve/test-dns-packet.c @@ -29,10 +29,9 @@ #include "resolved-dns-rr.h" #include "string-util.h" #include "strv.h" +#include "tests.h" #include "unaligned.h" -#include "test-helper.h" - #define HASH_KEY SD_ID128_MAKE(d3,1e,48,90,4b,fa,4c,fe,af,9d,d5,a1,d7,2e,8a,b1) static void verify_rr_copy(DnsResourceRecord *rr) { @@ -117,7 +116,7 @@ int main(int argc, char **argv) { N = argc - 1; fnames = argv + 1; } else { - assert_se(glob(TEST_DATA_DIR("/test-resolve/*.pkts"), GLOB_NOSORT, NULL, &g) == 0); + assert_se(glob(get_testdata_dir("/test-resolve/*.pkts"), GLOB_NOSORT, NULL, &g) == 0); N = g.gl_pathc; fnames = g.gl_pathv; } diff --git a/src/shared/tests.c b/src/shared/tests.c index 7034687725..f300bbc66f 100644 --- a/src/shared/tests.c +++ b/src/shared/tests.c @@ -24,6 +24,7 @@ #include <util.h> #include "tests.h" +#include "path-util.h" char* setup_fake_runtime_dir(void) { char t[] = "/tmp/fake-xdg-runtime-XXXXXX", *p; @@ -35,12 +36,38 @@ char* setup_fake_runtime_dir(void) { return p; } -const char* get_exe_relative_testdata_dir(void) { - _cleanup_free_ char *exedir = NULL; +const char* get_testdata_dir(const char *suffix) { + const char *env; /* convenience: caller does not need to free result */ static char testdir[PATH_MAX]; - assert_se(readlink_and_make_absolute("/proc/self/exe", &exedir) >= 0); - assert_se(snprintf(testdir, sizeof(testdir), "%s/testdata", dirname(exedir)) > 0); + /* if the env var is set, use that */ + env = getenv("SYSTEMD_TEST_DATA"); + testdir[sizeof(testdir) - 1] = '\0'; + if (env) { + if (access(env, F_OK) < 0) { + fputs("ERROR: $SYSTEMD_TEST_DATA directory does not exist\n", stderr); + exit(1); + } + strncpy(testdir, env, sizeof(testdir) - 1); + } else { + _cleanup_free_ char *exedir = NULL; + assert_se(readlink_and_make_absolute("/proc/self/exe", &exedir) >= 0); + + /* Check if we're running from the builddir. If so, use the compiled in path. */ + if (path_startswith(exedir, ABS_BUILD_DIR)) + assert_se(snprintf(testdir, sizeof(testdir), "%s/test", ABS_SRC_DIR) > 0); + else + /* Try relative path, according to the install-test layout */ + assert_se(snprintf(testdir, sizeof(testdir), "%s/testdata", dirname(exedir)) > 0); + + /* test this without the suffix, as it may contain a glob */ + if (access(testdir, F_OK) < 0) { + fputs("ERROR: Cannot find testdata directory, set $SYSTEMD_TEST_DATA\n", stderr); + exit(1); + } + } + + strncpy(testdir + strlen(testdir), suffix, sizeof(testdir) - strlen(testdir) - 1); return testdir; } diff --git a/src/shared/tests.h b/src/shared/tests.h index 0100b48937..7055124990 100644 --- a/src/shared/tests.h +++ b/src/shared/tests.h @@ -20,4 +20,4 @@ ***/ char* setup_fake_runtime_dir(void); -const char* get_exe_relative_testdata_dir(void); +const char* get_testdata_dir(const char *suffix); diff --git a/src/test/test-cgroup-mask.c b/src/test/test-cgroup-mask.c index 630587aaf1..b42088c680 100644 --- a/src/test/test-cgroup-mask.c +++ b/src/test/test-cgroup-mask.c @@ -27,6 +27,7 @@ #include "unit.h" static int test_cgroup_mask(void) { + _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL; Manager *m = NULL; Unit *son, *daughter, *parent, *root, *grandchild, *parent_deep; FILE *serial = NULL; @@ -34,7 +35,8 @@ static int test_cgroup_mask(void) { int r; /* Prepare the manager. */ - assert_se(set_unit_path(TEST_DATA_DIR("")) >= 0); + assert_se(set_unit_path(get_testdata_dir("")) >= 0); + assert_se(runtime_dir = setup_fake_runtime_dir()); r = manager_new(UNIT_FILE_USER, true, &m); if (r == -EPERM || r == -EACCES) { puts("manager_new: Permission denied. Skipping test."); @@ -110,10 +112,8 @@ static int test_cgroup_mask(void) { } int main(int argc, char* argv[]) { - _cleanup_(rm_rf_physical_and_freep) char *runtime_dir = NULL; int rc = 0; - assert_se(runtime_dir = setup_fake_runtime_dir()); TEST_REQ_RUNNING_SYSTEMD(rc = test_cgroup_mask()); return rc; diff --git a/src/test/test-engine.c b/src/test/test-engine.c index 3ec2dfe10e..8133343fb3 100644 --- a/src/test/test-engine.c +++ b/src/test/test-engine.c @@ -37,10 +37,9 @@ int main(int argc, char *argv[]) { Job *j; int r; - assert_se(runtime_dir = setup_fake_runtime_dir()); - /* prepare the test */ - assert_se(set_unit_path(TEST_DATA_DIR("")) >= 0); + assert_se(set_unit_path(get_testdata_dir("")) >= 0); + assert_se(runtime_dir = setup_fake_runtime_dir()); r = manager_new(UNIT_FILE_USER, true, &m); if (MANAGER_SKIP_TEST(r)) { log_notice_errno(r, "Skipping test: manager_new: %m"); diff --git a/src/test/test-execute.c b/src/test/test-execute.c index 145aa37a66..90540b884b 100644 --- a/src/test/test-execute.c +++ b/src/test/test-execute.c @@ -35,6 +35,7 @@ #endif #include "stat-util.h" #include "test-helper.h" +#include "tests.h" #include "unit.h" #include "util.h" #include "virt.h" @@ -516,7 +517,7 @@ int main(int argc, char *argv[]) { } assert_se(setenv("XDG_RUNTIME_DIR", "/tmp/", 1) == 0); - assert_se(set_unit_path(TEST_DATA_DIR("/test-execute/")) >= 0); + assert_se(set_unit_path(get_testdata_dir("/test-execute")) >= 0); /* Unset VAR1, VAR2 and VAR3 which are used in the PassEnvironment test * cases, otherwise (and if they are present in the environment), diff --git a/src/test/test-helper.h b/src/test/test-helper.h index 4e633ae6d8..ddb10f88fd 100644 --- a/src/test/test-helper.h +++ b/src/test/test-helper.h @@ -20,8 +20,6 @@ ***/ #include "sd-daemon.h" -#include "string-util.h" -#include "tests.h" #include "macro.h" @@ -41,6 +39,3 @@ -ENOENT, \ -ENOMEDIUM /* cannot determine cgroup */ \ ) - -#define TEST_DATA_DIR(subdir) \ - strjoina(getenv("TEST_DIR") ?: get_exe_relative_testdata_dir(), subdir) diff --git a/src/test/test-journal-importer.c b/src/test/test-journal-importer.c index 1f0684863e..a61212ce7b 100644 --- a/src/test/test-journal-importer.c +++ b/src/test/test-journal-importer.c @@ -24,7 +24,7 @@ #include "log.h" #include "journal-importer.h" #include "string-util.h" -#include "test-helper.h" +#include "tests.h" static void assert_iovec_entry(const struct iovec *iovec, const char* content) { assert_se(strlen(content) == iovec->iov_len); @@ -39,7 +39,7 @@ static void test_basic_parsing(void) { _cleanup_(journal_importer_cleanup) JournalImporter imp = {}; int r; - imp.fd = open(TEST_DATA_DIR("/journal-data/journal-1.txt"), O_RDONLY|O_CLOEXEC); + imp.fd = open(get_testdata_dir("/journal-data/journal-1.txt"), O_RDONLY|O_CLOEXEC); assert_se(imp.fd >= 0); do @@ -68,7 +68,7 @@ static void test_bad_input(void) { _cleanup_(journal_importer_cleanup) JournalImporter imp = {}; int r; - imp.fd = open(TEST_DATA_DIR("/journal-data/journal-2.txt"), O_RDONLY|O_CLOEXEC); + imp.fd = open(get_testdata_dir("/journal-data/journal-2.txt"), O_RDONLY|O_CLOEXEC); assert_se(imp.fd >= 0); do diff --git a/src/test/test-path.c b/src/test/test-path.c index d09df3e8a5..70ac6b3df3 100644 --- a/src/test/test-path.c +++ b/src/test/test-path.c @@ -262,8 +262,8 @@ int main(int argc, char *argv[]) { log_parse_environment(); log_open(); + assert_se(set_unit_path(get_testdata_dir("/test-path")) >= 0); assert_se(runtime_dir = setup_fake_runtime_dir()); - assert_se(set_unit_path(TEST_DATA_DIR("/test-path/")) >= 0); for (test = tests; test && *test; test++) { int r; diff --git a/src/test/test-sched-prio.c b/src/test/test-sched-prio.c index dab64fea57..81d9abc2d5 100644 --- a/src/test/test-sched-prio.c +++ b/src/test/test-sched-prio.c @@ -34,10 +34,9 @@ int main(int argc, char *argv[]) { FDSet *fdset = NULL; int r; - assert_se(runtime_dir = setup_fake_runtime_dir()); - /* prepare the test */ - assert_se(set_unit_path(TEST_DATA_DIR("")) >= 0); + assert_se(set_unit_path(get_testdata_dir("")) >= 0); + assert_se(runtime_dir = setup_fake_runtime_dir()); r = manager_new(UNIT_FILE_USER, true, &m); if (MANAGER_SKIP_TEST(r)) { log_notice_errno(r, "Skipping test: manager_new: %m"); |