summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Pitt <martin@piware.de>2017-02-12 23:14:43 +0100
committerMartin Pitt <martin@piware.de>2017-02-13 22:31:13 +0100
commitf853c6efb509589c8e3a82caa3af2ac5a370ae97 (patch)
tree4b5e46c4dfc6a9dfd701db8c29975d546b0b9ece
parentee3c7ff7c303cdbc8fea18d3a6f3c4c6e7c450d8 (diff)
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 <test_exe_directory>/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 <srcdir>/test/, as we previously did with an automake variable.
-rw-r--r--Makefile.am5
-rw-r--r--src/resolve/test-dns-packet.c4
-rw-r--r--src/shared/tests.c13
-rw-r--r--src/shared/tests.h1
-rw-r--r--src/test/test-cgroup-mask.c2
-rw-r--r--src/test/test-engine.c2
-rw-r--r--src/test/test-execute.c2
-rw-r--r--src/test/test-helper.h5
-rw-r--r--src/test/test-path.c2
-rw-r--r--src/test/test-sched-prio.c2
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 <http://www.gnu.org/licenses/>.
***/
+#include <alloc-util.h>
+#include <fs-util.h>
+#include <libgen.h>
#include <stdlib.h>
#include <util.h>
@@ -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");