The following tests are in this commit: NotAnIgnore() - Test that non-ignore rules are not processed
SimpleMatch() - Test that an ignore rule with a matching cgroup and controller match CgroupsDontMatch() - Test that cgroups with similar but not matching names do not match ControllersDontMatch() - Test that controllers with non-matching names do not match CombinedControllers() - Test that controllers that have been mounted on the same path, e.g. cpu,cpuacct, can be matched by a rule WildcardMatch() - Test that rules with a wildcarded destination, e.g. parentcg/*, can match a process in a nested cgroup WildcardMatch2() - Another test that a wildcarded destination can match a process in a nested cgroup RealWorldMatch() - Test that a realistic cgroup proc file matches a new process RealWorldNoMatch() - Test that a realistic cgroup proc file will not match a new process The results from googletest are reported below: [----------] 11 tests from CgroupCompareIgnoreRuleTest [ RUN ] CgroupCompareIgnoreRuleTest.NotAnIgnore [ OK ] CgroupCompareIgnoreRuleTest.NotAnIgnore (0 ms) [ RUN ] CgroupCompareIgnoreRuleTest.SimpleMatch [ OK ] CgroupCompareIgnoreRuleTest.SimpleMatch (0 ms) [ RUN ] CgroupCompareIgnoreRuleTest.CgroupsDontMatch [ OK ] CgroupCompareIgnoreRuleTest.CgroupsDontMatch (0 ms) [ RUN ] CgroupCompareIgnoreRuleTest.ControllersDontMatch [ OK ] CgroupCompareIgnoreRuleTest.ControllersDontMatch (0 ms) [ RUN ] CgroupCompareIgnoreRuleTest.CombinedControllers [ OK ] CgroupCompareIgnoreRuleTest.CombinedControllers (0 ms) [ RUN ] CgroupCompareIgnoreRuleTest.WildcardMatch [ OK ] CgroupCompareIgnoreRuleTest.WildcardMatch (0 ms) [ RUN ] CgroupCompareIgnoreRuleTest.WildcardMatch2 [ OK ] CgroupCompareIgnoreRuleTest.WildcardMatch2 (0 ms) [ RUN ] CgroupCompareIgnoreRuleTest.RealWorldMatch [ OK ] CgroupCompareIgnoreRuleTest.RealWorldMatch (0 ms) [ RUN ] CgroupCompareIgnoreRuleTest.RealWorldNoMatch [ OK ] CgroupCompareIgnoreRuleTest.RealWorldNoMatch (0 ms) [----------] 11 tests from CgroupCompareIgnoreRuleTest (1 ms total) Signed-off-by: Tom Hromatka <tom.hroma...@oracle.com> --- src/api.c | 4 +- src/libcgroup-internal.h | 3 + tests/gunit/004-cgroup_compare_ignore_rule.cpp | 241 +++++++++++++++++++++++++ tests/gunit/Makefile.am | 3 +- 4 files changed, 249 insertions(+), 2 deletions(-) create mode 100644 tests/gunit/004-cgroup_compare_ignore_rule.cpp diff --git a/src/api.c b/src/api.c index b4bc20ee3605..a7c84159cab1 100644 --- a/src/api.c +++ b/src/api.c @@ -116,9 +116,11 @@ const char const *cgroup_strerror_codes[] = { static const char const *cgroup_ignored_tasks_files[] = { "tasks", NULL }; +#ifndef UNIT_TEST static int cg_get_cgroups_from_proc_cgroups(pid_t pid, char *cgroup_list[], char *controller_list[], int list_len); +#endif static int cg_chown(const char *filename, uid_t owner, gid_t group) { @@ -2877,7 +2879,7 @@ static int cgroup_find_matching_controller(char *rule_controllers[], * @return True if the rule is an ignore rule and this pid/procname * match the rule. False otherwise */ -static bool cgroup_compare_ignore_rule(const struct cgroup_rule * const rule, +STATIC bool cgroup_compare_ignore_rule(const struct cgroup_rule * const rule, pid_t pid, const char * const procname) { char *controller_list[MAX_MNT_ELEMENTS] = { '\0' }; diff --git a/src/libcgroup-internal.h b/src/libcgroup-internal.h index efe9b36fe052..c827fea28d35 100644 --- a/src/libcgroup-internal.h +++ b/src/libcgroup-internal.h @@ -303,6 +303,9 @@ int cg_get_cgroups_from_proc_cgroups(pid_t pid, char *cgroup_list[], char *controller_list[], int list_len); +bool cgroup_compare_ignore_rule(const struct cgroup_rule * const rule, + pid_t pid, const char * const procname); + #endif /* UNIT_TEST */ __END_DECLS diff --git a/tests/gunit/004-cgroup_compare_ignore_rule.cpp b/tests/gunit/004-cgroup_compare_ignore_rule.cpp new file mode 100644 index 000000000000..b643997b22ef --- /dev/null +++ b/tests/gunit/004-cgroup_compare_ignore_rule.cpp @@ -0,0 +1,241 @@ +/** + * libcgroup googletest for cgroup_compare_ignore_rule() + * + * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved. + * Author: Tom Hromatka <tom.hroma...@oracle.com> + */ + +/* + * This library is free software; you can redistribute it and/or modify it + * under the terms of version 2.1 of the GNU Lesser General Public License as + * published by the Free Software Foundation. + * + * This library 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 this library; if not, see <http://www.gnu.org/licenses>. + */ + +#include "gtest/gtest.h" + +#include "libcgroup-internal.h" + +class CgroupCompareIgnoreRuleTest : public ::testing::Test { +}; + +static void CreateCgroupProcFile(const char * const contents) +{ + FILE *f; + + f = fopen(TEST_PROC_PID_CGROUP_FILE, "w"); + ASSERT_NE(f, nullptr); + + fprintf(f, "%s", contents); + fclose(f); +} + +TEST_F(CgroupCompareIgnoreRuleTest, NotAnIgnore) +{ + char procname[] = "myprocess"; + struct cgroup_rule rule; + pid_t pid = 1234; + bool ret; + + rule.is_ignore = false; + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, false); +} + +TEST_F(CgroupCompareIgnoreRuleTest, SimpleMatch) +{ + char proc_file_contents[] = + "7:cpuacct:/SimpleMatchCgroup"; + char rule_controller[] = "cpuacct"; + char procname[] = "procfoo"; + struct cgroup_rule rule; + pid_t pid = 2345; + bool ret; + + CreateCgroupProcFile(proc_file_contents); + + rule.procname = NULL; + rule.is_ignore = true; + rule.controllers[0] = rule_controller; + sprintf(rule.destination, "SimpleMatchCgroup"); + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, true); +} + +TEST_F(CgroupCompareIgnoreRuleTest, CgroupsDontMatch) +{ + char proc_file_contents[] = + "2:cpuacct:CloseButNotQuite"; + char rule_controller[] = "cpuacct"; + char procname[] = "procfoo2"; + struct cgroup_rule rule; + pid_t pid = 4567; + bool ret; + + CreateCgroupProcFile(proc_file_contents); + + rule.is_ignore = true; + rule.controllers[0] = rule_controller; + sprintf(rule.destination, "CloseButNotQuit"); + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, false); +} + +TEST_F(CgroupCompareIgnoreRuleTest, ControllersDontMatch) +{ + char proc_file_contents[] = + "5:memory:MyCgroup"; + char rule_controller[] = "cpuacct"; + char procname[] = "procfoo3"; + struct cgroup_rule rule; + pid_t pid = 5678; + bool ret; + + CreateCgroupProcFile(proc_file_contents); + + rule.is_ignore = true; + rule.controllers[0] = rule_controller; + sprintf(rule.destination, "MyCgroup"); + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, false); +} + +TEST_F(CgroupCompareIgnoreRuleTest, CombinedControllers) +{ + char proc_file_contents[] = + "13:cpu,cpuacct:/containercg"; + char rule_controller[] = "cpuacct"; + char procname[] = "docker"; + struct cgroup_rule rule; + pid_t pid = 6789; + bool ret; + + CreateCgroupProcFile(proc_file_contents); + + rule.is_ignore = true; + rule.controllers[0] = rule_controller; + rule.controllers[1] = NULL; + sprintf(rule.destination, "containercg"); + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, true); +} + +TEST_F(CgroupCompareIgnoreRuleTest, WildcardMatch) +{ + char proc_file_contents[] = + "7:cpuset:/parentcg/childcg/grandchildcg"; + char rule_controller[] = "cpuset"; + char procname[] = "childprocess"; + struct cgroup_rule rule; + pid_t pid = 7890; + bool ret; + + CreateCgroupProcFile(proc_file_contents); + + rule.procname = procname; + rule.is_ignore = true; + rule.controllers[0] = rule_controller; + sprintf(rule.destination, "parentcg/*"); + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, true); +} + +TEST_F(CgroupCompareIgnoreRuleTest, WildcardMatch2) +{ + char proc_file_contents[] = + "1:hugetlb:/parentcg/childcg/grandchildcg"; + char rule_controller[] = "hugetlb"; + char procname[] = "granchildprocess"; + struct cgroup_rule rule; + pid_t pid = 8901; + bool ret; + + CreateCgroupProcFile(proc_file_contents); + + rule.procname = NULL; + rule.is_ignore = true; + rule.controllers[0] = rule_controller; + sprintf(rule.destination, "parentcg/childcg*"); + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, true); +} + +TEST_F(CgroupCompareIgnoreRuleTest, RealWorldMatch) +{ + char proc_file_contents[] = + "12:memory:/user/johndoe/0\n" + "11:perf_event:/\n" + "10:rdma:/\n" + "9:blkio:/user.slice\n" + "8:cpu,cpuacct:/myCgroup\n" + "7:freezer:/user/johndoe/0\n" + "6:net_cls,net_prio:/\n" + "5:pids:/user.slice/user-1000.slice/session-1.scope\n" + "4:devices:/user.slice\n" + "3:cpuset:/\n" + "2:hugetlb:/\n" + "1:name=systemd:/user.slice/user-1000.slice/session-1.scope\n" + "0::/user.slice/user-1000.slice/session-1.scope\n"; + char rule_controller[] = "cpu"; + char procname[] = "granchildprocess"; + struct cgroup_rule rule; + pid_t pid = 8901; + bool ret; + + CreateCgroupProcFile(proc_file_contents); + + rule.procname = NULL; + rule.is_ignore = true; + rule.controllers[0] = rule_controller; + sprintf(rule.destination, "myCgroup*"); + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, true); +} + +TEST_F(CgroupCompareIgnoreRuleTest, RealWorldNoMatch) +{ + char proc_file_contents[] = + "12:memory:/user/johndoe/0\n" + "11:perf_event:/\n" + "10:rdma:/\n" + "9:blkio:/user.slice\n" + "8:cpu,cpuacct:/myCgroup\n" + "7:freezer:/user/johndoe/0\n" + "6:net_cls,net_prio:/NetCgroup\n" + "5:pids:/user.slice/user-1000.slice/session-1.scope\n" + "4:devices:/user.slice\n" + "3:cpuset:/\n" + "2:hugetlb:/\n" + "1:name=systemd:/user.slice/user-1000.slice/session-1.scope\n" + "0::/user.slice/user-1000.slice/session-1.scope\n"; + char rule_controller[] = "net_cls"; + char procname[] = "NotMatching"; + struct cgroup_rule rule; + pid_t pid = 9012; + bool ret; + + CreateCgroupProcFile(proc_file_contents); + + rule.procname = NULL; + rule.is_ignore = true; + rule.controllers[0] = rule_controller; + sprintf(rule.destination, "NetCgroup2"); + + ret = cgroup_compare_ignore_rule(&rule, pid, procname); + ASSERT_EQ(ret, false); +} diff --git a/tests/gunit/Makefile.am b/tests/gunit/Makefile.am index 85050d2b7cff..ff2630644044 100644 --- a/tests/gunit/Makefile.am +++ b/tests/gunit/Makefile.am @@ -41,4 +41,5 @@ TESTS = gtest gtest_SOURCES = gtest.cpp \ 001-path.cpp \ 002-cgroup_parse_rules_options.cpp \ - 003-cg_get_cgroups_from_proc_cgroups.cpp + 003-cg_get_cgroups_from_proc_cgroups.cpp \ + 004-cgroup_compare_ignore_rule.cpp -- 1.8.3.1 _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel