summaryrefslogtreecommitdiff
path: root/src/test
diff options
context:
space:
mode:
authorPaul Sherwood <paul.sherwood@codethink.co.uk>2013-11-17 18:32:22 +0000
committerPaul Sherwood <paul.sherwood@codethink.co.uk>2013-11-17 18:32:22 +0000
commitaf04dc70741e58c16a3b2c003ef9779d7863827c (patch)
tree23b608397f1ccb73a34d5fa7cc8d6377554f952f /src/test
parentdc8ee9a30e2df2568f2b37e3fb61e4b0bb601b13 (diff)
parent1434ae6fd49f8377b0ddbd4c675736e0d3226ea6 (diff)
downloadsystemd-af04dc70741e58c16a3b2c003ef9779d7863827c.tar.gz
systemd 208
Diffstat (limited to 'src/test')
-rw-r--r--src/test/test-boot-timestamps.c98
-rw-r--r--src/test/test-cgroup-util.c131
-rw-r--r--src/test/test-cgroup.c8
-rw-r--r--src/test/test-device-nodes.c55
-rw-r--r--src/test/test-efivars.c47
-rw-r--r--src/test/test-engine.c2
-rw-r--r--src/test/test-fileio.c165
-rw-r--r--src/test/test-hashmap.c36
-rw-r--r--src/test/test-helper.h31
-rw-r--r--src/test/test-id128.c11
-rw-r--r--src/test/test-libudev.c2
-rw-r--r--src/test/test-list.c109
-rw-r--r--src/test/test-path-util.c79
-rw-r--r--src/test/test-sched-prio.c6
-rw-r--r--src/test/test-sleep.c28
-rw-r--r--src/test/test-strv.c138
-rw-r--r--src/test/test-tables.c105
-rw-r--r--src/test/test-unit-file.c25
-rw-r--r--src/test/test-unit-name.c19
-rw-r--r--src/test/test-utf8.c76
-rw-r--r--src/test/test-util.c205
21 files changed, 1186 insertions, 190 deletions
diff --git a/src/test/test-boot-timestamps.c b/src/test/test-boot-timestamps.c
new file mode 100644
index 0000000000..4ede318e38
--- /dev/null
+++ b/src/test/test-boot-timestamps.c
@@ -0,0 +1,98 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+ This file is part of systemd.
+
+ Copyright 2013 Lennart Poettering
+ Copyright 2013 Kay Sievers
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "util.h"
+#include "log.h"
+#include "boot-timestamps.h"
+#include "efivars.h"
+#include "acpi-fpdt.h"
+
+static int test_acpi_fpdt(void) {
+ usec_t loader_start;
+ usec_t loader_exit;
+ char ts_start[FORMAT_TIMESPAN_MAX];
+ char ts_exit[FORMAT_TIMESPAN_MAX];
+ char ts_span[FORMAT_TIMESPAN_MAX];
+ int r;
+
+ r = acpi_get_boot_usec(&loader_start, &loader_exit);
+ if (r < 0) {
+ if (r != -ENOENT)
+ log_error("Failed to read ACPI FPDT: %s", strerror(-r));
+ return r;
+ }
+
+ log_info("ACPI FPDT: loader start=%s exit=%s duration=%s",
+ format_timespan(ts_start, sizeof(ts_start), loader_start, USEC_PER_MSEC),
+ format_timespan(ts_exit, sizeof(ts_exit), loader_exit, USEC_PER_MSEC),
+ format_timespan(ts_span, sizeof(ts_span), loader_exit - loader_start, USEC_PER_MSEC));
+
+ return 0;
+}
+
+static int test_efi_loader(void) {
+ usec_t loader_start;
+ usec_t loader_exit;
+ char ts_start[FORMAT_TIMESPAN_MAX];
+ char ts_exit[FORMAT_TIMESPAN_MAX];
+ char ts_span[FORMAT_TIMESPAN_MAX];
+ int r;
+
+ r = efi_loader_get_boot_usec(&loader_start, &loader_exit);
+ if (r < 0) {
+ if (r != -ENOENT)
+ log_error("Failed to read EFI loader data: %s", strerror(-r));
+ return r;
+ }
+
+ log_info("EFI Loader: start=%s exit=%s duration=%s",
+ format_timespan(ts_start, sizeof(ts_start), loader_start, USEC_PER_MSEC),
+ format_timespan(ts_exit, sizeof(ts_exit), loader_exit, USEC_PER_MSEC),
+ format_timespan(ts_span, sizeof(ts_span), loader_exit - loader_start, USEC_PER_MSEC));
+
+ return 0;
+}
+
+int main(int argc, char* argv[]) {
+ char s[MAX(FORMAT_TIMESPAN_MAX, FORMAT_TIMESTAMP_MAX)];
+ int r;
+ dual_timestamp fw, l, k;
+
+ test_acpi_fpdt();
+ test_efi_loader();
+
+ dual_timestamp_from_monotonic(&k, 0);
+
+ r = boot_timestamps(NULL, &fw, &l);
+ if (r < 0) {
+ log_error("Failed to read variables: %s", strerror(-r));
+ return 1;
+ }
+
+ log_info("Firmware began %s before kernel.", format_timespan(s, sizeof(s), fw.monotonic, 0));
+ log_info("Loader began %s before kernel.", format_timespan(s, sizeof(s), l.monotonic, 0));
+ log_info("Firmware began %s.", format_timestamp(s, sizeof(s), fw.realtime));
+ log_info("Loader began %s.", format_timestamp(s, sizeof(s), l.realtime));
+ log_info("Kernel began %s.", format_timestamp(s, sizeof(s), k.realtime));
+
+ return 0;
+}
diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c
index c9634d42b0..16bf968340 100644
--- a/src/test/test-cgroup-util.c
+++ b/src/test/test-cgroup-util.c
@@ -23,6 +23,7 @@
#include "util.h"
#include "cgroup-util.h"
+#include "test-helper.h"
static void check_p_d_u(const char *path, int code, const char *result) {
_cleanup_free_ char *unit = NULL;
@@ -32,12 +33,15 @@ static void check_p_d_u(const char *path, int code, const char *result) {
}
static void test_path_decode_unit(void) {
- check_p_d_u("getty@.service/getty@tty2.service", 0, "getty@tty2.service");
- check_p_d_u("getty@.service/getty@tty2.service/xxx", 0, "getty@tty2.service");
+ check_p_d_u("getty@tty2.service", 0, "getty@tty2.service");
+ check_p_d_u("getty@tty2.service/", 0, "getty@tty2.service");
+ check_p_d_u("getty@tty2.service/xxx", 0, "getty@tty2.service");
check_p_d_u("getty@.service/", -EINVAL, NULL);
check_p_d_u("getty@.service", -EINVAL, NULL);
check_p_d_u("getty.service", 0, "getty.service");
check_p_d_u("getty", -EINVAL, NULL);
+ check_p_d_u("getty/waldo", -EINVAL, NULL);
+ check_p_d_u("_cpu.service", 0, "cpu.service");
}
static void check_p_g_u(const char *path, int code, const char *result) {
@@ -47,6 +51,18 @@ static void check_p_g_u(const char *path, int code, const char *result) {
assert_se(streq_ptr(unit, result));
}
+static void test_path_get_unit(void) {
+ check_p_g_u("/system.slice/foobar.service/sdfdsaf", 0, "foobar.service");
+ check_p_g_u("/system.slice/getty@tty5.service", 0, "getty@tty5.service");
+ check_p_g_u("/system.slice/getty@tty5.service/aaa/bbb", 0, "getty@tty5.service");
+ check_p_g_u("/system.slice/getty@tty5.service/", 0, "getty@tty5.service");
+ check_p_g_u("/system.slice/getty@tty6.service/tty5", 0, "getty@tty6.service");
+ check_p_g_u("sadfdsafsda", -EINVAL, NULL);
+ check_p_g_u("/system.slice/getty####@tty6.service/xxx", -EINVAL, NULL);
+ check_p_g_u("/system.slice/system-waldo.slice/foobar.service/sdfdsaf", 0, "foobar.service");
+ check_p_g_u("/system.slice/system-waldo.slice/_cpu.service/sdfdsaf", 0, "cpu.service");
+}
+
static void check_p_g_u_u(const char *path, int code, const char *result) {
_cleanup_free_ char *unit = NULL;
@@ -54,39 +70,65 @@ static void check_p_g_u_u(const char *path, int code, const char *result) {
assert_se(streq_ptr(unit, result));
}
-static void test_path_get_unit(void) {
- check_p_g_u("/system/foobar.service/sdfdsaf", 0, "foobar.service");
- check_p_g_u("/system/getty@.service/getty@tty5.service", 0, "getty@tty5.service");
- check_p_g_u("/system/getty@.service/getty@tty5.service/aaa/bbb", 0, "getty@tty5.service");
- check_p_g_u("/system/getty@.service/getty@tty5.service/", 0, "getty@tty5.service");
- check_p_g_u("/system/getty@tty6.service/tty5", 0, "getty@tty6.service");
- check_p_g_u("sadfdsafsda", -ENOENT, NULL);
- check_p_g_u("/system/getty####@tty6.service/tty5", -EINVAL, NULL);
+static void test_path_get_user_unit(void) {
+ check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar.service", 0, "foobar.service");
+ check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/waldo.slice/foobar.service", 0, "foobar.service");
+ check_p_g_u_u("/user.slice/user-1002.slice/session-2.scope/foobar.service/waldo", 0, "foobar.service");
+ check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar.service/waldo/uuuux", 0, "foobar.service");
+ check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/waldo/waldo/uuuux", -EINVAL, NULL);
+ check_p_g_u_u("/user.slice/user-1000.slice/session-2.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
+ check_p_g_u_u("/session-2.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
+ check_p_g_u_u("/xyz.slice/xyz-waldo.slice/session-77.scope/foobar@pie.service/pa/po", 0, "foobar@pie.service");
+ check_p_g_u_u("/meh.service", -ENOENT, NULL);
+ check_p_g_u_u("/session-3.scope/_cpu.service", 0, "cpu.service");
}
-static void test_path_get_user_unit(void) {
- check_p_g_u_u("/user/lennart/2/systemd-21548/foobar.service", 0, "foobar.service");
- check_p_g_u_u("/user/lennart/2/systemd-21548/foobar.service/waldo", 0, "foobar.service");
- check_p_g_u_u("/user/lennart/2/systemd-21548/foobar.service/waldo/uuuux", 0, "foobar.service");
- check_p_g_u_u("/user/lennart/2/systemd-21548/waldo/waldo/uuuux", -EINVAL, NULL);
- check_p_g_u_u("/user/lennart/2/foobar.service", -ENOENT, NULL);
- check_p_g_u_u("/user/lennart/2/systemd-21548/foobar@.service/foobar@pie.service/pa/po", 0, "foobar@pie.service");
+static void check_p_g_s(const char *path, int code, const char *result) {
+ _cleanup_free_ char *s = NULL;
+
+ assert_se(cg_path_get_session(path, &s) == code);
+ assert_se(streq_ptr(s, result));
}
-static void test_get_paths(void) {
- _cleanup_free_ char *a = NULL, *b = NULL, *c = NULL, *d = NULL;
+static void test_path_get_session(void) {
+ check_p_g_s("/user.slice/user-1000.slice/session-2.scope/foobar.service", 0, "2");
+ check_p_g_s("/session-3.scope", 0, "3");
+ check_p_g_s("", -ENOENT, 0);
+}
- assert_se(cg_get_root_path(&a) >= 0);
- log_info("Root = %s", a);
+static void check_p_g_o_u(const char *path, int code, uid_t result) {
+ uid_t uid = 0;
+
+ assert_se(cg_path_get_owner_uid(path, &uid) == code);
+ assert_se(uid == result);
+}
+
+static void test_path_get_owner_uid(void) {
+ check_p_g_o_u("/user.slice/user-1000.slice/session-2.scope/foobar.service", 0, 1000);
+ check_p_g_o_u("/user.slice/user-1006.slice", 0, 1006);
+ check_p_g_o_u("", -ENOENT, 0);
+}
+
+static void check_p_g_m_n(const char *path, int code, const char *result) {
+ _cleanup_free_ char *m = NULL;
- assert_se(cg_get_system_path(&b) >= 0);
- log_info("System = %s", b);
+ assert_se(cg_path_get_machine_name(path, &m) == code);
+ assert_se(streq_ptr(m, result));
+}
- assert_se(cg_get_user_path(&c) >= 0);
- log_info("User = %s", c);
+static void test_path_get_machine_name(void) {
+ check_p_g_m_n("/user.slice/machine-foobar.scope", 0, "foobar");
+ check_p_g_m_n("/machine-foobar.scope", 0, "foobar");
+ check_p_g_m_n("/user.slice/user-kuux.slice/machine-foobar.scope", 0, "foobar");
+ check_p_g_m_n("/user.slice/user-kuux.slice/machine-foobar.scope/asjhdkj", 0, "foobar");
+ check_p_g_m_n("", -ENOENT, NULL);
+}
- assert_se(cg_get_machine_path("harley", &d) >= 0);
- log_info("Machine = %s", d);
+static void test_get_paths(void) {
+ _cleanup_free_ char *a = NULL;
+
+ assert_se(cg_get_root_path(&a) >= 0);
+ log_info("Root = %s", a);
}
static void test_proc(void) {
@@ -98,7 +140,7 @@ static void test_proc(void) {
assert_se(d);
FOREACH_DIRENT(de, d, break) {
- _cleanup_free_ char *path = NULL, *path_shifted = NULL, *session = NULL, *unit = NULL, *user_unit = NULL, *machine = NULL, *prefix = NULL;
+ _cleanup_free_ char *path = NULL, *path_shifted = NULL, *session = NULL, *unit = NULL, *user_unit = NULL, *machine = NULL, *prefix = NULL, *slice = NULL;
pid_t pid;
uid_t uid = (uid_t) -1;
@@ -120,8 +162,9 @@ static void test_proc(void) {
cg_pid_get_unit(pid, &unit);
cg_pid_get_user_unit(pid, &user_unit);
cg_pid_get_machine_name(pid, &machine);
+ cg_pid_get_slice(pid, &slice);
- printf("%lu\t%s\t%s\t%s\t%lu\t%s\t%s\t%s\t%s\n",
+ printf("%lu\t%s\t%s\t%s\t%lu\t%s\t%s\t%s\t%s\t%s\n",
(unsigned long) pid,
path,
prefix,
@@ -130,7 +173,8 @@ static void test_proc(void) {
session,
unit,
user_unit,
- machine);
+ machine,
+ slice);
}
}
@@ -170,14 +214,37 @@ static void test_controller_is_valid(void) {
assert_se(!cg_controller_is_valid("tatü", false));
}
+static void test_slice_to_path_one(const char *unit, const char *path, int error) {
+ _cleanup_free_ char *ret = NULL;
+
+ assert_se(cg_slice_to_path(unit, &ret) == error);
+ assert_se(streq_ptr(ret, path));
+}
+
+static void test_slice_to_path(void) {
+
+ test_slice_to_path_one("foobar.slice", "foobar.slice", 0);
+ test_slice_to_path_one("foobar-waldo.slice", "foobar.slice/foobar-waldo.slice", 0);
+ test_slice_to_path_one("foobar-waldo.service", NULL, -EINVAL);
+ test_slice_to_path_one("-.slice", NULL, -EINVAL);
+ test_slice_to_path_one("-foo-.slice", NULL, -EINVAL);
+ test_slice_to_path_one("-foo.slice", NULL, -EINVAL);
+ test_slice_to_path_one("a-b.slice", "a.slice/a-b.slice", 0);
+ test_slice_to_path_one("a-b-c-d-e.slice", "a.slice/a-b.slice/a-b-c.slice/a-b-c-d.slice/a-b-c-d-e.slice", 0);
+}
+
int main(void) {
test_path_decode_unit();
test_path_get_unit();
test_path_get_user_unit();
- test_get_paths();
+ test_path_get_session();
+ test_path_get_owner_uid();
+ test_path_get_machine_name();
+ TEST_REQ_RUNNING_SYSTEMD(test_get_paths());
test_proc();
- test_escape();
+ TEST_REQ_RUNNING_SYSTEMD(test_escape());
test_controller_is_valid();
+ test_slice_to_path();
return 0;
}
diff --git a/src/test/test-cgroup.c b/src/test/test-cgroup.c
index 3a3489d6a2..2a0ce27206 100644
--- a/src/test/test-cgroup.c
+++ b/src/test/test-cgroup.c
@@ -31,10 +31,10 @@ int main(int argc, char*argv[]) {
char *path;
char *c, *p;
- assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, "/test-a", NULL) == 0);
- assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, "/test-a", NULL) == 0);
- assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, "/test-b", NULL) == 0);
- assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, "/test-b/test-c", NULL) == 0);
+ assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, "/test-a") == 0);
+ assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, "/test-a") == 0);
+ assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, "/test-b") == 0);
+ assert_se(cg_create(SYSTEMD_CGROUP_CONTROLLER, "/test-b/test-c") == 0);
assert_se(cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, "/test-b", 0) == 0);
assert_se(cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, getpid(), &path) == 0);
diff --git a/src/test/test-device-nodes.c b/src/test/test-device-nodes.c
new file mode 100644
index 0000000000..2f3dedb90f
--- /dev/null
+++ b/src/test/test-device-nodes.c
@@ -0,0 +1,55 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+ This file is part of systemd.
+
+ Copyright 2013 Dave Reisner
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include <sys/types.h>
+
+#include "device-nodes.h"
+#include "util.h"
+
+/* helpers for test_encode_devnode_name */
+static char *do_encode_string(const char *in) {
+ size_t out_len = strlen(in) * 4;
+ char *out = malloc(out_len);
+
+ assert_se(out);
+ assert_se(encode_devnode_name(in, out, out_len) >= 0);
+ puts(out);
+
+ return out;
+}
+
+static bool expect_encoded_as(const char *in, const char *expected) {
+ _cleanup_free_ char *encoded = do_encode_string(in);
+ return streq(encoded, expected);
+}
+
+static void test_encode_devnode_name(void) {
+ assert_se(expect_encoded_as("systemd sucks", "systemd\\x20sucks"));
+ assert_se(expect_encoded_as("pinkiepie", "pinkiepie"));
+ assert_se(expect_encoded_as("valíd\\ųtf8", "valíd\\x5cųtf8"));
+ assert_se(expect_encoded_as("s/ash/ng", "s\\x2fash\\x2fng"));
+}
+
+int main(int argc, char *argv[]) {
+ test_encode_devnode_name();
+
+ return 0;
+}
diff --git a/src/test/test-efivars.c b/src/test/test-efivars.c
deleted file mode 100644
index 43ea5917b6..0000000000
--- a/src/test/test-efivars.c
+++ /dev/null
@@ -1,47 +0,0 @@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-
-/***
- This file is part of systemd.
-
- Copyright 2013 Lennart Poettering
-
- systemd is free software; you can redistribute it and/or modify it
- under the terms of the GNU Lesser General Public License as published by
- the Free Software Foundation; either version 2.1 of the License, or
- (at your option) any later version.
-
- systemd is distributed in the hope that it will be useful, but
- WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with systemd; If not, see <http://www.gnu.org/licenses/>.
-***/
-
-#include "util.h"
-#include "log.h"
-#include "efivars.h"
-
-int main(int argc, char* argv[]) {
- char s[MAX(FORMAT_TIMESPAN_MAX, FORMAT_TIMESTAMP_MAX)];
- int r;
- dual_timestamp fw, l, k;
-
- dual_timestamp_from_monotonic(&k, 0);
-
- r = efi_get_boot_timestamps(NULL, &fw, &l);
- if (r < 0) {
- log_error("Failed to read variables: %s", strerror(-r));
- return 1;
- }
-
- log_info("Firmware began %s before kernel.", format_timespan(s, sizeof(s), fw.monotonic, 0));
- log_info("Loader began %s before kernel.", format_timespan(s, sizeof(s), l.monotonic, 0));
-
- log_info("Firmware began %s.", format_timestamp(s, sizeof(s), fw.realtime));
- log_info("Loader began %s.", format_timestamp(s, sizeof(s), l.realtime));
- log_info("Kernel began %s.", format_timestamp(s, sizeof(s), k.realtime));
-
- return 0;
-}
diff --git a/src/test/test-engine.c b/src/test/test-engine.c
index 0f3862226a..20ae103a19 100644
--- a/src/test/test-engine.c
+++ b/src/test/test-engine.c
@@ -33,7 +33,7 @@ int main(int argc, char *argv[]) {
assert_se(set_unit_path("test") >= 0);
- assert_se(manager_new(SYSTEMD_SYSTEM, &m) >= 0);
+ assert_se(manager_new(SYSTEMD_SYSTEM, false, &m) >= 0);
printf("Load1:\n");
assert_se(manager_load_unit(m, "a.service", NULL, NULL, &a) >= 0);
diff --git a/src/test/test-fileio.c b/src/test/test-fileio.c
index d56f7cc856..06f3e28288 100644
--- a/src/test/test-fileio.c
+++ b/src/test/test-fileio.c
@@ -27,9 +27,12 @@
#include "fileio.h"
#include "strv.h"
#include "env-util.h"
+#include "def.h"
+#include "ctype.h"
static void test_parse_env_file(void) {
- char t[] = "/tmp/test-parse-env-file-XXXXXX";
+ char t[] = "/tmp/test-fileio-in-XXXXXX",
+ p[] = "/tmp/test-fileio-out-XXXXXX";
int fd, r;
FILE *f;
_cleanup_free_ char *one = NULL, *two = NULL, *three = NULL, *four = NULL, *five = NULL,
@@ -38,6 +41,8 @@ static void test_parse_env_file(void) {
char **i;
unsigned k;
+ assert_se(mktemp(p));
+
fd = mkostemp(t, O_CLOEXEC);
assert_se(fd >= 0);
@@ -83,7 +88,7 @@ static void test_parse_env_file(void) {
assert_se(streq(a[9], "ten="));
assert_se(a[10] == NULL);
- strv_env_clean_log(a, "/tmp/test-fileio");
+ strv_env_clean_log(a, "test");
k = 0;
STRV_FOREACH(i, b) {
@@ -129,17 +134,167 @@ static void test_parse_env_file(void) {
assert_se(streq(nine, "nineval"));
assert_se(ten == NULL);
- r = write_env_file("/tmp/test-fileio", a);
+ r = write_env_file(p, a);
assert_se(r >= 0);
- r = load_env_file("/tmp/test-fileio", NULL, &b);
+ r = load_env_file(p, NULL, &b);
assert_se(r >= 0);
unlink(t);
- unlink("/tmp/test-fileio");
+ unlink(p);
+}
+
+static void test_parse_multiline_env_file(void) {
+ char t[] = "/tmp/test-fileio-in-XXXXXX",
+ p[] = "/tmp/test-fileio-out-XXXXXX";
+ int fd, r;
+ FILE *f;
+ _cleanup_strv_free_ char **a = NULL, **b = NULL;
+ char **i;
+
+ assert_se(mktemp(p));
+
+ fd = mkostemp(t, O_CLOEXEC);
+ assert_se(fd >= 0);
+
+ f = fdopen(fd, "w");
+ assert_se(f);
+
+ fputs("one=BAR\\\n"
+ " VAR\\\n"
+ "\tGAR\n"
+ "#comment\n"
+ "two=\"bar\\\n"
+ " var\\\n"
+ "\tgar\"\n"
+ "#comment\n"
+ "tri=\"bar \\\n"
+ " var \\\n"
+ "\tgar \"\n", f);
+
+ fflush(f);
+ fclose(f);
+
+ r = load_env_file(t, NULL, &a);
+ assert_se(r >= 0);
+
+ STRV_FOREACH(i, a)
+ log_info("Got: <%s>", *i);
+
+ assert_se(streq(a[0], "one=BAR VAR\tGAR"));
+ assert_se(streq(a[1], "two=bar var\tgar"));
+ assert_se(streq(a[2], "tri=bar var \tgar "));
+ assert_se(a[3] == NULL);
+
+ r = write_env_file(p, a);
+ assert_se(r >= 0);
+
+ r = load_env_file(p, NULL, &b);
+ assert_se(r >= 0);
+
+ unlink(t);
+ unlink(p);
+}
+
+
+static void test_executable_is_script(void) {
+ char t[] = "/tmp/test-executable-XXXXXX";
+ int fd, r;
+ FILE *f;
+ char *command;
+
+ fd = mkostemp(t, O_CLOEXEC);
+ assert_se(fd >= 0);
+
+ f = fdopen(fd, "w");
+ assert_se(f);
+
+ fputs("#! /bin/script -a -b \ngoo goo", f);
+ fflush(f);
+
+ r = executable_is_script(t, &command);
+ assert_se(r > 0);
+ assert_se(streq(command, "/bin/script"));
+ free(command);
+
+ r = executable_is_script("/bin/sh", &command);
+ assert_se(r == 0);
+
+ r = executable_is_script("/usr/bin/yum", &command);
+ assert_se(r > 0 || r == -ENOENT);
+ if (r > 0) {
+ assert_se(startswith(command, "/"));
+ free(command);
+ }
+
+ fclose(f);
+ unlink(t);
+}
+
+static void test_status_field(void) {
+ _cleanup_free_ char *t = NULL, *p = NULL, *s = NULL, *z = NULL;
+ unsigned long long total = 0, buffers = 0;
+ int r;
+
+ assert_se(get_status_field("/proc/self/status", "\nThreads:", &t) == 0);
+ puts(t);
+ assert_se(streq(t, "1"));
+
+ r = get_status_field("/proc/meminfo", "MemTotal:", &p);
+ if (r != -ENOENT) {
+ assert(r == 0);
+ puts(p);
+ assert_se(safe_atollu(p, &total) == 0);
+ }
+
+ r = get_status_field("/proc/meminfo", "\nBuffers:", &s);
+ if (r != -ENOENT) {
+ assert(r == 0);
+ puts(s);
+ assert_se(safe_atollu(s, &buffers) == 0);
+ }
+
+ if (p && t)
+ assert(buffers < total);
+
+ /* Seccomp should be a good test for field full of zeros. */
+ r = get_status_field("/proc/meminfo", "\nSeccomp:", &z);
+ if (r != -ENOENT) {
+ assert(r == 0);
+ puts(z);
+ assert_se(safe_atollu(z, &buffers) == 0);
+ }
+}
+
+static void test_capeff(void) {
+ int pid, p;
+
+ for (pid = 0; pid < 2; pid++) {
+ _cleanup_free_ char *capeff = NULL;
+ int r;
+
+ r = get_process_capeff(0, &capeff);
+ log_info("capeff: '%s' (r=%d)", capeff, r);
+
+ if (r == -ENOENT || r == -EPERM)
+ return;
+
+ assert(r == 0);
+ assert(*capeff);
+ p = capeff[strspn(capeff, DIGITS "abcdefABCDEF")];
+ assert(!p || isspace(p));
+ }
}
int main(int argc, char *argv[]) {
+ log_parse_environment();
+ log_open();
+
test_parse_env_file();
+ test_parse_multiline_env_file();
+ test_executable_is_script();
+ test_status_field();
+ test_capeff();
+
return 0;
}
diff --git a/src/test/test-hashmap.c b/src/test/test-hashmap.c
index 2aead79bb1..56a9b58c24 100644
--- a/src/test/test-hashmap.c
+++ b/src/test/test-hashmap.c
@@ -467,10 +467,36 @@ static void test_hashmap_get(void) {
hashmap_free_free(m);
}
+static void test_hashmap_many(void) {
+ Hashmap *h;
+ unsigned i;
+
+#define N_ENTRIES 100000
+
+ assert_se(h = hashmap_new(NULL, NULL));
+
+ for (i = 1; i < N_ENTRIES*3; i+=3) {
+ assert_se(hashmap_put(h, UINT_TO_PTR(i), UINT_TO_PTR(i)) >= 0);
+ assert_se(PTR_TO_UINT(hashmap_get(h, UINT_TO_PTR(i))) == i);
+ }
+
+ for (i = 1; i < N_ENTRIES*3; i++)
+ assert_se(hashmap_contains(h, UINT_TO_PTR(i)) == (i % 3 == 1));
+
+ log_info("%u <= %u * 0.75 = %g", hashmap_size(h), hashmap_buckets(h), hashmap_buckets(h) * 0.75);
+
+ assert_se(hashmap_size(h) <= hashmap_buckets(h) * 0.75);
+ assert_se(hashmap_size(h) == N_ENTRIES);
+
+ hashmap_free(h);
+}
+
static void test_uint64_compare_func(void) {
- assert_se(uint64_compare_func("a", "a") == 0);
- assert_se(uint64_compare_func("a", "b") == -1);
- assert_se(uint64_compare_func("b", "a") == 1);
+ const uint64_t a = 0x100, b = 0x101;
+
+ assert_se(uint64_compare_func(&a, &a) == 0);
+ assert_se(uint64_compare_func(&a, &b) == -1);
+ assert_se(uint64_compare_func(&b, &a) == 1);
}
static void test_trivial_compare_func(void) {
@@ -484,8 +510,7 @@ static void test_string_compare_func(void) {
assert_se(string_compare_func("fred", "fred") == 0);
}
-int main(int argc, const char *argv[])
-{
+int main(int argc, const char *argv[]) {
test_hashmap_copy();
test_hashmap_get_strv();
test_hashmap_move_one();
@@ -502,6 +527,7 @@ int main(int argc, const char *argv[])
test_hashmap_isempty();
test_hashmap_get();
test_hashmap_size();
+ test_hashmap_many();
test_uint64_compare_func();
test_trivial_compare_func();
test_string_compare_func();
diff --git a/src/test/test-helper.h b/src/test/test-helper.h
new file mode 100644
index 0000000000..92864edb54
--- /dev/null
+++ b/src/test/test-helper.h
@@ -0,0 +1,31 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+#pragma once
+
+/***
+ This file is part of systemd.
+
+ Copyright 2013 Holger Hans Peter Freyther
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "sd-daemon.h"
+
+#define TEST_REQ_RUNNING_SYSTEMD(x) \
+ if (sd_booted() > 0) { \
+ x; \
+ } else { \
+ printf("systemd not booted skipping '%s'\n", #x); \
+ }
diff --git a/src/test/test-id128.c b/src/test/test-id128.c
index 2ed8e292e6..7b92758174 100644
--- a/src/test/test-id128.c
+++ b/src/test/test-id128.c
@@ -25,6 +25,7 @@
#include "util.h"
#include "macro.h"
+#include "sd-daemon.h"
#define ID128_WALDI SD_ID128_MAKE(01, 02, 03, 04, 05, 06, 07, 08, 09, 0a, 0b, 0c, 0d, 0e, 0f, 10)
#define STR_WALDI "0102030405060708090a0b0c0d0e0f10"
@@ -41,11 +42,13 @@ int main(int argc, char *argv[]) {
assert_se(sd_id128_from_string(t, &id2) == 0);
assert_se(sd_id128_equal(id, id2));
- assert_se(sd_id128_get_machine(&id) == 0);
- printf("machine: %s\n", sd_id128_to_string(id, t));
+ if (sd_booted() > 0) {
+ assert_se(sd_id128_get_machine(&id) == 0);
+ printf("machine: %s\n", sd_id128_to_string(id, t));
- assert_se(sd_id128_get_boot(&id) == 0);
- printf("boot: %s\n", sd_id128_to_string(id, t));
+ assert_se(sd_id128_get_boot(&id) == 0);
+ printf("boot: %s\n", sd_id128_to_string(id, t));
+ }
printf("waldi: %s\n", sd_id128_to_string(ID128_WALDI, t));
assert_se(streq(t, STR_WALDI));
diff --git a/src/test/test-libudev.c b/src/test/test-libudev.c
index caa3b4d14c..716767ba5f 100644
--- a/src/test/test-libudev.c
+++ b/src/test/test-libudev.c
@@ -430,7 +430,7 @@ static int test_enumerate(struct udev *udev, const char *subsystem)
}
static int test_hwdb(struct udev *udev, const char *modalias) {
- struct udev_hwdb * hwdb;
+ struct udev_hwdb *hwdb;
struct udev_list_entry *entry;
hwdb = udev_hwdb_new(udev);
diff --git a/src/test/test-list.c b/src/test/test-list.c
new file mode 100644
index 0000000000..2710504765
--- /dev/null
+++ b/src/test/test-list.c
@@ -0,0 +1,109 @@
+/***
+ This file is part of systemd
+
+ Copyright 2013 Jan Janssen
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "list.h"
+#include "util.h"
+
+int main(int argc, const char *argv[]) {
+ size_t i;
+ typedef struct list_item {
+ LIST_FIELDS(struct list_item, item);
+ } list_item;
+ LIST_HEAD(list_item, head);
+ list_item items[4];
+ list_item *cursor;
+
+ LIST_HEAD_INIT(list_item, head);
+ assert_se(head == NULL);
+
+ for (i = 0; i < ELEMENTSOF(items); i++) {
+ LIST_INIT(list_item, item, &items[i]);
+ assert_se(LIST_JUST_US(item, &items[i]));
+ LIST_PREPEND(list_item, item, head, &items[i]);
+ }
+
+ assert_se(!LIST_JUST_US(item, head));
+
+ assert_se(items[0].item_next == NULL);
+ assert_se(items[1].item_next == &items[0]);
+ assert_se(items[2].item_next == &items[1]);
+ assert_se(items[3].item_next == &items[2]);
+
+ assert_se(items[0].item_prev == &items[1]);
+ assert_se(items[1].item_prev == &items[2]);
+ assert_se(items[2].item_prev == &items[3]);
+ assert_se(items[3].item_prev == NULL);
+
+ LIST_FIND_HEAD(list_item, item, &items[0], cursor);
+ assert_se(cursor == &items[3]);
+
+ LIST_FIND_TAIL(list_item, item, &items[3], cursor);
+ assert_se(cursor == &items[0]);
+
+ LIST_REMOVE(list_item, item, head, &items[1]);
+ assert_se(LIST_JUST_US(item, &items[1]));
+
+ assert_se(items[0].item_next == NULL);
+ assert_se(items[2].item_next == &items[0]);
+ assert_se(items[3].item_next == &items[2]);
+
+ assert_se(items[0].item_prev == &items[2]);
+ assert_se(items[2].item_prev == &items[3]);
+ assert_se(items[3].item_prev == NULL);
+
+ LIST_INSERT_AFTER(list_item, item, head, &items[3], &items[1]);
+ assert_se(items[0].item_next == NULL);
+ assert_se(items[2].item_next == &items[0]);
+ assert_se(items[1].item_next == &items[2]);
+ assert_se(items[3].item_next == &items[1]);
+
+ assert_se(items[0].item_prev == &items[2]);
+ assert_se(items[2].item_prev == &items[1]);
+ assert_se(items[1].item_prev == &items[3]);
+ assert_se(items[3].item_prev == NULL);
+
+ LIST_REMOVE(list_item, item, head, &items[0]);
+ assert_se(LIST_JUST_US(item, &items[0]));
+
+ assert_se(items[2].item_next == NULL);
+ assert_se(items[1].item_next == &items[2]);
+ assert_se(items[3].item_next == &items[1]);
+
+ assert_se(items[2].item_prev == &items[1]);
+ assert_se(items[1].item_prev == &items[3]);
+ assert_se(items[3].item_prev == NULL);
+
+ LIST_REMOVE(list_item, item, head, &items[1]);
+ assert_se(LIST_JUST_US(item, &items[1]));
+
+ assert_se(items[2].item_next == NULL);
+ assert_se(items[3].item_next == &items[2]);
+
+ assert_se(items[2].item_prev == &items[3]);
+ assert_se(items[3].item_prev == NULL);
+
+ LIST_REMOVE(list_item, item, head, &items[2]);
+ assert_se(LIST_JUST_US(item, &items[2]));
+ assert_se(LIST_JUST_US(item, head));
+
+ LIST_REMOVE(list_item, item, head, &items[3]);
+ assert_se(LIST_JUST_US(item, &items[3]));
+
+ return 0;
+}
diff --git a/src/test/test-path-util.c b/src/test/test-path-util.c
index 127e17803f..ed3b315a61 100644
--- a/src/test/test-path-util.c
+++ b/src/test/test-path-util.c
@@ -56,7 +56,7 @@ static void test_path(void) {
assert_se(streq(path_get_file_name("file.../"), ""));
#define test_parent(x, y) { \
- char *z; \
+ char _cleanup_free_ *z = NULL; \
int r = path_get_parent(x, &z); \
printf("expected: %s\n", y ? y : "error"); \
printf("actual: %s\n", r<0 ? "error" : z); \
@@ -83,7 +83,84 @@ static void test_path(void) {
}
}
+static void test_find_binary(void) {
+ char *p;
+
+ assert(find_binary("/bin/sh", &p) == 0);
+ puts(p);
+ assert(streq(p, "/bin/sh"));
+ free(p);
+
+ assert(find_binary("./test-path-util", &p) == 0);
+ puts(p);
+ assert(endswith(p, "/test-path-util"));
+ assert(path_is_absolute(p));
+ free(p);
+
+ assert(find_binary("sh", &p) == 0);
+ puts(p);
+ assert(endswith(p, "/sh"));
+ assert(path_is_absolute(p));
+ free(p);
+
+ assert(find_binary("xxxx-xxxx", &p) == -ENOENT);
+}
+
+static void test_prefixes(void) {
+ static const char* values[] = { "/a/b/c/d", "/a/b/c", "/a/b", "/a", "", NULL};
+ unsigned i;
+ char s[PATH_MAX];
+ bool b;
+
+ i = 0;
+ PATH_FOREACH_PREFIX_MORE(s, "/a/b/c/d") {
+ log_error("---%s---", s);
+ assert_se(streq(s, values[i++]));
+ }
+ assert_se(values[i] == NULL);
+
+ i = 1;
+ PATH_FOREACH_PREFIX(s, "/a/b/c/d") {
+ log_error("---%s---", s);
+ assert_se(streq(s, values[i++]));
+ }
+ assert_se(values[i] == NULL);
+
+ i = 0;
+ PATH_FOREACH_PREFIX_MORE(s, "////a////b////c///d///////")
+ assert_se(streq(s, values[i++]));
+ assert_se(values[i] == NULL);
+
+ i = 1;
+ PATH_FOREACH_PREFIX(s, "////a////b////c///d///////")
+ assert_se(streq(s, values[i++]));
+ assert_se(values[i] == NULL);
+
+ PATH_FOREACH_PREFIX(s, "////")
+ assert_not_reached("Wut?");
+
+ b = false;
+ PATH_FOREACH_PREFIX_MORE(s, "////") {
+ assert_se(!b);
+ assert_se(streq(s, ""));
+ b = true;
+ }
+ assert_se(b);
+
+ PATH_FOREACH_PREFIX(s, "")
+ assert_not_reached("wut?");
+
+ b = false;
+ PATH_FOREACH_PREFIX_MORE(s, "") {
+ assert(!b);
+ assert(streq(s, ""));
+ b = true;
+ }
+}
+
int main(void) {
test_path();
+ test_find_binary();
+ test_prefixes();
return 0;
}
diff --git a/src/test/test-sched-prio.c b/src/test/test-sched-prio.c
index ba0aacf79d..1bbe867317 100644
--- a/src/test/test-sched-prio.c
+++ b/src/test/test-sched-prio.c
@@ -34,8 +34,8 @@ int main(int argc, char *argv[]) {
/* prepare the test */
assert_se(set_unit_path(TEST_DIR) >= 0);
- r = manager_new(SYSTEMD_USER, &m);
- if (r == -EPERM) {
+ r = manager_new(SYSTEMD_USER, false, &m);
+ if (r == -EPERM || r == -EACCES) {
puts("manager_new: Permission denied. Skipping test.");
return EXIT_TEST_SKIP;
}
@@ -88,5 +88,7 @@ int main(int argc, char *argv[]) {
assert_se(ser->exec_context.cpu_sched_policy == SCHED_RR);
assert_se(ser->exec_context.cpu_sched_priority == 99);
+ manager_free(m);
+
return EXIT_SUCCESS;
}
diff --git a/src/test/test-sleep.c b/src/test/test-sleep.c
index c3cb9c531d..a1020ad14c 100644
--- a/src/test/test-sleep.c
+++ b/src/test/test-sleep.c
@@ -29,7 +29,7 @@
#include "sleep-config.h"
#include "strv.h"
-int main(int argc, char* argv[]) {
+static void test_sleep(void) {
_cleanup_strv_free_ char
**standby = strv_new("standby", NULL),
**mem = strv_new("mem", NULL),
@@ -40,18 +40,28 @@ int main(int argc, char* argv[]) {
**shutdown = strv_new("shutdown", NULL),
**freez = strv_new("freeze", NULL);
- log_info("Can Standby: %s", yes_no(can_sleep_state(standby) > 0));
- log_info("Can Suspend: %s", yes_no(can_sleep_state(mem) > 0));
- log_info("Can Hibernate: %s", yes_no(can_sleep_state(disk) > 0));
- log_info("Can Hibernate+Suspend (Hybrid-Sleep): %s", yes_no(can_sleep_disk(suspend) > 0));
- log_info("Can Hibernate+Reboot: %s", yes_no(can_sleep_disk(reboot) > 0));
- log_info("Can Hibernate+Platform: %s", yes_no(can_sleep_disk(platform) > 0));
- log_info("Can Hibernate+Shutdown: %s", yes_no(can_sleep_disk(shutdown) > 0));
- log_info("Can Freeze: %s", yes_no(can_sleep_disk(freez) > 0));
+ log_info("Standby configured: %s", yes_no(can_sleep_state(standby) > 0));
+ log_info("Suspend configured: %s", yes_no(can_sleep_state(mem) > 0));
+ log_info("Hibernate configured: %s", yes_no(can_sleep_state(disk) > 0));
+ log_info("Hibernate+Suspend (Hybrid-Sleep) configured: %s", yes_no(can_sleep_disk(suspend) > 0));
+ log_info("Hibernate+Reboot configured: %s", yes_no(can_sleep_disk(reboot) > 0));
+ log_info("Hibernate+Platform configured: %s", yes_no(can_sleep_disk(platform) > 0));
+ log_info("Hibernate+Shutdown configured: %s", yes_no(can_sleep_disk(shutdown) > 0));
+ log_info("Freeze configured: %s", yes_no(can_sleep_state(freez) > 0));
log_info("Suspend configured and possible: %s", yes_no(can_sleep("suspend") > 0));
log_info("Hibernation configured and possible: %s", yes_no(can_sleep("hibernate") > 0));
log_info("Hybrid-sleep configured and possible: %s", yes_no(can_sleep("hybrid-sleep") > 0));
+}
+
+int main(int argc, char* argv[]) {
+ log_parse_environment();
+ log_open();
+
+ if (getuid() != 0)
+ log_warning("This program is unlikely to work for unpriviledged users");
+
+ test_sleep();
return 0;
}
diff --git a/src/test/test-strv.c b/src/test/test-strv.c
index 074e1bb3d4..c3d536d057 100644
--- a/src/test/test-strv.c
+++ b/src/test/test-strv.c
@@ -27,65 +27,95 @@
#include "strv.h"
static void test_specifier_printf(void) {
- _cleanup_free_ char *w = NULL;
-
- const Specifier table[] = {
+ static const Specifier table[] = {
{ 'a', specifier_string, (char*) "AAAA" },
{ 'b', specifier_string, (char*) "BBBB" },
- { 0, NULL, NULL }
+ { 'm', specifier_machine_id, NULL },
+ { 'B', specifier_boot_id, NULL },
+ { 'H', specifier_host_name, NULL },
+ { 'v', specifier_kernel_release, NULL },
+ {}
};
- w = specifier_printf("xxx a=%a b=%b yyy", table, NULL);
- puts(w);
+ _cleanup_free_ char *w = NULL;
+ int r;
+ r = specifier_printf("xxx a=%a b=%b yyy", table, NULL, &w);
+ assert_se(r >= 0);
assert_se(w);
+
+ puts(w);
assert_se(streq(w, "xxx a=AAAA b=BBBB yyy"));
+
+ free(w);
+ r = specifier_printf("machine=%m, boot=%B, host=%H, version=%v", table, NULL, &w);
+ assert_se(r >= 0);
+ assert_se(w);
+ puts(w);
}
-static void test_strv_find(void) {
- const char * const input_table[] = {
- "one",
- "two",
- "three",
- NULL
- };
+static const char* const input_table_multiple[] = {
+ "one",
+ "two",
+ "three",
+ NULL,
+};
+
+static const char* const input_table_one[] = {
+ "one",
+ NULL,
+};
+
+static const char* const input_table_none[] = {
+ NULL,
+};
+
+static const char* const input_table_quotes[] = {
+ "\"",
+ "'",
+ "\"\"",
+ "\\",
+ "\\\\",
+ NULL,
+};
+#define QUOTES_STRING \
+ "\"\\\"\" " \
+ "\"\\\'\" " \
+ "\"\\\"\\\"\" " \
+ "\"\\\\\" " \
+ "\"\\\\\\\\\""
+
+static const char * const input_table_spaces[] = {
+ " ",
+ "' '",
+ "\" ",
+ " \"",
+ " \\\\ ",
+ NULL,
+};
+#define SPACES_STRING \
+ "\" \" " \
+ "\"\\' \\'\" " \
+ "\"\\\" \" " \
+ "\" \\\"\" " \
+ "\" \\\\\\\\ \""
- assert_se(strv_find((char **)input_table, "three"));
- assert_se(!strv_find((char **)input_table, "four"));
+static void test_strv_find(void) {
+ assert_se(strv_find((char **)input_table_multiple, "three"));
+ assert_se(!strv_find((char **)input_table_multiple, "four"));
}
static void test_strv_find_prefix(void) {
- const char * const input_table[] = {
- "one",
- "two",
- "three",
- NULL
- };
-
- assert_se(strv_find_prefix((char **)input_table, "o"));
- assert_se(strv_find_prefix((char **)input_table, "one"));
- assert_se(strv_find_prefix((char **)input_table, ""));
- assert_se(!strv_find_prefix((char **)input_table, "xxx"));
- assert_se(!strv_find_prefix((char **)input_table, "onee"));
+ assert_se(strv_find_prefix((char **)input_table_multiple, "o"));
+ assert_se(strv_find_prefix((char **)input_table_multiple, "one"));
+ assert_se(strv_find_prefix((char **)input_table_multiple, ""));
+ assert_se(!strv_find_prefix((char **)input_table_multiple, "xxx"));
+ assert_se(!strv_find_prefix((char **)input_table_multiple, "onee"));
}
static void test_strv_join(void) {
_cleanup_free_ char *p = NULL, *q = NULL, *r = NULL, *s = NULL, *t = NULL;
- const char * const input_table_multiple[] = {
- "one",
- "two",
- "three",
- NULL
- };
- const char * const input_table_one[] = {
- "one",
- NULL
- };
- const char * const input_table_none[] = {
- NULL
- };
-
p = strv_join((char **)input_table_multiple, ", ");
assert_se(p);
assert_se(streq(p, "one, two, three"));
@@ -107,6 +137,25 @@ static void test_strv_join(void) {
assert_se(streq(t, ""));
}
+static void test_strv_quote_unquote(const char* const *split, const char *quoted) {
+ _cleanup_free_ char *p;
+ _cleanup_strv_free_ char **s;
+ char **t;
+
+ p = strv_join_quoted((char **)split);
+ printf("-%s- --- -%s-\n", p, quoted); /* fprintf deals with NULL, puts does not */
+ assert_se(p);
+ assert_se(streq(p, quoted));
+
+ s = strv_split_quoted(quoted);
+ assert_se(s);
+ STRV_FOREACH(t, s) {
+ assert_se(*t);
+ assert_se(streq(*t, *split));
+ split++;
+ }
+}
+
static void test_strv_split_nulstr(void) {
_cleanup_strv_free_ char **l = NULL;
const char nulstr[] = "str0\0str1\0str2\0str3\0";
@@ -253,6 +302,13 @@ int main(int argc, char *argv[]) {
test_strv_find();
test_strv_find_prefix();
test_strv_join();
+
+ test_strv_quote_unquote(input_table_multiple, "\"one\" \"two\" \"three\"");
+ test_strv_quote_unquote(input_table_one, "\"one\"");
+ test_strv_quote_unquote(input_table_none, "");
+ test_strv_quote_unquote(input_table_quotes, QUOTES_STRING);
+ test_strv_quote_unquote(input_table_spaces, SPACES_STRING);
+
test_strv_split_nulstr();
test_strv_parse_nulstr();
test_strv_overlap();
diff --git a/src/test/test-tables.c b/src/test/test-tables.c
new file mode 100644
index 0000000000..3b7800cf37
--- /dev/null
+++ b/src/test/test-tables.c
@@ -0,0 +1,105 @@
+/***
+ This file is part of systemd
+
+ Copyright 2013 Zbigniew Jędrzejewski-Szmek
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "automount.h"
+#include "cgroup.h"
+#include "condition.h"
+#include "device.h"
+#include "execute.h"
+#include "exit-status.h"
+#include "install.h"
+#include "job.h"
+#include "kill.h"
+#include "log.h"
+#include "logs-show.h"
+#include "mount.h"
+#include "path-lookup.h"
+#include "path.h"
+#include "scope.h"
+#include "service.h"
+#include "slice.h"
+#include "snapshot.h"
+#include "socket-util.h"
+#include "socket.h"
+#include "swap.h"
+#include "target.h"
+#include "timer.h"
+#include "unit-name.h"
+#include "unit.h"
+#include "util.h"
+#include "syscall-list.h"
+
+#include "test-tables.h"
+
+int main(int argc, char **argv) {
+ test_table(automount_result, AUTOMOUNT_RESULT);
+ test_table(automount_state, AUTOMOUNT_STATE);
+ test_table(cgroup_device_policy, CGROUP_DEVICE_POLICY);
+ test_table(condition_type, CONDITION_TYPE);
+ test_table(device_state, DEVICE_STATE);
+ test_table(exec_input, EXEC_INPUT);
+ test_table(exec_output, EXEC_OUTPUT);
+ test_table(job_mode, JOB_MODE);
+ test_table(job_result, JOB_RESULT);
+ test_table(job_state, JOB_STATE);
+ test_table(job_type, JOB_TYPE);
+ test_table(kill_mode, KILL_MODE);
+ test_table(kill_who, KILL_WHO);
+ test_table(log_target, LOG_TARGET);
+ test_table(mount_exec_command, MOUNT_EXEC_COMMAND);
+ test_table(mount_result, MOUNT_RESULT);
+ test_table(mount_state, MOUNT_STATE);
+ test_table(notify_access, NOTIFY_ACCESS);
+ test_table(output_mode, OUTPUT_MODE);
+ test_table(path_result, PATH_RESULT);
+ test_table(path_state, PATH_STATE);
+ test_table(path_type, PATH_TYPE);
+ test_table(scope_result, SCOPE_RESULT);
+ test_table(scope_state, SCOPE_STATE);
+ test_table(service_exec_command, SERVICE_EXEC_COMMAND);
+ test_table(service_restart, SERVICE_RESTART);
+ test_table(service_result, SERVICE_RESULT);
+ test_table(service_state, SERVICE_STATE);
+ test_table(service_type, SERVICE_TYPE);
+ test_table(slice_state, SLICE_STATE);
+ test_table(snapshot_state, SNAPSHOT_STATE);
+ test_table(socket_address_bind_ipv6_only, SOCKET_ADDRESS_BIND_IPV6_ONLY);
+ test_table(socket_exec_command, SOCKET_EXEC_COMMAND);
+ test_table(socket_result, SOCKET_RESULT);
+ test_table(socket_state, SOCKET_STATE);
+ test_table(start_limit_action, SERVICE_START_LIMIT);
+ test_table(swap_exec_command, SWAP_EXEC_COMMAND);
+ test_table(swap_result, SWAP_RESULT);
+ test_table(swap_state, SWAP_STATE);
+ test_table(systemd_running_as, SYSTEMD_RUNNING_AS);
+ test_table(target_state, TARGET_STATE);
+ test_table(timer_base, TIMER_BASE);
+ test_table(timer_result, TIMER_RESULT);
+ test_table(timer_state, TIMER_STATE);
+ test_table(unit_active_state, UNIT_ACTIVE_STATE);
+ test_table(unit_dependency, UNIT_DEPENDENCY);
+ test_table(unit_file_change_type, UNIT_FILE_CHANGE_TYPE);
+ test_table(unit_file_state, UNIT_FILE_STATE);
+ test_table(unit_load_state, UNIT_LOAD_STATE);
+ test_table(unit_type, UNIT_TYPE);
+
+ _test_table("syscall", syscall_to_name, syscall_from_name, syscall_max(), true);
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/test/test-unit-file.c b/src/test/test-unit-file.c
index a7fe77af24..0413ae2117 100644
--- a/src/test/test-unit-file.c
+++ b/src/test/test-unit-file.c
@@ -35,8 +35,9 @@
#include "load-fragment.h"
#include "strv.h"
#include "fileio.h"
+#include "test-helper.h"
-static void test_unit_file_get_set(void) {
+static int test_unit_file_get_set(void) {
int r;
Hashmap *h;
Iterator i;
@@ -46,13 +47,17 @@ static void test_unit_file_get_set(void) {
assert(h);
r = unit_file_get_list(UNIT_FILE_SYSTEM, NULL, h);
- log_info("unit_file_get_list: %s", strerror(-r));
- assert(r >= 0);
+ log_full(r == 0 ? LOG_INFO : LOG_ERR,
+ "unit_file_get_list: %s", strerror(-r));
+ if (r < 0)
+ return EXIT_FAILURE;
HASHMAP_FOREACH(p, h, i)
printf("%s = %s\n", p->path, unit_file_state_to_string(p->state));
unit_file_list_free(h);
+
+ return 0;
}
static void check_execcommand(ExecCommand *c,
@@ -297,17 +302,18 @@ static void test_install_printf(void) {
_cleanup_free_ char *mid, *bid, *host;
- assert_se((mid = specifier_machine_id('m', NULL, NULL)));
- assert_se((bid = specifier_boot_id('b', NULL, NULL)));
+ assert_se(specifier_machine_id('m', NULL, NULL, &mid) >= 0 && mid);
+ assert_se(specifier_boot_id('b', NULL, NULL, &bid) >= 0 && bid);
assert_se((host = gethostname_malloc()));
#define expect(src, pattern, result) \
do { \
- _cleanup_free_ char *t = install_full_printf(&src, pattern); \
+ _cleanup_free_ char *t = NULL; \
_cleanup_free_ char \
*d1 = strdup(i.name), \
*d2 = strdup(i.path), \
*d3 = strdup(i.user); \
+ assert_se(install_full_printf(&src, pattern, &t) >= 0 || !result); \
memzero(i.name, strlen(i.name)); \
memzero(i.path, strlen(i.path)); \
memzero(i.user, strlen(i.user)); \
@@ -351,17 +357,18 @@ static void test_install_printf(void) {
#pragma GCC diagnostic pop
int main(int argc, char *argv[]) {
+ int r;
log_parse_environment();
log_open();
- test_unit_file_get_set();
+ r = test_unit_file_get_set();
test_config_parse_exec();
test_load_env_file_1();
test_load_env_file_2();
test_load_env_file_3();
test_load_env_file_4();
- test_install_printf();
+ TEST_REQ_RUNNING_SYSTEMD(test_install_printf());
- return 0;
+ return r;
}
diff --git a/src/test/test-unit-name.c b/src/test/test-unit-name.c
index 86cb2b8da6..67ccdd4228 100644
--- a/src/test/test-unit-name.c
+++ b/src/test/test-unit-name.c
@@ -34,6 +34,7 @@
#include "specifier.h"
#include "util.h"
#include "macro.h"
+#include "test-helper.h"
static void test_replacements(void) {
#define expect(pattern, repl, expected) \
@@ -116,15 +117,15 @@ static int test_unit_printf(void) {
_cleanup_free_ char *mid, *bid, *host, *root_uid;
struct passwd *root;
- assert_se((mid = specifier_machine_id('m', NULL, NULL)));
- assert_se((bid = specifier_boot_id('b', NULL, NULL)));
+ assert_se(specifier_machine_id('m', NULL, NULL, &mid) >= 0 && mid);
+ assert_se(specifier_boot_id('b', NULL, NULL, &bid) >= 0 && bid);
assert_se((host = gethostname_malloc()));
assert_se((root = getpwnam("root")));
assert_se(asprintf(&root_uid, "%d", (int) root->pw_uid) > 0);
- r = manager_new(SYSTEMD_USER, &m);
- if (r == -EPERM) {
+ r = manager_new(SYSTEMD_USER, false, &m);
+ if (r == -EPERM || r == -EACCES) {
puts("manager_new: Permission denied. Skipping test.");
return EXIT_TEST_SKIP;
}
@@ -133,8 +134,8 @@ static int test_unit_printf(void) {
#define expect(unit, pattern, expected) \
{ \
char *e; \
- _cleanup_free_ char *t = \
- unit_full_printf(unit, pattern); \
+ _cleanup_free_ char *t; \
+ assert_se(unit_full_printf(unit, pattern, &t) >= 0); \
printf("result: %s\nexpect: %s\n", t, expected); \
if ((e = endswith(expected, "*"))) \
assert(strncmp(t, e, e-expected)); \
@@ -190,10 +191,14 @@ static int test_unit_printf(void) {
expect(u2, "%H", host);
expect(u2, "%t", "/run/user/*");
+ manager_free(m);
+
return 0;
}
int main(int argc, char* argv[]) {
+ int rc = 0;
test_replacements();
- return test_unit_printf();
+ TEST_REQ_RUNNING_SYSTEMD(rc = test_unit_printf());
+ return rc;
}
diff --git a/src/test/test-utf8.c b/src/test/test-utf8.c
new file mode 100644
index 0000000000..7bd0db173a
--- /dev/null
+++ b/src/test/test-utf8.c
@@ -0,0 +1,76 @@
+/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
+
+/***
+ This file is part of systemd.
+
+ Copyright 2013 Dave Reisner
+
+ systemd is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ systemd is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with systemd; If not, see <http://www.gnu.org/licenses/>.
+***/
+
+#include "utf8.h"
+#include "util.h"
+
+static void test_utf8_is_printable(void) {
+ assert_se(utf8_is_printable("ascii is valid\tunicode", 22));
+ assert_se(utf8_is_printable("\342\204\242", 3));
+ assert_se(!utf8_is_printable("\341\204", 2));
+}
+
+static void test_utf8_is_valid(void) {
+ assert_se(utf8_is_valid("ascii is valid unicode"));
+ assert_se(utf8_is_valid("\342\204\242"));
+ assert_se(!utf8_is_valid("\341\204"));
+}
+
+static void test_ascii_is_valid(void) {
+ assert_se(ascii_is_valid("alsdjf\t\vbarr\nba z"));
+ assert_se(!ascii_is_valid("\342\204\242"));
+ assert_se(!ascii_is_valid("\341\204"));
+}
+
+static void test_ascii_filter(void) {
+ char *f;
+
+ f = ascii_filter("alsdjf\t\vbarr\nba z");
+ assert_se(streq(f, "alsdjf\t\vbarr\nba z"));
+ free(f);
+
+ f = ascii_filter("\342\204\242");
+ assert_se(streq(f, ""));
+ free(f);
+
+ f = ascii_filter("foo\341\204bar");
+ assert_se(streq(f, "foobar"));
+ free(f);
+}
+
+static void test_utf8_encoded_valid_unichar(void) {
+ assert_se(utf8_encoded_valid_unichar("\342\204\242") == 3);
+ assert_se(utf8_encoded_valid_unichar("\302\256") == 2);
+ assert_se(utf8_encoded_valid_unichar("a") == 1);
+ assert_se(utf8_encoded_valid_unichar("\341\204") < 0);
+ assert_se(utf8_encoded_valid_unichar("\341\204\341\204") < 0);
+
+}
+
+int main(int argc, char *argv[]) {
+ test_utf8_is_valid();
+ test_utf8_is_printable();
+ test_ascii_is_valid();
+ test_ascii_filter();
+ test_utf8_encoded_valid_unichar();
+
+ return 0;
+}
diff --git a/src/test/test-util.c b/src/test/test-util.c
index 4c3a8a6b88..c5762ede4b 100644
--- a/src/test/test-util.c
+++ b/src/test/test-util.c
@@ -27,6 +27,7 @@
#include <errno.h>
#include "util.h"
+#include "strv.h"
static void test_streq_ptr(void) {
assert_se(streq_ptr(NULL, NULL));
@@ -192,41 +193,40 @@ static void test_safe_atod(void) {
}
static void test_strappend(void) {
- _cleanup_free_ char *t1, *t2, *t3, *t4;
+ _cleanup_free_ char *t1, *t2, *t3, *t4;
- t1 = strappend(NULL, NULL);
- assert_se(streq(t1, ""));
+ t1 = strappend(NULL, NULL);
+ assert_se(streq(t1, ""));
- t2 = strappend(NULL, "suf");
- assert_se(streq(t2, "suf"));
+ t2 = strappend(NULL, "suf");
+ assert_se(streq(t2, "suf"));
- t3 = strappend("pre", NULL);
- assert_se(streq(t3, "pre"));
+ t3 = strappend("pre", NULL);
+ assert_se(streq(t3, "pre"));
- t4 = strappend("pre", "suf");
- assert_se(streq(t4, "presuf"));
+ t4 = strappend("pre", "suf");
+ assert_se(streq(t4, "presuf"));
}
static void test_strstrip(void) {
- char *r;
- char input[] = " hello, waldo. ";
-
- r = strstrip(input);
- assert_se(streq(r, "hello, waldo."));
+ char *r;
+ char input[] = " hello, waldo. ";
+ r = strstrip(input);
+ assert_se(streq(r, "hello, waldo."));
}
static void test_delete_chars(void) {
- char *r;
- char input[] = " hello, waldo. abc";
+ char *r;
+ char input[] = " hello, waldo. abc";
- r = delete_chars(input, WHITESPACE);
- assert_se(streq(r, "hello,waldo.abc"));
+ r = delete_chars(input, WHITESPACE);
+ assert_se(streq(r, "hello,waldo.abc"));
}
static void test_in_charset(void) {
- assert_se(in_charset("dddaaabbbcccc", "abcd"));
- assert_se(!in_charset("dddaaabbbcccc", "abc f"));
+ assert_se(in_charset("dddaaabbbcccc", "abcd"));
+ assert_se(!in_charset("dddaaabbbcccc", "abc f"));
}
static void test_hexchar(void) {
@@ -260,6 +260,18 @@ static void test_undecchar(void) {
assert_se(undecchar('9') == 9);
}
+static void test_cescape(void) {
+ _cleanup_free_ char *escaped;
+ escaped = cescape("abc\\\"\b\f\n\r\t\v\003\177\234\313");
+ assert_se(streq(escaped, "abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\003\\177\\234\\313"));
+}
+
+static void test_cunescape(void) {
+ _cleanup_free_ char *unescaped;
+ unescaped = cunescape("abc\\\\\\\"\\b\\f\\n\\r\\t\\v\\003\\177\\234\\313");
+ assert_se(streq(unescaped, "abc\\\"\b\f\n\r\t\v\003\177\234\313"));
+}
+
static void test_foreach_word(void) {
char *w, *state;
size_t l;
@@ -386,6 +398,7 @@ static void test_u64log2(void) {
}
static void test_get_process_comm(void) {
+ struct stat st;
_cleanup_free_ char *a = NULL, *c = NULL, *d = NULL, *f = NULL, *i = NULL;
unsigned long long b;
pid_t e;
@@ -394,8 +407,12 @@ static void test_get_process_comm(void) {
dev_t h;
int r;
- assert_se(get_process_comm(1, &a) >= 0);
- log_info("pid1 comm: '%s'", a);
+ if (stat("/proc/1/comm", &st) == 0) {
+ assert_se(get_process_comm(1, &a) >= 0);
+ log_info("pid1 comm: '%s'", a);
+ } else {
+ log_warning("/proc/1/comm does not exist.");
+ }
assert_se(get_starttime_of_pid(1, &b) >= 0);
log_info("pid1 starttime: '%llu'", b);
@@ -439,6 +456,141 @@ static void test_protect_errno(void) {
assert(errno == 12);
}
+static void test_parse_bytes(void) {
+ off_t bytes;
+
+ assert_se(parse_bytes("111", &bytes) == 0);
+ assert_se(bytes == 111);
+
+ assert_se(parse_bytes(" 112 B", &bytes) == 0);
+ assert_se(bytes == 112);
+
+ assert_se(parse_bytes("3 K", &bytes) == 0);
+ assert_se(bytes == 3*1024);
+
+ assert_se(parse_bytes(" 4 M 11K", &bytes) == 0);
+ assert_se(bytes == 4*1024*1024 + 11 * 1024);
+
+ assert_se(parse_bytes("3B3G", &bytes) == 0);
+ assert_se(bytes == 3ULL*1024*1024*1024 + 3);
+
+ assert_se(parse_bytes("3B3G4T", &bytes) == 0);
+ assert_se(bytes == (4ULL*1024 + 3)*1024*1024*1024 + 3);
+
+ assert_se(parse_bytes("12P", &bytes) == 0);
+ assert_se(bytes == 12ULL * 1024*1024*1024*1024*1024);
+
+ assert_se(parse_bytes("3E 2P", &bytes) == 0);
+ assert_se(bytes == (3 * 1024 + 2ULL) * 1024*1024*1024*1024*1024);
+
+ assert_se(parse_bytes("12X", &bytes) == -EINVAL);
+
+ assert_se(parse_bytes("1024E", &bytes) == -ERANGE);
+ assert_se(parse_bytes("-1", &bytes) == -ERANGE);
+ assert_se(parse_bytes("-1024E", &bytes) == -ERANGE);
+
+ assert_se(parse_bytes("-1024P", &bytes) == -ERANGE);
+
+ assert_se(parse_bytes("-10B 20K", &bytes) == -ERANGE);
+}
+
+static void test_strextend(void) {
+ _cleanup_free_ char *str = strdup("0123");
+ strextend(&str, "456", "78", "9", NULL);
+ assert_se(streq(str, "0123456789"));
+}
+
+static void test_strrep(void) {
+ _cleanup_free_ char *one, *three, *zero;
+ one = strrep("waldo", 1);
+ three = strrep("waldo", 3);
+ zero = strrep("waldo", 0);
+
+ assert_se(streq(one, "waldo"));
+ assert_se(streq(three, "waldowaldowaldo"));
+ assert_se(streq(zero, ""));
+}
+
+static void test_parse_user_at_host(void) {
+ _cleanup_free_ char *both = strdup("waldo@waldoscomputer");
+ _cleanup_free_ char *onlyhost = strdup("mikescomputer");
+ char *user = NULL, *host = NULL;
+
+ parse_user_at_host(both, &user, &host);
+ assert_se(streq(user, "waldo"));
+ assert_se(streq(host, "waldoscomputer"));
+
+ user = host = NULL;
+ parse_user_at_host(onlyhost, &user, &host);
+ assert_se(user == NULL);
+ assert_se(streq(host, "mikescomputer"));
+}
+
+static void test_split_pair(void) {
+ _cleanup_free_ char *a = NULL, *b = NULL;
+
+ assert_se(split_pair("", "", &a, &b) == -EINVAL);
+ assert_se(split_pair("foo=bar", "", &a, &b) == -EINVAL);
+ assert_se(split_pair("", "=", &a, &b) == -EINVAL);
+ assert_se(split_pair("foo=bar", "=", &a, &b) >= 0);
+ assert_se(streq(a, "foo"));
+ assert_se(streq(b, "bar"));
+ free(a);
+ free(b);
+ assert_se(split_pair("==", "==", &a, &b) >= 0);
+ assert_se(streq(a, ""));
+ assert_se(streq(b, ""));
+ free(a);
+ free(b);
+
+ assert_se(split_pair("===", "==", &a, &b) >= 0);
+ assert_se(streq(a, ""));
+ assert_se(streq(b, "="));
+}
+
+static void test_fstab_node_to_udev_node(void) {
+ char *n;
+
+ n = fstab_node_to_udev_node("LABEL=applé/jack");
+ puts(n);
+ assert_se(streq(n, "/dev/disk/by-label/applé\\x2fjack"));
+ free(n);
+
+ n = fstab_node_to_udev_node("PARTLABEL=pinkié pie");
+ puts(n);
+ assert_se(streq(n, "/dev/disk/by-partlabel/pinkié\\x20pie"));
+ free(n);
+
+ n = fstab_node_to_udev_node("UUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
+ puts(n);
+ assert_se(streq(n, "/dev/disk/by-uuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
+ free(n);
+
+ n = fstab_node_to_udev_node("PARTUUID=037b9d94-148e-4ee4-8d38-67bfe15bb535");
+ puts(n);
+ assert_se(streq(n, "/dev/disk/by-partuuid/037b9d94-148e-4ee4-8d38-67bfe15bb535"));
+ free(n);
+
+
+ n = fstab_node_to_udev_node("PONIES=awesome");
+ puts(n);
+ assert_se(streq(n, "PONIES=awesome"));
+ free(n);
+
+ n = fstab_node_to_udev_node("/dev/xda1");
+ puts(n);
+ assert_se(streq(n, "/dev/xda1"));
+ free(n);
+}
+
+static void test_get_files_in_directory(void) {
+ _cleanup_strv_free_ char **l = NULL, **t = NULL;
+
+ assert_se(get_files_in_directory("/tmp", &l) >= 0);
+ assert_se(get_files_in_directory(".", &l) >= 0);
+ assert_se(get_files_in_directory(".", NULL) >= 0);
+}
+
int main(int argc, char *argv[]) {
test_streq_ptr();
test_first_word();
@@ -458,6 +610,8 @@ int main(int argc, char *argv[]) {
test_unoctchar();
test_decchar();
test_undecchar();
+ test_cescape();
+ test_cunescape();
test_foreach_word();
test_foreach_word_quoted();
test_default_term_for_tty();
@@ -467,6 +621,13 @@ int main(int argc, char *argv[]) {
test_u64log2();
test_get_process_comm();
test_protect_errno();
+ test_parse_bytes();
+ test_strextend();
+ test_strrep();
+ test_parse_user_at_host();
+ test_split_pair();
+ test_fstab_node_to_udev_node();
+ test_get_files_in_directory();
return 0;
}