This commit adds unit tests for cgroupv2_get_subtree_control() [----------] 6 tests from GetSubtreeControlTest [ RUN ] GetSubtreeControlTest.SingleControllerEnabled [ OK ] GetSubtreeControlTest.SingleControllerEnabled (0 ms) [ RUN ] GetSubtreeControlTest.SingleControllerNoMatch [ OK ] GetSubtreeControlTest.SingleControllerNoMatch (0 ms) [ RUN ] GetSubtreeControlTest.SingleControllerNoMatch2 [ OK ] GetSubtreeControlTest.SingleControllerNoMatch2 (0 ms) [ RUN ] GetSubtreeControlTest.MultipleControllersEnabled [ OK ] GetSubtreeControlTest.MultipleControllersEnabled (0 ms) [ RUN ] GetSubtreeControlTest.MultipleControllersEnabled2 [ OK ] GetSubtreeControlTest.MultipleControllersEnabled2 (0 ms) [ RUN ] GetSubtreeControlTest.MultipleControllersNoMatch [ OK ] GetSubtreeControlTest.MultipleControllersNoMatch (0 ms) [----------] 6 tests from GetSubtreeControlTest (0 ms total)
Signed-off-by: Tom Hromatka <tom.hroma...@oracle.com> --- gunit/014-cgroupv2_get_subtree_control.cpp | 170 +++++++++++++++++++++ gunit/Makefile.am | 3 +- 2 files changed, 172 insertions(+), 1 deletion(-) create mode 100644 gunit/014-cgroupv2_get_subtree_control.cpp diff --git a/gunit/014-cgroupv2_get_subtree_control.cpp b/gunit/014-cgroupv2_get_subtree_control.cpp new file mode 100644 index 000000000000..66f3c52b00a4 --- /dev/null +++ b/gunit/014-cgroupv2_get_subtree_control.cpp @@ -0,0 +1,170 @@ +/** + * libcgroup googletest for cgroupv2_get_subtree_control() + * + * Copyright (c) 2020 Oracle and/or its affiliates. + * 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 <fcntl.h> +#include <ftw.h> +#include <sys/stat.h> +#include <sys/types.h> +#include <unistd.h> + +#include "gtest/gtest.h" + +#include "libcgroup-internal.h" + +static const char * const PARENT_DIR = "test013cgroup/"; +static const char * const SUBTREE_FILE = "cgroup.subtree_control"; + + +class GetSubtreeControlTest : public ::testing::Test { + protected: + + void SetUp() override { + char tmp_path[FILENAME_MAX]; + int ret, i; + FILE *f; + + ret = mkdir(PARENT_DIR, S_IRWXU | S_IRWXG | S_IRWXO); + ASSERT_EQ(ret, 0); + } + + /* + * https://stackoverflow.com/questions/5467725/how-to-delete-a-directory-and-its-contents-in-posix-c + */ + static int unlink_cb(const char *fpath, const struct stat *sb, int typeflag, + struct FTW *ftwbuf) { + return remove(fpath); + } + + int rmrf(const char * const path) +{ + return nftw(path, unlink_cb, 64, FTW_DEPTH | FTW_PHYS); + } + + void TearDown() override { + int ret; + + ret = rmrf(PARENT_DIR); + ASSERT_EQ(ret, 0); + } +}; + +static void write_subtree_file(const char * const contents, ssize_t len) +{ + char tmp_path[FILENAME_MAX]; + ssize_t bytes_written; + int ret, fd; + + memset(tmp_path, 0, sizeof(tmp_path)); + ret = snprintf(tmp_path, FILENAME_MAX - 1, "%s%s", + PARENT_DIR, SUBTREE_FILE); + ASSERT_GT(ret, 0); + + fd = open(tmp_path, O_WRONLY | O_TRUNC | O_CREAT, S_IRWXU | S_IRWXG); + ASSERT_GT(fd, 0); + + bytes_written = write(fd, contents, len); + ASSERT_EQ(bytes_written, len); + close(fd); +} + +TEST_F(GetSubtreeControlTest, SingleControllerEnabled) +{ + char ctrlr_name[] = "cpu"; + char subtree_contents[] = "cpu\n"; + bool enabled = false; + int ret; + + write_subtree_file(subtree_contents, strlen(subtree_contents)); + + ret = cgroupv2_get_subtree_control(PARENT_DIR, ctrlr_name, &enabled); + ASSERT_EQ(ret, 0); + ASSERT_EQ(enabled, true); +} + +TEST_F(GetSubtreeControlTest, SingleControllerNoMatch) +{ + char ctrlr_name[] = "cpu"; + char subtree_contents[] = "cpuset\n"; + bool enabled = true; + int ret; + + write_subtree_file(subtree_contents, strlen(subtree_contents)); + + ret = cgroupv2_get_subtree_control(PARENT_DIR, ctrlr_name, &enabled); + ASSERT_EQ(ret, ECGROUPNOTMOUNTED); + ASSERT_EQ(enabled, false); +} + +TEST_F(GetSubtreeControlTest, SingleControllerNoMatch2) +{ + char ctrlr_name[] = "cpuset"; + char subtree_contents[] = "cpu\n"; + bool enabled = true; + int ret; + + write_subtree_file(subtree_contents, strlen(subtree_contents)); + + ret = cgroupv2_get_subtree_control(PARENT_DIR, ctrlr_name, &enabled); + ASSERT_EQ(ret, ECGROUPNOTMOUNTED); + ASSERT_EQ(enabled, false); +} + +TEST_F(GetSubtreeControlTest, MultipleControllersEnabled) +{ + char ctrlr_name[] = "cpu"; + char subtree_contents[] = "cpu cpuset io memory pids\n"; + bool enabled = false; + int ret; + + write_subtree_file(subtree_contents, strlen(subtree_contents)); + + ret = cgroupv2_get_subtree_control(PARENT_DIR, ctrlr_name, &enabled); + ASSERT_EQ(ret, 0); + ASSERT_EQ(enabled, true); +} + +TEST_F(GetSubtreeControlTest, MultipleControllersEnabled2) +{ + char ctrlr_name[] = "pids"; + char subtree_contents[] = "cpu cpuset io memory pids\n"; + bool enabled = false; + int ret; + + write_subtree_file(subtree_contents, strlen(subtree_contents)); + + ret = cgroupv2_get_subtree_control(PARENT_DIR, ctrlr_name, &enabled); + ASSERT_EQ(ret, 0); + ASSERT_EQ(enabled, true); +} + +TEST_F(GetSubtreeControlTest, MultipleControllersNoMatch) +{ + char ctrlr_name[] = "network"; + char subtree_contents[] = "cpu cpuset io memory pids\n"; + bool enabled = true; + int ret; + + write_subtree_file(subtree_contents, strlen(subtree_contents)); + + ret = cgroupv2_get_subtree_control(PARENT_DIR, ctrlr_name, &enabled); + ASSERT_EQ(ret, ECGROUPNOTMOUNTED); + ASSERT_EQ(enabled, false); +} diff --git a/gunit/Makefile.am b/gunit/Makefile.am index 7ae8b3bb463d..912f2182d8d2 100644 --- a/gunit/Makefile.am +++ b/gunit/Makefile.am @@ -50,6 +50,7 @@ gtest_SOURCES = gtest.cpp \ 010-cgroup_chown_chmod_tasks.cpp \ 011-cgroupv2_subtree_control.cpp \ 012-cgroup_create_cgroup.cpp \ - 013-cgroup_build_tasks_procs_path.cpp + 013-cgroup_build_tasks_procs_path.cpp \ + 014-cgroupv2_get_subtree_control.cpp gtest_LDFLAGS = -L$(top_builddir)/googletest/googletest -l:libgtest.so \ -rpath $(abs_top_builddir)/googletest/googletest -- 2.25.4 _______________________________________________ Libcg-devel mailing list Libcg-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/libcg-devel