summaryrefslogtreecommitdiffhomepage
path: root/test/syscalls/linux
diff options
context:
space:
mode:
authorRahat Mahmood <rahat@google.com>2021-04-22 15:50:01 -0700
committergVisor bot <gvisor-bot@google.com>2021-04-22 15:52:24 -0700
commitd93907110eebdfb1e51dacd9ccffd0f0c2633a81 (patch)
tree5941c19d879269244b71031bffa437af895728a6 /test/syscalls/linux
parentdbfdb31e8a014e5e11092de121e825b21c2804c3 (diff)
Also report mount options through /proc/<pid>/mounts.
PiperOrigin-RevId: 369967629
Diffstat (limited to 'test/syscalls/linux')
-rw-r--r--test/syscalls/linux/BUILD2
-rw-r--r--test/syscalls/linux/cgroup.cc52
-rw-r--r--test/syscalls/linux/mount.cc33
-rw-r--r--test/syscalls/linux/proc.cc27
4 files changed, 114 insertions, 0 deletions
diff --git a/test/syscalls/linux/BUILD b/test/syscalls/linux/BUILD
index 55f3fc4ae..94a582256 100644
--- a/test/syscalls/linux/BUILD
+++ b/test/syscalls/linux/BUILD
@@ -1726,6 +1726,7 @@ cc_binary(
"//test/util:cleanup",
"//test/util:file_descriptor",
"//test/util:fs_util",
+ "//test/util:mount_util",
"@com_google_absl//absl/container:node_hash_set",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/synchronization",
@@ -4243,6 +4244,7 @@ cc_binary(
"//test/util:cgroup_util",
"//test/util:file_descriptor",
"//test/util:fs_util",
+ "//test/util:mount_util",
"@com_google_absl//absl/strings",
gtest,
"//test/util:posix_error",
diff --git a/test/syscalls/linux/cgroup.cc b/test/syscalls/linux/cgroup.cc
index 862328f5b..70ad5868f 100644
--- a/test/syscalls/linux/cgroup.cc
+++ b/test/syscalls/linux/cgroup.cc
@@ -25,6 +25,7 @@
#include "absl/strings/str_split.h"
#include "test/util/capability_util.h"
#include "test/util/cgroup_util.h"
+#include "test/util/mount_util.h"
#include "test/util/temp_path.h"
#include "test/util/test_util.h"
@@ -33,8 +34,11 @@ namespace testing {
namespace {
using ::testing::_;
+using ::testing::Contains;
using ::testing::Ge;
using ::testing::Gt;
+using ::testing::Key;
+using ::testing::Not;
std::vector<std::string> known_controllers = {
"cpu", "cpuset", "cpuacct", "job", "memory",
@@ -447,6 +451,54 @@ TEST(ProcCgroup, MultiControllerHierarchy) {
EXPECT_EQ(pid_e.hierarchy, mem_e.hierarchy);
}
+TEST(ProcCgroup, ProcfsReportsCgroupfsMountOptions) {
+ SKIP_IF(!CgroupsAvailable());
+
+ Mounter m(ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateDir()));
+ // Hierarchy with multiple controllers.
+ Cgroup c1 = ASSERT_NO_ERRNO_AND_VALUE(m.MountCgroupfs("memory,cpu"));
+ // Hierarchy with a single controller.
+ Cgroup c2 = ASSERT_NO_ERRNO_AND_VALUE(m.MountCgroupfs("cpuacct"));
+
+ const std::vector<ProcMountsEntry> mounts =
+ ASSERT_NO_ERRNO_AND_VALUE(ProcSelfMountsEntries());
+
+ for (auto const& e : mounts) {
+ if (e.mount_point == c1.Path()) {
+ auto mopts = ParseMountOptions(e.mount_opts);
+ EXPECT_THAT(mopts, Contains(Key("memory")));
+ EXPECT_THAT(mopts, Contains(Key("cpu")));
+ EXPECT_THAT(mopts, Not(Contains(Key("cpuacct"))));
+ }
+
+ if (e.mount_point == c2.Path()) {
+ auto mopts = ParseMountOptions(e.mount_opts);
+ EXPECT_THAT(mopts, Contains(Key("cpuacct")));
+ EXPECT_THAT(mopts, Not(Contains(Key("cpu"))));
+ EXPECT_THAT(mopts, Not(Contains(Key("memory"))));
+ }
+ }
+
+ const std::vector<ProcMountInfoEntry> mountinfo =
+ ASSERT_NO_ERRNO_AND_VALUE(ProcSelfMountInfoEntries());
+
+ for (auto const& e : mountinfo) {
+ if (e.mount_point == c1.Path()) {
+ auto mopts = ParseMountOptions(e.super_opts);
+ EXPECT_THAT(mopts, Contains(Key("memory")));
+ EXPECT_THAT(mopts, Contains(Key("cpu")));
+ EXPECT_THAT(mopts, Not(Contains(Key("cpuacct"))));
+ }
+
+ if (e.mount_point == c2.Path()) {
+ auto mopts = ParseMountOptions(e.super_opts);
+ EXPECT_THAT(mopts, Contains(Key("cpuacct")));
+ EXPECT_THAT(mopts, Not(Contains(Key("cpu"))));
+ EXPECT_THAT(mopts, Not(Contains(Key("memory"))));
+ }
+ }
+}
+
} // namespace
} // namespace testing
} // namespace gvisor
diff --git a/test/syscalls/linux/mount.cc b/test/syscalls/linux/mount.cc
index 15b645fb7..cdc223d07 100644
--- a/test/syscalls/linux/mount.cc
+++ b/test/syscalls/linux/mount.cc
@@ -26,6 +26,7 @@
#include "gmock/gmock.h"
#include "gtest/gtest.h"
+#include "absl/strings/str_split.h"
#include "absl/strings/string_view.h"
#include "absl/time/time.h"
#include "test/util/capability_util.h"
@@ -44,6 +45,9 @@ namespace testing {
namespace {
+using ::testing::Contains;
+using ::testing::Pair;
+
TEST(MountTest, MountBadFilesystem) {
SKIP_IF(!ASSERT_NO_ERRNO_AND_VALUE(HaveCapability(CAP_SYS_ADMIN)));
@@ -345,6 +349,35 @@ TEST(MountTest, RenameRemoveMountPoint) {
ASSERT_THAT(rmdir(dir.path().c_str()), SyscallFailsWithErrno(EBUSY));
}
+TEST(MountTest, MountInfo) {
+ SKIP_IF(IsRunningWithVFS1());
+ SKIP_IF(!ASSERT_NO_ERRNO_AND_VALUE(HaveCapability(CAP_SYS_ADMIN)));
+
+ auto const dir = ASSERT_NO_ERRNO_AND_VALUE(TempPath::CreateDir());
+ auto const mount = ASSERT_NO_ERRNO_AND_VALUE(
+ Mount("", dir.path(), "tmpfs", MS_NOEXEC, "mode=0123", 0));
+ const std::vector<ProcMountsEntry> mounts =
+ ASSERT_NO_ERRNO_AND_VALUE(ProcSelfMountsEntries());
+ for (const auto& e : mounts) {
+ if (e.mount_point == dir.path()) {
+ EXPECT_EQ(e.fstype, "tmpfs");
+ auto mopts = ParseMountOptions(e.mount_opts);
+ EXPECT_THAT(mopts, Contains(Pair("mode", "0123")));
+ }
+ }
+
+ const std::vector<ProcMountInfoEntry> mountinfo =
+ ASSERT_NO_ERRNO_AND_VALUE(ProcSelfMountInfoEntries());
+
+ for (auto const& e : mountinfo) {
+ if (e.mount_point == dir.path()) {
+ EXPECT_EQ(e.fstype, "tmpfs");
+ auto mopts = ParseMountOptions(e.super_opts);
+ EXPECT_THAT(mopts, Contains(Pair("mode", "0123")));
+ }
+ }
+}
+
} // namespace
} // namespace testing
diff --git a/test/syscalls/linux/proc.cc b/test/syscalls/linux/proc.cc
index 6b055ea89..9e48fbca5 100644
--- a/test/syscalls/linux/proc.cc
+++ b/test/syscalls/linux/proc.cc
@@ -65,6 +65,7 @@
#include "test/util/file_descriptor.h"
#include "test/util/fs_util.h"
#include "test/util/memory_util.h"
+#include "test/util/mount_util.h"
#include "test/util/multiprocess_util.h"
#include "test/util/posix_error.h"
#include "test/util/proc_util.h"
@@ -2468,6 +2469,19 @@ TEST(ProcSelfMountinfo, RequiredFieldsArePresent) {
R"([0-9]+ [0-9]+ [0-9]+:[0-9]+ / /proc rw.*- \S+ \S+ rw\S*)")));
}
+TEST(ProcSelfMountinfo, ContainsProcfsEntry) {
+ const std::vector<ProcMountInfoEntry> entries =
+ ASSERT_NO_ERRNO_AND_VALUE(ProcSelfMountInfoEntries());
+ bool found = false;
+ for (const auto& e : entries) {
+ if (e.fstype == "proc") {
+ found = true;
+ break;
+ }
+ }
+ EXPECT_TRUE(found);
+}
+
// Check that /proc/self/mounts looks something like a real mounts file.
TEST(ProcSelfMounts, RequiredFieldsArePresent) {
auto mounts = ASSERT_NO_ERRNO_AND_VALUE(GetContents("/proc/self/mounts"));
@@ -2479,6 +2493,19 @@ TEST(ProcSelfMounts, RequiredFieldsArePresent) {
ContainsRegex(R"(\S+ /proc \S+ rw\S* [0-9]+ [0-9]+\s)")));
}
+TEST(ProcSelfMounts, ContainsProcfsEntry) {
+ const std::vector<ProcMountsEntry> entries =
+ ASSERT_NO_ERRNO_AND_VALUE(ProcSelfMountsEntries());
+ bool found = false;
+ for (const auto& e : entries) {
+ if (e.fstype == "proc") {
+ found = true;
+ break;
+ }
+ }
+ EXPECT_TRUE(found);
+}
+
void CheckDuplicatesRecursively(std::string path) {
std::vector<std::string> child_dirs;