From f385c447870e0783814b37cb11a38187533458db Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 5 Mar 2021 09:29:57 +0900 Subject: [PATCH 1/5] strv: introduce strv_split_newlines_full() --- src/basic/strv.c | 25 +++++++++++++------------ src/basic/strv.h | 16 +++++++++++----- src/test/test-device-nodes.c | 1 + src/test/test-strv.c | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 59 insertions(+), 17 deletions(-) diff --git a/src/basic/strv.c b/src/basic/strv.c index 492dfe4002..765da04a7b 100644 --- a/src/basic/strv.c +++ b/src/basic/strv.c @@ -240,27 +240,28 @@ int strv_extend_strv_concat(char ***a, char * const *b, const char *suffix) { return 0; } -char **strv_split_newlines(const char *s) { - char **l; +int strv_split_newlines_full(char ***ret, const char *s, ExtractFlags flags) { + _cleanup_strv_free_ char **l = NULL; size_t n; + int r; assert(s); - /* Special version of strv_split() that splits on newlines and - * suppresses an empty string at the end */ + /* Special version of strv_split_full() that splits on newlines and + * suppresses an empty string at the end. */ - l = strv_split(s, NEWLINE); - if (!l) - return NULL; + r = strv_split_full(&l, s, NEWLINE, flags); + if (r < 0) + return r; n = strv_length(l); - if (n <= 0) - return l; - - if (isempty(l[n - 1])) + if (n > 0 && isempty(l[n - 1])) { l[n - 1] = mfree(l[n - 1]); + n--; + } - return l; + *ret = TAKE_PTR(l); + return n; } int strv_split_full(char ***t, const char *s, const char *separators, ExtractFlags flags) { diff --git a/src/basic/strv.h b/src/basic/strv.h index 6b3e8e7f86..911528fab4 100644 --- a/src/basic/strv.h +++ b/src/basic/strv.h @@ -73,15 +73,21 @@ static inline bool strv_isempty(char * const *l) { return !l || !*l; } -char **strv_split_newlines(const char *s); - int strv_split_full(char ***t, const char *s, const char *separators, ExtractFlags flags); static inline char **strv_split(const char *s, const char *separators) { char **ret; - int r; - r = strv_split_full(&ret, s, separators, 0); - if (r < 0) + if (strv_split_full(&ret, s, separators, 0) < 0) + return NULL; + + return ret; +} + +int strv_split_newlines_full(char ***ret, const char *s, ExtractFlags flags); +static inline char **strv_split_newlines(const char *s) { + char **ret; + + if (strv_split_newlines_full(&ret, s, 0) < 0) return NULL; return ret; diff --git a/src/test/test-device-nodes.c b/src/test/test-device-nodes.c index 9efb3fe3b3..c914d78324 100644 --- a/src/test/test-device-nodes.c +++ b/src/test/test-device-nodes.c @@ -31,6 +31,7 @@ static void test_encode_devnode_name(void) { assert_se(expect_encoded_as("s/ash/ng", "s\\x2fash\\x2fng")); assert_se(expect_encoded_as("/", "\\x2f")); assert_se(expect_encoded_as("!", "\\x21")); + assert_se(expect_encoded_as("QEMU ", "QEMU\\x20\\x20\\x20\\x20")); } int main(int argc, char *argv[]) { diff --git a/src/test/test-strv.c b/src/test/test-strv.c index 6b5005f9fc..162d8bed95 100644 --- a/src/test/test-strv.c +++ b/src/test/test-strv.c @@ -118,6 +118,20 @@ static const char* const input_table_one_empty[] = { NULL, }; +static const char* const input_table_unescape[] = { + "ID_VENDOR=QEMU", + "ID_VENDOR_ENC=QEMUx20x20x20x20", + "ID_MODEL_ENC=QEMUx20HARDDISKx20x20x20", + NULL, +}; + +static const char* const input_table_retain_escape[] = { + "ID_VENDOR=QEMU", + "ID_VENDOR_ENC=QEMU\\x20\\x20\\x20\\x20", + "ID_MODEL_ENC=QEMU\\x20HARDDISK\\x20\\x20\\x20", + NULL, +}; + static void test_strv_find(void) { log_info("/* %s */", __func__); @@ -453,6 +467,25 @@ static void test_strv_split_newlines(void) { assert_se(streq(*s, input_table_multiple[i++])); } +static void test_strv_split_newlines_full(void) { + const char str[] = + "ID_VENDOR=QEMU\n" + "ID_VENDOR_ENC=QEMU\\x20\\x20\\x20\\x20\n" + "ID_MODEL_ENC=QEMU\\x20HARDDISK\\x20\\x20\\x20\n" + "\n\n\n"; + _cleanup_strv_free_ char **l = NULL; + + log_info("/* %s */", __func__); + + assert_se(strv_split_newlines_full(&l, str, 0) == 3); + assert_se(strv_equal(l, (char**) input_table_unescape)); + + l = strv_free(l); + + assert_se(strv_split_newlines_full(&l, str, EXTRACT_RETAIN_ESCAPE) == 3); + assert_se(strv_equal(l, (char**) input_table_retain_escape)); +} + static void test_strv_split_nulstr(void) { _cleanup_strv_free_ char **l = NULL; const char nulstr[] = "str0\0str1\0str2\0str3\0"; @@ -1031,6 +1064,7 @@ int main(int argc, char *argv[]) { test_strv_split_full(); test_strv_split_colon_pairs(); test_strv_split_newlines(); + test_strv_split_newlines_full(); test_strv_split_nulstr(); test_strv_parse_nulstr(); test_strv_overlap(); From 86c783d93dafde1d175170b6366725ebfd148de6 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 5 Mar 2021 09:37:24 +0900 Subject: [PATCH 2/5] udev: do not unescape command result This fixes a bug introduced by 28a5065149c31a8689738ddcd1100502371a7c34. Fixes RHBZ#1935062 (https://bugzilla.redhat.com/show_bug.cgi?id=1935062). --- src/udev/udev-rules.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/udev/udev-rules.c b/src/udev/udev-rules.c index 0f10116a99..57ede6a197 100644 --- a/src/udev/udev-rules.c +++ b/src/udev/udev-rules.c @@ -1746,9 +1746,10 @@ static int udev_rule_apply_token_to_event( return token->op == OP_NOMATCH; } - lines = strv_split_newlines(result); - if (!lines) - return log_oom(); + r = strv_split_newlines_full(&lines, result, EXTRACT_RETAIN_ESCAPE); + if (r < 0) + log_rule_warning_errno(dev, rules, r, + "Failed to extract lines from result of command \"%s\", ignoring: %m", buf); STRV_FOREACH(line, lines) { char *key, *value; From daceb818cfafbeac470aa5efc5e36e64e52d906d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 5 Mar 2021 11:31:30 +0900 Subject: [PATCH 3/5] udev: also not unescape command result on debug log --- src/udev/udev-event.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/udev/udev-event.c b/src/udev/udev-event.c index 78a999d00a..d5d89d6802 100644 --- a/src/udev/udev-event.c +++ b/src/udev/udev-event.c @@ -573,9 +573,11 @@ static int on_spawn_io(sd_event_source *s, int fd, uint32_t revents, void *userd _cleanup_strv_free_ char **v = NULL; char **q; - v = strv_split_newlines(p); - if (!v) - log_oom_debug(); + r = strv_split_newlines_full(&v, p, EXTRACT_RETAIN_ESCAPE); + if (r < 0) + log_device_debug(spawn->device, + "Failed to split output from '%s'(%s), ignoring: %m", + spawn->cmd, fd == spawn->fd_stdout ? "out" : "err"); STRV_FOREACH(q, v) log_device_debug(spawn->device, "'%s'(%s) '%s'", spawn->cmd, From 1ebcf47296647d3586ebd5bccc53270561e879fb Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 5 Mar 2021 18:36:04 +0900 Subject: [PATCH 4/5] test: merge udev tests --- test/TEST-17-UDEV-WANTS/test.sh | 9 -- .../Makefile | 0 .../test.sh | 8 +- .../Makefile | 0 .../test.sh | 2 +- .../Makefile | 0 .../test.sh | 2 +- test/TEST-49-UDEV-EVENT-TIMEOUT/test.sh | 8 -- .../Makefile | 0 test/{TEST-56-OOMD => TEST-55-OOMD}/test.sh | 2 +- test/TEST-55-UDEV-TAGS/test.sh | 8 -- test/TEST-56-OOMD/Makefile | 1 - test/TEST-57-RUNTIME-BIND-PATHS/Makefile | 1 - test/TEST-58-PORTABLE/Makefile | 1 - test/units/testsuite-17.01.sh | 72 ++++++++++++ test/units/testsuite-17.02.sh | 57 ++++++++++ test/units/testsuite-17.03.sh | 45 ++++++++ test/units/testsuite-17.04.sh | 64 +++++++++++ test/units/testsuite-17.service | 2 +- test/units/testsuite-17.sh | 75 ++----------- test/units/testsuite-29.service | 2 +- test/units/testsuite-29.sh | 87 ++++++++------- ...ervice => testsuite-49-namespaced.service} | 2 +- ...ce => testsuite-49-non-namespaced.service} | 0 test/units/testsuite-49.service | 3 +- test/units/testsuite-49.sh | 56 +++++----- ...owgrowth.sh => testsuite-55-slowgrowth.sh} | 0 ...service => testsuite-55-testbloat.service} | 4 +- ...service => testsuite-55-testchill.service} | 2 +- test/units/testsuite-55-testmunch.service | 7 ++ ...load.slice => testsuite-55-workload.slice} | 0 test/units/testsuite-55.service | 4 +- test/units/testsuite-55.sh | 104 ++++++++++-------- test/units/testsuite-56-testmunch.service | 7 -- test/units/testsuite-56.service | 7 -- test/units/testsuite-56.sh | 76 ------------- test/units/testsuite-57.service | 7 -- test/units/testsuite-57.sh | 43 -------- test/units/testsuite-58.service | 7 -- test/units/testsuite-58.sh | 68 ------------ 40 files changed, 400 insertions(+), 443 deletions(-) delete mode 100755 test/TEST-17-UDEV-WANTS/test.sh rename test/{TEST-17-UDEV-WANTS => TEST-17-UDEV}/Makefile (100%) rename test/{TEST-29-UDEV-ID_RENAMING => TEST-17-UDEV}/test.sh (61%) rename test/{TEST-29-UDEV-ID_RENAMING => TEST-29-PORTABLE}/Makefile (100%) rename test/{TEST-58-PORTABLE => TEST-29-PORTABLE}/test.sh (97%) rename test/{TEST-49-UDEV-EVENT-TIMEOUT => TEST-49-RUNTIME-BIND-PATHS}/Makefile (100%) rename test/{TEST-57-RUNTIME-BIND-PATHS => TEST-49-RUNTIME-BIND-PATHS}/test.sh (89%) delete mode 100755 test/TEST-49-UDEV-EVENT-TIMEOUT/test.sh rename test/{TEST-55-UDEV-TAGS => TEST-55-OOMD}/Makefile (100%) rename test/{TEST-56-OOMD => TEST-55-OOMD}/test.sh (98%) delete mode 100755 test/TEST-55-UDEV-TAGS/test.sh delete mode 120000 test/TEST-56-OOMD/Makefile delete mode 120000 test/TEST-57-RUNTIME-BIND-PATHS/Makefile delete mode 120000 test/TEST-58-PORTABLE/Makefile create mode 100755 test/units/testsuite-17.01.sh create mode 100755 test/units/testsuite-17.02.sh create mode 100755 test/units/testsuite-17.03.sh create mode 100755 test/units/testsuite-17.04.sh rename test/units/{testsuite-57-namespaced.service => testsuite-49-namespaced.service} (89%) rename test/units/{testsuite-57-non-namespaced.service => testsuite-49-non-namespaced.service} (100%) rename test/units/{testsuite-56-slowgrowth.sh => testsuite-55-slowgrowth.sh} (100%) rename test/units/{testsuite-56-testbloat.service => testsuite-55-testbloat.service} (68%) rename test/units/{testsuite-56-testchill.service => testsuite-55-testchill.service} (68%) create mode 100644 test/units/testsuite-55-testmunch.service rename test/units/{testsuite-56-workload.slice => testsuite-55-workload.slice} (100%) delete mode 100644 test/units/testsuite-56-testmunch.service delete mode 100644 test/units/testsuite-56.service delete mode 100755 test/units/testsuite-56.sh delete mode 100644 test/units/testsuite-57.service delete mode 100755 test/units/testsuite-57.sh delete mode 100644 test/units/testsuite-58.service delete mode 100755 test/units/testsuite-58.sh diff --git a/test/TEST-17-UDEV-WANTS/test.sh b/test/TEST-17-UDEV-WANTS/test.sh deleted file mode 100755 index 5b8f22cbaa..0000000000 --- a/test/TEST-17-UDEV-WANTS/test.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/env bash -set -e -TEST_DESCRIPTION="UDEV SYSTEMD_WANTS property" -TEST_NO_NSPAWN=1 - -. $TEST_BASE_DIR/test-functions -QEMU_TIMEOUT=300 - -do_test "$@" 17 diff --git a/test/TEST-17-UDEV-WANTS/Makefile b/test/TEST-17-UDEV/Makefile similarity index 100% rename from test/TEST-17-UDEV-WANTS/Makefile rename to test/TEST-17-UDEV/Makefile diff --git a/test/TEST-29-UDEV-ID_RENAMING/test.sh b/test/TEST-17-UDEV/test.sh similarity index 61% rename from test/TEST-29-UDEV-ID_RENAMING/test.sh rename to test/TEST-17-UDEV/test.sh index c918e5af6a..b13ae0aa78 100755 --- a/test/TEST-29-UDEV-ID_RENAMING/test.sh +++ b/test/TEST-17-UDEV/test.sh @@ -1,11 +1,11 @@ #!/usr/bin/env bash set -e -TEST_DESCRIPTION="UDEV ID_RENAMING property" -IMAGE_NAME="udev-id-renaming" +TEST_DESCRIPTION="UDEV" +IMAGE_NAME="udev" TEST_NO_NSPAWN=1 . $TEST_BASE_DIR/test-functions -QEMU_TIMEOUT=300 +QEMU_TIMEOUT=500 test_append_files() { ( @@ -14,4 +14,4 @@ test_append_files() { ) } -do_test "$@" 29 +do_test "$@" 17 diff --git a/test/TEST-29-UDEV-ID_RENAMING/Makefile b/test/TEST-29-PORTABLE/Makefile similarity index 100% rename from test/TEST-29-UDEV-ID_RENAMING/Makefile rename to test/TEST-29-PORTABLE/Makefile diff --git a/test/TEST-58-PORTABLE/test.sh b/test/TEST-29-PORTABLE/test.sh similarity index 97% rename from test/TEST-58-PORTABLE/test.sh rename to test/TEST-29-PORTABLE/test.sh index 98e697962e..801e74c13d 100755 --- a/test/TEST-58-PORTABLE/test.sh +++ b/test/TEST-29-PORTABLE/test.sh @@ -24,4 +24,4 @@ test_append_files() { ) } -do_test "$@" 58 +do_test "$@" 29 diff --git a/test/TEST-49-UDEV-EVENT-TIMEOUT/Makefile b/test/TEST-49-RUNTIME-BIND-PATHS/Makefile similarity index 100% rename from test/TEST-49-UDEV-EVENT-TIMEOUT/Makefile rename to test/TEST-49-RUNTIME-BIND-PATHS/Makefile diff --git a/test/TEST-57-RUNTIME-BIND-PATHS/test.sh b/test/TEST-49-RUNTIME-BIND-PATHS/test.sh similarity index 89% rename from test/TEST-57-RUNTIME-BIND-PATHS/test.sh rename to test/TEST-49-RUNTIME-BIND-PATHS/test.sh index 76d1b496ad..ff24a4f254 100755 --- a/test/TEST-57-RUNTIME-BIND-PATHS/test.sh +++ b/test/TEST-49-RUNTIME-BIND-PATHS/test.sh @@ -4,4 +4,4 @@ set -e TEST_DESCRIPTION="test adding new BindPaths while unit is already running" . $TEST_BASE_DIR/test-functions -do_test "$@" 57 +do_test "$@" 49 diff --git a/test/TEST-49-UDEV-EVENT-TIMEOUT/test.sh b/test/TEST-49-UDEV-EVENT-TIMEOUT/test.sh deleted file mode 100755 index 249d8a22ae..0000000000 --- a/test/TEST-49-UDEV-EVENT-TIMEOUT/test.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -e - -TEST_DESCRIPTION="test udev's event-timeout and timeout-signal options" -TEST_NO_NSPAWN=1 -. $TEST_BASE_DIR/test-functions - -do_test "$@" 49 diff --git a/test/TEST-55-UDEV-TAGS/Makefile b/test/TEST-55-OOMD/Makefile similarity index 100% rename from test/TEST-55-UDEV-TAGS/Makefile rename to test/TEST-55-OOMD/Makefile diff --git a/test/TEST-56-OOMD/test.sh b/test/TEST-55-OOMD/test.sh similarity index 98% rename from test/TEST-56-OOMD/test.sh rename to test/TEST-55-OOMD/test.sh index 55b0d1dafd..121aa8d56e 100755 --- a/test/TEST-56-OOMD/test.sh +++ b/test/TEST-55-OOMD/test.sh @@ -45,4 +45,4 @@ check_result_qemu() { return $ret } -do_test "$@" 56 +do_test "$@" 55 diff --git a/test/TEST-55-UDEV-TAGS/test.sh b/test/TEST-55-UDEV-TAGS/test.sh deleted file mode 100755 index 325d70f011..0000000000 --- a/test/TEST-55-UDEV-TAGS/test.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash -set -e -TEST_DESCRIPTION="UDEV tags management" -TEST_NO_NSPAWN=1 - -. $TEST_BASE_DIR/test-functions - -do_test "$@" 55 diff --git a/test/TEST-56-OOMD/Makefile b/test/TEST-56-OOMD/Makefile deleted file mode 120000 index e9f93b1104..0000000000 --- a/test/TEST-56-OOMD/Makefile +++ /dev/null @@ -1 +0,0 @@ -../TEST-01-BASIC/Makefile \ No newline at end of file diff --git a/test/TEST-57-RUNTIME-BIND-PATHS/Makefile b/test/TEST-57-RUNTIME-BIND-PATHS/Makefile deleted file mode 120000 index e9f93b1104..0000000000 --- a/test/TEST-57-RUNTIME-BIND-PATHS/Makefile +++ /dev/null @@ -1 +0,0 @@ -../TEST-01-BASIC/Makefile \ No newline at end of file diff --git a/test/TEST-58-PORTABLE/Makefile b/test/TEST-58-PORTABLE/Makefile deleted file mode 120000 index e9f93b1104..0000000000 --- a/test/TEST-58-PORTABLE/Makefile +++ /dev/null @@ -1 +0,0 @@ -../TEST-01-BASIC/Makefile \ No newline at end of file diff --git a/test/units/testsuite-17.01.sh b/test/units/testsuite-17.01.sh new file mode 100755 index 0000000000..573ad41079 --- /dev/null +++ b/test/units/testsuite-17.01.sh @@ -0,0 +1,72 @@ +#!/usr/bin/env bash +set -ex +set -o pipefail + +mkdir -p /run/udev/rules.d/ + +rm -f /run/udev/rules.d/50-testsuite.rules +udevadm control --reload +udevadm trigger /dev/sda + +while : ; do + ( + udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service + udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service + systemctl show -p WantedBy foobar.service | grep -q -v sda + systemctl show -p WantedBy waldo.service | grep -q -v sda + ) && break + + sleep .5 +done + +cat > /run/udev/rules.d/50-testsuite.rules < /run/udev/rules.d/50-testsuite.rules < /run/udev/rules.d/50-testsuite.rules < "${test_rule}" + echo "event_timeout=30" >> /etc/udev/udev.conf + echo "timeout_signal=SIGABRT" >> /etc/udev/udev.conf + + systemctl restart systemd-udevd.service +} + +teardown() { + set +e + + mv -f /etc/udev/udev.conf.bckp /etc/udev/udev.conf + rm -f "$test_rule" + systemctl restart systemd-udevd.service +} + +run_test() { + since="$(date +%T)" + + echo add > /sys/class/net/lo/uevent + + for n in {1..20}; do + sleep 5 + if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then + return 0 + fi + done + + return 1 +} + +trap teardown EXIT + +setup +run_test + +exit 0 diff --git a/test/units/testsuite-17.04.sh b/test/units/testsuite-17.04.sh new file mode 100755 index 0000000000..c799936c0a --- /dev/null +++ b/test/units/testsuite-17.04.sh @@ -0,0 +1,64 @@ +#!/bin/bash +set -ex +set -o pipefail + +mkdir -p /run/udev/rules.d/ + +! test -f /run/udev/tags/added/c1:3 && + ! test -f /run/udev/tags/changed/c1:3 && + udevadm info /dev/null | grep -q -v 'E: TAGS=.*:added:.*' && + udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' && + udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' && + udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' + +cat > /run/udev/rules.d/50-testsuite.rules </failed -while : ; do - ( - udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=foobar.service - udevadm info /dev/sda | grep -q -v SYSTEMD_WANTS=waldo.service - systemctl show -p WantedBy foobar.service | grep -q -v sda - systemctl show -p WantedBy waldo.service | grep -q -v sda - ) && break - - sleep .5 +for t in ${0%.sh}.*.sh; do + echo "Running $t"; ./$t done -cat > /run/udev/rules.d/50-testsuite.rules < /run/udev/rules.d/50-testsuite.rules </testok - -exit 0 +touch /testok +rm /failed diff --git a/test/units/testsuite-29.service b/test/units/testsuite-29.service index 90c2187bd7..900b99f77b 100644 --- a/test/units/testsuite-29.service +++ b/test/units/testsuite-29.service @@ -1,5 +1,5 @@ [Unit] -Description=TEST-29-UDEV-ID_RENAMING +Description=TEST-29-PORTABLE [Service] ExecStartPre=rm -f /failed /testok diff --git a/test/units/testsuite-29.sh b/test/units/testsuite-29.sh index 5c62556895..b5b05b42d9 100755 --- a/test/units/testsuite-29.sh +++ b/test/units/testsuite-29.sh @@ -1,58 +1,67 @@ #!/usr/bin/env bash +# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- +# ex: ts=8 sw=4 sts=4 et filetype=sh set -ex set -o pipefail -mkdir -p /run/udev/rules.d/ +export SYSTEMD_LOG_LEVEL=debug -cat > /run/udev/rules.d/50-testsuite.rules < /testok diff --git a/test/units/testsuite-57-namespaced.service b/test/units/testsuite-49-namespaced.service similarity index 89% rename from test/units/testsuite-57-namespaced.service rename to test/units/testsuite-49-namespaced.service index 0abcc4faf4..722dbe246d 100644 --- a/test/units/testsuite-57-namespaced.service +++ b/test/units/testsuite-49-namespaced.service @@ -6,7 +6,7 @@ Type=notify RemainAfterExit=yes MountAPIVFS=yes PrivateTmp=yes -BindPaths=/run/testservice-57-fixed:/tmp/testfile_fixed +BindPaths=/run/testservice-49-fixed:/tmp/testfile_fixed InaccessiblePaths=/run/inaccessible ExecStartPre=grep -q -F MARKER_FIXED /tmp/testfile_fixed ExecStart=/bin/sh -c 'systemd-notify --ready; while ! grep -q -F MARKER_RUNTIME /tmp/testfile_runtime; do sleep 0.1; done; test ! -f /run/inaccessible/testfile_fixed' diff --git a/test/units/testsuite-57-non-namespaced.service b/test/units/testsuite-49-non-namespaced.service similarity index 100% rename from test/units/testsuite-57-non-namespaced.service rename to test/units/testsuite-49-non-namespaced.service diff --git a/test/units/testsuite-49.service b/test/units/testsuite-49.service index f47177106f..9475109ca2 100644 --- a/test/units/testsuite-49.service +++ b/test/units/testsuite-49.service @@ -1,6 +1,7 @@ [Unit] -Description=TEST-49-UDEV-EVENT-TIMEOUT +Description=TEST-49-RUNTIME-BIND-PATHS [Service] +ExecStartPre=rm -f /failed /testok ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh Type=oneshot diff --git a/test/units/testsuite-49.sh b/test/units/testsuite-49.sh index ffa9801644..07bb20d99c 100755 --- a/test/units/testsuite-49.sh +++ b/test/units/testsuite-49.sh @@ -1,46 +1,42 @@ #!/usr/bin/env bash - set -ex -test_rule="/run/udev/rules.d/49-test.rules" +echo "MARKER_FIXED" > /run/testservice-49-fixed +mkdir -p /run/inaccessible -setup() { - mkdir -p "${test_rule%/*}" - cp -f /etc/udev/udev.conf /etc/udev/udev.conf.bckp - echo 'KERNEL=="lo", SUBSYSTEM=="net", PROGRAM=="/bin/sleep 60"' > "${test_rule}" - echo "event_timeout=30" >> /etc/udev/udev.conf - echo "timeout_signal=SIGABRT" >> /etc/udev/udev.conf +systemctl start testsuite-49-namespaced.service - systemctl restart systemd-udevd.service -} +# Ensure that inaccessible paths aren't bypassed by the runtime setup +set +e +systemctl bind --mkdir testsuite-49-namespaced.service /run/testservice-49-fixed /run/inaccessible/testfile_fixed && exit 1 +set -e -teardown() { - set +e +echo "MARKER_RUNTIME" > /run/testservice-49-runtime - mv -f /etc/udev/udev.conf.bckp /etc/udev/udev.conf - rm -f "$test_rule" - systemctl restart systemd-udevd.service -} +systemctl bind --mkdir testsuite-49-namespaced.service /run/testservice-49-runtime /tmp/testfile_runtime -run_test() { - since="$(date +%T)" +while systemctl show -P SubState testsuite-49-namespaced.service | grep -q running +do + sleep 0.1 +done - echo add > /sys/class/net/lo/uevent +systemctl is-active testsuite-49-namespaced.service - for n in {1..20}; do - sleep 5 - if coredumpctl --since "$since" --no-legend --no-pager | grep /bin/udevadm ; then - return 0 - fi - done +# Now test that systemctl bind fails when attempted on a non-namespaced unit +systemctl start testsuite-49-non-namespaced.service - return 1 -} +set +e +systemctl bind --mkdir testsuite-49-non-namespaced.service /run/testservice-49-runtime /tmp/testfile_runtime && exit 1 +set -e -trap teardown EXIT +while systemctl show -P SubState testsuite-49-non-namespaced.service | grep -q running +do + sleep 0.1 +done -setup -run_test +set +e +systemctl is-active testsuite-49-non-namespaced.service && exit 1 +set -e echo OK > /testok diff --git a/test/units/testsuite-56-slowgrowth.sh b/test/units/testsuite-55-slowgrowth.sh similarity index 100% rename from test/units/testsuite-56-slowgrowth.sh rename to test/units/testsuite-55-slowgrowth.sh diff --git a/test/units/testsuite-56-testbloat.service b/test/units/testsuite-55-testbloat.service similarity index 68% rename from test/units/testsuite-56-testbloat.service rename to test/units/testsuite-55-testbloat.service index 6163aae1db..7aa794b9f9 100644 --- a/test/units/testsuite-56-testbloat.service +++ b/test/units/testsuite-55-testbloat.service @@ -5,5 +5,5 @@ Description=Create a lot of memory pressure # A VERY small memory.high will cause the script (trying to use a lot of memory) # to throttle and be put under heavy pressure. MemoryHigh=1M -Slice=testsuite-56-workload.slice -ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-56-slowgrowth.sh +Slice=testsuite-55-workload.slice +ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-55-slowgrowth.sh diff --git a/test/units/testsuite-56-testchill.service b/test/units/testsuite-55-testchill.service similarity index 68% rename from test/units/testsuite-56-testchill.service rename to test/units/testsuite-55-testchill.service index 6cae3d852a..aca6bc4ab9 100644 --- a/test/units/testsuite-56-testchill.service +++ b/test/units/testsuite-55-testchill.service @@ -2,5 +2,5 @@ Description=No memory pressure [Service] -Slice=testsuite-56-workload.slice +Slice=testsuite-55-workload.slice ExecStart=sleep infinity diff --git a/test/units/testsuite-55-testmunch.service b/test/units/testsuite-55-testmunch.service new file mode 100644 index 0000000000..457e4a587a --- /dev/null +++ b/test/units/testsuite-55-testmunch.service @@ -0,0 +1,7 @@ +[Unit] +Description=Create some memory pressure + +[Service] +MemoryHigh=2M +Slice=testsuite-55-workload.slice +ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-55-slowgrowth.sh diff --git a/test/units/testsuite-56-workload.slice b/test/units/testsuite-55-workload.slice similarity index 100% rename from test/units/testsuite-56-workload.slice rename to test/units/testsuite-55-workload.slice diff --git a/test/units/testsuite-55.service b/test/units/testsuite-55.service index 2127a4db7f..592e9d5bec 100644 --- a/test/units/testsuite-55.service +++ b/test/units/testsuite-55.service @@ -1,7 +1,7 @@ [Unit] -Description=TESTSUITE-55-UDEV-TAGS +Description=TESTSUITE-55-OOMD [Service] -ExecStartPre=rm -f /failed /testok +ExecStartPre=rm -f /failed /skipped /testok ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh Type=oneshot diff --git a/test/units/testsuite-55.sh b/test/units/testsuite-55.sh index ffceefb6a5..f7896ada42 100755 --- a/test/units/testsuite-55.sh +++ b/test/units/testsuite-55.sh @@ -1,65 +1,75 @@ -#!/bin/bash +#!/usr/bin/env bash set -ex set -o pipefail -mkdir -p /run/udev/rules.d/ +systemd-analyze log-level debug +systemd-analyze log-target console -! test -f /run/udev/tags/added/c1:3 && - ! test -f /run/udev/tags/changed/c1:3 && - udevadm info /dev/null | grep -q -v 'E: TAGS=.*:added:.*' && - udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' && - udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' && - udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' +# Loose checks to ensure the environment has the necessary features for systemd-oomd +[[ -e /proc/pressure ]] || echo "no PSI" >> /skipped +cgroup_type=$(stat -fc %T /sys/fs/cgroup/) +if [[ "$cgroup_type" != *"cgroup2"* ]] && [[ "$cgroup_type" != *"0x63677270"* ]]; then + echo "no cgroup2" >> /skipped +fi +if [ ! -f /usr/lib/systemd/systemd-oomd ] && [ ! -f /lib/systemd/systemd-oomd ]; then + echo "no oomd" >> /skipped +fi +[[ -e /skipped ]] && exit 0 || true -cat > /run/udev/rules.d/50-testsuite.rules <> /etc/systemd/oomd.conf -while : ; do - test -f /run/udev/tags/added/c1:3 && - ! test -f /run/udev/tags/changed/c1:3 && - udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' && - udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' && - udevadm info /dev/null | grep -q -v 'E: TAGS=.*:changed:.*' && - udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' && +systemctl start testsuite-55-testchill.service +systemctl start testsuite-55-testbloat.service + +# Verify systemd-oomd is monitoring the expected units +oomctl | grep "/testsuite-55-workload.slice" +oomctl | grep "1.00%" +oomctl | grep "Default Memory Pressure Duration: 5s" + +# systemd-oomd watches for elevated pressure for 5 seconds before acting. +# It can take time to build up pressure so either wait 2 minutes or for the service to fail. +timeout=$(date -ud "2 minutes" +%s) +while [[ $(date -u +%s) -le $timeout ]]; do + if ! systemctl status testsuite-55-testbloat.service; then break - - sleep .5 + fi + sleep 5 done -udevadm control --reload -udevadm trigger -c change /dev/null +# testbloat should be killed and testchill should be fine +if systemctl status testsuite-55-testbloat.service; then exit 42; fi +if ! systemctl status testsuite-55-testchill.service; then exit 24; fi -while : ; do - test -f /run/udev/tags/added/c1:3 && - test -f /run/udev/tags/changed/c1:3 && - udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' && - udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:added:.*' && - udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' && - udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:changed:.*' && - break +# only run this portion of the test if we can set xattrs +if setfattr -n user.xattr_test -v 1 /sys/fs/cgroup/; then + sleep 120 # wait for systemd-oomd kill cool down and elevated memory pressure to come down - sleep .5 -done + mkdir -p /etc/systemd/system/testsuite-55-testbloat.service.d/ + echo "[Service]" > /etc/systemd/system/testsuite-55-testbloat.service.d/override.conf + echo "ManagedOOMPreference=avoid" >> /etc/systemd/system/testsuite-55-testbloat.service.d/override.conf -udevadm control --reload -udevadm trigger -c add /dev/null + systemctl daemon-reload + systemctl start testsuite-55-testchill.service + systemctl start testsuite-55-testmunch.service + systemctl start testsuite-55-testbloat.service -while : ; do - test -f /run/udev/tags/added/c1:3 && - test -f /run/udev/tags/changed/c1:3 && - udevadm info /dev/null | grep -q 'E: TAGS=.*:added:.*' && - udevadm info /dev/null | grep -q 'E: CURRENT_TAGS=.*:added:.*' && - udevadm info /dev/null | grep -q 'E: TAGS=.*:changed:.*' && - udevadm info /dev/null | grep -q -v 'E: CURRENT_TAGS=.*:changed:.*' && - break + timeout=$(date -ud "2 minutes" +%s) + while [[ $(date -u +%s) -le $timeout ]]; do + if ! systemctl status testsuite-55-testmunch.service; then + break + fi + sleep 5 + done - sleep .5 -done + # testmunch should be killed since testbloat had the avoid xattr on it + if ! systemctl status testsuite-55-testbloat.service; then exit 25; fi + if systemctl status testsuite-55-testmunch.service; then exit 43; fi + if ! systemctl status testsuite-55-testchill.service; then exit 24; fi +fi + +systemd-analyze log-level info echo OK > /testok diff --git a/test/units/testsuite-56-testmunch.service b/test/units/testsuite-56-testmunch.service deleted file mode 100644 index b4b925a7af..0000000000 --- a/test/units/testsuite-56-testmunch.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=Create some memory pressure - -[Service] -MemoryHigh=2M -Slice=testsuite-56-workload.slice -ExecStart=/usr/lib/systemd/tests/testdata/units/testsuite-56-slowgrowth.sh diff --git a/test/units/testsuite-56.service b/test/units/testsuite-56.service deleted file mode 100644 index b53b0905db..0000000000 --- a/test/units/testsuite-56.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=TESTSUITE-56-OOMD - -[Service] -ExecStartPre=rm -f /failed /skipped /testok -ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh -Type=oneshot diff --git a/test/units/testsuite-56.sh b/test/units/testsuite-56.sh deleted file mode 100755 index 6835802eb8..0000000000 --- a/test/units/testsuite-56.sh +++ /dev/null @@ -1,76 +0,0 @@ -#!/usr/bin/env bash -set -ex -set -o pipefail - -systemd-analyze log-level debug -systemd-analyze log-target console - -# Loose checks to ensure the environment has the necessary features for systemd-oomd -[[ -e /proc/pressure ]] || echo "no PSI" >> /skipped -cgroup_type=$(stat -fc %T /sys/fs/cgroup/) -if [[ "$cgroup_type" != *"cgroup2"* ]] && [[ "$cgroup_type" != *"0x63677270"* ]]; then - echo "no cgroup2" >> /skipped -fi -if [ ! -f /usr/lib/systemd/systemd-oomd ] && [ ! -f /lib/systemd/systemd-oomd ]; then - echo "no oomd" >> /skipped -fi -[[ -e /skipped ]] && exit 0 || true - -rm -rf /etc/systemd/system/testsuite-56-testbloat.service.d - -echo "DefaultMemoryPressureDurationSec=5s" >> /etc/systemd/oomd.conf - -systemctl start testsuite-56-testchill.service -systemctl start testsuite-56-testbloat.service - -# Verify systemd-oomd is monitoring the expected units -oomctl | grep "/testsuite-56-workload.slice" -oomctl | grep "1.00%" -oomctl | grep "Default Memory Pressure Duration: 5s" - -# systemd-oomd watches for elevated pressure for 5 seconds before acting. -# It can take time to build up pressure so either wait 2 minutes or for the service to fail. -timeout=$(date -ud "2 minutes" +%s) -while [[ $(date -u +%s) -le $timeout ]]; do - if ! systemctl status testsuite-56-testbloat.service; then - break - fi - sleep 5 -done - -# testbloat should be killed and testchill should be fine -if systemctl status testsuite-56-testbloat.service; then exit 42; fi -if ! systemctl status testsuite-56-testchill.service; then exit 24; fi - -# only run this portion of the test if we can set xattrs -if setfattr -n user.xattr_test -v 1 /sys/fs/cgroup/; then - sleep 120 # wait for systemd-oomd kill cool down and elevated memory pressure to come down - - mkdir -p /etc/systemd/system/testsuite-56-testbloat.service.d/ - echo "[Service]" > /etc/systemd/system/testsuite-56-testbloat.service.d/override.conf - echo "ManagedOOMPreference=avoid" >> /etc/systemd/system/testsuite-56-testbloat.service.d/override.conf - - systemctl daemon-reload - systemctl start testsuite-56-testchill.service - systemctl start testsuite-56-testmunch.service - systemctl start testsuite-56-testbloat.service - - timeout=$(date -ud "2 minutes" +%s) - while [[ $(date -u +%s) -le $timeout ]]; do - if ! systemctl status testsuite-56-testmunch.service; then - break - fi - sleep 5 - done - - # testmunch should be killed since testbloat had the avoid xattr on it - if ! systemctl status testsuite-56-testbloat.service; then exit 25; fi - if systemctl status testsuite-56-testmunch.service; then exit 43; fi - if ! systemctl status testsuite-56-testchill.service; then exit 24; fi -fi - -systemd-analyze log-level info - -echo OK > /testok - -exit 0 diff --git a/test/units/testsuite-57.service b/test/units/testsuite-57.service deleted file mode 100644 index b6edd862da..0000000000 --- a/test/units/testsuite-57.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=TEST-57-RUNTIME-BIND-PATHS - -[Service] -ExecStartPre=rm -f /failed /testok -ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh -Type=oneshot diff --git a/test/units/testsuite-57.sh b/test/units/testsuite-57.sh deleted file mode 100755 index c24cf325c2..0000000000 --- a/test/units/testsuite-57.sh +++ /dev/null @@ -1,43 +0,0 @@ -#!/usr/bin/env bash -set -ex - -echo "MARKER_FIXED" > /run/testservice-57-fixed -mkdir -p /run/inaccessible - -systemctl start testsuite-57-namespaced.service - -# Ensure that inaccessible paths aren't bypassed by the runtime setup -set +e -systemctl bind --mkdir testsuite-57-namespaced.service /run/testservice-57-fixed /run/inaccessible/testfile_fixed && exit 1 -set -e - -echo "MARKER_RUNTIME" > /run/testservice-57-runtime - -systemctl bind --mkdir testsuite-57-namespaced.service /run/testservice-57-runtime /tmp/testfile_runtime - -while systemctl show -P SubState testsuite-57-namespaced.service | grep -q running -do - sleep 0.1 -done - -systemctl is-active testsuite-57-namespaced.service - -# Now test that systemctl bind fails when attempted on a non-namespaced unit -systemctl start testsuite-57-non-namespaced.service - -set +e -systemctl bind --mkdir testsuite-57-non-namespaced.service /run/testservice-57-runtime /tmp/testfile_runtime && exit 1 -set -e - -while systemctl show -P SubState testsuite-57-non-namespaced.service | grep -q running -do - sleep 0.1 -done - -set +e -systemctl is-active testsuite-57-non-namespaced.service && exit 1 -set -e - -echo OK > /testok - -exit 0 diff --git a/test/units/testsuite-58.service b/test/units/testsuite-58.service deleted file mode 100644 index 47deba7d53..0000000000 --- a/test/units/testsuite-58.service +++ /dev/null @@ -1,7 +0,0 @@ -[Unit] -Description=TEST-58-PORTABLE - -[Service] -ExecStartPre=rm -f /failed /testok -ExecStart=/usr/lib/systemd/tests/testdata/units/%N.sh -Type=oneshot diff --git a/test/units/testsuite-58.sh b/test/units/testsuite-58.sh deleted file mode 100755 index b5b05b42d9..0000000000 --- a/test/units/testsuite-58.sh +++ /dev/null @@ -1,68 +0,0 @@ -#!/usr/bin/env bash -# -*- mode: shell-script; indent-tabs-mode: nil; sh-basic-offset: 4; -*- -# ex: ts=8 sw=4 sts=4 et filetype=sh -set -ex -set -o pipefail - -export SYSTEMD_LOG_LEVEL=debug - -portablectl attach --now --runtime /usr/share/minimal_0.raw app0 - -systemctl is-active app0.service -systemctl is-active app0-foo.service -set +o pipefail -set +e -systemctl is-active app0-bar.service && exit 1 -set -e -set -o pipefail - -portablectl reattach --now --runtime /usr/share/minimal_1.raw app0 - -systemctl is-active app0.service -systemctl is-active app0-bar.service -set +o pipefail -set +e -systemctl is-active app0-foo.service && exit 1 -set -e -set -o pipefail - -portablectl list | grep -q -F "minimal_1" - -portablectl detach --now --runtime /usr/share/minimal_1.raw app0 - -portablectl list | grep -q -F "No images." - -# portablectl also works with directory paths rather than images - -unsquashfs -dest /tmp/minimal_0 /usr/share/minimal_0.raw -unsquashfs -dest /tmp/minimal_1 /usr/share/minimal_1.raw - -portablectl attach --copy=symlink --now --runtime /tmp/minimal_0 app0 - -systemctl is-active app0.service -systemctl is-active app0-foo.service -set +o pipefail -set +e -systemctl is-active app0-bar.service && exit 1 -set -e -set -o pipefail - -portablectl reattach --now --enable --runtime /tmp/minimal_1 app0 - -systemctl is-active app0.service -systemctl is-active app0-bar.service -set +o pipefail -set +e -systemctl is-active app0-foo.service && exit 1 -set -e -set -o pipefail - -portablectl list | grep -q -F "minimal_1" - -portablectl detach --now --enable --runtime /tmp/minimal_1 app0 - -portablectl list | grep -q -F "No images." - -echo OK > /testok - -exit 0 From 3509c7874bc15812f920eb988a5800473f9c905b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 5 Mar 2021 11:32:49 +0900 Subject: [PATCH 5/5] test: add test for IMPORT{program}= udev rule --- test/units/testsuite-17.05.sh | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100755 test/units/testsuite-17.05.sh diff --git a/test/units/testsuite-17.05.sh b/test/units/testsuite-17.05.sh new file mode 100755 index 0000000000..0991ec9d59 --- /dev/null +++ b/test/units/testsuite-17.05.sh @@ -0,0 +1,24 @@ +#!/bin/bash +set -ex +set -o pipefail + +mkdir -p /run/udev/rules.d/ + +cat > /run/udev/rules.d/50-testsuite.rules <