Chromium Code Reviews| Index: webkit/fileapi/file_system_operation_unittest.cc |
| diff --git a/webkit/fileapi/file_system_operation_unittest.cc b/webkit/fileapi/file_system_operation_unittest.cc |
| index 3e349d6714c858598e7b60df766cddc7d3e3470a..c2e42915e661837cb6040fdf16b98d262a53289c 100644 |
| --- a/webkit/fileapi/file_system_operation_unittest.cc |
| +++ b/webkit/fileapi/file_system_operation_unittest.cc |
| @@ -9,59 +9,121 @@ |
| #include "base/memory/scoped_ptr.h" |
| #include "base/message_loop.h" |
| #include "base/scoped_temp_dir.h" |
| -#include "base/sys_string_conversions.h" |
| -#include "base/utf_string_conversions.h" |
| +#include "googleurl/src/gurl.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| #include "webkit/fileapi/file_system_callback_dispatcher.h" |
| #include "webkit/fileapi/file_system_context.h" |
| #include "webkit/fileapi/file_system_file_util.h" |
| #include "webkit/fileapi/file_system_mount_point_provider.h" |
| #include "webkit/fileapi/file_system_operation.h" |
| +#include "webkit/fileapi/file_system_quota_util.h" |
| #include "webkit/fileapi/file_system_test_helper.h" |
| #include "webkit/fileapi/file_system_util.h" |
| #include "webkit/fileapi/local_file_system_file_util.h" |
| #include "webkit/fileapi/quota_file_util.h" |
| #include "webkit/quota/quota_manager.h" |
| +using quota::QuotaClient; |
| using quota::QuotaManager; |
| +using quota::QuotaManagerProxy; |
| +using quota::StorageType; |
| namespace fileapi { |
| -const int kFileOperationStatusNotSet = 1; |
| - |
| namespace { |
| +const int kFileOperationStatusNotSet = 1; |
| + |
| class MockQuotaManager : public QuotaManager { |
| public: |
| - MockQuotaManager(const FilePath& base_dir) |
| - : QuotaManager(false /* is_incognito */, base_dir, |
| - base::MessageLoopProxy::CreateForCurrentThread(), |
| - base::MessageLoopProxy::CreateForCurrentThread()), |
| - usage_(0), |
| - quota_(QuotaFileUtil::kNoLimit) {} |
| - |
| - virtual void GetUsageAndQuota(const GURL& origin, quota::StorageType type, |
| - GetUsageAndQuotaCallback* callback) { |
| + explicit MockQuotaManager(const FilePath& base_dir, |
|
ericu
2011/05/24 03:03:56
The explicit shouldn't be needed on a multiple-arg
kinuko
2011/05/24 03:09:32
Oops, yup, I was warned by lint before making this
|
| + const GURL& origin, |
| + StorageType type) |
| + : QuotaManager(false /* is_incognito */, base_dir, |
| + base::MessageLoopProxy::CreateForCurrentThread(), |
| + base::MessageLoopProxy::CreateForCurrentThread()), |
| + origin_(origin), |
| + type_(type), |
| + usage_(0), |
| + quota_(QuotaFileUtil::kNoLimit), |
| + accessed_(0) {} |
| + |
| + virtual void GetUsageAndQuota( |
| + const GURL& origin, quota::StorageType type, |
| + GetUsageAndQuotaCallback* callback) { |
| + EXPECT_EQ(origin_, origin); |
| + EXPECT_EQ(type_, type); |
| callback->Run(quota::kQuotaStatusOk, usage_, quota_); |
| delete callback; |
| } |
| - void set_usage(int64 usage) { usage_ = usage; } |
| - void set_quota(int64 quota) { quota_ = quota; } |
| - |
| private: |
| + friend class MockQuotaManagerProxy; |
| + void SetQuota(const GURL& origin, StorageType type, int64 quota) { |
| + EXPECT_EQ(origin_, origin); |
| + EXPECT_EQ(type_, type); |
| + quota_ = quota; |
| + } |
| + |
| + void RecordStorageAccessed(const GURL& origin, StorageType type) { |
| + EXPECT_EQ(origin_, origin); |
| + EXPECT_EQ(type_, type); |
| + ++accessed_; |
| + } |
| + |
| + void UpdateUsage(const GURL& origin, StorageType type, int64 delta) { |
| + EXPECT_EQ(origin_, origin); |
| + EXPECT_EQ(type_, type); |
| + usage_ += delta; |
| + } |
| + |
| + const GURL& origin_; |
| + const StorageType type_; |
| int64 usage_; |
| int64 quota_; |
| + int accessed_; |
| +}; |
| + |
| +class MockQuotaManagerProxy : public QuotaManagerProxy { |
| + public: |
| + explicit MockQuotaManagerProxy(QuotaManager* quota_manager) |
| + : QuotaManagerProxy(quota_manager, |
| + base::MessageLoopProxy::CreateForCurrentThread()) {} |
| + |
| + // We don't mock them. |
| + virtual void RegisterClient(QuotaClient* client) OVERRIDE {} |
|
oshima
2011/05/25 20:43:38
Looks like this has to call OnQuotaManagerDestorye
|
| + virtual void NotifyOriginInUse(const GURL& origin) OVERRIDE {} |
| + virtual void NotifyOriginNoLongerInUse(const GURL& origin) OVERRIDE {} |
| + |
| + virtual void NotifyStorageAccessed(QuotaClient::ID client_id, |
| + const GURL& origin, |
| + StorageType type) OVERRIDE { |
| + mock_manager()->RecordStorageAccessed(origin, type); |
| + } |
| + |
| + virtual void NotifyStorageModified(QuotaClient::ID client_id, |
| + const GURL& origin, |
| + StorageType type, |
| + int64 delta) OVERRIDE { |
| + mock_manager()->UpdateUsage(origin, type, delta); |
| + } |
| + |
| + int storage_accessed_count() const { |
| + return mock_manager()->accessed_; |
| + } |
| + |
| + void SetQuota(const GURL& origin, StorageType type, int64 quota) { |
| + mock_manager()->SetQuota(origin, type, quota); |
| + } |
| + |
| + private: |
| + MockQuotaManager* mock_manager() const { |
| + return static_cast<MockQuotaManager*>(quota_manager()); |
| + } |
| }; |
| -FilePath UTF8ToFilePath(const std::string& str) { |
| - FilePath::StringType result; |
| -#if defined(OS_POSIX) |
| - result = base::SysWideToNativeMB(UTF8ToWide(str)); |
| -#elif defined(OS_WIN) |
| - result = UTF8ToUTF16(str); |
| -#endif |
| - return FilePath(result); |
| +FilePath ASCIIToFilePath(const std::string& str) { |
| + return FilePath().AppendASCII(str); |
| } |
| } // namespace (anonymous) |
| @@ -77,8 +139,6 @@ class FileSystemOperationTest : public testing::Test { |
| FileSystemOperation* operation(); |
| - void set_local_path(const FilePath& path) { local_path_ = path; } |
| - const FilePath& local_path() const { return local_path_; } |
| void set_status(int status) { status_ = status; } |
| int status() const { return status_; } |
| void set_info(const base::PlatformFileInfo& info) { info_ = info; } |
| @@ -99,29 +159,29 @@ class FileSystemOperationTest : public testing::Test { |
| // Common temp base for nondestructive uses. |
| ScopedTempDir base_; |
| - MockQuotaManager* quota_manager() { |
| - return static_cast<MockQuotaManager*>(quota_manager_.get()); |
| + MockQuotaManagerProxy* quota_manager_proxy() { |
| + return static_cast<MockQuotaManagerProxy*>(quota_manager_proxy_.get()); |
| } |
| GURL URLForPath(const FilePath& path) const { |
| return test_helper_.GetURLForPath(path); |
| } |
| - FilePath PlatformPath(FilePath virtual_path) { |
| + FilePath PlatformPath(const FilePath& virtual_path) { |
| return test_helper_.GetLocalPath(virtual_path); |
| } |
| - bool VirtualFileExists(FilePath virtual_path) { |
| + bool VirtualFileExists(const FilePath& virtual_path) { |
| return file_util::PathExists(PlatformPath(virtual_path)) && |
| !file_util::DirectoryExists(PlatformPath(virtual_path)); |
| } |
| - bool VirtualDirectoryExists(FilePath virtual_path) { |
| + bool VirtualDirectoryExists(const FilePath& virtual_path) { |
| return file_util::DirectoryExists(PlatformPath(virtual_path)); |
| } |
| FilePath CreateVirtualDirectory(const char* virtual_path_string) { |
| - FilePath virtual_path(UTF8ToFilePath(virtual_path_string)); |
| + FilePath virtual_path(ASCIIToFilePath(virtual_path_string)); |
| file_util::CreateDirectory(PlatformPath(virtual_path)); |
| return virtual_path; |
| } |
| @@ -164,11 +224,11 @@ class FileSystemOperationTest : public testing::Test { |
| int status_; |
| base::PlatformFileInfo info_; |
| FilePath path_; |
| - FilePath local_path_; |
| std::vector<base::FileUtilProxy::Entry> entries_; |
| private: |
| scoped_refptr<QuotaManager> quota_manager_; |
| + scoped_refptr<QuotaManagerProxy> quota_manager_proxy_; |
| DISALLOW_COPY_AND_ASSIGN(FileSystemOperationTest); |
| }; |
| @@ -176,7 +236,7 @@ namespace { |
| class MockDispatcher : public FileSystemCallbackDispatcher { |
| public: |
| - MockDispatcher(FileSystemOperationTest* test) : test_(test) { } |
| + explicit MockDispatcher(FileSystemOperationTest* test) : test_(test) { } |
| virtual void DidFail(base::PlatformFileError status) { |
| test_->set_status(status); |
| @@ -216,16 +276,19 @@ class MockDispatcher : public FileSystemCallbackDispatcher { |
| void FileSystemOperationTest::SetUp() { |
| FilePath base_dir = base_.path().AppendASCII("filesystem"); |
| - quota_manager_ = new MockQuotaManager(base_dir); |
| + quota_manager_ = new MockQuotaManager( |
| + base_dir, test_helper_.origin(), test_helper_.storage_type()); |
| + quota_manager_proxy_ = new MockQuotaManagerProxy(quota_manager_.get()); |
| test_helper_.SetUp(base_dir, |
| false /* incognito */, |
| false /* unlimited quota */, |
| - quota_manager_->proxy(), |
| + quota_manager_proxy_.get(), |
| LocalFileSystemFileUtil::GetInstance()); |
| } |
| void FileSystemOperationTest::TearDown() { |
| quota_manager_ = NULL; |
| + quota_manager_proxy_ = NULL; |
| test_helper_.TearDown(); |
| } |
| @@ -303,6 +366,10 @@ TEST_F(FileSystemOperationTest, TestMoveSuccessSrcFileAndOverwrite) { |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_TRUE(VirtualFileExists(dest_file_path)); |
| + |
| + // Move is considered 'write' access (for both side), and won't be counted |
| + // as read access. |
| + EXPECT_EQ(0, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestMoveSuccessSrcFileAndNew) { |
| @@ -433,7 +500,9 @@ TEST_F(FileSystemOperationTest, TestCopyFailureByQuota) { |
| FilePath dest_dir_path(CreateVirtualTemporaryDir()); |
| FilePath dest_file_path(dest_dir_path.Append(FILE_PATH_LITERAL("NewFile"))); |
| - quota_manager()->set_quota(11); |
| + quota_manager_proxy()->SetQuota(test_helper_.origin(), |
| + test_helper_.storage_type(), |
| + 11); |
| operation()->Truncate(URLForPath(src_file_path), 6); |
| MessageLoop::current()->RunAllPending(); |
| @@ -442,8 +511,6 @@ TEST_F(FileSystemOperationTest, TestCopyFailureByQuota) { |
| EXPECT_TRUE(file_util::GetFileInfo(PlatformPath(src_file_path), &info)); |
| EXPECT_EQ(6, info.size); |
| - quota_manager()->set_usage(6); |
| - |
| operation()->Copy(URLForPath(src_file_path), URLForPath(dest_file_path)); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status()); |
| @@ -460,6 +527,7 @@ TEST_F(FileSystemOperationTest, TestCopySuccessSrcFileAndOverwrite) { |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_TRUE(VirtualFileExists(dest_file_path)); |
| + EXPECT_EQ(1, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestCopySuccessSrcFileAndNew) { |
| @@ -472,6 +540,7 @@ TEST_F(FileSystemOperationTest, TestCopySuccessSrcFileAndNew) { |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_TRUE(VirtualFileExists(dest_file_path)); |
| + EXPECT_EQ(1, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirAndOverwrite) { |
| @@ -486,6 +555,7 @@ TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirAndOverwrite) { |
| EXPECT_TRUE(VirtualDirectoryExists(dest_dir_path)); |
| EXPECT_FALSE(VirtualDirectoryExists( |
| dest_dir_path.Append(src_dir_path.BaseName()))); |
| + EXPECT_EQ(1, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirAndNew) { |
| @@ -498,6 +568,7 @@ TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirAndNew) { |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_TRUE(VirtualDirectoryExists(dest_child_dir_path)); |
| + EXPECT_EQ(1, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirRecursive) { |
| @@ -516,6 +587,7 @@ TEST_F(FileSystemOperationTest, TestCopySuccessSrcDirRecursive) { |
| EXPECT_TRUE(VirtualFileExists(dest_dir_path.Append( |
| child_dir_path.BaseName()).Append( |
| grandchild_file_path.BaseName()))); |
| + EXPECT_EQ(1, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestCreateFileFailure) { |
| @@ -563,7 +635,8 @@ TEST_F(FileSystemOperationTest, |
| FILE_PATH_LITERAL("DirDoesntExist"))); |
| FilePath nonexisting_file_path(nonexisting_path.Append( |
| FILE_PATH_LITERAL("FileDoesntExist"))); |
| - operation()->CreateDirectory(URLForPath(nonexisting_file_path), false, false); |
| + operation()->CreateDirectory( |
| + URLForPath(nonexisting_file_path), false, false); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_ERROR_NOT_FOUND, status()); |
| } |
| @@ -595,7 +668,8 @@ TEST_F(FileSystemOperationTest, TestCreateDirSuccess) { |
| // Dir doesn't exist. |
| FilePath nonexisting_dir_path(FilePath( |
| FILE_PATH_LITERAL("nonexistingdir"))); |
| - operation()->CreateDirectory(URLForPath(nonexisting_dir_path), false, false); |
| + operation()->CreateDirectory( |
| + URLForPath(nonexisting_dir_path), false, false); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_TRUE(VirtualDirectoryExists(nonexisting_dir_path)); |
| @@ -606,7 +680,8 @@ TEST_F(FileSystemOperationTest, TestCreateDirSuccessExclusive) { |
| FilePath nonexisting_dir_path(FilePath( |
| FILE_PATH_LITERAL("nonexistingdir"))); |
| - operation()->CreateDirectory(URLForPath(nonexisting_dir_path), true, false); |
| + operation()->CreateDirectory( |
| + URLForPath(nonexisting_dir_path), true, false); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_TRUE(VirtualDirectoryExists(nonexisting_dir_path)); |
| @@ -631,27 +706,34 @@ TEST_F(FileSystemOperationTest, TestExistsAndMetadataFailure) { |
| TEST_F(FileSystemOperationTest, TestExistsAndMetadataSuccess) { |
| FilePath dir_path(CreateVirtualTemporaryDir()); |
| + int read_access = 0; |
| operation()->DirectoryExists(URLForPath(dir_path)); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| + ++read_access; |
| operation()->GetMetadata(URLForPath(dir_path)); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_TRUE(info().is_directory); |
| EXPECT_EQ(PlatformPath(dir_path), path()); |
| + ++read_access; |
| FilePath file_path(CreateVirtualTemporaryFileInDir(dir_path)); |
| operation()->FileExists(URLForPath(file_path)); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| + ++read_access; |
| operation()->GetMetadata(URLForPath(file_path)); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_FALSE(info().is_directory); |
| EXPECT_EQ(PlatformPath(file_path), path()); |
| + ++read_access; |
| + |
| + EXPECT_EQ(read_access, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestTypeMismatchErrors) { |
| @@ -709,6 +791,7 @@ TEST_F(FileSystemOperationTest, TestReadDirSuccess) { |
| entries()[i].name); |
| } |
| } |
| + EXPECT_EQ(1, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestRemoveFailure) { |
| @@ -761,6 +844,9 @@ TEST_F(FileSystemOperationTest, TestRemoveSuccess) { |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_OK, status()); |
| EXPECT_FALSE(VirtualDirectoryExists(parent_dir_path)); |
| + |
| + // Remove is not a 'read' access. |
| + EXPECT_EQ(0, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestTruncate) { |
| @@ -813,6 +899,10 @@ TEST_F(FileSystemOperationTest, TestTruncate) { |
| EXPECT_EQ(length, file_util::ReadFile(PlatformPath(file_path), data, length)); |
| for (int i = 0; i < length; ++i) |
| EXPECT_EQ(test_data[i], data[i]); |
| + |
| + // Truncate is not a 'read' access. (Here expected access count is 1 |
| + // since we made 1 read access for GetMetadata.) |
| + EXPECT_EQ(1, quota_manager_proxy()->storage_accessed_count()); |
| } |
| TEST_F(FileSystemOperationTest, TestTruncateFailureByQuota) { |
| @@ -821,7 +911,9 @@ TEST_F(FileSystemOperationTest, TestTruncateFailureByQuota) { |
| FilePath dir_path(CreateVirtualTemporaryDir()); |
| FilePath file_path(CreateVirtualTemporaryFileInDir(dir_path)); |
| - quota_manager()->set_quota(10); |
| + quota_manager_proxy()->SetQuota(test_helper_.origin(), |
| + test_helper_.storage_type(), |
| + 10); |
| operation()->Truncate(URLForPath(file_path), 10); |
| MessageLoop::current()->RunAllPending(); |
| @@ -830,8 +922,6 @@ TEST_F(FileSystemOperationTest, TestTruncateFailureByQuota) { |
| EXPECT_TRUE(file_util::GetFileInfo(PlatformPath(file_path), &info)); |
| EXPECT_EQ(10, info.size); |
| - quota_manager()->set_usage(10); |
| - |
| operation()->Truncate(URLForPath(file_path), 11); |
| MessageLoop::current()->RunAllPending(); |
| EXPECT_EQ(base::PLATFORM_FILE_ERROR_NO_SPACE, status()); |