| Index: content/browser/fileapi/obfuscated_file_util_unittest.cc
|
| diff --git a/content/browser/fileapi/obfuscated_file_util_unittest.cc b/content/browser/fileapi/obfuscated_file_util_unittest.cc
|
| index 72dd36008ddd947397188d67c4f1745b731a4687..58f99d96a26903acd0cea6a813ff632dd20808c4 100644
|
| --- a/content/browser/fileapi/obfuscated_file_util_unittest.cc
|
| +++ b/content/browser/fileapi/obfuscated_file_util_unittest.cc
|
| @@ -34,7 +34,19 @@
|
| #include "webkit/common/database/database_identifier.h"
|
| #include "webkit/common/quota/quota_types.h"
|
|
|
| -namespace fileapi {
|
| +using fileapi::AsyncFileTestHelper;
|
| +using fileapi::FileSystemContext;
|
| +using fileapi::FileSystemOperation;
|
| +using fileapi::FileSystemOperationContext;
|
| +using fileapi::FileSystemType;
|
| +using fileapi::FileSystemURL;
|
| +using fileapi::ObfuscatedFileUtil;
|
| +using fileapi::SandboxDirectoryDatabase;
|
| +using fileapi::SandboxIsolatedOriginDatabase;
|
| +using fileapi::kFileSystemTypeTemporary;
|
| +using fileapi::kFileSystemTypePersistent;
|
| +
|
| +namespace content {
|
|
|
| namespace {
|
|
|
| @@ -110,11 +122,12 @@ FileSystemURL FileSystemURLAppendUTF8(
|
|
|
| FileSystemURL FileSystemURLDirName(const FileSystemURL& url) {
|
| return FileSystemURL::CreateForTest(
|
| - url.origin(), url.mount_type(), VirtualPath::DirName(url.virtual_path()));
|
| + url.origin(), url.mount_type(),
|
| + fileapi::VirtualPath::DirName(url.virtual_path()));
|
| }
|
|
|
| std::string GetTypeString(FileSystemType type) {
|
| - return SandboxFileSystemBackendDelegate::GetTypeString(type);
|
| + return fileapi::SandboxFileSystemBackendDelegate::GetTypeString(type);
|
| }
|
|
|
| bool HasFileSystemType(
|
| @@ -133,7 +146,7 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
| public:
|
| ObfuscatedFileUtilTest()
|
| : origin_(GURL("http://www.example.com")),
|
| - type_(kFileSystemTypeTemporary),
|
| + type_(fileapi::kFileSystemTypeTemporary),
|
| weak_factory_(this),
|
| sandbox_file_system_(origin_, type_),
|
| quota_status_(quota::kQuotaStatusUnknown),
|
| @@ -162,7 +175,8 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
|
|
| sandbox_file_system_.SetUp(file_system_context_.get());
|
|
|
| - change_observers_ = MockFileChangeObserver::CreateList(&change_observer_);
|
| + change_observers_ = fileapi::MockFileChangeObserver::CreateList(
|
| + &change_observer_);
|
| }
|
|
|
| virtual void TearDown() {
|
| @@ -196,11 +210,11 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
| return context;
|
| }
|
|
|
| - const ChangeObserverList& change_observers() const {
|
| + const fileapi::ChangeObserverList& change_observers() const {
|
| return change_observers_;
|
| }
|
|
|
| - MockFileChangeObserver* change_observer() {
|
| + fileapi::MockFileChangeObserver* change_observer() {
|
| return &change_observer_;
|
| }
|
|
|
| @@ -217,6 +231,14 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
| return file_system;
|
| }
|
|
|
| + scoped_ptr<ObfuscatedFileUtil> CreateObfuscatedFileUtil(
|
| + quota::SpecialStoragePolicy* storage_policy) {
|
| + return scoped_ptr<ObfuscatedFileUtil>(
|
| + ObfuscatedFileUtil::CreateForTesting(
|
| + storage_policy, data_dir_path(),
|
| + base::MessageLoopProxy::current().get()));
|
| + }
|
| +
|
| ObfuscatedFileUtil* ofu() {
|
| return static_cast<ObfuscatedFileUtil*>(sandbox_file_system_.file_util());
|
| }
|
| @@ -283,7 +305,7 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
| }
|
|
|
| int64 usage() const { return usage_; }
|
| - FileSystemUsageCache* usage_cache() {
|
| + fileapi::FileSystemUsageCache* usage_cache() {
|
| return sandbox_file_system_.usage_cache();
|
| }
|
|
|
| @@ -427,7 +449,7 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
| std::set<base::FilePath::StringType>* files,
|
| std::set<base::FilePath::StringType>* directories) {
|
| scoped_ptr<FileSystemOperationContext> context;
|
| - std::vector<DirectoryEntry> entries;
|
| + std::vector<fileapi::DirectoryEntry> entries;
|
| EXPECT_EQ(base::PLATFORM_FILE_OK,
|
| AsyncFileTestHelper::ReadDirectory(
|
| file_system_context(), root_url, &entries));
|
| @@ -471,17 +493,17 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
| FillTestDirectory(root_url, &files, &directories);
|
|
|
| scoped_ptr<FileSystemOperationContext> context;
|
| - std::vector<DirectoryEntry> entries;
|
| + std::vector<fileapi::DirectoryEntry> entries;
|
| context.reset(NewContext(NULL));
|
| EXPECT_EQ(base::PLATFORM_FILE_OK,
|
| AsyncFileTestHelper::ReadDirectory(
|
| file_system_context(), root_url, &entries));
|
| - std::vector<DirectoryEntry>::iterator entry_iter;
|
| + std::vector<fileapi::DirectoryEntry>::iterator entry_iter;
|
| EXPECT_EQ(files.size() + directories.size(), entries.size());
|
| EXPECT_TRUE(change_observer()->HasNoChange());
|
| for (entry_iter = entries.begin(); entry_iter != entries.end();
|
| ++entry_iter) {
|
| - const DirectoryEntry& entry = *entry_iter;
|
| + const fileapi::DirectoryEntry& entry = *entry_iter;
|
| std::set<base::FilePath::StringType>::iterator iter =
|
| files.find(entry.name);
|
| if (iter != files.end()) {
|
| @@ -662,6 +684,120 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
| EXPECT_NE(base::Time(), GetModifiedTime(dest_dir_url));
|
| }
|
|
|
| + void MaybeDropDatabasesAliveCaseTestBody() {
|
| + scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(NULL);
|
| + file_util->InitOriginDatabase(GURL(), true /*create*/);
|
| + ASSERT_TRUE(file_util->origin_database_ != NULL);
|
| +
|
| + // Callback to Drop DB is called while ObfuscatedFileUtilTest is
|
| + // still alive.
|
| + file_util->db_flush_delay_seconds_ = 0;
|
| + file_util->MarkUsed();
|
| + base::RunLoop().RunUntilIdle();
|
| +
|
| + ASSERT_TRUE(file_util->origin_database_ == NULL);
|
| + }
|
| +
|
| + void MaybeDropDatabasesAlreadyDeletedCaseTestBody() {
|
| + // Run message loop after OFU is already deleted to make sure callback
|
| + // doesn't cause a crash for use after free.
|
| + {
|
| + scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(NULL);
|
| + file_util->InitOriginDatabase(GURL(), true /*create*/);
|
| + file_util->db_flush_delay_seconds_ = 0;
|
| + file_util->MarkUsed();
|
| + }
|
| +
|
| + // At this point the callback is still in the message queue but OFU is gone.
|
| + base::RunLoop().RunUntilIdle();
|
| + }
|
| +
|
| + void DestroyDirectoryDatabase_IsolatedTestBody() {
|
| + storage_policy_->AddIsolated(origin_);
|
| + scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
|
| + storage_policy_.get());
|
| + const FileSystemURL url = FileSystemURL::CreateForTest(
|
| + origin_, kFileSystemTypePersistent, base::FilePath());
|
| +
|
| + // Create DirectoryDatabase for isolated origin.
|
| + SandboxDirectoryDatabase* db =
|
| + file_util->GetDirectoryDatabase(url, true /* create */);
|
| + ASSERT_TRUE(db != NULL);
|
| +
|
| + // Destory it.
|
| + ASSERT_TRUE(file_util->DestroyDirectoryDatabase(
|
| + url.origin(), GetTypeString(url.type())));
|
| + ASSERT_TRUE(file_util->directories_.empty());
|
| + }
|
| +
|
| + void GetDirectoryDatabase_IsolatedTestBody() {
|
| + storage_policy_->AddIsolated(origin_);
|
| + scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
|
| + storage_policy_.get());
|
| + const FileSystemURL url = FileSystemURL::CreateForTest(
|
| + origin_, kFileSystemTypePersistent, base::FilePath());
|
| +
|
| + // Create DirectoryDatabase for isolated origin.
|
| + SandboxDirectoryDatabase* db =
|
| + file_util->GetDirectoryDatabase(url, true /* create */);
|
| + ASSERT_TRUE(db != NULL);
|
| + ASSERT_EQ(1U, file_util->directories_.size());
|
| +
|
| + // Remove isolated.
|
| + storage_policy_->RemoveIsolated(url.origin());
|
| +
|
| + // This should still get the same database.
|
| + SandboxDirectoryDatabase* db2 =
|
| + file_util->GetDirectoryDatabase(url, false /* create */);
|
| + ASSERT_EQ(db, db2);
|
| + }
|
| +
|
| + void MigrationBackFromIsolatedTestBody() {
|
| + std::string kFakeDirectoryData("0123456789");
|
| + base::FilePath old_directory_db_path;
|
| +
|
| + // Initialize the directory with one origin using
|
| + // SandboxIsolatedOriginDatabase.
|
| + {
|
| + std::string origin_string =
|
| + webkit_database::GetIdentifierFromOrigin(origin_);
|
| + SandboxIsolatedOriginDatabase database_old(
|
| + origin_string, data_dir_path(),
|
| + base::FilePath(
|
| + SandboxIsolatedOriginDatabase::kObsoleteOriginDirectory));
|
| + base::FilePath path;
|
| + EXPECT_TRUE(database_old.GetPathForOrigin(origin_string, &path));
|
| + EXPECT_FALSE(path.empty());
|
| +
|
| + // Populate the origin directory with some fake data.
|
| + old_directory_db_path = data_dir_path().Append(path);
|
| + ASSERT_TRUE(base::CreateDirectory(old_directory_db_path));
|
| + EXPECT_EQ(static_cast<int>(kFakeDirectoryData.size()),
|
| + file_util::WriteFile(old_directory_db_path.AppendASCII("dummy"),
|
| + kFakeDirectoryData.data(),
|
| + kFakeDirectoryData.size()));
|
| + }
|
| +
|
| + storage_policy_->AddIsolated(origin_);
|
| + scoped_ptr<ObfuscatedFileUtil> file_util = CreateObfuscatedFileUtil(
|
| + storage_policy_.get());
|
| + base::PlatformFileError error = base::PLATFORM_FILE_ERROR_FAILED;
|
| + base::FilePath origin_directory = file_util->GetDirectoryForOrigin(
|
| + origin_, true /* create */, &error);
|
| + EXPECT_EQ(base::PLATFORM_FILE_OK, error);
|
| +
|
| + // The database is migrated from the old one.
|
| + EXPECT_TRUE(base::DirectoryExists(origin_directory));
|
| + EXPECT_FALSE(base::DirectoryExists(old_directory_db_path));
|
| +
|
| + // Check we see the same contents in the new origin directory.
|
| + std::string origin_db_data;
|
| + EXPECT_TRUE(base::PathExists(origin_directory.AppendASCII("dummy")));
|
| + EXPECT_TRUE(base::ReadFileToString(
|
| + origin_directory.AppendASCII("dummy"), &origin_db_data));
|
| + EXPECT_EQ(kFakeDirectoryData, origin_db_data);
|
| + }
|
| +
|
| int64 ComputeCurrentUsage() {
|
| return sandbox_file_system_.ComputeCurrentOriginUsage() -
|
| sandbox_file_system_.ComputeCurrentDirectoryDatabaseUsage();
|
| @@ -687,8 +823,8 @@ class ObfuscatedFileUtilTest : public testing::Test {
|
| SandboxFileSystemTestHelper sandbox_file_system_;
|
| quota::QuotaStatusCode quota_status_;
|
| int64 usage_;
|
| - MockFileChangeObserver change_observer_;
|
| - ChangeObserverList change_observers_;
|
| + fileapi::MockFileChangeObserver change_observer_;
|
| + fileapi::ChangeObserverList change_observers_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(ObfuscatedFileUtilTest);
|
| @@ -1120,7 +1256,7 @@ TEST_F(ObfuscatedFileUtilTest, TestReadDirectoryOnFile) {
|
| ofu()->EnsureFileExists(context.get(), url, &created));
|
| ASSERT_TRUE(created);
|
|
|
| - std::vector<DirectoryEntry> entries;
|
| + std::vector<fileapi::DirectoryEntry> entries;
|
| EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_A_DIRECTORY,
|
| AsyncFileTestHelper::ReadDirectory(
|
| file_system_context(), url, &entries));
|
| @@ -1567,9 +1703,10 @@ TEST_F(ObfuscatedFileUtilTest, TestRevokeUsageCache) {
|
|
|
| int64 expected_quota = 0;
|
|
|
| - for (size_t i = 0; i < test::kRegularTestCaseSize; ++i) {
|
| + for (size_t i = 0; i < fileapi::test::kRegularTestCaseSize; ++i) {
|
| SCOPED_TRACE(testing::Message() << "Creating kRegularTestCase " << i);
|
| - const test::TestCaseRecord& test_case = test::kRegularTestCases[i];
|
| + const fileapi::test::TestCaseRecord& test_case =
|
| + fileapi::test::kRegularTestCases[i];
|
| base::FilePath file_path(test_case.path);
|
| expected_quota += ObfuscatedFileUtil::ComputeFilePathCost(file_path);
|
| if (test_case.is_directory) {
|
| @@ -1702,7 +1839,7 @@ TEST_F(ObfuscatedFileUtilTest, TestIncompleteDirectoryReading) {
|
| EXPECT_TRUE(created);
|
| }
|
|
|
| - std::vector<DirectoryEntry> entries;
|
| + std::vector<fileapi::DirectoryEntry> entries;
|
| EXPECT_EQ(base::PLATFORM_FILE_OK,
|
| AsyncFileTestHelper::ReadDirectory(
|
| file_system_context(), empty_path, &entries));
|
| @@ -1959,7 +2096,7 @@ TEST_F(ObfuscatedFileUtilTest, TestFileEnumeratorTimestamp) {
|
| base::Time()));
|
|
|
| context.reset(NewContext(NULL));
|
| - scoped_ptr<FileSystemFileUtil::AbstractFileEnumerator> file_enum(
|
| + scoped_ptr<fileapi::FileSystemFileUtil::AbstractFileEnumerator> file_enum(
|
| ofu()->CreateFileEnumerator(context.get(), dir, false));
|
|
|
| int count = 0;
|
| @@ -2312,128 +2449,23 @@ TEST_F(ObfuscatedFileUtilTest, TestQuotaOnOpen) {
|
| }
|
|
|
| TEST_F(ObfuscatedFileUtilTest, MaybeDropDatabasesAliveCase) {
|
| - scoped_ptr<ObfuscatedFileUtil> file_util(
|
| - ObfuscatedFileUtil::CreateForTesting(
|
| - NULL, data_dir_path(),
|
| - base::MessageLoopProxy::current().get()));
|
| - file_util->InitOriginDatabase(GURL(), true /*create*/);
|
| - ASSERT_TRUE(file_util->origin_database_ != NULL);
|
| -
|
| - // Callback to Drop DB is called while ObfuscatedFileUtilTest is still alive.
|
| - file_util->db_flush_delay_seconds_ = 0;
|
| - file_util->MarkUsed();
|
| - base::RunLoop().RunUntilIdle();
|
| -
|
| - ASSERT_TRUE(file_util->origin_database_ == NULL);
|
| + MaybeDropDatabasesAliveCaseTestBody();
|
| }
|
|
|
| TEST_F(ObfuscatedFileUtilTest, MaybeDropDatabasesAlreadyDeletedCase) {
|
| - // Run message loop after OFU is already deleted to make sure callback doesn't
|
| - // cause a crash for use after free.
|
| - {
|
| - scoped_ptr<ObfuscatedFileUtil> file_util(
|
| - ObfuscatedFileUtil::CreateForTesting(
|
| - NULL, data_dir_path(),
|
| - base::MessageLoopProxy::current().get()));
|
| - file_util->InitOriginDatabase(GURL(), true /*create*/);
|
| - file_util->db_flush_delay_seconds_ = 0;
|
| - file_util->MarkUsed();
|
| - }
|
| -
|
| - // At this point the callback is still in the message queue but OFU is gone.
|
| - base::RunLoop().RunUntilIdle();
|
| + MaybeDropDatabasesAlreadyDeletedCaseTestBody();
|
| }
|
|
|
| TEST_F(ObfuscatedFileUtilTest, DestroyDirectoryDatabase_Isolated) {
|
| - storage_policy_->AddIsolated(origin_);
|
| - scoped_ptr<ObfuscatedFileUtil> file_util(
|
| - ObfuscatedFileUtil::CreateForTesting(
|
| - storage_policy_.get(), data_dir_path(),
|
| - base::MessageLoopProxy::current().get()));
|
| - const FileSystemURL url = FileSystemURL::CreateForTest(
|
| - origin_, kFileSystemTypePersistent, base::FilePath());
|
| -
|
| - // Create DirectoryDatabase for isolated origin.
|
| - SandboxDirectoryDatabase* db =
|
| - file_util->GetDirectoryDatabase(url, true /* create */);
|
| - ASSERT_TRUE(db != NULL);
|
| -
|
| - // Destory it.
|
| - ASSERT_TRUE(file_util->DestroyDirectoryDatabase(
|
| - url.origin(), GetTypeString(url.type())));
|
| - ASSERT_TRUE(file_util->directories_.empty());
|
| + DestroyDirectoryDatabase_IsolatedTestBody();
|
| }
|
|
|
| TEST_F(ObfuscatedFileUtilTest, GetDirectoryDatabase_Isolated) {
|
| - storage_policy_->AddIsolated(origin_);
|
| - scoped_ptr<ObfuscatedFileUtil> file_util(
|
| - ObfuscatedFileUtil::CreateForTesting(
|
| - storage_policy_.get(), data_dir_path(),
|
| - base::MessageLoopProxy::current().get()));
|
| - const FileSystemURL url = FileSystemURL::CreateForTest(
|
| - origin_, kFileSystemTypePersistent, base::FilePath());
|
| -
|
| - // Create DirectoryDatabase for isolated origin.
|
| - SandboxDirectoryDatabase* db =
|
| - file_util->GetDirectoryDatabase(url, true /* create */);
|
| - ASSERT_TRUE(db != NULL);
|
| - ASSERT_EQ(1U, file_util->directories_.size());
|
| -
|
| - // Remove isolated.
|
| - storage_policy_->RemoveIsolated(url.origin());
|
| -
|
| - // This should still get the same database.
|
| - SandboxDirectoryDatabase* db2 =
|
| - file_util->GetDirectoryDatabase(url, false /* create */);
|
| - ASSERT_EQ(db, db2);
|
| + GetDirectoryDatabase_IsolatedTestBody();
|
| }
|
|
|
| TEST_F(ObfuscatedFileUtilTest, MigrationBackFromIsolated) {
|
| - std::string kFakeDirectoryData("0123456789");
|
| - base::FilePath old_directory_db_path;
|
| -
|
| - // Initialize the directory with one origin using
|
| - // SandboxIsolatedOriginDatabase.
|
| - {
|
| - std::string origin_string =
|
| - webkit_database::GetIdentifierFromOrigin(origin_);
|
| - SandboxIsolatedOriginDatabase database_old(
|
| - origin_string, data_dir_path(),
|
| - base::FilePath(
|
| - SandboxIsolatedOriginDatabase::kObsoleteOriginDirectory));
|
| - base::FilePath path;
|
| - EXPECT_TRUE(database_old.GetPathForOrigin(origin_string, &path));
|
| - EXPECT_FALSE(path.empty());
|
| -
|
| - // Populate the origin directory with some fake data.
|
| - old_directory_db_path = data_dir_path().Append(path);
|
| - ASSERT_TRUE(base::CreateDirectory(old_directory_db_path));
|
| - EXPECT_EQ(static_cast<int>(kFakeDirectoryData.size()),
|
| - file_util::WriteFile(old_directory_db_path.AppendASCII("dummy"),
|
| - kFakeDirectoryData.data(),
|
| - kFakeDirectoryData.size()));
|
| - }
|
| -
|
| - storage_policy_->AddIsolated(origin_);
|
| - scoped_ptr<ObfuscatedFileUtil> file_util(
|
| - ObfuscatedFileUtil::CreateForTesting(
|
| - storage_policy_.get(), data_dir_path(),
|
| - base::MessageLoopProxy::current().get()));
|
| - base::PlatformFileError error = base::PLATFORM_FILE_ERROR_FAILED;
|
| - base::FilePath origin_directory = file_util->GetDirectoryForOrigin(
|
| - origin_, true /* create */, &error);
|
| - EXPECT_EQ(base::PLATFORM_FILE_OK, error);
|
| -
|
| - // The database is migrated from the old one.
|
| - EXPECT_TRUE(base::DirectoryExists(origin_directory));
|
| - EXPECT_FALSE(base::DirectoryExists(old_directory_db_path));
|
| -
|
| - // Check we see the same contents in the new origin directory.
|
| - std::string origin_db_data;
|
| - EXPECT_TRUE(base::PathExists(origin_directory.AppendASCII("dummy")));
|
| - EXPECT_TRUE(base::ReadFileToString(
|
| - origin_directory.AppendASCII("dummy"), &origin_db_data));
|
| - EXPECT_EQ(kFakeDirectoryData, origin_db_data);
|
| + MigrationBackFromIsolatedTestBody();
|
| }
|
|
|
| TEST_F(ObfuscatedFileUtilTest, OpenPathInNonDirectory) {
|
| @@ -2487,4 +2519,4 @@ TEST_F(ObfuscatedFileUtilTest, CreateDirectory_NotADirectoryInRecursive) {
|
| true /* recursive */));
|
| }
|
|
|
| -} // namespace fileapi
|
| +} // namespace content
|
|
|