From 0682ed5cf4696cc12f5bcb4776a3433ef3581748 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= Date: Thu, 7 Dec 2017 14:42:45 +0100 Subject: [PATCH] tests: add some tests for unit_name_is_valid() and related functions I was surprised to see that foo@bar@bar.service is a valid unit name. Apparently it is according to current code and docs. --- src/basic/unit-name.c | 2 +- src/test/test-cgroup-util.c | 18 +++++++++++++-- src/test/test-unit-name.c | 55 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 60 insertions(+), 15 deletions(-) diff --git a/src/basic/unit-name.c b/src/basic/unit-name.c index 407982e..4790790 100644 --- a/src/basic/unit-name.c +++ b/src/basic/unit-name.c @@ -710,7 +710,7 @@ int slice_build_parent_slice(const char *slice, char **ret) { return 1; } -int slice_build_subslice(const char *slice, const char*name, char **ret) { +int slice_build_subslice(const char *slice, const char *name, char **ret) { char *subslice; assert(slice); diff --git a/src/test/test-cgroup-util.c b/src/test/test-cgroup-util.c index 2c53956..fc612b3 100644 --- a/src/test/test-cgroup-util.c +++ b/src/test/test-cgroup-util.c @@ -253,13 +253,18 @@ static void test_controller_is_valid(void) { static void test_slice_to_path_one(const char *unit, const char *path, int error) { _cleanup_free_ char *ret = NULL; + int r; + + log_info("unit: %s", unit); - assert_se(cg_slice_to_path(unit, &ret) == error); + r = cg_slice_to_path(unit, &ret); + log_info("actual: %s / %d", strnull(ret), r); + log_info("expect: %s / %d", strnull(path), error); + assert_se(r == 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); @@ -273,6 +278,15 @@ static void test_slice_to_path(void) { test_slice_to_path_one("foo.slice/foo--bar.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); + + test_slice_to_path_one("foobar@.slice", NULL, -EINVAL); + test_slice_to_path_one("foobar@waldo.slice", NULL, -EINVAL); + test_slice_to_path_one("foobar@waldo.service", 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("foo@-.slice", NULL, -EINVAL); + test_slice_to_path_one("foo@@bar.slice", NULL, -EINVAL); + test_slice_to_path_one("foo.slice/foo@@bar.slice", NULL, -EINVAL); } static void test_shift_path_one(const char *raw, const char *root, const char *shifted) { diff --git a/src/test/test-unit-name.c b/src/test/test-unit-name.c index b45c152..347c586 100644 --- a/src/test/test-unit-name.c +++ b/src/test/test-unit-name.c @@ -31,29 +31,39 @@ #include "util.h" static void test_unit_name_is_valid(void) { - assert_se(unit_name_is_valid("foo.service", UNIT_NAME_ANY)); - assert_se(unit_name_is_valid("foo.service", UNIT_NAME_PLAIN)); + assert_se( unit_name_is_valid("foo.service", UNIT_NAME_ANY)); + assert_se( unit_name_is_valid("foo.service", UNIT_NAME_PLAIN)); assert_se(!unit_name_is_valid("foo.service", UNIT_NAME_INSTANCE)); assert_se(!unit_name_is_valid("foo.service", UNIT_NAME_TEMPLATE)); assert_se(!unit_name_is_valid("foo.service", UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE)); - assert_se(unit_name_is_valid("foo@bar.service", UNIT_NAME_ANY)); + assert_se( unit_name_is_valid("foo@bar.service", UNIT_NAME_ANY)); assert_se(!unit_name_is_valid("foo@bar.service", UNIT_NAME_PLAIN)); - assert_se(unit_name_is_valid("foo@bar.service", UNIT_NAME_INSTANCE)); + assert_se( unit_name_is_valid("foo@bar.service", UNIT_NAME_INSTANCE)); assert_se(!unit_name_is_valid("foo@bar.service", UNIT_NAME_TEMPLATE)); - assert_se(unit_name_is_valid("foo@bar.service", UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE)); + assert_se( unit_name_is_valid("foo@bar.service", UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE)); - assert_se(unit_name_is_valid("foo@.service", UNIT_NAME_ANY)); + assert_se( unit_name_is_valid("foo@bar@bar.service", UNIT_NAME_ANY)); + assert_se(!unit_name_is_valid("foo@bar@bar.service", UNIT_NAME_PLAIN)); + assert_se( unit_name_is_valid("foo@bar@bar.service", UNIT_NAME_INSTANCE)); + assert_se(!unit_name_is_valid("foo@bar@bar.service", UNIT_NAME_TEMPLATE)); + assert_se( unit_name_is_valid("foo@bar@bar.service", UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE)); + + assert_se( unit_name_is_valid("foo@.service", UNIT_NAME_ANY)); assert_se(!unit_name_is_valid("foo@.service", UNIT_NAME_PLAIN)); assert_se(!unit_name_is_valid("foo@.service", UNIT_NAME_INSTANCE)); - assert_se(unit_name_is_valid("foo@.service", UNIT_NAME_TEMPLATE)); - assert_se(unit_name_is_valid("foo@.service", UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE)); + assert_se( unit_name_is_valid("foo@.service", UNIT_NAME_TEMPLATE)); + assert_se( unit_name_is_valid("foo@.service", UNIT_NAME_INSTANCE|UNIT_NAME_TEMPLATE)); assert_se(!unit_name_is_valid(".service", UNIT_NAME_ANY)); assert_se(!unit_name_is_valid("", UNIT_NAME_ANY)); assert_se(!unit_name_is_valid("foo.waldo", UNIT_NAME_ANY)); assert_se(!unit_name_is_valid("@.service", UNIT_NAME_ANY)); assert_se(!unit_name_is_valid("@piep.service", UNIT_NAME_ANY)); + + assert_se( unit_name_is_valid("user@1000.slice", UNIT_NAME_ANY)); + assert_se( unit_name_is_valid("user@1000.slice", UNIT_NAME_INSTANCE)); + assert_se(!unit_name_is_valid("user@1000.slice", UNIT_NAME_TEMPLATE)); } static void test_unit_name_replace_instance_one(const char *pattern, const char *repl, const char *expected, int ret) { @@ -323,10 +333,10 @@ static void test_unit_name_build(void) { } static void test_slice_name_is_valid(void) { - assert_se(slice_name_is_valid(SPECIAL_ROOT_SLICE)); - assert_se(slice_name_is_valid("foo.slice")); - assert_se(slice_name_is_valid("foo-bar.slice")); - assert_se(slice_name_is_valid("foo-bar-baz.slice")); + assert_se( slice_name_is_valid(SPECIAL_ROOT_SLICE)); + assert_se( slice_name_is_valid("foo.slice")); + assert_se( slice_name_is_valid("foo-bar.slice")); + assert_se( slice_name_is_valid("foo-bar-baz.slice")); assert_se(!slice_name_is_valid("-foo-bar-baz.slice")); assert_se(!slice_name_is_valid("foo-bar-baz-.slice")); assert_se(!slice_name_is_valid("-foo-bar-baz-.slice")); @@ -335,6 +345,20 @@ static void test_slice_name_is_valid(void) { assert_se(!slice_name_is_valid(".slice")); assert_se(!slice_name_is_valid("")); assert_se(!slice_name_is_valid("foo.service")); + + assert_se(!slice_name_is_valid("foo@.slice")); + assert_se(!slice_name_is_valid("foo@bar.slice")); + assert_se(!slice_name_is_valid("foo-bar@baz.slice")); + assert_se(!slice_name_is_valid("foo@bar@baz.slice")); + assert_se(!slice_name_is_valid("foo@bar-baz.slice")); + assert_se(!slice_name_is_valid("-foo-bar-baz@.slice")); + assert_se(!slice_name_is_valid("foo-bar-baz@-.slice")); + assert_se(!slice_name_is_valid("foo-bar-baz@a--b.slice")); + assert_se(!slice_name_is_valid("-foo-bar-baz@-.slice")); + assert_se(!slice_name_is_valid("foo-bar--baz@.slice")); + assert_se(!slice_name_is_valid("foo--bar--baz@.slice")); + assert_se(!slice_name_is_valid("@.slice")); + assert_se(!slice_name_is_valid("foo@bar.service")); } static void test_build_subslice(void) { @@ -372,6 +396,13 @@ static void test_build_parent_slice(void) { test_build_parent_slice_one("foo-bar-.slice", NULL, -EINVAL); test_build_parent_slice_one("foo-bar.service", NULL, -EINVAL); test_build_parent_slice_one(".slice", NULL, -EINVAL); + test_build_parent_slice_one("foo@bar.slice", NULL, -EINVAL); + test_build_parent_slice_one("foo-bar@baz.slice", NULL, -EINVAL); + test_build_parent_slice_one("foo-bar--@baz.slice", NULL, -EINVAL); + test_build_parent_slice_one("-foo-bar@bar.slice", NULL, -EINVAL); + test_build_parent_slice_one("foo-bar@-.slice", NULL, -EINVAL); + test_build_parent_slice_one("foo@bar.service", NULL, -EINVAL); + test_build_parent_slice_one("@.slice", NULL, -EINVAL); } static void test_unit_name_to_instance(void) { -- 2.7.4