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
|
/* SPDX-License-Identifier: LGPL-2.1-only */
/**
* libcgroup googletest for cgroupv2_subtree_control()
*
* Copyright (c) 2020 Oracle and/or its affiliates.
* Author: Tom Hromatka <tom.hromatka@oracle.com>
*/
#include <ftw.h>
#include "gtest/gtest.h"
#include "libcgroup-internal.h"
static const char * const PARENT_DIR = "test011cgroup/";
static const char * const SUBTREE_FILE = "cgroup.subtree_control";
class SubtreeControlTest : public ::testing::Test {
protected:
void SetUp() override {
char tmp_path[FILENAME_MAX];
int ret;
FILE *f;
ret = mkdir(PARENT_DIR, S_IRWXU | S_IRWXG | S_IRWXO);
ASSERT_EQ(ret, 0);
memset(tmp_path, 0, sizeof(tmp_path));
ret = snprintf(tmp_path, FILENAME_MAX - 1, "%s%s",
PARENT_DIR, SUBTREE_FILE);
ASSERT_GT(ret, 0);
f = fopen(tmp_path, "w");
fclose(f);
}
/*
* 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);
}
};
TEST_F(SubtreeControlTest, AddController)
{
char tmp_path[FILENAME_MAX], buf[4092];
char ctrlr_name[] = "cpu";
int ret;
FILE *f;
memset(tmp_path, 0, sizeof(tmp_path));
ret = snprintf(tmp_path, FILENAME_MAX - 1, "%s%s",
PARENT_DIR, SUBTREE_FILE);
ASSERT_GT(ret, 0);
/* erase the contents of the file */
f = fopen(tmp_path, "w");
fclose(f);
ret = cgroupv2_subtree_control(PARENT_DIR, ctrlr_name, true);
ASSERT_EQ(ret, 0);
f = fopen(tmp_path, "r");
ASSERT_NE(f, nullptr);
while (fgets(buf, sizeof(buf), f))
ASSERT_STREQ(buf, "+cpu");
fclose(f);
}
TEST_F(SubtreeControlTest, RemoveController)
{
char tmp_path[FILENAME_MAX], buf[4092];
char ctrlr_name[] = "memory";
int ret;
FILE *f;
memset(tmp_path, 0, sizeof(tmp_path));
ret = snprintf(tmp_path, FILENAME_MAX - 1, "%s%s",
PARENT_DIR, SUBTREE_FILE);
ASSERT_GT(ret, 0);
/* erase the contents of the file */
f = fopen(tmp_path, "w");
fclose(f);
ret = cgroupv2_subtree_control(PARENT_DIR, ctrlr_name, false);
ASSERT_EQ(ret, 0);
f = fopen(tmp_path, "r");
ASSERT_NE(f, nullptr);
while (fgets(buf, sizeof(buf), f))
ASSERT_STREQ(buf, "-memory");
fclose(f);
}
|