1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
|
/* SPDX-License-Identifier: LGPL-2.1-only */
/**
* libcgroup googletest for cgroupv2_get_subtree_control()
*
* Copyright (c) 2020 Oracle and/or its affiliates.
* Author: Tom Hromatka <tom.hromatka@oracle.com>
*/
#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);
}
|