blob: 6a499414bfd917f3e00128fc6c0c297292c60d68 [file] [log] [blame]
// Copyright 2014 The Chromium 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 "chrome/browser/chromeos/drive/file_system_util.h"
#include <vector>
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/single_thread_task_runner.h"
#include "base/strings/utf_string_conversions.h"
#include "base/threading/thread_task_runner_handle.h"
#include "chrome/browser/chromeos/profiles/profile_helper.h"
#include "chrome/test/base/testing_browser_process.h"
#include "chrome/test/base/testing_profile.h"
#include "chrome/test/base/testing_profile_manager.h"
#include "content/public/test/test_browser_thread_bundle.h"
#include "google_apis/drive/test_util.h"
#include "storage/browser/fileapi/external_mount_points.h"
#include "storage/browser/fileapi/file_system_backend.h"
#include "storage/browser/fileapi/file_system_context.h"
#include "storage/browser/fileapi/file_system_url.h"
#include "storage/browser/fileapi/isolated_context.h"
#include "storage/browser/test/test_file_system_options.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace drive {
namespace util {
namespace {
// Sets up ProfileManager for testing and marks the current thread as UI by
// TestBrowserThreadBundle. We need the thread since Profile objects must be
// touched from UI and hence has CHECK/DCHECKs for it.
class ProfileRelatedFileSystemUtilTest : public testing::Test {
protected:
ProfileRelatedFileSystemUtilTest()
: testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {}
void SetUp() override { ASSERT_TRUE(testing_profile_manager_.SetUp()); }
TestingProfileManager& testing_profile_manager() {
return testing_profile_manager_;
}
private:
content::TestBrowserThreadBundle thread_bundle_;
TestingProfileManager testing_profile_manager_;
};
} // namespace
TEST_F(ProfileRelatedFileSystemUtilTest, GetDriveMountPointPath) {
Profile* profile = testing_profile_manager().CreateTestingProfile("user1");
const std::string user_id_hash =
chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting("user1");
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("/special/drive-" + user_id_hash),
GetDriveMountPointPath(profile));
}
TEST_F(ProfileRelatedFileSystemUtilTest, IsUnderDriveMountPoint) {
EXPECT_FALSE(IsUnderDriveMountPoint(
base::FilePath::FromUTF8Unsafe("/wherever/foo.txt")));
EXPECT_FALSE(IsUnderDriveMountPoint(
base::FilePath::FromUTF8Unsafe("/special/foo.txt")));
EXPECT_FALSE(IsUnderDriveMountPoint(
base::FilePath::FromUTF8Unsafe("special/drive/foo.txt")));
EXPECT_TRUE(
IsUnderDriveMountPoint(base::FilePath::FromUTF8Unsafe("/special/drive")));
EXPECT_TRUE(IsUnderDriveMountPoint(
base::FilePath::FromUTF8Unsafe("/special/drive/foo.txt")));
EXPECT_TRUE(IsUnderDriveMountPoint(
base::FilePath::FromUTF8Unsafe("/special/drive/subdir/foo.txt")));
EXPECT_TRUE(IsUnderDriveMountPoint(
base::FilePath::FromUTF8Unsafe("/special/drive-xxx/foo.txt")));
}
TEST_F(ProfileRelatedFileSystemUtilTest, ExtractDrivePath) {
EXPECT_EQ(
base::FilePath(),
ExtractDrivePath(base::FilePath::FromUTF8Unsafe("/wherever/foo.txt")));
EXPECT_EQ(
base::FilePath(),
ExtractDrivePath(base::FilePath::FromUTF8Unsafe("/special/foo.txt")));
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive"),
ExtractDrivePath(base::FilePath::FromUTF8Unsafe("/special/drive")));
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive/foo.txt"),
ExtractDrivePath(
base::FilePath::FromUTF8Unsafe("/special/drive/foo.txt")));
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive/subdir/foo.txt"),
ExtractDrivePath(base::FilePath::FromUTF8Unsafe(
"/special/drive/subdir/foo.txt")));
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive/foo.txt"),
ExtractDrivePath(
base::FilePath::FromUTF8Unsafe("/special/drive-xxx/foo.txt")));
}
TEST_F(ProfileRelatedFileSystemUtilTest, ExtractProfileFromPath) {
Profile* profile1 = testing_profile_manager().CreateTestingProfile("user1");
Profile* profile2 = testing_profile_manager().CreateTestingProfile("user2");
const std::string user1_id_hash =
chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting("user1");
const std::string user2_id_hash =
chromeos::ProfileHelper::GetUserIdHashByUserIdForTesting("user2");
EXPECT_EQ(profile1, ExtractProfileFromPath(base::FilePath::FromUTF8Unsafe(
"/special/drive-" + user1_id_hash)));
EXPECT_EQ(profile2, ExtractProfileFromPath(base::FilePath::FromUTF8Unsafe(
"/special/drive-" + user2_id_hash + "/root/xxx")));
EXPECT_EQ(nullptr, ExtractProfileFromPath(base::FilePath::FromUTF8Unsafe(
"/special/non-drive-path")));
}
TEST_F(ProfileRelatedFileSystemUtilTest, ExtractDrivePathFromFileSystemUrl) {
TestingProfile profile;
// Set up file system context for testing.
base::ScopedTempDir temp_dir_;
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
scoped_refptr<storage::ExternalMountPoints> mount_points =
storage::ExternalMountPoints::CreateRefCounted();
scoped_refptr<storage::FileSystemContext> context(
new storage::FileSystemContext(
base::ThreadTaskRunnerHandle::Get().get(),
base::ThreadTaskRunnerHandle::Get().get(), mount_points.get(),
nullptr, // special_storage_policy
nullptr, // quota_manager_proxy,
std::vector<std::unique_ptr<storage::FileSystemBackend>>(),
std::vector<storage::URLRequestAutoMountHandler>(),
temp_dir_.GetPath(), // partition_path
content::CreateAllowFileAccessOptions()));
// Type:"external" + virtual_path:"drive/foo/bar" resolves to "drive/foo/bar".
const std::string& drive_mount_name =
GetDriveMountPointPath(&profile).BaseName().AsUTF8Unsafe();
mount_points->RegisterFileSystem(
drive_mount_name, storage::kFileSystemTypeDrive,
storage::FileSystemMountOption(), GetDriveMountPointPath(&profile));
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive/foo/bar"),
ExtractDrivePathFromFileSystemUrl(context->CrackURL(
GURL("filesystem:chrome-extension://dummy-id/external/" +
drive_mount_name + "/foo/bar"))));
// Virtual mount name should not affect the extracted path.
mount_points->RevokeFileSystem(drive_mount_name);
mount_points->RegisterFileSystem("drive2", storage::kFileSystemTypeDrive,
storage::FileSystemMountOption(),
GetDriveMountPointPath(&profile));
EXPECT_EQ(
base::FilePath::FromUTF8Unsafe("drive/foo/bar"),
ExtractDrivePathFromFileSystemUrl(context->CrackURL(GURL(
"filesystem:chrome-extension://dummy-id/external/drive2/foo/bar"))));
// Type:"external" + virtual_path:"Downloads/foo" is not a Drive path.
mount_points->RegisterFileSystem(
"Downloads", storage::kFileSystemTypeNativeLocal,
storage::FileSystemMountOption(), temp_dir_.GetPath());
EXPECT_EQ(
base::FilePath(),
ExtractDrivePathFromFileSystemUrl(context->CrackURL(GURL(
"filesystem:chrome-extension://dummy-id/external/Downloads/foo"))));
// Type:"isolated" + virtual_path:"isolated_id/name" mapped on a Drive path.
std::string isolated_name;
std::string isolated_id =
storage::IsolatedContext::GetInstance()->RegisterFileSystemForPath(
storage::kFileSystemTypeNativeForPlatformApp, std::string(),
GetDriveMountPointPath(&profile).AppendASCII("bar/buz"),
&isolated_name);
EXPECT_EQ(base::FilePath::FromUTF8Unsafe("drive/bar/buz"),
ExtractDrivePathFromFileSystemUrl(context->CrackURL(
GURL("filesystem:chrome-extension://dummy-id/isolated/" +
isolated_id + "/" + isolated_name))));
}
TEST_F(ProfileRelatedFileSystemUtilTest, GetCacheRootPath) {
TestingProfile profile;
base::FilePath profile_path = profile.GetPath();
EXPECT_EQ(profile_path.AppendASCII("GCache/v1"),
util::GetCacheRootPath(&profile));
}
} // namespace util
} // namespace drive