blob: 5edc53e666a24958bde2eab9021e023df3fc10d4 [file] [log] [blame]
// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "cros-disks/mount_options.h"
#include <sys/mount.h>
#include <string>
#include <vector>
#include <base/macros.h>
#include <gtest/gtest.h>
using std::pair;
using std::string;
using std::vector;
namespace cros_disks {
class MountOptionsTest : public ::testing::Test {
public:
MountOptionsTest() {}
virtual ~MountOptionsTest() {}
virtual void SetUp() {}
virtual void TearDown() {}
private:
DISALLOW_COPY_AND_ASSIGN(MountOptionsTest);
};
TEST_F(MountOptionsTest, IsReadOnlyOptionSet) {
MountOptions mount_options;
// default construction
EXPECT_TRUE(mount_options.IsReadOnlyOptionSet());
// options: ro
vector<string> options = {"ro"};
mount_options.Initialize(options, false, "", "");
EXPECT_TRUE(mount_options.IsReadOnlyOptionSet());
// options: rw
options = {"rw"};
mount_options.Initialize(options, false, "", "");
EXPECT_FALSE(mount_options.IsReadOnlyOptionSet());
}
TEST_F(MountOptionsTest, SetReadOnlyOption) {
MountOptions mount_options;
string expected_string_default = "ro";
string expected_string_initialize = "ro,nodev,noexec,nosuid";
// default construction
mount_options.SetReadOnlyOption();
EXPECT_EQ(expected_string_default, mount_options.ToString());
// options: ro
vector<string> options = {"ro"};
mount_options.Initialize(options, false, "", "");
mount_options.SetReadOnlyOption();
EXPECT_EQ(expected_string_initialize, mount_options.ToString());
// options: rw
options = {"rw"};
mount_options.Initialize(options, false, "", "");
mount_options.SetReadOnlyOption();
EXPECT_EQ(expected_string_initialize, mount_options.ToString());
}
TEST_F(MountOptionsTest, ToString) {
MountOptions mount_options;
vector<string> options;
string expected_string;
// default construction
expected_string = "ro";
EXPECT_EQ(expected_string, mount_options.ToString());
// options: ro (default)
expected_string = "ro,nodev,noexec,nosuid";
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: ro, bind
expected_string = "bind,ro,nodev,noexec,nosuid";
options.push_back("bind");
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: ro, nodev
expected_string = "ro,nodev,noexec,nosuid";
options.clear();
options.push_back("nodev");
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw
expected_string = "rw,nodev,noexec,nosuid";
options.push_back("rw");
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw, nosuid
expected_string = "rw,nodev,noexec,nosuid";
options.push_back("nosuid");
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw, nosuid, noexec
expected_string = "rw,nodev,noexec,nosuid";
options.push_back("noexec");
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw, nosuid, noexec, dirsync
expected_string = "dirsync,rw,nodev,noexec,nosuid";
options.push_back("dirsync");
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw, nosuid, noexec, dirsync, sync
expected_string = "dirsync,sync,rw,nodev,noexec,nosuid";
options.push_back("sync");
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw, nosuid, noexec, dirsync, sync
// default uid=1000, gid=1001
// ignore user and group ID
expected_string = "dirsync,sync,rw,nodev,noexec,nosuid";
mount_options.Initialize(options, false, "1000", "1001");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw, nosuid, noexec, dirsync, sync
// default uid=1000, gid=1001
expected_string = "dirsync,sync,rw,uid=1000,gid=1001,nodev,noexec,nosuid";
mount_options.Initialize(options, true, "1000", "1001");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw, nosuid, noexec, dirsync, sync, uid=2000, gid=2001
// default uid=1000, gid=1001
// ignore user and group ID
options.push_back("uid=2000");
options.push_back("gid=2001");
expected_string = "dirsync,sync,rw,nodev,noexec,nosuid";
mount_options.Initialize(options, false, "1000", "1001");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: nodev, rw, nosuid, noexec, dirsync, sync, uid=2000, gid=2001
// default uid=1000, gid=1001
expected_string = "dirsync,sync,rw,uid=2000,gid=2001,nodev,noexec,nosuid";
mount_options.Initialize(options, true, "1000", "1001");
EXPECT_EQ(expected_string, mount_options.ToString());
// options: "nodev,dev"
// ignore an option string containing a comma.
expected_string = "ro,nodev,noexec,nosuid";
options.clear();
options.push_back("nodev,dev");
mount_options.Initialize(options, false, "", "");
EXPECT_EQ(expected_string, mount_options.ToString());
}
TEST_F(MountOptionsTest, ToMountFlagsAndData) {
MountOptions mount_options;
vector<string> options;
MountOptions::Flags expected_flags;
MountOptions::Flags security_flags = MS_NODEV | MS_NOEXEC | MS_NOSUID;
string expected_data;
pair<MountOptions::Flags, string> flags_and_data;
// default construction
expected_flags = MS_RDONLY;
expected_data = "";
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: ro (default)
mount_options.Initialize(options, false, "", "");
expected_flags = security_flags | MS_RDONLY;
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: ro, bind
options.push_back("bind");
expected_flags = security_flags | MS_RDONLY | MS_BIND;
mount_options.Initialize(options, false, "", "");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: ro, nodev
options.clear();
options.push_back("nodev");
expected_flags = security_flags | MS_RDONLY | MS_NODEV;
mount_options.Initialize(options, false, "", "");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: nodev, rw
options.push_back("rw");
expected_flags = security_flags | MS_NODEV;
mount_options.Initialize(options, false, "", "");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: nodev, rw, nosuid
options.push_back("nosuid");
expected_flags = security_flags | MS_NODEV | MS_NOSUID;
mount_options.Initialize(options, false, "", "");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: nodev, rw, nosuid, noexec
options.push_back("noexec");
expected_flags = security_flags | MS_NODEV | MS_NOSUID | MS_NOEXEC;
mount_options.Initialize(options, false, "", "");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: nodev, rw, nosuid, noexec, sync
options.push_back("sync");
expected_flags = security_flags |
MS_NODEV | MS_NOSUID | MS_NOEXEC | MS_SYNCHRONOUS;
mount_options.Initialize(options, false, "", "");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: nodev, rw, nosuid, noexec, sync
// default uid=1000, gid=1001
// ignore user and group ID
expected_flags = security_flags | MS_NODEV | MS_NOSUID | MS_NOEXEC |
MS_SYNCHRONOUS;
mount_options.Initialize(options, false, "1000", "1001");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: nodev, rw, nosuid, noexec, sync
// default uid=1000, gid=1001
expected_data = "uid=1000,gid=1001";
mount_options.Initialize(options, true, "1000", "1001");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: nodev, rw, nosuid, noexec, sync, uid=2000, gid=2001
// default uid=1000, gid=1001
// ignore user and group ID
options.push_back("uid=2000");
options.push_back("gid=2001");
expected_data = "";
mount_options.Initialize(options, false, "1000", "1001");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
// options: nodev, rw, nosuid, noexec, sync, uid=2000, gid=2001
// default uid=1000, gid=1001
expected_data = "uid=2000,gid=2001";
mount_options.Initialize(options, true, "1000", "1001");
flags_and_data = mount_options.ToMountFlagsAndData();
EXPECT_EQ(expected_flags, flags_and_data.first);
EXPECT_EQ(expected_data, flags_and_data.second);
}
} // namespace cros_disks