From e3a5da8ce62826f56c0b531590bb472ea717eeac Mon Sep 17 00:00:00 2001 From: Rahat Mahmood Date: Wed, 21 Apr 2021 13:34:51 -0700 Subject: Stub the custom "job" controller required by some workloads. PiperOrigin-RevId: 369724358 --- test/syscalls/linux/cgroup.cc | 35 +++++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) (limited to 'test/syscalls/linux') diff --git a/test/syscalls/linux/cgroup.cc b/test/syscalls/linux/cgroup.cc index a1006a978..862328f5b 100644 --- a/test/syscalls/linux/cgroup.cc +++ b/test/syscalls/linux/cgroup.cc @@ -15,6 +15,7 @@ // All tests in this file rely on being about to mount and unmount cgroupfs, // which isn't expected to work, or be safe on a general linux system. +#include #include #include @@ -35,8 +36,9 @@ using ::testing::_; using ::testing::Ge; using ::testing::Gt; -std::vector known_controllers = {"cpu", "cpuset", "cpuacct", - "memory"}; +std::vector known_controllers = { + "cpu", "cpuset", "cpuacct", "job", "memory", +}; bool CgroupsAvailable() { return IsRunningOnGvisor() && !IsRunningWithVFS1() && @@ -257,6 +259,35 @@ TEST(CPUAcctCgroup, CPUAcctStat) { EXPECT_THAT(Atoi(sys_tokens[1]), IsPosixErrorOkAndHolds(Ge(0))); } +// WriteAndVerifyControlValue attempts to write val to a cgroup file at path, +// and verify the value by reading it afterwards. +PosixError WriteAndVerifyControlValue(const Cgroup& c, std::string_view path, + int64_t val) { + RETURN_IF_ERRNO(c.WriteIntegerControlFile(path, val)); + ASSIGN_OR_RETURN_ERRNO(int64_t newval, c.ReadIntegerControlFile(path)); + if (newval != val) { + return PosixError( + EINVAL, + absl::StrFormat( + "Unexpected value for control file '%s': expected %d, got %d", path, + val, newval)); + } + return NoError(); +} + +TEST(JobCgroup, ReadWriteRead) { + SKIP_IF(!CgroupsAvailable()); + + Mounter m(ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateDir())); + Cgroup c = ASSERT_NO_ERRNO_AND_VALUE(m.MountCgroupfs("job")); + + EXPECT_THAT(c.ReadIntegerControlFile("job.id"), IsPosixErrorOkAndHolds(0)); + EXPECT_NO_ERRNO(WriteAndVerifyControlValue(c, "job.id", 1234)); + EXPECT_NO_ERRNO(WriteAndVerifyControlValue(c, "job.id", -1)); + EXPECT_NO_ERRNO(WriteAndVerifyControlValue(c, "job.id", LLONG_MIN)); + EXPECT_NO_ERRNO(WriteAndVerifyControlValue(c, "job.id", LLONG_MAX)); +} + TEST(ProcCgroups, Empty) { SKIP_IF(!CgroupsAvailable()); -- cgit v1.2.3