Index: chrome/browser/chromeos/drive/change_list_loader_unittest.cc |
diff --git a/chrome/browser/chromeos/drive/change_list_loader_unittest.cc b/chrome/browser/chromeos/drive/change_list_loader_unittest.cc |
index d774a6412a59f5d9d5d4cb5cd086d622d24db2a5..dbcc48fe0a2524b214214687f98966c860ab5a64 100644 |
--- a/chrome/browser/chromeos/drive/change_list_loader_unittest.cc |
+++ b/chrome/browser/chromeos/drive/change_list_loader_unittest.cc |
@@ -66,6 +66,35 @@ class TestChangeListLoaderObserver : public ChangeListLoaderObserver { |
DISALLOW_COPY_AND_ASSIGN(TestChangeListLoaderObserver); |
}; |
+class TestDriveService : public FakeDriveService { |
+ public: |
+ TestDriveService() : never_return_all_resource_list_(false), |
+ blocked_call_count_(0) {} |
+ |
+ void set_never_return_all_resource_list(bool value) { |
+ never_return_all_resource_list_ = value; |
+ } |
+ |
+ int blocked_call_count() const { return blocked_call_count_; } |
+ |
+ // FakeDriveService override. |
+ virtual google_apis::CancelCallback GetAllResourceList( |
+ const google_apis::GetResourceListCallback& callback) OVERRIDE { |
+ if (never_return_all_resource_list_) { |
+ ++blocked_call_count_; |
+ return google_apis::CancelCallback(); |
+ } |
+ return FakeDriveService::GetAllResourceList(callback); |
+ } |
+ |
+ private: |
+ // GetAllResourceList never returns result when this is set to true. |
+ // Used to emulate the real server's slowness. |
+ bool never_return_all_resource_list_; |
+ |
+ int blocked_call_count_; // Number of blocked method calls. |
+}; |
+ |
class ChangeListLoaderTest : public testing::Test { |
protected: |
virtual void SetUp() OVERRIDE { |
@@ -73,7 +102,7 @@ class ChangeListLoaderTest : public testing::Test { |
pref_service_.reset(new TestingPrefServiceSimple); |
test_util::RegisterDrivePrefs(pref_service_->registry()); |
- drive_service_.reset(new FakeDriveService); |
+ drive_service_.reset(new TestDriveService); |
ASSERT_TRUE(drive_service_->LoadResourceListForWapi( |
"gdata/root_feed.json")); |
ASSERT_TRUE(drive_service_->LoadAccountMetadataForWapi( |
@@ -121,7 +150,7 @@ class ChangeListLoaderTest : public testing::Test { |
content::TestBrowserThreadBundle thread_bundle_; |
base::ScopedTempDir temp_dir_; |
scoped_ptr<TestingPrefServiceSimple> pref_service_; |
- scoped_ptr<FakeDriveService> drive_service_; |
+ scoped_ptr<TestDriveService> drive_service_; |
scoped_ptr<JobScheduler> scheduler_; |
scoped_ptr<ResourceMetadataStorage, |
test_util::DestroyHelperForTests> metadata_storage_; |
@@ -224,6 +253,86 @@ TEST_F(ChangeListLoaderTest, LoadIfNeeded_LocalMetadataAvailable) { |
metadata_->GetResourceEntryByPath(file_path, &entry)); |
} |
+TEST_F(ChangeListLoaderTest, LoadIfNeeded_MyDrive) { |
+ // Emulate the slowness of GetAllResourceList(). |
+ drive_service_->set_never_return_all_resource_list(true); |
+ |
+ // Load grand root. |
+ FileError error = FILE_ERROR_FAILED; |
+ change_list_loader_->LoadIfNeeded( |
+ DirectoryFetchInfo(util::kDriveGrandRootSpecialResourceId, 0), |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(FILE_ERROR_OK, error); |
+ |
+ // GetAllResourceList() was called. |
+ EXPECT_EQ(1, drive_service_->blocked_call_count()); |
+ |
+ // My Drive is present in the local metadata, but its child is not. |
+ ResourceEntry entry; |
+ EXPECT_EQ(FILE_ERROR_OK, |
+ metadata_->GetResourceEntryByPath(util::GetDriveMyDriveRootPath(), |
+ &entry)); |
+ const int64 mydrive_changestamp = |
+ entry.directory_specific_info().changestamp(); |
+ |
+ base::FilePath file_path = |
+ util::GetDriveMyDriveRootPath().AppendASCII("File 1.txt"); |
+ EXPECT_EQ(FILE_ERROR_NOT_FOUND, |
+ metadata_->GetResourceEntryByPath(file_path, &entry)); |
+ |
+ // Load My Drive. |
+ change_list_loader_->LoadIfNeeded( |
+ DirectoryFetchInfo(drive_service_->GetRootResourceId(), |
+ mydrive_changestamp), |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(FILE_ERROR_OK, error); |
+ |
+ // Now the file is present. |
+ EXPECT_EQ(FILE_ERROR_OK, |
+ metadata_->GetResourceEntryByPath(file_path, &entry)); |
+} |
+ |
+TEST_F(ChangeListLoaderTest, LoadIfNeeded_NewDirectories) { |
+ // Make local metadata up to date. |
+ FileError error = FILE_ERROR_FAILED; |
+ change_list_loader_->LoadIfNeeded( |
+ DirectoryFetchInfo(), |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(FILE_ERROR_OK, error); |
+ |
+ // Add a new file. |
+ scoped_ptr<google_apis::ResourceEntry> file = AddNewFile("New File"); |
+ ASSERT_TRUE(file); |
+ |
+ // Emulate the slowness of GetAllResourceList(). |
+ drive_service_->set_never_return_all_resource_list(true); |
+ |
+ // Enter refreshing state. |
+ FileError check_for_updates_error = FILE_ERROR_FAILED; |
+ change_list_loader_->CheckForUpdates( |
+ google_apis::test_util::CreateCopyResultCallback( |
+ &check_for_updates_error)); |
+ EXPECT_TRUE(change_list_loader_->IsRefreshing()); |
+ |
+ // Load My Drive. |
+ change_list_loader_->LoadIfNeeded( |
+ DirectoryFetchInfo(drive_service_->GetRootResourceId(), |
+ metadata_->GetLargestChangestamp()), |
+ google_apis::test_util::CreateCopyResultCallback(&error)); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_EQ(FILE_ERROR_OK, error); |
+ |
+ // The new file is present in the local metadata. |
+ base::FilePath file_path = |
+ util::GetDriveMyDriveRootPath().AppendASCII(file->title()); |
+ ResourceEntry entry; |
+ EXPECT_EQ(FILE_ERROR_OK, |
+ metadata_->GetResourceEntryByPath(file_path, &entry)); |
+} |
+ |
TEST_F(ChangeListLoaderTest, CheckForUpdates) { |
// CheckForUpdates() results in no-op before load. |
FileError check_for_updates_error = FILE_ERROR_FAILED; |