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

Reply via email to