blob: 9f2a00b332f8bfa634c993cdbbb7d5c91ac360a9 [file] [log] [blame]
// Copyright (c) 2012 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/archive_manager.h"
#include <brillo/process/process_reaper.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
#include "cros-disks/metrics.h"
#include "cros-disks/platform.h"
namespace cros_disks {
namespace {
using testing::_;
using testing::DoAll;
using testing::Invoke;
using testing::IsEmpty;
using testing::Return;
using testing::SetArgPointee;
using testing::UnorderedElementsAre;
const char kMountRootDirectory[] = "/my_mount_point";
// Mock Platform implementation for testing.
class MockPlatform : public Platform {
public:
MOCK_METHOD(bool,
GetUserAndGroupId,
(const std::string&, uid_t*, gid_t*),
(const, override));
MOCK_METHOD(bool,
GetGroupId,
(const std::string&, gid_t*),
(const, override));
};
class ArchiveManagerUnderTest : public ArchiveManager {
public:
using ArchiveManager::ArchiveManager;
~ArchiveManagerUnderTest() override { UnmountAll(); }
MOCK_METHOD(bool, CanMount, (const std::string&), (const, override));
MOCK_METHOD(std::unique_ptr<MountPoint>,
DoMount,
(const std::string&,
const std::string&,
const std::vector<std::string>&,
const base::FilePath&,
MountOptions*,
MountErrorType*),
(override));
};
} // namespace
class ArchiveManagerTest : public testing::Test {
protected:
Metrics metrics_;
MockPlatform platform_;
brillo::ProcessReaper reaper_;
const ArchiveManagerUnderTest manager_{kMountRootDirectory, &platform_,
&metrics_, &reaper_};
};
TEST_F(ArchiveManagerTest, IsInAllowedFolder) {
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(""));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/dev/sda1"));
EXPECT_TRUE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/MyFiles/foo"));
EXPECT_TRUE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/MyFiles/x/"
"foo"));
EXPECT_TRUE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/MyFiles/"
"Downloads/foo"));
EXPECT_TRUE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/MyFiles/"
"Downloads/x/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/x/foo"));
EXPECT_FALSE(
ArchiveManager::IsInAllowedFolder("/home/chronos/user/MyFiles/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/homex/chronos/u-0123456789abcdef0123456789abcdef01234567/MyFiles/"
"Downloads/x/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronosx/u-0123456789abcdef0123456789abcdef01234567/MyFiles/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/0123456789abcdef0123456789abcdef01234567/MyFiles/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567x/MyFiles/foo"));
EXPECT_FALSE(
ArchiveManager::IsInAllowedFolder("/home/chronos/user/Downloads/bar"));
EXPECT_TRUE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/MyFiles/"
"Downloads/bar"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/media/removable"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/media/removable/"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/media/archive"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/media/archive/"));
EXPECT_FALSE(
ArchiveManager::IsInAllowedFolder("/home/chronos/user/Downloads"));
EXPECT_FALSE(
ArchiveManager::IsInAllowedFolder("/home/chronos/user/Downloads/"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/Downloads"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/Downloads/"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/home/chronos/bar"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/home/chronos/user/bar"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef01234567/bar"));
EXPECT_FALSE(
ArchiveManager::IsInAllowedFolder("/home/chronos/Downloads/bar"));
EXPECT_FALSE(
ArchiveManager::IsInAllowedFolder("/home/chronos/foo/Downloads/bar"));
EXPECT_FALSE(
ArchiveManager::IsInAllowedFolder("/home/chronos/u-/Downloads/bar"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-0123456789abcdef0123456789abcdef0123456/Downloads/bar"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder(
"/home/chronos/u-xyz3456789abcdef0123456789abcdef01234567/Downloads/"
"bar"));
EXPECT_TRUE(ArchiveManager::IsInAllowedFolder("/media/archive/y/foo"));
EXPECT_TRUE(ArchiveManager::IsInAllowedFolder("/media/fuse/y/foo"));
EXPECT_TRUE(ArchiveManager::IsInAllowedFolder("/media/removable/y/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/media/x/y/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("/media/x/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("x/media/fuse/y/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("media/fuse/y/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("file:///media/fuse/y/foo"));
EXPECT_FALSE(ArchiveManager::IsInAllowedFolder("ssh:///media/fuse/y/foo"));
}
TEST_F(ArchiveManagerTest, GetMountSourceType) {
EXPECT_EQ(manager_.GetMountSourceType(), MOUNT_SOURCE_ARCHIVE);
}
TEST_F(ArchiveManagerTest, SuggestMountPath) {
EXPECT_EQ(manager_.SuggestMountPath("/home/chronos/Downloads/My Doc.rar"),
std::string(kMountRootDirectory) + "/My Doc.rar");
EXPECT_EQ(manager_.SuggestMountPath("/media/archive/Test.rar/My Doc.zip"),
std::string(kMountRootDirectory) + "/My Doc.zip");
}
TEST_F(ArchiveManagerTest, GetSupplementaryGroups) {
const gid_t gid = 478785;
EXPECT_CALL(platform_, GetGroupId("android-everybody", _))
.WillOnce(DoAll(SetArgPointee<1>(gid), Return(true)));
EXPECT_THAT(manager_.GetSupplementaryGroups(), UnorderedElementsAre(gid));
}
TEST_F(ArchiveManagerTest, GetSupplementaryGroupsCannotGetGroupId) {
EXPECT_CALL(platform_, GetGroupId("android-everybody", _))
.WillOnce(Return(false));
EXPECT_THAT(manager_.GetSupplementaryGroups(), IsEmpty());
}
TEST_F(ArchiveManagerTest, GetMountOptions) {
MountOptions options;
EXPECT_EQ(manager_.GetMountOptions(&options), MOUNT_ERROR_NONE);
EXPECT_EQ(options.ToString(),
"ro,uid=1000,gid=1001,nodev,noexec,nosuid,umask=0222,nosymfollow");
}
} // namespace cros_disks