From ee3c7ff7c303cdbc8fea18d3a6f3c4c6e7c450d8 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Sun, 12 Feb 2017 22:39:21 +0100 Subject: [PATCH 1/3] test: move resolved test data into test/ Moe test-resolve's test data from src/resolve/test-data to test/test-resolve/ to be consistent with test/test-{execute,path}/. This will make it easier to make the tests relocatable. --- Makefile.am | 25 +++++++++--------- src/resolve/test-dns-packet.c | 2 +- .../_443._tcp.fedoraproject.org.pkts | Bin .../_openpgpkey.fedoraproject.org.pkts | Bin .../test-resolve}/fake-caa.pkts | Bin .../test-resolve}/fedoraproject.org.pkts | Bin .../test-resolve}/gandi.net.pkts | Bin .../test-resolve}/google.com.pkts | Bin .../test-resolve}/kyhwana.org.pkts | Bin .../test-data => test/test-resolve}/root.pkts | Bin ...aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts | Bin .../test-resolve}/teamits.com.pkts | Bin .../zbyszek@fedoraproject.org.pkts | Bin 13 files changed, 13 insertions(+), 14 deletions(-) rename {src/resolve/test-data => test/test-resolve}/_443._tcp.fedoraproject.org.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/_openpgpkey.fedoraproject.org.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/fake-caa.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/fedoraproject.org.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/gandi.net.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/google.com.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/kyhwana.org.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/root.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/teamits.com.pkts (100%) rename {src/resolve/test-data => test/test-resolve}/zbyszek@fedoraproject.org.pkts (100%) diff --git a/Makefile.am b/Makefile.am index 77e5aa7402..3c20c9d4bf 100644 --- a/Makefile.am +++ b/Makefile.am @@ -5637,8 +5637,7 @@ test_dns_packet_SOURCES = \ $(basic_dns_sources) test_dns_packet_CPPFLAGS = \ - $(AM_CPPFLAGS) \ - -DRESOLVE_TEST_DIR=\"$(abs_top_srcdir)/src/resolve/test-data\" + $(AM_CPPFLAGS) test_dns_packet_CFLAGS = \ $(AM_CFLAGS) \ @@ -5650,17 +5649,17 @@ test_dns_packet_LDADD = \ -lm EXTRA_DIST += \ - src/resolve/test-data/_openpgpkey.fedoraproject.org.pkts \ - src/resolve/test-data/fedoraproject.org.pkts \ - src/resolve/test-data/gandi.net.pkts \ - src/resolve/test-data/google.com.pkts \ - src/resolve/test-data/root.pkts \ - src/resolve/test-data/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts \ - src/resolve/test-data/teamits.com.pkts \ - src/resolve/test-data/zbyszek@fedoraproject.org.pkts \ - src/resolve/test-data/_443._tcp.fedoraproject.org.pkts \ - src/resolve/test-data/kyhwana.org.pkts \ - src/resolve/test-data/fake-caa.pkts + test/test-resolve/_openpgpkey.fedoraproject.org.pkts \ + test/test-resolve/fedoraproject.org.pkts \ + test/test-resolve/gandi.net.pkts \ + test/test-resolve/google.com.pkts \ + test/test-resolve/root.pkts \ + test/test-resolve/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts \ + test/test-resolve/teamits.com.pkts \ + test/test-resolve/zbyszek@fedoraproject.org.pkts \ + test/test-resolve/_443._tcp.fedoraproject.org.pkts \ + test/test-resolve/kyhwana.org.pkts \ + test/test-resolve/fake-caa.pkts test_dnssec_SOURCES = \ src/resolve/test-dnssec.c \ diff --git a/src/resolve/test-dns-packet.c b/src/resolve/test-dns-packet.c index 956b155872..957b8677ba 100644 --- a/src/resolve/test-dns-packet.c +++ b/src/resolve/test-dns-packet.c @@ -115,7 +115,7 @@ int main(int argc, char **argv) { N = argc - 1; fnames = argv + 1; } else { - assert_se(glob(RESOLVE_TEST_DIR "/*.pkts", GLOB_NOSORT, NULL, &g) == 0); + assert_se(glob(TEST_DIR "/test-resolve/*.pkts", GLOB_NOSORT, NULL, &g) == 0); N = g.gl_pathc; fnames = g.gl_pathv; } diff --git a/src/resolve/test-data/_443._tcp.fedoraproject.org.pkts b/test/test-resolve/_443._tcp.fedoraproject.org.pkts similarity index 100% rename from src/resolve/test-data/_443._tcp.fedoraproject.org.pkts rename to test/test-resolve/_443._tcp.fedoraproject.org.pkts diff --git a/src/resolve/test-data/_openpgpkey.fedoraproject.org.pkts b/test/test-resolve/_openpgpkey.fedoraproject.org.pkts similarity index 100% rename from src/resolve/test-data/_openpgpkey.fedoraproject.org.pkts rename to test/test-resolve/_openpgpkey.fedoraproject.org.pkts diff --git a/src/resolve/test-data/fake-caa.pkts b/test/test-resolve/fake-caa.pkts similarity index 100% rename from src/resolve/test-data/fake-caa.pkts rename to test/test-resolve/fake-caa.pkts diff --git a/src/resolve/test-data/fedoraproject.org.pkts b/test/test-resolve/fedoraproject.org.pkts similarity index 100% rename from src/resolve/test-data/fedoraproject.org.pkts rename to test/test-resolve/fedoraproject.org.pkts diff --git a/src/resolve/test-data/gandi.net.pkts b/test/test-resolve/gandi.net.pkts similarity index 100% rename from src/resolve/test-data/gandi.net.pkts rename to test/test-resolve/gandi.net.pkts diff --git a/src/resolve/test-data/google.com.pkts b/test/test-resolve/google.com.pkts similarity index 100% rename from src/resolve/test-data/google.com.pkts rename to test/test-resolve/google.com.pkts diff --git a/src/resolve/test-data/kyhwana.org.pkts b/test/test-resolve/kyhwana.org.pkts similarity index 100% rename from src/resolve/test-data/kyhwana.org.pkts rename to test/test-resolve/kyhwana.org.pkts diff --git a/src/resolve/test-data/root.pkts b/test/test-resolve/root.pkts similarity index 100% rename from src/resolve/test-data/root.pkts rename to test/test-resolve/root.pkts diff --git a/src/resolve/test-data/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts b/test/test-resolve/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts similarity index 100% rename from src/resolve/test-data/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts rename to test/test-resolve/sw1a1aa-sw1a2aa-sw1a2ab-sw1a2ac.find.me.uk.pkts diff --git a/src/resolve/test-data/teamits.com.pkts b/test/test-resolve/teamits.com.pkts similarity index 100% rename from src/resolve/test-data/teamits.com.pkts rename to test/test-resolve/teamits.com.pkts diff --git a/src/resolve/test-data/zbyszek@fedoraproject.org.pkts b/test/test-resolve/zbyszek@fedoraproject.org.pkts similarity index 100% rename from src/resolve/test-data/zbyszek@fedoraproject.org.pkts rename to test/test-resolve/zbyszek@fedoraproject.org.pkts From f853c6efb509589c8e3a82caa3af2ac5a370ae97 Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Sun, 12 Feb 2017 23:14:43 +0100 Subject: [PATCH 2/3] test: make unit tests relocatable It is useful to package test-* binaries and run them as root under autopkgtest or manually on particular machines. They currently have a built-in hardcoded absolute path to their test data, which does not work when running the test programs from any other path than the original build directory. By default, make the tests look for their data in /testdata/ so that they can be called from any directory (provided that the corresponding test data is installed correctly). As we don't have a fixed static path in the build tree (as build and source tree are independent), set $TEST_DIR with "make check" to point to /test/, as we previously did with an automake variable. --- Makefile.am | 5 +++-- src/resolve/test-dns-packet.c | 4 +++- src/shared/tests.c | 13 +++++++++++++ src/shared/tests.h | 1 + src/test/test-cgroup-mask.c | 2 +- src/test/test-engine.c | 2 +- src/test/test-execute.c | 2 +- src/test/test-helper.h | 5 +++++ src/test/test-path.c | 2 +- src/test/test-sched-prio.c | 2 +- 10 files changed, 30 insertions(+), 8 deletions(-) diff --git a/Makefile.am b/Makefile.am index 3c20c9d4bf..489cf3c1b7 100644 --- a/Makefile.am +++ b/Makefile.am @@ -150,6 +150,7 @@ 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 @@ -218,7 +219,6 @@ AM_CPPFLAGS = \ -DLIBDIR=\"$(libdir)\" \ -DROOTLIBDIR=\"$(rootlibdir)\" \ -DROOTLIBEXECDIR=\"$(rootlibexecdir)\" \ - -DTEST_DIR=\"$(abs_top_srcdir)/test\" \ -I $(top_srcdir)/src \ -I $(top_builddir)/src/basic \ -I $(top_srcdir)/src/basic \ @@ -5637,7 +5637,8 @@ test_dns_packet_SOURCES = \ $(basic_dns_sources) test_dns_packet_CPPFLAGS = \ - $(AM_CPPFLAGS) + $(AM_CPPFLAGS) \ + -I $(top_srcdir)/src/test test_dns_packet_CFLAGS = \ $(AM_CFLAGS) \ diff --git a/src/resolve/test-dns-packet.c b/src/resolve/test-dns-packet.c index 957b8677ba..3ca7e78495 100644 --- a/src/resolve/test-dns-packet.c +++ b/src/resolve/test-dns-packet.c @@ -31,6 +31,8 @@ #include "strv.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) { @@ -115,7 +117,7 @@ int main(int argc, char **argv) { N = argc - 1; fnames = argv + 1; } else { - assert_se(glob(TEST_DIR "/test-resolve/*.pkts", GLOB_NOSORT, NULL, &g) == 0); + assert_se(glob(TEST_DATA_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 409116290d..7034687725 100644 --- a/src/shared/tests.c +++ b/src/shared/tests.c @@ -17,6 +17,9 @@ along with systemd; If not, see . ***/ +#include +#include +#include #include #include @@ -31,3 +34,13 @@ char* setup_fake_runtime_dir(void) { return p; } + +const char* get_exe_relative_testdata_dir(void) { + _cleanup_free_ char *exedir = NULL; + /* 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); + return testdir; +} diff --git a/src/shared/tests.h b/src/shared/tests.h index 93f09013a1..0100b48937 100644 --- a/src/shared/tests.h +++ b/src/shared/tests.h @@ -20,3 +20,4 @@ ***/ char* setup_fake_runtime_dir(void); +const char* get_exe_relative_testdata_dir(void); diff --git a/src/test/test-cgroup-mask.c b/src/test/test-cgroup-mask.c index a027eb0fd2..630587aaf1 100644 --- a/src/test/test-cgroup-mask.c +++ b/src/test/test-cgroup-mask.c @@ -34,7 +34,7 @@ static int test_cgroup_mask(void) { int r; /* Prepare the manager. */ - assert_se(set_unit_path(TEST_DIR) >= 0); + assert_se(set_unit_path(TEST_DATA_DIR("")) >= 0); r = manager_new(UNIT_FILE_USER, true, &m); if (r == -EPERM || r == -EACCES) { puts("manager_new: Permission denied. Skipping test."); diff --git a/src/test/test-engine.c b/src/test/test-engine.c index a651f6b683..3ec2dfe10e 100644 --- a/src/test/test-engine.c +++ b/src/test/test-engine.c @@ -40,7 +40,7 @@ int main(int argc, char *argv[]) { assert_se(runtime_dir = setup_fake_runtime_dir()); /* prepare the test */ - assert_se(set_unit_path(TEST_DIR) >= 0); + assert_se(set_unit_path(TEST_DATA_DIR("")) >= 0); 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 3a3ab3eb94..145aa37a66 100644 --- a/src/test/test-execute.c +++ b/src/test/test-execute.c @@ -516,7 +516,7 @@ int main(int argc, char *argv[]) { } assert_se(setenv("XDG_RUNTIME_DIR", "/tmp/", 1) == 0); - assert_se(set_unit_path(TEST_DIR "/test-execute/") >= 0); + assert_se(set_unit_path(TEST_DATA_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 ddb10f88fd..4e633ae6d8 100644 --- a/src/test/test-helper.h +++ b/src/test/test-helper.h @@ -20,6 +20,8 @@ ***/ #include "sd-daemon.h" +#include "string-util.h" +#include "tests.h" #include "macro.h" @@ -39,3 +41,6 @@ -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-path.c b/src/test/test-path.c index 5e99d478ee..d09df3e8a5 100644 --- a/src/test/test-path.c +++ b/src/test/test-path.c @@ -263,7 +263,7 @@ int main(int argc, char *argv[]) { log_open(); assert_se(runtime_dir = setup_fake_runtime_dir()); - assert_se(set_unit_path(TEST_DIR "/test-path/") >= 0); + 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 7b37910c33..dab64fea57 100644 --- a/src/test/test-sched-prio.c +++ b/src/test/test-sched-prio.c @@ -37,7 +37,7 @@ int main(int argc, char *argv[]) { assert_se(runtime_dir = setup_fake_runtime_dir()); /* prepare the test */ - assert_se(set_unit_path(TEST_DIR) >= 0); + assert_se(set_unit_path(TEST_DATA_DIR("")) >= 0); r = manager_new(UNIT_FILE_USER, true, &m); if (MANAGER_SKIP_TEST(r)) { log_notice_errno(r, "Skipping test: manager_new: %m"); From 4f8425b8d5a3fb2e5ec24b77f1a7a95db55f532c Mon Sep 17 00:00:00 2001 From: Martin Pitt Date: Sun, 12 Feb 2017 23:53:53 +0100 Subject: [PATCH 3/3] buildsys: add "install-tests" target Add a new "install-tests" make target that installs our unit test-* executables and their test data files into /usr/lib/systemd/tests/. This is useful for packaging the tests to run them with root privileges or in CI. Fixes #5257 --- Makefile.am | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 489cf3c1b7..c45755f36e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -93,6 +93,7 @@ kernelinstalldir = $(prefix)/lib/kernel/install.d factory_etcdir = $(datadir)/factory/etc factory_pamdir = $(datadir)/factory/etc/pam.d bootlibdir = $(prefix)/lib/systemd/boot/efi +testsdir = $(prefix)/lib/systemd/tests # And these are the special ones for / rootprefix=@rootprefix@ @@ -133,6 +134,7 @@ check_DATA = dist_rootlibexec_DATA = tests= manual_tests = +TEST_DATA_FILES = TEST_EXTENSIONS = .py PY_LOG_COMPILER = $(PYTHON) DISABLE_HARD_ERRORS = yes @@ -1606,7 +1608,7 @@ tests += \ test-seccomp endif -EXTRA_DIST += \ +TEST_DATA_FILES += \ test/a.service \ test/basic.target \ test/b.service \ @@ -5649,7 +5651,7 @@ test_dns_packet_LDADD = \ $(GCRYPT_LIBS) \ -lm -EXTRA_DIST += \ +TEST_DATA_FILES += \ test/test-resolve/_openpgpkey.fedoraproject.org.pkts \ test/test-resolve/fedoraproject.org.pkts \ test/test-resolve/gandi.net.pkts \ @@ -5662,6 +5664,8 @@ EXTRA_DIST += \ test/test-resolve/kyhwana.org.pkts \ test/test-resolve/fake-caa.pkts +EXTRA_DIST += $(TEST_DATA_FILES) + test_dnssec_SOURCES = \ src/resolve/test-dnssec.c \ $(basic_dns_sources) @@ -6694,6 +6698,20 @@ tests += \ test-libsystemd-sym \ test-libudev-sym +.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; \ + else \ + install -D -m 755 $$f $(DESTDIR)/$(testsdir)/$$f; \ + fi; \ + done + for f in $(TEST_DATA_FILES); do \ + install -D -m 644 $$f $(DESTDIR)/$(testsdir)/testdata/$${f#test/}; \ + done + + .PHONY: cppcheck cppcheck: cppcheck --enable=all -q $(top_srcdir)