Index: chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc |
diff --git a/chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc b/chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc |
deleted file mode 100644 |
index 98e2c8174cc8ccb1f254f7e836455e82033b1b87..0000000000000000000000000000000000000000 |
--- a/chrome/browser/chromeos/drive/drive_prefetcher_unittest.cc |
+++ /dev/null |
@@ -1,228 +0,0 @@ |
-// Copyright (c) 2012 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/drive_prefetcher.h" |
- |
-#include <string> |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/message_loop.h" |
-#include "base/run_loop.h" |
-#include "chrome/browser/chromeos/drive/drive.pb.h" |
-#include "chrome/browser/chromeos/drive/mock_drive_file_system.h" |
-#include "chrome/browser/chromeos/drive/test_util.h" |
-#include "content/public/test/test_browser_thread.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using ::testing::AtMost; |
-using ::testing::StrictMock; |
-using ::testing::_; |
- |
-namespace drive { |
- |
-namespace { |
- |
-// Enumeration values to represent the type of drive entries. |
-enum TestEntryType { |
- TYPE_DIRECTORY, |
- TYPE_REGULAR_FILE, |
- TYPE_HOSTED_FILE, |
-}; |
- |
-// TestEntry represents a dummy entry for mocking a filesystem. |
-struct TestEntry { |
- const base::FilePath::CharType* path; |
- TestEntryType entry_type; |
- int64 last_accessed; |
- int64 last_modified; |
- const char* resource_id; |
- int64 file_size; |
- |
- // Checks whether this TestEntry is the direct content of the |directory|. |
- bool IsDirectChildOf(const base::FilePath& directory) const { |
- return base::FilePath(path).DirName() == directory; |
- } |
- |
- // Converts this TestEntry to DriveEntryProto, which is the real data |
- // structure used in DriveFileSystem. |
- DriveEntryProto ToDriveEntryProto() const { |
- DriveEntryProto entry; |
- entry.set_base_name(base::FilePath(path).BaseName().value()); |
- entry.mutable_file_info()->set_is_directory(entry_type == TYPE_DIRECTORY); |
- if (entry_type != TYPE_DIRECTORY) { |
- entry.mutable_file_specific_info()->set_is_hosted_document( |
- entry_type == TYPE_HOSTED_FILE); |
- entry.mutable_file_info()->set_size(file_size); |
- } |
- entry.mutable_file_info()->set_last_accessed(last_accessed); |
- entry.mutable_file_info()->set_last_modified(last_modified); |
- entry.set_resource_id(resource_id); |
- return entry; |
- } |
-}; |
- |
-// Mocks DriveFileSystem::GetFileByResourceId. It records the requested |
-// resource_id (arg0) to |fetched_list|, and calls back a successful completion. |
-ACTION_P(MockGetFile, fetched_list) { |
- fetched_list->push_back(arg0); |
- arg2.Run(FILE_ERROR_OK, base::FilePath(), std::string(), REGULAR_FILE); |
-} |
- |
-// Mocks DriveFileSystem::ReadDirectory. It holds the flat list of all entries |
-// in the mock filesystem in |test_entries|, and when it is called to read a |
-// |directory|, it selects only the direct children of the directory. |
-ACTION_P(MockReadDirectory, test_entries) { |
- const base::FilePath& directory = arg0; |
- const ReadDirectoryWithSettingCallback& callback = arg1; |
- |
- scoped_ptr<DriveEntryProtoVector> entries(new DriveEntryProtoVector); |
- for (size_t i = 0; i < test_entries.size(); ++i) { |
- if (test_entries[i].IsDirectChildOf(directory)) |
- entries->push_back(test_entries[i].ToDriveEntryProto()); |
- } |
- callback.Run(FILE_ERROR_OK, false /* hide_hosted_document */, entries.Pass()); |
-} |
- |
-#define FPL FILE_PATH_LITERAL |
- |
-const TestEntry kEmptyDrive[] = { |
- { FPL("drive/root"), TYPE_DIRECTORY, 0, 0, "id:drive" }, |
-}; |
- |
-const TestEntry kOneFileDrive[] = { |
- { FPL("drive/root"), TYPE_DIRECTORY, 0, 0, "id:drive" }, |
- { FPL("drive/root/abc.txt"), TYPE_REGULAR_FILE, 1, 0, |
- "id:abc" }, |
-}; |
- |
-const char* kExpectedOneFile[] = { "id:abc" }; |
- |
-const TestEntry kComplexDrive[] = { |
- // Path Type Access Modify ID |
- { FPL("drive/root"), TYPE_DIRECTORY, 0, 0, "id:root" }, |
- { FPL("drive/root/a"), TYPE_DIRECTORY, 0, 0, "id:a" }, |
- { FPL("drive/root/a/foo.txt"), TYPE_REGULAR_FILE, 3, 2, "id:foo1" }, |
- { FPL("drive/root/a/b"), TYPE_DIRECTORY, 8, 0, "id:b" }, |
- { FPL("drive/root/a/bar.jpg"), TYPE_REGULAR_FILE, 5, 0, "id:bar1", |
- 999 }, |
- { FPL("drive/root/a/b/x.gdoc"), TYPE_HOSTED_FILE, 7, 0, "id:new" }, |
- { FPL("drive/root/a/buz.zip"), TYPE_REGULAR_FILE, 4, 0, "id:buz1" }, |
- { FPL("drive/root/a/old.gdoc"), TYPE_HOSTED_FILE, 1, 0, "id:old" }, |
- { FPL("drive/root/c"), TYPE_DIRECTORY, 0, 0, "id:c" }, |
- { FPL("drive/root/c/foo.txt"), TYPE_REGULAR_FILE, 3, 1, "id:foo2" }, |
- { FPL("drive/root/c/buz.zip"), TYPE_REGULAR_FILE, 1, 0, "id:buz2" }, |
- { FPL("drive/root/bar.jpg"), TYPE_REGULAR_FILE, 6, 0, "id:bar2" }, |
-}; |
- |
-#undef FPL |
- |
-const char* kTop3Files[] = { |
- "id:bar2", // The file with the largest timestamp |
- // "bar1" is the second latest, but its file size is over limit. |
- "id:buz1", // The third latest file. |
- "id:foo1" // 4th. Has same access time with id:foo2, so the one with the |
- // newer modified time wins. |
-}; |
- |
-const char* kAllRegularFiles[] = { |
- "id:bar2", "id:bar1", "id:buz1", "id:foo1", "id:foo2", "id:buz2", |
-}; |
- |
-} // namespace |
- |
-class DrivePrefetcherTest : public testing::Test { |
- public: |
- DrivePrefetcherTest() |
- : ui_thread_(content::BrowserThread::UI, &message_loop_) {} |
- |
- virtual void SetUp() OVERRIDE { |
- mock_file_system_.reset(new StrictMock<MockDriveFileSystem>); |
- } |
- |
- virtual void TearDown() OVERRIDE { |
- EXPECT_CALL(*mock_file_system_, RemoveObserver(_)).Times(AtMost(1)); |
- prefetcher_.reset(); |
- mock_file_system_.reset(); |
- } |
- |
- protected: |
- // Sets a new prefetcher that fetches at most |prefetch_count| latest files. |
- void InitPrefetcher(int prefetch_count, int64 size_limit) { |
- EXPECT_CALL(*mock_file_system_, AddObserver(_)).Times(AtMost(1)); |
- |
- DrivePrefetcherOptions options; |
- options.initial_prefetch_count = prefetch_count; |
- options.prefetch_file_size_limit = size_limit; |
- prefetcher_.reset(new DrivePrefetcher(mock_file_system_.get(), |
- options)); |
- } |
- |
- // Flushes all the pending tasks on the current thread. |
- void RunMessageLoop() { |
- base::RunLoop run_loop; |
- run_loop.RunUntilIdle(); |
- } |
- |
- // Verifies that fully running the prefetching loop over |test_entries| |
- // correctly fetches the |expected| files, in the given order. |
- void VerifyFullScan(const std::vector<TestEntry>& test_entries, |
- const std::vector<std::string>& expected) { |
- std::vector<std::string> fetched_list; |
- EXPECT_CALL(*mock_file_system_, ReadDirectoryByPath(_, _)) |
- .WillRepeatedly(MockReadDirectory(test_entries)); |
- EXPECT_CALL(*mock_file_system_, GetFileByResourceId(_, _, _, _)).Times(0); |
- EXPECT_CALL(*mock_file_system_, GetFileByResourceId(_, _, _, _)) |
- .WillRepeatedly(MockGetFile(&fetched_list)); |
- prefetcher_->OnInitialLoadFinished(); |
- RunMessageLoop(); |
- EXPECT_EQ(expected, fetched_list); |
- } |
- |
- scoped_ptr<StrictMock<MockDriveFileSystem> > mock_file_system_; |
- scoped_ptr<DrivePrefetcher> prefetcher_; |
- MessageLoopForUI message_loop_; |
- content::TestBrowserThread ui_thread_; |
-}; |
- |
-TEST_F(DrivePrefetcherTest, ZeroFiles) { |
- InitPrefetcher(3, 100); |
- VerifyFullScan( |
- std::vector<TestEntry>(kEmptyDrive, |
- kEmptyDrive + arraysize(kEmptyDrive)), |
- std::vector<std::string>()); |
-} |
- |
-TEST_F(DrivePrefetcherTest, OneFile) { |
- InitPrefetcher(3, 100); |
- VerifyFullScan( |
- std::vector<TestEntry>(kOneFileDrive, |
- kOneFileDrive + arraysize(kOneFileDrive)), |
- std::vector<std::string>(kExpectedOneFile, |
- kExpectedOneFile + arraysize(kExpectedOneFile))); |
-} |
- |
-TEST_F(DrivePrefetcherTest, MoreThanLimitFiles) { |
- // Files with the largest timestamps should be listed, in the order of time. |
- // Directories nor hosted files should not be listed. |
- InitPrefetcher(3, 100); |
- VerifyFullScan( |
- std::vector<TestEntry>(kComplexDrive, |
- kComplexDrive + arraysize(kComplexDrive)), |
- std::vector<std::string>(kTop3Files, kTop3Files + arraysize(kTop3Files))); |
-} |
- |
-TEST_F(DrivePrefetcherTest, DirectoryTraversal) { |
- // Ensure the prefetcher correctly traverses whole the file system tree. |
- // This is checked by setting the fetch limit larger than the number of files. |
- InitPrefetcher(100, 99999999); |
- VerifyFullScan( |
- std::vector<TestEntry>(kComplexDrive, |
- kComplexDrive + arraysize(kComplexDrive)), |
- std::vector<std::string>(kAllRegularFiles, |
- kAllRegularFiles + arraysize(kAllRegularFiles))); |
-} |
- |
-} // namespace drive |