Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 1 | /* Copyright 2016 The Chromium OS Authors. All rights reserved. |
| 2 | * Use of this source code is governed by a BSD-style license that can be |
| 3 | * found in the LICENSE file. |
| 4 | */ |
| 5 | |
| 6 | #include <errno.h> |
| 7 | |
Luis Hector Chavez | fd81db4 | 2018-01-31 12:18:39 -0800 | [diff] [blame] | 8 | #include <fcntl.h> |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 9 | #include <sys/stat.h> |
| 10 | #include <sys/types.h> |
| 11 | #include <unistd.h> |
| 12 | |
| 13 | #include <base/files/file_path.h> |
| 14 | #include <base/files/file_util.h> |
| 15 | #include <base/files/scoped_temp_dir.h> |
| 16 | #include <base/logging.h> |
| 17 | #include <base/strings/string_split.h> |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 18 | #include <gtest/gtest.h> |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 19 | |
| 20 | #include "libcontainer/cgroup.h" |
| 21 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 22 | namespace libcontainer { |
| 23 | |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 24 | namespace { |
| 25 | |
| 26 | constexpr char kCgroupName[] = "testcg"; |
| 27 | constexpr char kCgroupParentName[] = "testparentcg"; |
| 28 | |
| 29 | bool CreateFile(const base::FilePath& path) { |
| 30 | return base::WriteFile(path, "", 0) == 0; |
| 31 | } |
| 32 | |
| 33 | bool FileHasString(const base::FilePath& path, const std::string& expected) { |
| 34 | std::string contents; |
| 35 | if (!base::ReadFileToString(path, &contents)) |
| 36 | return false; |
| 37 | |
| 38 | return contents.find(expected) != std::string::npos; |
| 39 | } |
| 40 | |
| 41 | bool FileHasLine(const base::FilePath& path, const std::string& expected) { |
| 42 | std::string contents; |
| 43 | if (!base::ReadFileToString(path, &contents)) |
| 44 | return false; |
| 45 | |
| 46 | for (const auto& line : base::SplitString( |
| 47 | contents, "\n", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY)) { |
| 48 | if (line == expected) |
| 49 | return true; |
| 50 | } |
| 51 | return false; |
| 52 | } |
| 53 | |
| 54 | } // namespace |
| 55 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 56 | TEST(CgroupTest, CgroupNewWithParent) { |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 57 | base::ScopedTempDir temp_dir; |
| 58 | ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
Eric Caruso | bf34ef7 | 2018-01-22 15:44:55 -0800 | [diff] [blame] | 59 | base::FilePath cgroup_root = temp_dir.GetPath(); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 60 | |
| 61 | for (const char* subsystem : |
| 62 | {"cpu", "cpuacct", "cpuset", "devices", "freezer", "schedtune"}) { |
| 63 | base::FilePath path = cgroup_root.Append(subsystem); |
| 64 | EXPECT_EQ(0, mkdir(path.value().c_str(), S_IRWXU | S_IRWXG)); |
| 65 | path = path.Append(kCgroupParentName); |
| 66 | EXPECT_EQ(0, mkdir(path.value().c_str(), S_IRWXU | S_IRWXG)); |
| 67 | } |
| 68 | |
| 69 | ASSERT_TRUE(base::WriteFile( |
| 70 | cgroup_root.Append("cpuset").Append(kCgroupParentName).Append("cpus"), |
Tom Hughes | 25f969a | 2020-08-27 15:57:27 -0700 | [diff] [blame] | 71 | "0-3", 3)); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 72 | ASSERT_TRUE(base::WriteFile( |
| 73 | cgroup_root.Append("cpuset").Append(kCgroupParentName).Append("mems"), |
Tom Hughes | 25f969a | 2020-08-27 15:57:27 -0700 | [diff] [blame] | 74 | "0", 1)); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 75 | |
Tom Hughes | 25f969a | 2020-08-27 15:57:27 -0700 | [diff] [blame] | 76 | std::unique_ptr<libcontainer::Cgroup> ccg = libcontainer::Cgroup::Create( |
| 77 | kCgroupName, cgroup_root, base::FilePath(kCgroupParentName), getuid(), |
| 78 | getgid()); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 79 | ASSERT_NE(nullptr, ccg.get()); |
| 80 | |
| 81 | EXPECT_TRUE(base::DirectoryExists( |
| 82 | cgroup_root.Append("cpu").Append(kCgroupParentName).Append(kCgroupName))); |
| 83 | EXPECT_TRUE(base::DirectoryExists(cgroup_root.Append("cpuacct") |
| 84 | .Append(kCgroupParentName) |
| 85 | .Append(kCgroupName))); |
| 86 | EXPECT_TRUE(base::DirectoryExists(cgroup_root.Append("cpuset") |
| 87 | .Append(kCgroupParentName) |
| 88 | .Append(kCgroupName))); |
| 89 | EXPECT_TRUE(base::DirectoryExists(cgroup_root.Append("devices") |
| 90 | .Append(kCgroupParentName) |
| 91 | .Append(kCgroupName))); |
| 92 | EXPECT_TRUE(base::DirectoryExists(cgroup_root.Append("freezer") |
| 93 | .Append(kCgroupParentName) |
| 94 | .Append(kCgroupName))); |
| 95 | EXPECT_TRUE(base::DirectoryExists(cgroup_root.Append("schedtune") |
| 96 | .Append(kCgroupParentName) |
| 97 | .Append(kCgroupName))); |
| 98 | |
| 99 | EXPECT_TRUE(temp_dir.Delete()); |
| 100 | } |
| 101 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 102 | class BasicCgroupManipulationTest : public ::testing::Test { |
| 103 | public: |
| 104 | BasicCgroupManipulationTest() = default; |
| 105 | ~BasicCgroupManipulationTest() override = default; |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 106 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 107 | void SetUp() override { |
| 108 | ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 109 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 110 | base::FilePath cgroup_root; |
Satoru Takabayashi | cf730fb | 2018-08-03 16:42:36 +0900 | [diff] [blame] | 111 | ASSERT_TRUE(base::CreateTemporaryDirInDir(temp_dir_.GetPath(), "cgtest", |
| 112 | &cgroup_root)); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 113 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 114 | for (const char* subsystem : |
| 115 | {"cpu", "cpuacct", "cpuset", "devices", "freezer", "schedtune"}) { |
| 116 | base::FilePath path = cgroup_root.Append(subsystem); |
| 117 | ASSERT_EQ(0, mkdir(path.value().c_str(), S_IRWXU | S_IRWXG)); |
| 118 | } |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 119 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 120 | ASSERT_TRUE(base::WriteFile(cgroup_root.Append("cpuset/cpus"), "0-3", 3)); |
| 121 | ASSERT_TRUE(base::WriteFile(cgroup_root.Append("cpuset/mems"), "0", 1)); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 122 | |
Tom Hughes | 25f969a | 2020-08-27 15:57:27 -0700 | [diff] [blame] | 123 | ccg_ = libcontainer::Cgroup::Create(kCgroupName, cgroup_root, |
| 124 | base::FilePath(), 0, 0); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 125 | ASSERT_NE(nullptr, ccg_.get()); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 126 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 127 | cpu_cg_ = cgroup_root.Append("cpu").Append(kCgroupName); |
| 128 | cpuacct_cg_ = cgroup_root.Append("cpuacct").Append(kCgroupName); |
| 129 | cpuset_cg_ = cgroup_root.Append("cpuset").Append(kCgroupName); |
| 130 | devices_cg_ = cgroup_root.Append("devices").Append(kCgroupName); |
| 131 | freezer_cg_ = cgroup_root.Append("freezer").Append(kCgroupName); |
| 132 | schedtune_cg_ = cgroup_root.Append("schedtune").Append(kCgroupName); |
| 133 | |
| 134 | ASSERT_TRUE(base::DirectoryExists(cpu_cg_)); |
| 135 | ASSERT_TRUE(base::DirectoryExists(cpuacct_cg_)); |
| 136 | ASSERT_TRUE(base::DirectoryExists(cpuset_cg_)); |
| 137 | ASSERT_TRUE(base::DirectoryExists(devices_cg_)); |
| 138 | ASSERT_TRUE(base::DirectoryExists(freezer_cg_)); |
| 139 | ASSERT_TRUE(base::DirectoryExists(schedtune_cg_)); |
| 140 | |
| 141 | ASSERT_TRUE(CreateFile(cpu_cg_.Append("tasks"))); |
| 142 | ASSERT_TRUE(CreateFile(cpu_cg_.Append("cpu.shares"))); |
| 143 | ASSERT_TRUE(CreateFile(cpu_cg_.Append("cpu.cfs_quota_us"))); |
| 144 | ASSERT_TRUE(CreateFile(cpu_cg_.Append("cpu.cfs_period_us"))); |
| 145 | ASSERT_TRUE(CreateFile(cpu_cg_.Append("cpu.rt_runtime_us"))); |
| 146 | ASSERT_TRUE(CreateFile(cpu_cg_.Append("cpu.rt_period_us"))); |
| 147 | ASSERT_TRUE(CreateFile(cpuacct_cg_.Append("tasks"))); |
| 148 | ASSERT_TRUE(CreateFile(cpuset_cg_.Append("tasks"))); |
| 149 | ASSERT_TRUE(CreateFile(devices_cg_.Append("tasks"))); |
| 150 | ASSERT_TRUE(CreateFile(devices_cg_.Append("devices.allow"))); |
| 151 | ASSERT_TRUE(CreateFile(devices_cg_.Append("devices.deny"))); |
| 152 | ASSERT_TRUE(CreateFile(freezer_cg_.Append("tasks"))); |
| 153 | ASSERT_TRUE(CreateFile(freezer_cg_.Append("freezer.state"))); |
| 154 | ASSERT_TRUE(CreateFile(schedtune_cg_.Append("tasks"))); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 155 | } |
| 156 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 157 | void TearDown() override { |
| 158 | ccg_.reset(); |
| 159 | ASSERT_TRUE(temp_dir_.Delete()); |
| 160 | } |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 161 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 162 | protected: |
| 163 | std::unique_ptr<libcontainer::Cgroup> ccg_; |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 164 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 165 | base::FilePath cpu_cg_; |
| 166 | base::FilePath cpuacct_cg_; |
| 167 | base::FilePath cpuset_cg_; |
| 168 | base::FilePath devices_cg_; |
| 169 | base::FilePath freezer_cg_; |
| 170 | base::FilePath schedtune_cg_; |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 171 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 172 | base::ScopedTempDir temp_dir_; |
| 173 | }; |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 174 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 175 | TEST_F(BasicCgroupManipulationTest, freeze) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 176 | EXPECT_TRUE(ccg_->Freeze()); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 177 | EXPECT_TRUE(FileHasString(freezer_cg_.Append("freezer.state"), "FROZEN")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 178 | } |
| 179 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 180 | TEST_F(BasicCgroupManipulationTest, thaw) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 181 | EXPECT_TRUE(ccg_->Thaw()); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 182 | EXPECT_TRUE(FileHasString(freezer_cg_.Append("freezer.state"), "THAWED")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 183 | } |
| 184 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 185 | TEST_F(BasicCgroupManipulationTest, default_all_devs_disallow) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 186 | ASSERT_TRUE(ccg_->DenyAllDevices()); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 187 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.deny"), "a")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 188 | } |
| 189 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 190 | TEST_F(BasicCgroupManipulationTest, add_device_invalid_type) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 191 | EXPECT_FALSE(ccg_->AddDevice(1, 14, 3, 1, 1, 0, 'x')); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 192 | } |
| 193 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 194 | TEST_F(BasicCgroupManipulationTest, add_device_no_perms) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 195 | EXPECT_FALSE(ccg_->AddDevice(1, 14, 3, 0, 0, 0, 'c')); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 196 | } |
| 197 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 198 | TEST_F(BasicCgroupManipulationTest, add_device_rw) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 199 | EXPECT_TRUE(ccg_->AddDevice(1, 14, 3, 1, 1, 0, 'c')); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 200 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.allow"), "c 14:3 rw")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 201 | } |
| 202 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 203 | TEST_F(BasicCgroupManipulationTest, add_device_rwm) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 204 | EXPECT_TRUE(ccg_->AddDevice(1, 14, 3, 1, 1, 1, 'c')); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 205 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.allow"), "c 14:3 rwm")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 206 | } |
| 207 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 208 | TEST_F(BasicCgroupManipulationTest, add_device_ro) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 209 | EXPECT_TRUE(ccg_->AddDevice(1, 14, 3, 1, 0, 0, 'c')); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 210 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.allow"), "c 14:3 r")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 211 | } |
| 212 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 213 | TEST_F(BasicCgroupManipulationTest, add_device_wo) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 214 | EXPECT_TRUE(ccg_->AddDevice(1, 14, 3, 0, 1, 0, 'c')); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 215 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.allow"), "c 14:3 w")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 216 | } |
| 217 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 218 | TEST_F(BasicCgroupManipulationTest, add_device_major_wide) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 219 | EXPECT_TRUE(ccg_->AddDevice(1, 14, -1, 0, 1, 0, 'c')); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 220 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.allow"), "c 14:* w")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 221 | } |
| 222 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 223 | TEST_F(BasicCgroupManipulationTest, add_device_major_minor_wildcard) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 224 | EXPECT_TRUE(ccg_->AddDevice(1, -1, -1, 0, 1, 0, 'c')); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 225 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.allow"), "c *:* w")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 226 | } |
| 227 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 228 | TEST_F(BasicCgroupManipulationTest, add_device_deny_all) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 229 | EXPECT_TRUE(ccg_->AddDevice(0, -1, -1, 1, 1, 1, 'a')); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 230 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.deny"), "a *:* rwm")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 231 | } |
| 232 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 233 | TEST_F(BasicCgroupManipulationTest, add_device_block) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 234 | EXPECT_TRUE(ccg_->AddDevice(1, 14, 3, 1, 1, 0, 'b')); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 235 | EXPECT_TRUE(FileHasLine(devices_cg_.Append("devices.allow"), "b 14:3 rw")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 236 | } |
| 237 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 238 | TEST_F(BasicCgroupManipulationTest, set_cpu_shares) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 239 | EXPECT_TRUE(ccg_->SetCpuShares(500)); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 240 | EXPECT_TRUE(FileHasString(cpu_cg_.Append("cpu.shares"), "500")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 241 | } |
| 242 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 243 | TEST_F(BasicCgroupManipulationTest, set_cpu_quota) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 244 | EXPECT_TRUE(ccg_->SetCpuQuota(200000)); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 245 | EXPECT_TRUE(FileHasString(cpu_cg_.Append("cpu.cfs_quota_us"), "200000")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 246 | } |
| 247 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 248 | TEST_F(BasicCgroupManipulationTest, set_cpu_period) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 249 | EXPECT_TRUE(ccg_->SetCpuPeriod(800000)); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 250 | EXPECT_TRUE(FileHasString(cpu_cg_.Append("cpu.cfs_period_us"), "800000")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 251 | } |
| 252 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 253 | TEST_F(BasicCgroupManipulationTest, set_cpu_rt_runtime) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 254 | EXPECT_TRUE(ccg_->SetCpuRtRuntime(100000)); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 255 | EXPECT_TRUE(FileHasString(cpu_cg_.Append("cpu.rt_runtime_us"), "100000")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 256 | } |
| 257 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 258 | TEST_F(BasicCgroupManipulationTest, set_cpu_rt_period) { |
Luis Hector Chavez | 1f7e60c | 2017-09-27 22:03:48 -0700 | [diff] [blame] | 259 | EXPECT_TRUE(ccg_->SetCpuRtPeriod(500000)); |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 260 | EXPECT_TRUE(FileHasString(cpu_cg_.Append("cpu.rt_period_us"), "500000")); |
Luis Hector Chavez | 76ae9ac | 2017-09-20 21:13:08 -0700 | [diff] [blame] | 261 | } |
| 262 | |
Luis Hector Chavez | fd81db4 | 2018-01-31 12:18:39 -0800 | [diff] [blame] | 263 | TEST_F(BasicCgroupManipulationTest, OpenCgroupFileRefusesToWriteToSymlink) { |
| 264 | base::FilePath cpu_rt_period_us_path = cpu_cg_.Append("cpu.rt_period_us"); |
| 265 | base::FilePath target_path = cpu_cg_.Append("symlink_target"); |
hscham | 53cf73a | 2020-11-30 15:58:42 +0900 | [diff] [blame] | 266 | ASSERT_TRUE(base::DeleteFile(cpu_rt_period_us_path)); |
Luis Hector Chavez | fd81db4 | 2018-01-31 12:18:39 -0800 | [diff] [blame] | 267 | ASSERT_TRUE(base::CreateSymbolicLink(target_path, cpu_rt_period_us_path)); |
| 268 | |
| 269 | // This should fail since we are trying to write to a symlink. |
| 270 | EXPECT_FALSE(ccg_->SetCpuRtPeriod(500000)); |
| 271 | } |
| 272 | |
| 273 | TEST_F(BasicCgroupManipulationTest, OpenCgroupFileRefusesToWriteToNonOpenFIFO) { |
| 274 | base::FilePath cpu_rt_period_us_path = cpu_cg_.Append("cpu.rt_period_us"); |
hscham | 53cf73a | 2020-11-30 15:58:42 +0900 | [diff] [blame] | 275 | ASSERT_TRUE(base::DeleteFile(cpu_rt_period_us_path)); |
Luis Hector Chavez | fd81db4 | 2018-01-31 12:18:39 -0800 | [diff] [blame] | 276 | ASSERT_NE(mkfifo(cpu_rt_period_us_path.value().c_str(), 0664), -1); |
| 277 | |
| 278 | // This should fail since we are trying to write to a FIFO. |
| 279 | EXPECT_FALSE(ccg_->SetCpuRtPeriod(500000)); |
| 280 | } |
| 281 | |
| 282 | TEST_F(BasicCgroupManipulationTest, OpenCgroupFileRefusesToWriteToOpenFIFO) { |
| 283 | base::FilePath cpu_rt_period_us_path = cpu_cg_.Append("cpu.rt_period_us"); |
hscham | 53cf73a | 2020-11-30 15:58:42 +0900 | [diff] [blame] | 284 | ASSERT_TRUE(base::DeleteFile(cpu_rt_period_us_path)); |
Luis Hector Chavez | fd81db4 | 2018-01-31 12:18:39 -0800 | [diff] [blame] | 285 | ASSERT_NE(mkfifo(cpu_rt_period_us_path.value().c_str(), 0664), -1); |
| 286 | base::ScopedFD fd( |
| 287 | open(cpu_rt_period_us_path.value().c_str(), O_RDONLY | O_NONBLOCK)); |
| 288 | ASSERT_TRUE(fd.is_valid()); |
| 289 | |
| 290 | // This should fail since we are trying to write to a FIFO. |
| 291 | EXPECT_FALSE(ccg_->SetCpuRtPeriod(500000)); |
| 292 | } |
| 293 | |
Luis Hector Chavez | 58725a8 | 2017-09-19 21:14:17 -0700 | [diff] [blame] | 294 | } // namespace libcontainer |