1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "chrome/browser/drive/fake_drive_service.h" 6 7 #include <string> 8 #include <vector> 9 10 #include "base/file_util.h" 11 #include "base/files/scoped_temp_dir.h" 12 #include "base/md5.h" 13 #include "base/run_loop.h" 14 #include "base/stl_util.h" 15 #include "base/strings/stringprintf.h" 16 #include "base/strings/utf_string_conversions.h" 17 #include "chrome/browser/google_apis/drive_api_parser.h" 18 #include "chrome/browser/google_apis/gdata_wapi_parser.h" 19 #include "chrome/browser/google_apis/gdata_wapi_requests.h" 20 #include "chrome/browser/google_apis/test_util.h" 21 #include "content/public/test/test_browser_thread_bundle.h" 22 #include "testing/gtest/include/gtest/gtest.h" 23 24 using google_apis::AboutResource; 25 using google_apis::AppList; 26 using google_apis::GDataErrorCode; 27 using google_apis::GDATA_NO_CONNECTION; 28 using google_apis::GDATA_OTHER_ERROR; 29 using google_apis::GetContentCallback; 30 using google_apis::HTTP_CREATED; 31 using google_apis::HTTP_NOT_FOUND; 32 using google_apis::HTTP_PRECONDITION; 33 using google_apis::HTTP_RESUME_INCOMPLETE; 34 using google_apis::HTTP_SUCCESS; 35 using google_apis::Link; 36 using google_apis::ProgressCallback; 37 using google_apis::ResourceEntry; 38 using google_apis::ResourceList; 39 using google_apis::UploadRangeResponse; 40 namespace test_util = google_apis::test_util; 41 42 namespace drive { 43 44 namespace { 45 46 class FakeDriveServiceTest : public testing::Test { 47 protected: 48 // Returns the resource entry that matches |resource_id|. 49 scoped_ptr<ResourceEntry> FindEntry(const std::string& resource_id) { 50 GDataErrorCode error = GDATA_OTHER_ERROR; 51 scoped_ptr<ResourceEntry> resource_entry; 52 fake_service_.GetResourceEntry( 53 resource_id, 54 test_util::CreateCopyResultCallback(&error, &resource_entry)); 55 base::RunLoop().RunUntilIdle(); 56 return resource_entry.Pass(); 57 } 58 59 // Returns true if the resource identified by |resource_id| exists. 60 bool Exists(const std::string& resource_id) { 61 scoped_ptr<ResourceEntry> resource_entry = FindEntry(resource_id); 62 return resource_entry && !resource_entry->deleted(); 63 } 64 65 // Adds a new directory at |parent_resource_id| with the given name. 66 // Returns true on success. 67 bool AddNewDirectory(const std::string& parent_resource_id, 68 const std::string& directory_title) { 69 GDataErrorCode error = GDATA_OTHER_ERROR; 70 scoped_ptr<ResourceEntry> resource_entry; 71 fake_service_.AddNewDirectory( 72 parent_resource_id, 73 directory_title, 74 test_util::CreateCopyResultCallback(&error, &resource_entry)); 75 base::RunLoop().RunUntilIdle(); 76 return error == HTTP_CREATED; 77 } 78 79 // Returns true if the resource identified by |resource_id| has a parent 80 // identified by |parent_id|. 81 bool HasParent(const std::string& resource_id, const std::string& parent_id) { 82 const GURL parent_url = FakeDriveService::GetFakeLinkUrl(parent_id); 83 scoped_ptr<ResourceEntry> resource_entry = FindEntry(resource_id); 84 if (resource_entry.get()) { 85 for (size_t i = 0; i < resource_entry->links().size(); ++i) { 86 if (resource_entry->links()[i]->type() == Link::LINK_PARENT && 87 resource_entry->links()[i]->href() == parent_url) 88 return true; 89 } 90 } 91 return false; 92 } 93 94 int64 GetLargestChangeByAboutResource() { 95 GDataErrorCode error; 96 scoped_ptr<AboutResource> about_resource; 97 fake_service_.GetAboutResource( 98 test_util::CreateCopyResultCallback(&error, &about_resource)); 99 base::RunLoop().RunUntilIdle(); 100 return about_resource->largest_change_id(); 101 } 102 103 content::TestBrowserThreadBundle thread_bundle_; 104 FakeDriveService fake_service_; 105 }; 106 107 void AppendProgressCallbackResult(std::vector<int64>* values, int64 progress) { 108 values->push_back(progress); 109 } 110 111 TEST_F(FakeDriveServiceTest, GetAllResourceList) { 112 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 113 "gdata/root_feed.json")); 114 115 GDataErrorCode error = GDATA_OTHER_ERROR; 116 scoped_ptr<ResourceList> resource_list; 117 fake_service_.GetAllResourceList( 118 test_util::CreateCopyResultCallback(&error, &resource_list)); 119 base::RunLoop().RunUntilIdle(); 120 121 EXPECT_EQ(HTTP_SUCCESS, error); 122 ASSERT_TRUE(resource_list); 123 // Do some sanity check. 124 EXPECT_EQ(14U, resource_list->entries().size()); 125 EXPECT_EQ(1, fake_service_.resource_list_load_count()); 126 } 127 128 TEST_F(FakeDriveServiceTest, GetAllResourceList_Offline) { 129 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 130 "gdata/root_feed.json")); 131 fake_service_.set_offline(true); 132 133 GDataErrorCode error = GDATA_OTHER_ERROR; 134 scoped_ptr<ResourceList> resource_list; 135 fake_service_.GetAllResourceList( 136 test_util::CreateCopyResultCallback(&error, &resource_list)); 137 base::RunLoop().RunUntilIdle(); 138 139 EXPECT_EQ(GDATA_NO_CONNECTION, error); 140 EXPECT_FALSE(resource_list); 141 } 142 143 TEST_F(FakeDriveServiceTest, GetResourceListInDirectory_InRootDirectory) { 144 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 145 "gdata/root_feed.json")); 146 147 GDataErrorCode error = GDATA_OTHER_ERROR; 148 scoped_ptr<ResourceList> resource_list; 149 fake_service_.GetResourceListInDirectory( 150 fake_service_.GetRootResourceId(), 151 test_util::CreateCopyResultCallback(&error, &resource_list)); 152 base::RunLoop().RunUntilIdle(); 153 154 EXPECT_EQ(HTTP_SUCCESS, error); 155 ASSERT_TRUE(resource_list); 156 // Do some sanity check. There are 8 entries in the root directory. 157 EXPECT_EQ(8U, resource_list->entries().size()); 158 EXPECT_EQ(1, fake_service_.directory_load_count()); 159 } 160 161 TEST_F(FakeDriveServiceTest, GetResourceListInDirectory_InNonRootDirectory) { 162 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 163 "gdata/root_feed.json")); 164 165 GDataErrorCode error = GDATA_OTHER_ERROR; 166 scoped_ptr<ResourceList> resource_list; 167 fake_service_.GetResourceListInDirectory( 168 "folder:1_folder_resource_id", 169 test_util::CreateCopyResultCallback(&error, &resource_list)); 170 base::RunLoop().RunUntilIdle(); 171 172 EXPECT_EQ(HTTP_SUCCESS, error); 173 ASSERT_TRUE(resource_list); 174 // Do some sanity check. There is three entries in 1_folder_resource_id 175 // directory. 176 EXPECT_EQ(3U, resource_list->entries().size()); 177 EXPECT_EQ(1, fake_service_.directory_load_count()); 178 } 179 180 TEST_F(FakeDriveServiceTest, GetResourceListInDirectory_Offline) { 181 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 182 "gdata/root_feed.json")); 183 fake_service_.set_offline(true); 184 185 GDataErrorCode error = GDATA_OTHER_ERROR; 186 scoped_ptr<ResourceList> resource_list; 187 fake_service_.GetResourceListInDirectory( 188 fake_service_.GetRootResourceId(), 189 test_util::CreateCopyResultCallback(&error, &resource_list)); 190 base::RunLoop().RunUntilIdle(); 191 192 EXPECT_EQ(GDATA_NO_CONNECTION, error); 193 EXPECT_FALSE(resource_list); 194 } 195 196 TEST_F(FakeDriveServiceTest, Search) { 197 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 198 "gdata/root_feed.json")); 199 200 GDataErrorCode error = GDATA_OTHER_ERROR; 201 scoped_ptr<ResourceList> resource_list; 202 fake_service_.Search( 203 "File", // search_query 204 test_util::CreateCopyResultCallback(&error, &resource_list)); 205 base::RunLoop().RunUntilIdle(); 206 207 EXPECT_EQ(HTTP_SUCCESS, error); 208 ASSERT_TRUE(resource_list); 209 // Do some sanity check. There are 4 entries that contain "File" in their 210 // titles. 211 EXPECT_EQ(4U, resource_list->entries().size()); 212 } 213 214 TEST_F(FakeDriveServiceTest, Search_WithAttribute) { 215 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 216 "gdata/root_feed.json")); 217 218 GDataErrorCode error = GDATA_OTHER_ERROR; 219 scoped_ptr<ResourceList> resource_list; 220 fake_service_.Search( 221 "title:1.txt", // search_query 222 test_util::CreateCopyResultCallback(&error, &resource_list)); 223 base::RunLoop().RunUntilIdle(); 224 225 EXPECT_EQ(HTTP_SUCCESS, error); 226 ASSERT_TRUE(resource_list); 227 // Do some sanity check. There are 4 entries that contain "1.txt" in their 228 // titles. 229 EXPECT_EQ(4U, resource_list->entries().size()); 230 } 231 232 TEST_F(FakeDriveServiceTest, Search_MultipleQueries) { 233 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 234 "gdata/root_feed.json")); 235 236 GDataErrorCode error = GDATA_OTHER_ERROR; 237 scoped_ptr<ResourceList> resource_list; 238 fake_service_.Search( 239 "Directory 1", // search_query 240 test_util::CreateCopyResultCallback(&error, &resource_list)); 241 base::RunLoop().RunUntilIdle(); 242 243 EXPECT_EQ(HTTP_SUCCESS, error); 244 ASSERT_TRUE(resource_list); 245 // There are 2 entries that contain both "Directory" and "1" in their titles. 246 EXPECT_EQ(2U, resource_list->entries().size()); 247 248 fake_service_.Search( 249 "\"Directory 1\"", // search_query 250 test_util::CreateCopyResultCallback(&error, &resource_list)); 251 base::RunLoop().RunUntilIdle(); 252 253 EXPECT_EQ(HTTP_SUCCESS, error); 254 ASSERT_TRUE(resource_list); 255 // There is 1 entry that contain "Directory 1" in its title. 256 EXPECT_EQ(1U, resource_list->entries().size()); 257 } 258 259 TEST_F(FakeDriveServiceTest, Search_Offline) { 260 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 261 "gdata/root_feed.json")); 262 fake_service_.set_offline(true); 263 264 GDataErrorCode error = GDATA_OTHER_ERROR; 265 scoped_ptr<ResourceList> resource_list; 266 fake_service_.Search( 267 "Directory 1", // search_query 268 test_util::CreateCopyResultCallback(&error, &resource_list)); 269 base::RunLoop().RunUntilIdle(); 270 271 EXPECT_EQ(GDATA_NO_CONNECTION, error); 272 EXPECT_FALSE(resource_list); 273 } 274 275 TEST_F(FakeDriveServiceTest, Search_Deleted) { 276 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 277 "gdata/root_feed.json")); 278 279 GDataErrorCode error = GDATA_OTHER_ERROR; 280 fake_service_.DeleteResource("file:2_file_resource_id", 281 std::string(), // etag 282 test_util::CreateCopyResultCallback(&error)); 283 base::RunLoop().RunUntilIdle(); 284 EXPECT_EQ(HTTP_SUCCESS, error); 285 286 error = GDATA_OTHER_ERROR; 287 scoped_ptr<ResourceList> resource_list; 288 fake_service_.Search( 289 "File", // search_query 290 test_util::CreateCopyResultCallback(&error, &resource_list)); 291 base::RunLoop().RunUntilIdle(); 292 293 EXPECT_EQ(HTTP_SUCCESS, error); 294 ASSERT_TRUE(resource_list); 295 // Do some sanity check. There are 4 entries that contain "File" in their 296 // titles and one of them is deleted. 297 EXPECT_EQ(3U, resource_list->entries().size()); 298 } 299 300 TEST_F(FakeDriveServiceTest, SearchByTitle) { 301 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 302 "gdata/root_feed.json")); 303 304 GDataErrorCode error = GDATA_OTHER_ERROR; 305 scoped_ptr<ResourceList> resource_list; 306 fake_service_.SearchByTitle( 307 "1.txt", // title 308 fake_service_.GetRootResourceId(), // directory_resource_id 309 test_util::CreateCopyResultCallback(&error, &resource_list)); 310 base::RunLoop().RunUntilIdle(); 311 312 EXPECT_EQ(HTTP_SUCCESS, error); 313 ASSERT_TRUE(resource_list); 314 // Do some sanity check. There are 2 entries that contain "1.txt" in their 315 // titles directly under the root directory. 316 EXPECT_EQ(2U, resource_list->entries().size()); 317 } 318 319 TEST_F(FakeDriveServiceTest, SearchByTitle_EmptyDirectoryResourceId) { 320 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 321 "gdata/root_feed.json")); 322 323 GDataErrorCode error = GDATA_OTHER_ERROR; 324 scoped_ptr<ResourceList> resource_list; 325 fake_service_.SearchByTitle( 326 "1.txt", // title 327 "", // directory resource id 328 test_util::CreateCopyResultCallback(&error, &resource_list)); 329 base::RunLoop().RunUntilIdle(); 330 331 EXPECT_EQ(HTTP_SUCCESS, error); 332 ASSERT_TRUE(resource_list); 333 // Do some sanity check. There are 4 entries that contain "1.txt" in their 334 // titles. 335 EXPECT_EQ(4U, resource_list->entries().size()); 336 } 337 338 TEST_F(FakeDriveServiceTest, SearchByTitle_Offline) { 339 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 340 "gdata/root_feed.json")); 341 fake_service_.set_offline(true); 342 343 GDataErrorCode error = GDATA_OTHER_ERROR; 344 scoped_ptr<ResourceList> resource_list; 345 fake_service_.SearchByTitle( 346 "Directory 1", // title 347 fake_service_.GetRootResourceId(), // directory_resource_id 348 test_util::CreateCopyResultCallback(&error, &resource_list)); 349 base::RunLoop().RunUntilIdle(); 350 351 EXPECT_EQ(GDATA_NO_CONNECTION, error); 352 EXPECT_FALSE(resource_list); 353 } 354 355 TEST_F(FakeDriveServiceTest, GetChangeList_NoNewEntries) { 356 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 357 "gdata/root_feed.json")); 358 // Load the account_metadata.json as well to add the largest changestamp 359 // (654321) to the existing entries. 360 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 361 "gdata/account_metadata.json")); 362 363 GDataErrorCode error = GDATA_OTHER_ERROR; 364 scoped_ptr<ResourceList> resource_list; 365 fake_service_.GetChangeList( 366 654321 + 1, // start_changestamp 367 test_util::CreateCopyResultCallback(&error, &resource_list)); 368 base::RunLoop().RunUntilIdle(); 369 370 EXPECT_EQ(HTTP_SUCCESS, error); 371 ASSERT_TRUE(resource_list); 372 EXPECT_EQ(fake_service_.largest_changestamp(), 373 resource_list->largest_changestamp()); 374 // This should be empty as the latest changestamp was passed to 375 // GetResourceList(), hence there should be no new entries. 376 EXPECT_EQ(0U, resource_list->entries().size()); 377 // It's considered loaded even if the result is empty. 378 EXPECT_EQ(1, fake_service_.change_list_load_count()); 379 } 380 381 TEST_F(FakeDriveServiceTest, GetChangeList_WithNewEntry) { 382 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 383 "gdata/root_feed.json")); 384 // Load the account_metadata.json as well to add the largest changestamp 385 // (654321) to the existing entries. 386 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 387 "gdata/account_metadata.json")); 388 // Add a new directory in the root directory. The new directory will have 389 // the changestamp of 654322. 390 ASSERT_TRUE(AddNewDirectory( 391 fake_service_.GetRootResourceId(), "new directory")); 392 393 // Get the resource list newer than 654321. 394 GDataErrorCode error = GDATA_OTHER_ERROR; 395 scoped_ptr<ResourceList> resource_list; 396 fake_service_.GetChangeList( 397 654321 + 1, // start_changestamp 398 test_util::CreateCopyResultCallback(&error, &resource_list)); 399 base::RunLoop().RunUntilIdle(); 400 401 EXPECT_EQ(HTTP_SUCCESS, error); 402 ASSERT_TRUE(resource_list); 403 EXPECT_EQ(fake_service_.largest_changestamp(), 404 resource_list->largest_changestamp()); 405 // The result should only contain the newly created directory. 406 ASSERT_EQ(1U, resource_list->entries().size()); 407 EXPECT_EQ("new directory", resource_list->entries()[0]->title()); 408 EXPECT_EQ(1, fake_service_.change_list_load_count()); 409 } 410 411 TEST_F(FakeDriveServiceTest, GetChangeList_Offline) { 412 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 413 "gdata/root_feed.json")); 414 fake_service_.set_offline(true); 415 416 GDataErrorCode error = GDATA_OTHER_ERROR; 417 scoped_ptr<ResourceList> resource_list; 418 fake_service_.GetChangeList( 419 654321, // start_changestamp 420 test_util::CreateCopyResultCallback(&error, &resource_list)); 421 base::RunLoop().RunUntilIdle(); 422 423 EXPECT_EQ(GDATA_NO_CONNECTION, error); 424 EXPECT_FALSE(resource_list); 425 } 426 427 TEST_F(FakeDriveServiceTest, GetChangeList_DeletedEntry) { 428 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 429 "gdata/root_feed.json")); 430 // Load the account_metadata.json as well to add the largest changestamp 431 // (654321) to the existing entries. 432 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 433 "gdata/account_metadata.json")); 434 // Add a new directory in the root directory. The new directory will have 435 // the changestamp of 654322. 436 ASSERT_TRUE(Exists("file:2_file_resource_id")); 437 438 GDataErrorCode error = GDATA_OTHER_ERROR; 439 fake_service_.DeleteResource("file:2_file_resource_id", 440 std::string(), // etag 441 test_util::CreateCopyResultCallback(&error)); 442 base::RunLoop().RunUntilIdle(); 443 ASSERT_EQ(HTTP_SUCCESS, error); 444 ASSERT_FALSE(Exists("file:2_file_resource_id")); 445 446 // Get the resource list newer than 654321. 447 error = GDATA_OTHER_ERROR; 448 scoped_ptr<ResourceList> resource_list; 449 fake_service_.GetChangeList( 450 654321 + 1, // start_changestamp 451 test_util::CreateCopyResultCallback(&error, &resource_list)); 452 base::RunLoop().RunUntilIdle(); 453 454 EXPECT_EQ(HTTP_SUCCESS, error); 455 ASSERT_TRUE(resource_list); 456 EXPECT_EQ(fake_service_.largest_changestamp(), 457 resource_list->largest_changestamp()); 458 // The result should only contain the newly created directory. 459 ASSERT_EQ(1U, resource_list->entries().size()); 460 const ResourceEntry& entry = *resource_list->entries()[0]; 461 EXPECT_EQ("file:2_file_resource_id", entry.resource_id()); 462 EXPECT_TRUE(entry.deleted()); 463 EXPECT_EQ(1, fake_service_.change_list_load_count()); 464 } 465 466 TEST_F(FakeDriveServiceTest, ContinueGetResourceList_GetAllResourceList) { 467 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 468 "gdata/root_feed.json")); 469 fake_service_.set_default_max_results(6); 470 471 GDataErrorCode error = GDATA_OTHER_ERROR; 472 scoped_ptr<ResourceList> resource_list; 473 fake_service_.GetAllResourceList( 474 test_util::CreateCopyResultCallback(&error, &resource_list)); 475 base::RunLoop().RunUntilIdle(); 476 EXPECT_EQ(HTTP_SUCCESS, error); 477 ASSERT_TRUE(resource_list); 478 479 // Do some sanity check. 480 // The number of results is 14 entries. Thus, it should split into three 481 // chunks: 6, 6, and then 2. 482 EXPECT_EQ(6U, resource_list->entries().size()); 483 EXPECT_EQ(1, fake_service_.resource_list_load_count()); 484 485 // Second page loading. 486 const google_apis::Link* next_link = 487 resource_list->GetLinkByType(Link::LINK_NEXT); 488 ASSERT_TRUE(next_link); 489 // Keep the next url before releasing the |resource_list|. 490 GURL next_url(next_link->href()); 491 492 error = GDATA_OTHER_ERROR; 493 resource_list.reset(); 494 fake_service_.ContinueGetResourceList( 495 next_url, 496 test_util::CreateCopyResultCallback(&error, &resource_list)); 497 base::RunLoop().RunUntilIdle(); 498 499 EXPECT_EQ(HTTP_SUCCESS, error); 500 ASSERT_TRUE(resource_list); 501 502 EXPECT_EQ(6U, resource_list->entries().size()); 503 EXPECT_EQ(1, fake_service_.resource_list_load_count()); 504 505 // Third page loading. 506 next_link = resource_list->GetLinkByType(Link::LINK_NEXT); 507 ASSERT_TRUE(next_link); 508 next_url = GURL(next_link->href()); 509 510 error = GDATA_OTHER_ERROR; 511 resource_list.reset(); 512 fake_service_.ContinueGetResourceList( 513 next_url, 514 test_util::CreateCopyResultCallback(&error, &resource_list)); 515 base::RunLoop().RunUntilIdle(); 516 517 EXPECT_EQ(HTTP_SUCCESS, error); 518 ASSERT_TRUE(resource_list); 519 520 EXPECT_EQ(2U, resource_list->entries().size()); 521 EXPECT_EQ(1, fake_service_.resource_list_load_count()); 522 } 523 524 TEST_F(FakeDriveServiceTest, 525 ContinueGetResourceList_GetResourceListInDirectory) { 526 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 527 "gdata/root_feed.json")); 528 fake_service_.set_default_max_results(3); 529 530 GDataErrorCode error = GDATA_OTHER_ERROR; 531 scoped_ptr<ResourceList> resource_list; 532 fake_service_.GetResourceListInDirectory( 533 fake_service_.GetRootResourceId(), 534 test_util::CreateCopyResultCallback(&error, &resource_list)); 535 base::RunLoop().RunUntilIdle(); 536 EXPECT_EQ(HTTP_SUCCESS, error); 537 ASSERT_TRUE(resource_list); 538 539 // Do some sanity check. 540 // The number of results is 8 entries. Thus, it should split into three 541 // chunks: 3, 3, and then 2. 542 EXPECT_EQ(3U, resource_list->entries().size()); 543 EXPECT_EQ(1, fake_service_.directory_load_count()); 544 545 // Second page loading. 546 const google_apis::Link* next_link = 547 resource_list->GetLinkByType(Link::LINK_NEXT); 548 ASSERT_TRUE(next_link); 549 // Keep the next url before releasing the |resource_list|. 550 GURL next_url(next_link->href()); 551 552 error = GDATA_OTHER_ERROR; 553 resource_list.reset(); 554 fake_service_.ContinueGetResourceList( 555 next_url, 556 test_util::CreateCopyResultCallback(&error, &resource_list)); 557 base::RunLoop().RunUntilIdle(); 558 559 EXPECT_EQ(HTTP_SUCCESS, error); 560 ASSERT_TRUE(resource_list); 561 562 EXPECT_EQ(3U, resource_list->entries().size()); 563 EXPECT_EQ(1, fake_service_.directory_load_count()); 564 565 // Third page loading. 566 next_link = resource_list->GetLinkByType(Link::LINK_NEXT); 567 ASSERT_TRUE(next_link); 568 next_url = GURL(next_link->href()); 569 570 error = GDATA_OTHER_ERROR; 571 resource_list.reset(); 572 fake_service_.ContinueGetResourceList( 573 next_url, 574 test_util::CreateCopyResultCallback(&error, &resource_list)); 575 base::RunLoop().RunUntilIdle(); 576 577 EXPECT_EQ(HTTP_SUCCESS, error); 578 ASSERT_TRUE(resource_list); 579 580 EXPECT_EQ(2U, resource_list->entries().size()); 581 EXPECT_EQ(1, fake_service_.directory_load_count()); 582 } 583 584 TEST_F(FakeDriveServiceTest, ContinueGetResourceList_Search) { 585 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 586 "gdata/root_feed.json")); 587 fake_service_.set_default_max_results(2); 588 589 GDataErrorCode error = GDATA_OTHER_ERROR; 590 scoped_ptr<ResourceList> resource_list; 591 fake_service_.Search( 592 "File", // search_query 593 test_util::CreateCopyResultCallback(&error, &resource_list)); 594 base::RunLoop().RunUntilIdle(); 595 EXPECT_EQ(HTTP_SUCCESS, error); 596 ASSERT_TRUE(resource_list); 597 598 // Do some sanity check. 599 // The number of results is 4 entries. Thus, it should split into two 600 // chunks: 2, and then 2 601 EXPECT_EQ(2U, resource_list->entries().size()); 602 603 // Second page loading. 604 const google_apis::Link* next_link = 605 resource_list->GetLinkByType(Link::LINK_NEXT); 606 ASSERT_TRUE(next_link); 607 // Keep the next url before releasing the |resource_list|. 608 GURL next_url(next_link->href()); 609 610 error = GDATA_OTHER_ERROR; 611 resource_list.reset(); 612 fake_service_.ContinueGetResourceList( 613 next_url, 614 test_util::CreateCopyResultCallback(&error, &resource_list)); 615 base::RunLoop().RunUntilIdle(); 616 617 EXPECT_EQ(HTTP_SUCCESS, error); 618 ASSERT_TRUE(resource_list); 619 620 EXPECT_EQ(2U, resource_list->entries().size()); 621 } 622 623 TEST_F(FakeDriveServiceTest, ContinueGetResourceList_GetChangeList) { 624 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 625 "gdata/root_feed.json")); 626 fake_service_.set_default_max_results(2); 627 628 // Load the account_metadata.json as well to add the largest changestamp 629 // (654321) to the existing entries. 630 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 631 "gdata/account_metadata.json")); 632 // Add 5 new directory in the root directory. The new directory will have 633 // the changestamp of 654326. 634 for (int i = 0; i < 5; ++i) { 635 ASSERT_TRUE(AddNewDirectory( 636 fake_service_.GetRootResourceId(), 637 base::StringPrintf("new directory %d", i))); 638 } 639 640 GDataErrorCode error = GDATA_OTHER_ERROR; 641 scoped_ptr<ResourceList> resource_list; 642 fake_service_.GetChangeList( 643 654321 + 1, // start_changestamp 644 test_util::CreateCopyResultCallback(&error, &resource_list)); 645 base::RunLoop().RunUntilIdle(); 646 EXPECT_EQ(HTTP_SUCCESS, error); 647 ASSERT_TRUE(resource_list); 648 649 // Do some sanity check. 650 // The number of results is 5 entries. Thus, it should split into three 651 // chunks: 2, 2 and then 1. 652 EXPECT_EQ(2U, resource_list->entries().size()); 653 EXPECT_EQ(1, fake_service_.change_list_load_count()); 654 655 // Second page loading. 656 const google_apis::Link* next_link = 657 resource_list->GetLinkByType(Link::LINK_NEXT); 658 ASSERT_TRUE(next_link); 659 // Keep the next url before releasing the |resource_list|. 660 GURL next_url(next_link->href()); 661 662 error = GDATA_OTHER_ERROR; 663 resource_list.reset(); 664 fake_service_.ContinueGetResourceList( 665 next_url, 666 test_util::CreateCopyResultCallback(&error, &resource_list)); 667 base::RunLoop().RunUntilIdle(); 668 669 EXPECT_EQ(HTTP_SUCCESS, error); 670 ASSERT_TRUE(resource_list); 671 672 EXPECT_EQ(2U, resource_list->entries().size()); 673 EXPECT_EQ(1, fake_service_.change_list_load_count()); 674 675 // Third page loading. 676 next_link = resource_list->GetLinkByType(Link::LINK_NEXT); 677 ASSERT_TRUE(next_link); 678 next_url = GURL(next_link->href()); 679 680 error = GDATA_OTHER_ERROR; 681 resource_list.reset(); 682 fake_service_.ContinueGetResourceList( 683 next_url, 684 test_util::CreateCopyResultCallback(&error, &resource_list)); 685 base::RunLoop().RunUntilIdle(); 686 687 EXPECT_EQ(HTTP_SUCCESS, error); 688 ASSERT_TRUE(resource_list); 689 690 EXPECT_EQ(1U, resource_list->entries().size()); 691 EXPECT_EQ(1, fake_service_.change_list_load_count()); 692 } 693 694 TEST_F(FakeDriveServiceTest, GetAboutResource) { 695 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 696 "gdata/account_metadata.json")); 697 698 GDataErrorCode error = GDATA_OTHER_ERROR; 699 scoped_ptr<AboutResource> about_resource; 700 fake_service_.GetAboutResource( 701 test_util::CreateCopyResultCallback(&error, &about_resource)); 702 base::RunLoop().RunUntilIdle(); 703 704 EXPECT_EQ(HTTP_SUCCESS, error); 705 706 ASSERT_TRUE(about_resource); 707 // Do some sanity check. 708 EXPECT_EQ(fake_service_.GetRootResourceId(), 709 about_resource->root_folder_id()); 710 EXPECT_EQ(1, fake_service_.about_resource_load_count()); 711 } 712 713 TEST_F(FakeDriveServiceTest, GetAboutResource_Offline) { 714 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 715 "gdata/account_metadata.json")); 716 fake_service_.set_offline(true); 717 718 GDataErrorCode error = GDATA_OTHER_ERROR; 719 scoped_ptr<AboutResource> about_resource; 720 fake_service_.GetAboutResource( 721 test_util::CreateCopyResultCallback(&error, &about_resource)); 722 base::RunLoop().RunUntilIdle(); 723 724 EXPECT_EQ(GDATA_NO_CONNECTION, error); 725 EXPECT_FALSE(about_resource); 726 } 727 728 TEST_F(FakeDriveServiceTest, GetAppList) { 729 ASSERT_TRUE(fake_service_.LoadAppListForDriveApi( 730 "drive/applist.json")); 731 732 GDataErrorCode error = GDATA_OTHER_ERROR; 733 scoped_ptr<AppList> app_list; 734 fake_service_.GetAppList( 735 test_util::CreateCopyResultCallback(&error, &app_list)); 736 base::RunLoop().RunUntilIdle(); 737 738 EXPECT_EQ(HTTP_SUCCESS, error); 739 740 ASSERT_TRUE(app_list); 741 EXPECT_EQ(1, fake_service_.app_list_load_count()); 742 } 743 744 TEST_F(FakeDriveServiceTest, GetAppList_Offline) { 745 ASSERT_TRUE(fake_service_.LoadAppListForDriveApi( 746 "drive/applist.json")); 747 fake_service_.set_offline(true); 748 749 GDataErrorCode error = GDATA_OTHER_ERROR; 750 scoped_ptr<AppList> app_list; 751 fake_service_.GetAppList( 752 test_util::CreateCopyResultCallback(&error, &app_list)); 753 base::RunLoop().RunUntilIdle(); 754 755 EXPECT_EQ(GDATA_NO_CONNECTION, error); 756 EXPECT_FALSE(app_list); 757 } 758 759 TEST_F(FakeDriveServiceTest, GetResourceEntry_ExistingFile) { 760 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 761 "gdata/root_feed.json")); 762 763 const std::string kResourceId = "file:2_file_resource_id"; 764 GDataErrorCode error = GDATA_OTHER_ERROR; 765 scoped_ptr<ResourceEntry> resource_entry; 766 fake_service_.GetResourceEntry( 767 kResourceId, 768 test_util::CreateCopyResultCallback(&error, &resource_entry)); 769 base::RunLoop().RunUntilIdle(); 770 771 EXPECT_EQ(HTTP_SUCCESS, error); 772 ASSERT_TRUE(resource_entry); 773 // Do some sanity check. 774 EXPECT_EQ(kResourceId, resource_entry->resource_id()); 775 } 776 777 TEST_F(FakeDriveServiceTest, GetResourceEntry_NonexistingFile) { 778 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 779 "gdata/root_feed.json")); 780 781 const std::string kResourceId = "file:nonexisting_resource_id"; 782 GDataErrorCode error = GDATA_OTHER_ERROR; 783 scoped_ptr<ResourceEntry> resource_entry; 784 fake_service_.GetResourceEntry( 785 kResourceId, 786 test_util::CreateCopyResultCallback(&error, &resource_entry)); 787 base::RunLoop().RunUntilIdle(); 788 789 EXPECT_EQ(HTTP_NOT_FOUND, error); 790 ASSERT_FALSE(resource_entry); 791 } 792 793 TEST_F(FakeDriveServiceTest, GetResourceEntry_Offline) { 794 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 795 "gdata/root_feed.json")); 796 fake_service_.set_offline(true); 797 798 const std::string kResourceId = "file:2_file_resource_id"; 799 GDataErrorCode error = GDATA_OTHER_ERROR; 800 scoped_ptr<ResourceEntry> resource_entry; 801 fake_service_.GetResourceEntry( 802 kResourceId, 803 test_util::CreateCopyResultCallback(&error, &resource_entry)); 804 base::RunLoop().RunUntilIdle(); 805 806 EXPECT_EQ(GDATA_NO_CONNECTION, error); 807 EXPECT_FALSE(resource_entry); 808 } 809 810 TEST_F(FakeDriveServiceTest, GetShareUrl) { 811 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 812 "gdata/root_feed.json")); 813 814 const std::string kResourceId = "file:2_file_resource_id"; 815 GDataErrorCode error = GDATA_OTHER_ERROR; 816 GURL share_url; 817 fake_service_.GetShareUrl( 818 kResourceId, 819 GURL(), // embed origin 820 test_util::CreateCopyResultCallback(&error, &share_url)); 821 base::RunLoop().RunUntilIdle(); 822 823 EXPECT_EQ(HTTP_SUCCESS, error); 824 EXPECT_FALSE(share_url.is_empty()); 825 } 826 827 TEST_F(FakeDriveServiceTest, DeleteResource_ExistingFile) { 828 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 829 "gdata/root_feed.json")); 830 831 // Resource "file:2_file_resource_id" should now exist. 832 ASSERT_TRUE(Exists("file:2_file_resource_id")); 833 834 GDataErrorCode error = GDATA_OTHER_ERROR; 835 fake_service_.DeleteResource("file:2_file_resource_id", 836 std::string(), // etag 837 test_util::CreateCopyResultCallback(&error)); 838 base::RunLoop().RunUntilIdle(); 839 840 EXPECT_EQ(HTTP_SUCCESS, error); 841 // Resource "file:2_file_resource_id" should be gone now. 842 EXPECT_FALSE(Exists("file:2_file_resource_id")); 843 844 error = GDATA_OTHER_ERROR; 845 fake_service_.DeleteResource("file:2_file_resource_id", 846 std::string(), // etag 847 test_util::CreateCopyResultCallback(&error)); 848 base::RunLoop().RunUntilIdle(); 849 EXPECT_EQ(HTTP_NOT_FOUND, error); 850 EXPECT_FALSE(Exists("file:2_file_resource_id")); 851 } 852 853 TEST_F(FakeDriveServiceTest, DeleteResource_NonexistingFile) { 854 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 855 "gdata/root_feed.json")); 856 857 GDataErrorCode error = GDATA_OTHER_ERROR; 858 fake_service_.DeleteResource("file:nonexisting_resource_id", 859 std::string(), // etag 860 test_util::CreateCopyResultCallback(&error)); 861 base::RunLoop().RunUntilIdle(); 862 863 EXPECT_EQ(HTTP_NOT_FOUND, error); 864 } 865 866 TEST_F(FakeDriveServiceTest, DeleteResource_Offline) { 867 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 868 "gdata/root_feed.json")); 869 fake_service_.set_offline(true); 870 871 GDataErrorCode error = GDATA_OTHER_ERROR; 872 fake_service_.DeleteResource("file:2_file_resource_id", 873 std::string(), // etag 874 test_util::CreateCopyResultCallback(&error)); 875 base::RunLoop().RunUntilIdle(); 876 877 EXPECT_EQ(GDATA_NO_CONNECTION, error); 878 } 879 880 TEST_F(FakeDriveServiceTest, DownloadFile_ExistingFile) { 881 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 882 "gdata/root_feed.json")); 883 884 base::ScopedTempDir temp_dir; 885 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 886 887 std::vector<test_util::ProgressInfo> download_progress_values; 888 889 const base::FilePath kOutputFilePath = 890 temp_dir.path().AppendASCII("whatever.txt"); 891 GDataErrorCode error = GDATA_OTHER_ERROR; 892 base::FilePath output_file_path; 893 test_util::TestGetContentCallback get_content_callback; 894 fake_service_.DownloadFile( 895 kOutputFilePath, 896 "file:2_file_resource_id", 897 test_util::CreateCopyResultCallback(&error, &output_file_path), 898 get_content_callback.callback(), 899 base::Bind(&test_util::AppendProgressCallbackResult, 900 &download_progress_values)); 901 base::RunLoop().RunUntilIdle(); 902 903 EXPECT_EQ(HTTP_SUCCESS, error); 904 EXPECT_EQ(output_file_path, kOutputFilePath); 905 std::string content; 906 ASSERT_TRUE(file_util::ReadFileToString(output_file_path, &content)); 907 // The content is "x"s of the file size specified in root_feed.json. 908 EXPECT_EQ("This is some test content.", content); 909 ASSERT_TRUE(!download_progress_values.empty()); 910 EXPECT_TRUE(base::STLIsSorted(download_progress_values)); 911 EXPECT_LE(0, download_progress_values.front().first); 912 EXPECT_GE(26, download_progress_values.back().first); 913 EXPECT_EQ(content, get_content_callback.GetConcatenatedData()); 914 } 915 916 TEST_F(FakeDriveServiceTest, DownloadFile_NonexistingFile) { 917 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 918 "gdata/root_feed.json")); 919 920 base::ScopedTempDir temp_dir; 921 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 922 923 const base::FilePath kOutputFilePath = 924 temp_dir.path().AppendASCII("whatever.txt"); 925 GDataErrorCode error = GDATA_OTHER_ERROR; 926 base::FilePath output_file_path; 927 fake_service_.DownloadFile( 928 kOutputFilePath, 929 "file:non_existent_file_resource_id", 930 test_util::CreateCopyResultCallback(&error, &output_file_path), 931 GetContentCallback(), 932 ProgressCallback()); 933 base::RunLoop().RunUntilIdle(); 934 935 EXPECT_EQ(HTTP_NOT_FOUND, error); 936 } 937 938 TEST_F(FakeDriveServiceTest, DownloadFile_Offline) { 939 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 940 "gdata/root_feed.json")); 941 fake_service_.set_offline(true); 942 943 base::ScopedTempDir temp_dir; 944 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 945 946 const base::FilePath kOutputFilePath = 947 temp_dir.path().AppendASCII("whatever.txt"); 948 GDataErrorCode error = GDATA_OTHER_ERROR; 949 base::FilePath output_file_path; 950 fake_service_.DownloadFile( 951 kOutputFilePath, 952 "file:2_file_resource_id", 953 test_util::CreateCopyResultCallback(&error, &output_file_path), 954 GetContentCallback(), 955 ProgressCallback()); 956 base::RunLoop().RunUntilIdle(); 957 958 EXPECT_EQ(GDATA_NO_CONNECTION, error); 959 } 960 961 TEST_F(FakeDriveServiceTest, CopyResource) { 962 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 963 "gdata/root_feed.json")); 964 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 965 "gdata/account_metadata.json")); 966 967 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 968 969 const std::string kResourceId = "file:2_file_resource_id"; 970 const std::string kParentResourceId = "folder:1_folder_resource_id"; 971 GDataErrorCode error = GDATA_OTHER_ERROR; 972 scoped_ptr<ResourceEntry> resource_entry; 973 fake_service_.CopyResource( 974 kResourceId, 975 kParentResourceId, 976 "new title", 977 test_util::CreateCopyResultCallback(&error, &resource_entry)); 978 base::RunLoop().RunUntilIdle(); 979 980 EXPECT_EQ(HTTP_SUCCESS, error); 981 ASSERT_TRUE(resource_entry); 982 // The copied entry should have the new resource ID and the title. 983 EXPECT_EQ(kResourceId + "_copied", resource_entry->resource_id()); 984 EXPECT_EQ("new title", resource_entry->title()); 985 EXPECT_TRUE(HasParent(kResourceId, kParentResourceId)); 986 // Should be incremented as a new hosted document was created. 987 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 988 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 989 } 990 991 TEST_F(FakeDriveServiceTest, CopyResource_NonExisting) { 992 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 993 "gdata/root_feed.json")); 994 995 const std::string kResourceId = "document:nonexisting_resource_id"; 996 GDataErrorCode error = GDATA_OTHER_ERROR; 997 scoped_ptr<ResourceEntry> resource_entry; 998 fake_service_.CopyResource( 999 kResourceId, 1000 "folder:1_folder_resource_id", 1001 "new title", 1002 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1003 base::RunLoop().RunUntilIdle(); 1004 1005 EXPECT_EQ(HTTP_NOT_FOUND, error); 1006 } 1007 1008 TEST_F(FakeDriveServiceTest, CopyResource_EmptyParentResourceId) { 1009 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1010 "gdata/root_feed.json")); 1011 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1012 "gdata/account_metadata.json")); 1013 1014 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1015 1016 const std::string kResourceId = "file:2_file_resource_id"; 1017 GDataErrorCode error = GDATA_OTHER_ERROR; 1018 scoped_ptr<ResourceEntry> resource_entry; 1019 fake_service_.CopyResource( 1020 kResourceId, 1021 std::string(), 1022 "new title", 1023 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1024 base::RunLoop().RunUntilIdle(); 1025 1026 EXPECT_EQ(HTTP_SUCCESS, error); 1027 ASSERT_TRUE(resource_entry); 1028 // The copied entry should have the new resource ID and the title. 1029 EXPECT_EQ(kResourceId + "_copied", resource_entry->resource_id()); 1030 EXPECT_EQ("new title", resource_entry->title()); 1031 EXPECT_TRUE(HasParent(kResourceId, fake_service_.GetRootResourceId())); 1032 // Should be incremented as a new hosted document was created. 1033 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1034 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1035 } 1036 1037 TEST_F(FakeDriveServiceTest, CopyResource_Offline) { 1038 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1039 "gdata/root_feed.json")); 1040 fake_service_.set_offline(true); 1041 1042 const std::string kResourceId = "file:2_file_resource_id"; 1043 GDataErrorCode error = GDATA_OTHER_ERROR; 1044 scoped_ptr<ResourceEntry> resource_entry; 1045 fake_service_.CopyResource( 1046 kResourceId, 1047 "folder:1_folder_resource_id", 1048 "new title", 1049 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1050 base::RunLoop().RunUntilIdle(); 1051 1052 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1053 EXPECT_FALSE(resource_entry); 1054 } 1055 1056 TEST_F(FakeDriveServiceTest, CopyHostedDocument_Existing) { 1057 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1058 "gdata/root_feed.json")); 1059 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1060 "gdata/account_metadata.json")); 1061 1062 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1063 1064 const std::string kResourceId = "document:5_document_resource_id"; 1065 GDataErrorCode error = GDATA_OTHER_ERROR; 1066 scoped_ptr<ResourceEntry> resource_entry; 1067 fake_service_.CopyHostedDocument( 1068 kResourceId, 1069 "new title", 1070 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1071 base::RunLoop().RunUntilIdle(); 1072 1073 EXPECT_EQ(HTTP_SUCCESS, error); 1074 ASSERT_TRUE(resource_entry); 1075 // The copied entry should have the new resource ID and the title. 1076 EXPECT_EQ(kResourceId + "_copied", resource_entry->resource_id()); 1077 EXPECT_EQ("new title", resource_entry->title()); 1078 // Should be incremented as a new hosted document was created. 1079 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1080 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1081 } 1082 1083 TEST_F(FakeDriveServiceTest, CopyHostedDocument_NonExisting) { 1084 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1085 "gdata/root_feed.json")); 1086 1087 const std::string kResourceId = "document:nonexisting_resource_id"; 1088 GDataErrorCode error = GDATA_OTHER_ERROR; 1089 scoped_ptr<ResourceEntry> resource_entry; 1090 fake_service_.CopyHostedDocument( 1091 kResourceId, 1092 "new title", 1093 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1094 base::RunLoop().RunUntilIdle(); 1095 1096 EXPECT_EQ(HTTP_NOT_FOUND, error); 1097 } 1098 1099 TEST_F(FakeDriveServiceTest, CopyHostedDocument_Offline) { 1100 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1101 "gdata/root_feed.json")); 1102 fake_service_.set_offline(true); 1103 1104 const std::string kResourceId = "document:5_document_resource_id"; 1105 GDataErrorCode error = GDATA_OTHER_ERROR; 1106 scoped_ptr<ResourceEntry> resource_entry; 1107 fake_service_.CopyHostedDocument( 1108 kResourceId, 1109 "new title", 1110 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1111 base::RunLoop().RunUntilIdle(); 1112 1113 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1114 EXPECT_FALSE(resource_entry); 1115 } 1116 1117 TEST_F(FakeDriveServiceTest, RenameResource_ExistingFile) { 1118 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1119 "gdata/root_feed.json")); 1120 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1121 "gdata/account_metadata.json")); 1122 1123 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1124 1125 const std::string kResourceId = "file:2_file_resource_id"; 1126 1127 GDataErrorCode error = GDATA_OTHER_ERROR; 1128 fake_service_.RenameResource(kResourceId, 1129 "new title", 1130 test_util::CreateCopyResultCallback(&error)); 1131 base::RunLoop().RunUntilIdle(); 1132 1133 EXPECT_EQ(HTTP_SUCCESS, error); 1134 1135 scoped_ptr<ResourceEntry> resource_entry = FindEntry(kResourceId); 1136 ASSERT_TRUE(resource_entry); 1137 EXPECT_EQ("new title", resource_entry->title()); 1138 // Should be incremented as a file was renamed. 1139 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1140 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1141 } 1142 1143 TEST_F(FakeDriveServiceTest, RenameResource_NonexistingFile) { 1144 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1145 "gdata/root_feed.json")); 1146 1147 const std::string kResourceId = "file:nonexisting_file"; 1148 1149 GDataErrorCode error = GDATA_OTHER_ERROR; 1150 fake_service_.RenameResource(kResourceId, 1151 "new title", 1152 test_util::CreateCopyResultCallback(&error)); 1153 base::RunLoop().RunUntilIdle(); 1154 1155 EXPECT_EQ(HTTP_NOT_FOUND, error); 1156 } 1157 1158 TEST_F(FakeDriveServiceTest, RenameResource_Offline) { 1159 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1160 "gdata/root_feed.json")); 1161 fake_service_.set_offline(true); 1162 1163 const std::string kResourceId = "file:2_file_resource_id"; 1164 1165 GDataErrorCode error = GDATA_OTHER_ERROR; 1166 fake_service_.RenameResource(kResourceId, 1167 "new title", 1168 test_util::CreateCopyResultCallback(&error)); 1169 base::RunLoop().RunUntilIdle(); 1170 1171 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1172 } 1173 1174 TEST_F(FakeDriveServiceTest, TouchResource_ExistingFile) { 1175 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1176 "gdata/root_feed.json")); 1177 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1178 "gdata/account_metadata.json")); 1179 1180 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1181 1182 const std::string kResourceId = "file:2_file_resource_id"; 1183 const base::Time::Exploded kModifiedDate = {2012, 7, 0, 19, 15, 59, 13, 123}; 1184 const base::Time::Exploded kLastViewedByMeDate = 1185 {2013, 7, 0, 19, 15, 59, 13, 123}; 1186 1187 GDataErrorCode error = GDATA_OTHER_ERROR; 1188 scoped_ptr<ResourceEntry> entry; 1189 fake_service_.TouchResource( 1190 kResourceId, 1191 base::Time::FromUTCExploded(kModifiedDate), 1192 base::Time::FromUTCExploded(kLastViewedByMeDate), 1193 test_util::CreateCopyResultCallback(&error, &entry)); 1194 base::RunLoop().RunUntilIdle(); 1195 1196 EXPECT_EQ(HTTP_SUCCESS, error); 1197 1198 ASSERT_TRUE(entry); 1199 EXPECT_EQ(base::Time::FromUTCExploded(kModifiedDate), 1200 entry->updated_time()); 1201 EXPECT_EQ(base::Time::FromUTCExploded(kLastViewedByMeDate), 1202 entry->last_viewed_time()); 1203 1204 // Should be incremented as a file was renamed. 1205 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1206 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1207 } 1208 1209 TEST_F(FakeDriveServiceTest, TouchResource_NonexistingFile) { 1210 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1211 "gdata/root_feed.json")); 1212 1213 const std::string kResourceId = "file:nonexisting_file"; 1214 const base::Time::Exploded kModifiedDate = {2012, 7, 0, 19, 15, 59, 13, 123}; 1215 const base::Time::Exploded kLastViewedByMeDate = 1216 {2013, 7, 0, 19, 15, 59, 13, 123}; 1217 1218 GDataErrorCode error = GDATA_OTHER_ERROR; 1219 scoped_ptr<ResourceEntry> entry; 1220 fake_service_.TouchResource( 1221 kResourceId, 1222 base::Time::FromUTCExploded(kModifiedDate), 1223 base::Time::FromUTCExploded(kLastViewedByMeDate), 1224 test_util::CreateCopyResultCallback(&error, &entry)); 1225 base::RunLoop().RunUntilIdle(); 1226 1227 EXPECT_EQ(HTTP_NOT_FOUND, error); 1228 } 1229 1230 TEST_F(FakeDriveServiceTest, TouchResource_Offline) { 1231 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1232 "gdata/root_feed.json")); 1233 fake_service_.set_offline(true); 1234 1235 const std::string kResourceId = "file:2_file_resource_id"; 1236 const base::Time::Exploded kModifiedDate = {2012, 7, 0, 19, 15, 59, 13, 123}; 1237 const base::Time::Exploded kLastViewedByMeDate = 1238 {2013, 7, 0, 19, 15, 59, 13, 123}; 1239 1240 GDataErrorCode error = GDATA_OTHER_ERROR; 1241 scoped_ptr<ResourceEntry> entry; 1242 fake_service_.TouchResource( 1243 kResourceId, 1244 base::Time::FromUTCExploded(kModifiedDate), 1245 base::Time::FromUTCExploded(kLastViewedByMeDate), 1246 test_util::CreateCopyResultCallback(&error, &entry)); 1247 base::RunLoop().RunUntilIdle(); 1248 1249 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1250 } 1251 1252 TEST_F(FakeDriveServiceTest, AddResourceToDirectory_FileInRootDirectory) { 1253 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1254 "gdata/root_feed.json")); 1255 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1256 "gdata/account_metadata.json")); 1257 1258 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1259 1260 const std::string kResourceId = "file:2_file_resource_id"; 1261 const std::string kOldParentResourceId = fake_service_.GetRootResourceId(); 1262 const std::string kNewParentResourceId = "folder:1_folder_resource_id"; 1263 1264 // Here's the original parent link. 1265 EXPECT_TRUE(HasParent(kResourceId, kOldParentResourceId)); 1266 EXPECT_FALSE(HasParent(kResourceId, kNewParentResourceId)); 1267 1268 GDataErrorCode error = GDATA_OTHER_ERROR; 1269 fake_service_.AddResourceToDirectory( 1270 kNewParentResourceId, 1271 kResourceId, 1272 test_util::CreateCopyResultCallback(&error)); 1273 base::RunLoop().RunUntilIdle(); 1274 1275 EXPECT_EQ(HTTP_SUCCESS, error); 1276 1277 // The parent link should now be changed. 1278 EXPECT_TRUE(HasParent(kResourceId, kOldParentResourceId)); 1279 EXPECT_TRUE(HasParent(kResourceId, kNewParentResourceId)); 1280 // Should be incremented as a file was moved. 1281 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1282 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1283 } 1284 1285 TEST_F(FakeDriveServiceTest, AddResourceToDirectory_FileInNonRootDirectory) { 1286 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1287 "gdata/root_feed.json")); 1288 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1289 "gdata/account_metadata.json")); 1290 1291 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1292 1293 const std::string kResourceId = "file:subdirectory_file_1_id"; 1294 const std::string kOldParentResourceId = "folder:1_folder_resource_id"; 1295 const std::string kNewParentResourceId = "folder:2_folder_resource_id"; 1296 1297 // Here's the original parent link. 1298 EXPECT_TRUE(HasParent(kResourceId, kOldParentResourceId)); 1299 EXPECT_FALSE(HasParent(kResourceId, kNewParentResourceId)); 1300 1301 GDataErrorCode error = GDATA_OTHER_ERROR; 1302 fake_service_.AddResourceToDirectory( 1303 kNewParentResourceId, 1304 kResourceId, 1305 test_util::CreateCopyResultCallback(&error)); 1306 base::RunLoop().RunUntilIdle(); 1307 1308 EXPECT_EQ(HTTP_SUCCESS, error); 1309 1310 // The parent link should now be changed. 1311 EXPECT_TRUE(HasParent(kResourceId, kOldParentResourceId)); 1312 EXPECT_TRUE(HasParent(kResourceId, kNewParentResourceId)); 1313 // Should be incremented as a file was moved. 1314 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1315 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1316 } 1317 1318 TEST_F(FakeDriveServiceTest, AddResourceToDirectory_NonexistingFile) { 1319 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1320 "gdata/root_feed.json")); 1321 1322 const std::string kResourceId = "file:nonexisting_file"; 1323 const std::string kNewParentResourceId = "folder:1_folder_resource_id"; 1324 1325 GDataErrorCode error = GDATA_OTHER_ERROR; 1326 fake_service_.AddResourceToDirectory( 1327 kNewParentResourceId, 1328 kResourceId, 1329 test_util::CreateCopyResultCallback(&error)); 1330 base::RunLoop().RunUntilIdle(); 1331 1332 EXPECT_EQ(HTTP_NOT_FOUND, error); 1333 } 1334 1335 TEST_F(FakeDriveServiceTest, AddResourceToDirectory_OrphanFile) { 1336 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1337 "gdata/root_feed.json")); 1338 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1339 "gdata/account_metadata.json")); 1340 1341 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1342 1343 const std::string kResourceId = "file:1_orphanfile_resource_id"; 1344 const std::string kNewParentResourceId = "folder:1_folder_resource_id"; 1345 1346 // The file does not belong to any directory, even to the root. 1347 EXPECT_FALSE(HasParent(kResourceId, kNewParentResourceId)); 1348 EXPECT_FALSE(HasParent(kResourceId, fake_service_.GetRootResourceId())); 1349 1350 GDataErrorCode error = GDATA_OTHER_ERROR; 1351 fake_service_.AddResourceToDirectory( 1352 kNewParentResourceId, 1353 kResourceId, 1354 test_util::CreateCopyResultCallback(&error)); 1355 base::RunLoop().RunUntilIdle(); 1356 1357 EXPECT_EQ(HTTP_SUCCESS, error); 1358 1359 // The parent link should now be changed. 1360 EXPECT_TRUE(HasParent(kResourceId, kNewParentResourceId)); 1361 EXPECT_FALSE(HasParent(kResourceId, fake_service_.GetRootResourceId())); 1362 // Should be incremented as a file was moved. 1363 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1364 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1365 } 1366 1367 TEST_F(FakeDriveServiceTest, AddResourceToDirectory_Offline) { 1368 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1369 "gdata/root_feed.json")); 1370 fake_service_.set_offline(true); 1371 1372 const std::string kResourceId = "file:2_file_resource_id"; 1373 const std::string kNewParentResourceId = "folder:1_folder_resource_id"; 1374 1375 GDataErrorCode error = GDATA_OTHER_ERROR; 1376 fake_service_.AddResourceToDirectory( 1377 kNewParentResourceId, 1378 kResourceId, 1379 test_util::CreateCopyResultCallback(&error)); 1380 base::RunLoop().RunUntilIdle(); 1381 1382 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1383 } 1384 1385 TEST_F(FakeDriveServiceTest, RemoveResourceFromDirectory_ExistingFile) { 1386 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1387 "gdata/root_feed.json")); 1388 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1389 "gdata/account_metadata.json")); 1390 1391 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1392 1393 const std::string kResourceId = "file:subdirectory_file_1_id"; 1394 const std::string kParentResourceId = "folder:1_folder_resource_id"; 1395 1396 scoped_ptr<ResourceEntry> resource_entry = FindEntry(kResourceId); 1397 ASSERT_TRUE(resource_entry); 1398 // The parent link should exist now. 1399 const google_apis::Link* parent_link = 1400 resource_entry->GetLinkByType(Link::LINK_PARENT); 1401 ASSERT_TRUE(parent_link); 1402 1403 GDataErrorCode error = GDATA_OTHER_ERROR; 1404 fake_service_.RemoveResourceFromDirectory( 1405 kParentResourceId, 1406 kResourceId, 1407 test_util::CreateCopyResultCallback(&error)); 1408 base::RunLoop().RunUntilIdle(); 1409 1410 EXPECT_EQ(HTTP_SUCCESS, error); 1411 1412 resource_entry = FindEntry(kResourceId); 1413 ASSERT_TRUE(resource_entry); 1414 // The parent link should be gone now. 1415 parent_link = resource_entry->GetLinkByType(Link::LINK_PARENT); 1416 ASSERT_FALSE(parent_link); 1417 // Should be incremented as a file was moved to the root directory. 1418 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1419 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1420 } 1421 1422 TEST_F(FakeDriveServiceTest, RemoveResourceFromDirectory_NonexistingFile) { 1423 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1424 "gdata/root_feed.json")); 1425 1426 const std::string kResourceId = "file:nonexisting_file"; 1427 const std::string kParentResourceId = "folder:1_folder_resource_id"; 1428 1429 GDataErrorCode error = GDATA_OTHER_ERROR; 1430 fake_service_.RemoveResourceFromDirectory( 1431 kParentResourceId, 1432 kResourceId, 1433 test_util::CreateCopyResultCallback(&error)); 1434 base::RunLoop().RunUntilIdle(); 1435 1436 EXPECT_EQ(HTTP_NOT_FOUND, error); 1437 } 1438 1439 TEST_F(FakeDriveServiceTest, RemoveResourceFromDirectory_OrphanFile) { 1440 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1441 "gdata/root_feed.json")); 1442 1443 const std::string kResourceId = "file:1_orphanfile_resource_id"; 1444 const std::string kParentResourceId = fake_service_.GetRootResourceId(); 1445 1446 GDataErrorCode error = GDATA_OTHER_ERROR; 1447 fake_service_.RemoveResourceFromDirectory( 1448 kParentResourceId, 1449 kResourceId, 1450 test_util::CreateCopyResultCallback(&error)); 1451 base::RunLoop().RunUntilIdle(); 1452 1453 EXPECT_EQ(HTTP_NOT_FOUND, error); 1454 } 1455 1456 TEST_F(FakeDriveServiceTest, RemoveResourceFromDirectory_Offline) { 1457 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1458 "gdata/root_feed.json")); 1459 fake_service_.set_offline(true); 1460 1461 const std::string kResourceId = "file:subdirectory_file_1_id"; 1462 const std::string kParentResourceId = "folder:1_folder_resource_id"; 1463 1464 GDataErrorCode error = GDATA_OTHER_ERROR; 1465 fake_service_.RemoveResourceFromDirectory( 1466 kParentResourceId, 1467 kResourceId, 1468 test_util::CreateCopyResultCallback(&error)); 1469 base::RunLoop().RunUntilIdle(); 1470 1471 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1472 } 1473 1474 TEST_F(FakeDriveServiceTest, AddNewDirectory_ToRootDirectory) { 1475 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1476 "gdata/root_feed.json")); 1477 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1478 "gdata/account_metadata.json")); 1479 1480 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1481 1482 GDataErrorCode error = GDATA_OTHER_ERROR; 1483 scoped_ptr<ResourceEntry> resource_entry; 1484 fake_service_.AddNewDirectory( 1485 fake_service_.GetRootResourceId(), 1486 "new directory", 1487 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1488 base::RunLoop().RunUntilIdle(); 1489 1490 EXPECT_EQ(HTTP_CREATED, error); 1491 ASSERT_TRUE(resource_entry); 1492 EXPECT_TRUE(resource_entry->is_folder()); 1493 EXPECT_EQ("resource_id_1", resource_entry->resource_id()); 1494 EXPECT_EQ("new directory", resource_entry->title()); 1495 EXPECT_TRUE(HasParent(resource_entry->resource_id(), 1496 fake_service_.GetRootResourceId())); 1497 // Should be incremented as a new directory was created. 1498 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1499 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1500 } 1501 1502 TEST_F(FakeDriveServiceTest, AddNewDirectory_ToRootDirectoryOnEmptyFileSystem) { 1503 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1504 "gdata/empty_feed.json")); 1505 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1506 "gdata/account_metadata.json")); 1507 1508 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1509 1510 GDataErrorCode error = GDATA_OTHER_ERROR; 1511 scoped_ptr<ResourceEntry> resource_entry; 1512 fake_service_.AddNewDirectory( 1513 fake_service_.GetRootResourceId(), 1514 "new directory", 1515 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1516 base::RunLoop().RunUntilIdle(); 1517 1518 EXPECT_EQ(HTTP_CREATED, error); 1519 ASSERT_TRUE(resource_entry); 1520 EXPECT_TRUE(resource_entry->is_folder()); 1521 EXPECT_EQ("resource_id_1", resource_entry->resource_id()); 1522 EXPECT_EQ("new directory", resource_entry->title()); 1523 EXPECT_TRUE(HasParent(resource_entry->resource_id(), 1524 fake_service_.GetRootResourceId())); 1525 // Should be incremented as a new directory was created. 1526 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1527 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1528 } 1529 1530 TEST_F(FakeDriveServiceTest, AddNewDirectory_ToNonRootDirectory) { 1531 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1532 "gdata/root_feed.json")); 1533 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1534 "gdata/account_metadata.json")); 1535 1536 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1537 1538 const std::string kParentResourceId = "folder:1_folder_resource_id"; 1539 1540 GDataErrorCode error = GDATA_OTHER_ERROR; 1541 scoped_ptr<ResourceEntry> resource_entry; 1542 fake_service_.AddNewDirectory( 1543 kParentResourceId, 1544 "new directory", 1545 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1546 base::RunLoop().RunUntilIdle(); 1547 1548 EXPECT_EQ(HTTP_CREATED, error); 1549 ASSERT_TRUE(resource_entry); 1550 EXPECT_TRUE(resource_entry->is_folder()); 1551 EXPECT_EQ("resource_id_1", resource_entry->resource_id()); 1552 EXPECT_EQ("new directory", resource_entry->title()); 1553 EXPECT_TRUE(HasParent(resource_entry->resource_id(), kParentResourceId)); 1554 // Should be incremented as a new directory was created. 1555 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1556 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1557 } 1558 1559 TEST_F(FakeDriveServiceTest, AddNewDirectory_ToNonexistingDirectory) { 1560 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1561 "gdata/root_feed.json")); 1562 1563 const std::string kParentResourceId = "folder:nonexisting_resource_id"; 1564 1565 GDataErrorCode error = GDATA_OTHER_ERROR; 1566 scoped_ptr<ResourceEntry> resource_entry; 1567 fake_service_.AddNewDirectory( 1568 kParentResourceId, 1569 "new directory", 1570 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1571 base::RunLoop().RunUntilIdle(); 1572 1573 EXPECT_EQ(HTTP_NOT_FOUND, error); 1574 EXPECT_FALSE(resource_entry); 1575 } 1576 1577 TEST_F(FakeDriveServiceTest, AddNewDirectory_Offline) { 1578 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1579 "gdata/root_feed.json")); 1580 fake_service_.set_offline(true); 1581 1582 GDataErrorCode error = GDATA_OTHER_ERROR; 1583 scoped_ptr<ResourceEntry> resource_entry; 1584 fake_service_.AddNewDirectory( 1585 fake_service_.GetRootResourceId(), 1586 "new directory", 1587 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1588 base::RunLoop().RunUntilIdle(); 1589 1590 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1591 EXPECT_FALSE(resource_entry); 1592 } 1593 1594 TEST_F(FakeDriveServiceTest, InitiateUploadNewFile_Offline) { 1595 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1596 "gdata/root_feed.json")); 1597 fake_service_.set_offline(true); 1598 1599 GDataErrorCode error = GDATA_OTHER_ERROR; 1600 GURL upload_location; 1601 fake_service_.InitiateUploadNewFile( 1602 "test/foo", 1603 13, 1604 "folder:1_folder_resource_id", 1605 "new file.foo", 1606 test_util::CreateCopyResultCallback(&error, &upload_location)); 1607 base::RunLoop().RunUntilIdle(); 1608 1609 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1610 EXPECT_TRUE(upload_location.is_empty()); 1611 } 1612 1613 TEST_F(FakeDriveServiceTest, InitiateUploadNewFile_NotFound) { 1614 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1615 "gdata/root_feed.json")); 1616 1617 GDataErrorCode error = GDATA_OTHER_ERROR; 1618 GURL upload_location; 1619 fake_service_.InitiateUploadNewFile( 1620 "test/foo", 1621 13, 1622 "non_existent", 1623 "new file.foo", 1624 test_util::CreateCopyResultCallback(&error, &upload_location)); 1625 base::RunLoop().RunUntilIdle(); 1626 1627 EXPECT_EQ(HTTP_NOT_FOUND, error); 1628 EXPECT_TRUE(upload_location.is_empty()); 1629 } 1630 1631 TEST_F(FakeDriveServiceTest, InitiateUploadNewFile) { 1632 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1633 "gdata/root_feed.json")); 1634 1635 GDataErrorCode error = GDATA_OTHER_ERROR; 1636 GURL upload_location; 1637 fake_service_.InitiateUploadNewFile( 1638 "test/foo", 1639 13, 1640 "folder:1_folder_resource_id", 1641 "new file.foo", 1642 test_util::CreateCopyResultCallback(&error, &upload_location)); 1643 base::RunLoop().RunUntilIdle(); 1644 1645 EXPECT_EQ(HTTP_SUCCESS, error); 1646 EXPECT_FALSE(upload_location.is_empty()); 1647 EXPECT_NE(GURL("https://1_folder_resumable_create_media_link?mode=newfile"), 1648 upload_location); 1649 } 1650 1651 TEST_F(FakeDriveServiceTest, InitiateUploadExistingFile_Offline) { 1652 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1653 "gdata/root_feed.json")); 1654 fake_service_.set_offline(true); 1655 1656 GDataErrorCode error = GDATA_OTHER_ERROR; 1657 GURL upload_location; 1658 fake_service_.InitiateUploadExistingFile( 1659 "test/foo", 1660 13, 1661 "file:2_file_resource_id", 1662 std::string(), // etag 1663 test_util::CreateCopyResultCallback(&error, &upload_location)); 1664 base::RunLoop().RunUntilIdle(); 1665 1666 EXPECT_EQ(GDATA_NO_CONNECTION, error); 1667 EXPECT_TRUE(upload_location.is_empty()); 1668 } 1669 1670 TEST_F(FakeDriveServiceTest, InitiateUploadExistingFile_NotFound) { 1671 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1672 "gdata/root_feed.json")); 1673 1674 GDataErrorCode error = GDATA_OTHER_ERROR; 1675 GURL upload_location; 1676 fake_service_.InitiateUploadExistingFile( 1677 "test/foo", 1678 13, 1679 "non_existent", 1680 std::string(), // etag 1681 test_util::CreateCopyResultCallback(&error, &upload_location)); 1682 base::RunLoop().RunUntilIdle(); 1683 1684 EXPECT_EQ(HTTP_NOT_FOUND, error); 1685 EXPECT_TRUE(upload_location.is_empty()); 1686 } 1687 1688 TEST_F(FakeDriveServiceTest, InitiateUploadExistingFile_WrongETag) { 1689 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1690 "gdata/root_feed.json")); 1691 1692 GDataErrorCode error = GDATA_OTHER_ERROR; 1693 GURL upload_location; 1694 fake_service_.InitiateUploadExistingFile( 1695 "text/plain", 1696 13, 1697 "file:2_file_resource_id", 1698 "invalid_etag", 1699 test_util::CreateCopyResultCallback(&error, &upload_location)); 1700 base::RunLoop().RunUntilIdle(); 1701 1702 EXPECT_EQ(HTTP_PRECONDITION, error); 1703 EXPECT_TRUE(upload_location.is_empty()); 1704 } 1705 1706 TEST_F(FakeDriveServiceTest, InitiateUpload_ExistingFile) { 1707 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1708 "gdata/root_feed.json")); 1709 1710 GDataErrorCode error = GDATA_OTHER_ERROR; 1711 GURL upload_location; 1712 fake_service_.InitiateUploadExistingFile( 1713 "text/plain", 1714 13, 1715 "file:2_file_resource_id", 1716 "\"HhMOFgxXHit7ImBr\"", 1717 test_util::CreateCopyResultCallback(&error, &upload_location)); 1718 base::RunLoop().RunUntilIdle(); 1719 1720 EXPECT_EQ(HTTP_SUCCESS, error); 1721 EXPECT_TRUE(upload_location.is_valid()); 1722 } 1723 1724 TEST_F(FakeDriveServiceTest, ResumeUpload_Offline) { 1725 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1726 "gdata/root_feed.json")); 1727 1728 GDataErrorCode error = GDATA_OTHER_ERROR; 1729 GURL upload_location; 1730 fake_service_.InitiateUploadNewFile( 1731 "test/foo", 1732 15, 1733 "folder:1_folder_resource_id", 1734 "new file.foo", 1735 test_util::CreateCopyResultCallback(&error, &upload_location)); 1736 base::RunLoop().RunUntilIdle(); 1737 1738 EXPECT_EQ(HTTP_SUCCESS, error); 1739 EXPECT_FALSE(upload_location.is_empty()); 1740 EXPECT_NE(GURL("https://1_folder_resumable_create_media_link"), 1741 upload_location); 1742 1743 fake_service_.set_offline(true); 1744 1745 UploadRangeResponse response; 1746 scoped_ptr<ResourceEntry> entry; 1747 fake_service_.ResumeUpload( 1748 upload_location, 1749 0, 13, 15, "test/foo", 1750 base::FilePath(), 1751 test_util::CreateCopyResultCallback(&response, &entry), 1752 ProgressCallback()); 1753 base::RunLoop().RunUntilIdle(); 1754 1755 EXPECT_EQ(GDATA_NO_CONNECTION, response.code); 1756 EXPECT_FALSE(entry.get()); 1757 } 1758 1759 TEST_F(FakeDriveServiceTest, ResumeUpload_NotFound) { 1760 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1761 "gdata/root_feed.json")); 1762 1763 GDataErrorCode error = GDATA_OTHER_ERROR; 1764 GURL upload_location; 1765 fake_service_.InitiateUploadNewFile( 1766 "test/foo", 1767 15, 1768 "folder:1_folder_resource_id", 1769 "new file.foo", 1770 test_util::CreateCopyResultCallback(&error, &upload_location)); 1771 base::RunLoop().RunUntilIdle(); 1772 1773 ASSERT_EQ(HTTP_SUCCESS, error); 1774 1775 UploadRangeResponse response; 1776 scoped_ptr<ResourceEntry> entry; 1777 fake_service_.ResumeUpload( 1778 GURL("https://foo.com/"), 1779 0, 13, 15, "test/foo", 1780 base::FilePath(), 1781 test_util::CreateCopyResultCallback(&response, &entry), 1782 ProgressCallback()); 1783 base::RunLoop().RunUntilIdle(); 1784 1785 EXPECT_EQ(HTTP_NOT_FOUND, response.code); 1786 EXPECT_FALSE(entry.get()); 1787 } 1788 1789 TEST_F(FakeDriveServiceTest, ResumeUpload_ExistingFile) { 1790 base::ScopedTempDir temp_dir; 1791 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1792 base::FilePath local_file_path = 1793 temp_dir.path().Append(FILE_PATH_LITERAL("File 1.txt")); 1794 std::string contents("hogefugapiyo"); 1795 ASSERT_TRUE(test_util::WriteStringToFile(local_file_path, contents)); 1796 1797 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1798 "gdata/root_feed.json")); 1799 1800 GDataErrorCode error = GDATA_OTHER_ERROR; 1801 GURL upload_location; 1802 fake_service_.InitiateUploadExistingFile( 1803 "text/plain", 1804 contents.size(), 1805 "file:2_file_resource_id", 1806 "\"HhMOFgxXHit7ImBr\"", 1807 test_util::CreateCopyResultCallback(&error, &upload_location)); 1808 base::RunLoop().RunUntilIdle(); 1809 1810 ASSERT_EQ(HTTP_SUCCESS, error); 1811 1812 UploadRangeResponse response; 1813 scoped_ptr<ResourceEntry> entry; 1814 std::vector<test_util::ProgressInfo> upload_progress_values; 1815 fake_service_.ResumeUpload( 1816 upload_location, 1817 0, contents.size() / 2, contents.size(), "text/plain", 1818 local_file_path, 1819 test_util::CreateCopyResultCallback(&response, &entry), 1820 base::Bind(&test_util::AppendProgressCallbackResult, 1821 &upload_progress_values)); 1822 base::RunLoop().RunUntilIdle(); 1823 1824 EXPECT_EQ(HTTP_RESUME_INCOMPLETE, response.code); 1825 EXPECT_FALSE(entry.get()); 1826 ASSERT_TRUE(!upload_progress_values.empty()); 1827 EXPECT_TRUE(base::STLIsSorted(upload_progress_values)); 1828 EXPECT_LE(0, upload_progress_values.front().first); 1829 EXPECT_GE(static_cast<int64>(contents.size() / 2), 1830 upload_progress_values.back().first); 1831 1832 upload_progress_values.clear(); 1833 fake_service_.ResumeUpload( 1834 upload_location, 1835 contents.size() / 2, contents.size(), contents.size(), "text/plain", 1836 local_file_path, 1837 test_util::CreateCopyResultCallback(&response, &entry), 1838 base::Bind(&test_util::AppendProgressCallbackResult, 1839 &upload_progress_values)); 1840 base::RunLoop().RunUntilIdle(); 1841 1842 EXPECT_EQ(HTTP_SUCCESS, response.code); 1843 EXPECT_TRUE(entry.get()); 1844 EXPECT_EQ(static_cast<int64>(contents.size()), 1845 entry->file_size()); 1846 EXPECT_TRUE(Exists(entry->resource_id())); 1847 ASSERT_TRUE(!upload_progress_values.empty()); 1848 EXPECT_TRUE(base::STLIsSorted(upload_progress_values)); 1849 EXPECT_LE(0, upload_progress_values.front().first); 1850 EXPECT_GE(static_cast<int64>(contents.size() - contents.size() / 2), 1851 upload_progress_values.back().first); 1852 EXPECT_EQ(base::MD5String(contents), entry->file_md5()); 1853 } 1854 1855 TEST_F(FakeDriveServiceTest, ResumeUpload_NewFile) { 1856 base::ScopedTempDir temp_dir; 1857 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); 1858 base::FilePath local_file_path = 1859 temp_dir.path().Append(FILE_PATH_LITERAL("new file.foo")); 1860 std::string contents("hogefugapiyo"); 1861 ASSERT_TRUE(test_util::WriteStringToFile(local_file_path, contents)); 1862 1863 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1864 "gdata/root_feed.json")); 1865 1866 GDataErrorCode error = GDATA_OTHER_ERROR; 1867 GURL upload_location; 1868 fake_service_.InitiateUploadNewFile( 1869 "test/foo", 1870 contents.size(), 1871 "folder:1_folder_resource_id", 1872 "new file.foo", 1873 test_util::CreateCopyResultCallback(&error, &upload_location)); 1874 base::RunLoop().RunUntilIdle(); 1875 1876 EXPECT_EQ(HTTP_SUCCESS, error); 1877 EXPECT_FALSE(upload_location.is_empty()); 1878 EXPECT_NE(GURL("https://1_folder_resumable_create_media_link"), 1879 upload_location); 1880 1881 UploadRangeResponse response; 1882 scoped_ptr<ResourceEntry> entry; 1883 std::vector<test_util::ProgressInfo> upload_progress_values; 1884 fake_service_.ResumeUpload( 1885 upload_location, 1886 0, contents.size() / 2, contents.size(), "test/foo", 1887 local_file_path, 1888 test_util::CreateCopyResultCallback(&response, &entry), 1889 base::Bind(&test_util::AppendProgressCallbackResult, 1890 &upload_progress_values)); 1891 base::RunLoop().RunUntilIdle(); 1892 1893 EXPECT_EQ(HTTP_RESUME_INCOMPLETE, response.code); 1894 EXPECT_FALSE(entry.get()); 1895 ASSERT_TRUE(!upload_progress_values.empty()); 1896 EXPECT_TRUE(base::STLIsSorted(upload_progress_values)); 1897 EXPECT_LE(0, upload_progress_values.front().first); 1898 EXPECT_GE(static_cast<int64>(contents.size() / 2), 1899 upload_progress_values.back().first); 1900 1901 upload_progress_values.clear(); 1902 fake_service_.ResumeUpload( 1903 upload_location, 1904 contents.size() / 2, contents.size(), contents.size(), "test/foo", 1905 local_file_path, 1906 test_util::CreateCopyResultCallback(&response, &entry), 1907 base::Bind(&test_util::AppendProgressCallbackResult, 1908 &upload_progress_values)); 1909 base::RunLoop().RunUntilIdle(); 1910 1911 EXPECT_EQ(HTTP_CREATED, response.code); 1912 EXPECT_TRUE(entry.get()); 1913 EXPECT_EQ(static_cast<int64>(contents.size()), entry->file_size()); 1914 EXPECT_TRUE(Exists(entry->resource_id())); 1915 ASSERT_TRUE(!upload_progress_values.empty()); 1916 EXPECT_TRUE(base::STLIsSorted(upload_progress_values)); 1917 EXPECT_LE(0, upload_progress_values.front().first); 1918 EXPECT_GE(static_cast<int64>(contents.size() - contents.size() / 2), 1919 upload_progress_values.back().first); 1920 EXPECT_EQ(base::MD5String(contents), entry->file_md5()); 1921 } 1922 1923 TEST_F(FakeDriveServiceTest, AddNewFile_ToRootDirectory) { 1924 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1925 "gdata/root_feed.json")); 1926 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1927 "gdata/account_metadata.json")); 1928 1929 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1930 1931 const std::string kContentType = "text/plain"; 1932 const std::string kContentData = "This is some test content."; 1933 const std::string kTitle = "new file"; 1934 1935 GDataErrorCode error = GDATA_OTHER_ERROR; 1936 scoped_ptr<ResourceEntry> resource_entry; 1937 fake_service_.AddNewFile( 1938 kContentType, 1939 kContentData, 1940 fake_service_.GetRootResourceId(), 1941 kTitle, 1942 false, // shared_with_me 1943 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1944 base::RunLoop().RunUntilIdle(); 1945 1946 EXPECT_EQ(HTTP_CREATED, error); 1947 ASSERT_TRUE(resource_entry); 1948 EXPECT_TRUE(resource_entry->is_file()); 1949 EXPECT_EQ(kContentType, resource_entry->content_mime_type()); 1950 EXPECT_EQ(static_cast<int64>(kContentData.size()), 1951 resource_entry->file_size()); 1952 EXPECT_EQ("resource_id_1", resource_entry->resource_id()); 1953 EXPECT_EQ(kTitle, resource_entry->title()); 1954 EXPECT_TRUE(HasParent(resource_entry->resource_id(), 1955 fake_service_.GetRootResourceId())); 1956 // Should be incremented as a new directory was created. 1957 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1958 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1959 EXPECT_EQ(base::MD5String(kContentData), resource_entry->file_md5()); 1960 } 1961 1962 TEST_F(FakeDriveServiceTest, AddNewFile_ToRootDirectoryOnEmptyFileSystem) { 1963 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 1964 "gdata/empty_feed.json")); 1965 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 1966 "gdata/account_metadata.json")); 1967 1968 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 1969 1970 const std::string kContentType = "text/plain"; 1971 const std::string kContentData = "This is some test content."; 1972 const std::string kTitle = "new file"; 1973 1974 GDataErrorCode error = GDATA_OTHER_ERROR; 1975 scoped_ptr<ResourceEntry> resource_entry; 1976 fake_service_.AddNewFile( 1977 kContentType, 1978 kContentData, 1979 fake_service_.GetRootResourceId(), 1980 kTitle, 1981 false, // shared_with_me 1982 test_util::CreateCopyResultCallback(&error, &resource_entry)); 1983 base::RunLoop().RunUntilIdle(); 1984 1985 EXPECT_EQ(HTTP_CREATED, error); 1986 ASSERT_TRUE(resource_entry); 1987 EXPECT_TRUE(resource_entry->is_file()); 1988 EXPECT_EQ(kContentType, resource_entry->content_mime_type()); 1989 EXPECT_EQ(static_cast<int64>(kContentData.size()), 1990 resource_entry->file_size()); 1991 EXPECT_EQ("resource_id_1", resource_entry->resource_id()); 1992 EXPECT_EQ(kTitle, resource_entry->title()); 1993 EXPECT_TRUE(HasParent(resource_entry->resource_id(), 1994 fake_service_.GetRootResourceId())); 1995 // Should be incremented as a new directory was created. 1996 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 1997 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 1998 EXPECT_EQ(base::MD5String(kContentData), resource_entry->file_md5()); 1999 } 2000 2001 TEST_F(FakeDriveServiceTest, AddNewFile_ToNonRootDirectory) { 2002 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 2003 "gdata/root_feed.json")); 2004 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 2005 "gdata/account_metadata.json")); 2006 2007 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 2008 2009 const std::string kContentType = "text/plain"; 2010 const std::string kContentData = "This is some test content."; 2011 const std::string kTitle = "new file"; 2012 const std::string kParentResourceId = "folder:1_folder_resource_id"; 2013 2014 GDataErrorCode error = GDATA_OTHER_ERROR; 2015 scoped_ptr<ResourceEntry> resource_entry; 2016 fake_service_.AddNewFile( 2017 kContentType, 2018 kContentData, 2019 kParentResourceId, 2020 kTitle, 2021 false, // shared_with_me 2022 test_util::CreateCopyResultCallback(&error, &resource_entry)); 2023 base::RunLoop().RunUntilIdle(); 2024 2025 EXPECT_EQ(HTTP_CREATED, error); 2026 ASSERT_TRUE(resource_entry); 2027 EXPECT_TRUE(resource_entry->is_file()); 2028 EXPECT_EQ(kContentType, resource_entry->content_mime_type()); 2029 EXPECT_EQ(static_cast<int64>(kContentData.size()), 2030 resource_entry->file_size()); 2031 EXPECT_EQ("resource_id_1", resource_entry->resource_id()); 2032 EXPECT_EQ(kTitle, resource_entry->title()); 2033 EXPECT_TRUE(HasParent(resource_entry->resource_id(), kParentResourceId)); 2034 // Should be incremented as a new directory was created. 2035 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 2036 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 2037 EXPECT_EQ(base::MD5String(kContentData), resource_entry->file_md5()); 2038 } 2039 2040 TEST_F(FakeDriveServiceTest, AddNewFile_ToNonexistingDirectory) { 2041 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 2042 "gdata/root_feed.json")); 2043 2044 const std::string kContentType = "text/plain"; 2045 const std::string kContentData = "This is some test content."; 2046 const std::string kTitle = "new file"; 2047 const std::string kParentResourceId = "folder:nonexisting_resource_id"; 2048 2049 GDataErrorCode error = GDATA_OTHER_ERROR; 2050 scoped_ptr<ResourceEntry> resource_entry; 2051 fake_service_.AddNewFile( 2052 kContentType, 2053 kContentData, 2054 kParentResourceId, 2055 kTitle, 2056 false, // shared_with_me 2057 test_util::CreateCopyResultCallback(&error, &resource_entry)); 2058 base::RunLoop().RunUntilIdle(); 2059 2060 EXPECT_EQ(HTTP_NOT_FOUND, error); 2061 EXPECT_FALSE(resource_entry); 2062 } 2063 2064 TEST_F(FakeDriveServiceTest, AddNewFile_Offline) { 2065 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 2066 "gdata/root_feed.json")); 2067 fake_service_.set_offline(true); 2068 2069 const std::string kContentType = "text/plain"; 2070 const std::string kContentData = "This is some test content."; 2071 const std::string kTitle = "new file"; 2072 2073 GDataErrorCode error = GDATA_OTHER_ERROR; 2074 scoped_ptr<ResourceEntry> resource_entry; 2075 fake_service_.AddNewFile( 2076 kContentType, 2077 kContentData, 2078 fake_service_.GetRootResourceId(), 2079 kTitle, 2080 false, // shared_with_me 2081 test_util::CreateCopyResultCallback(&error, &resource_entry)); 2082 base::RunLoop().RunUntilIdle(); 2083 2084 EXPECT_EQ(GDATA_NO_CONNECTION, error); 2085 EXPECT_FALSE(resource_entry); 2086 } 2087 2088 TEST_F(FakeDriveServiceTest, AddNewFile_SharedWithMeLabel) { 2089 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 2090 "gdata/root_feed.json")); 2091 ASSERT_TRUE(fake_service_.LoadAccountMetadataForWapi( 2092 "gdata/account_metadata.json")); 2093 2094 const std::string kContentType = "text/plain"; 2095 const std::string kContentData = "This is some test content."; 2096 const std::string kTitle = "new file"; 2097 2098 int64 old_largest_change_id = GetLargestChangeByAboutResource(); 2099 2100 GDataErrorCode error = GDATA_OTHER_ERROR; 2101 scoped_ptr<ResourceEntry> resource_entry; 2102 fake_service_.AddNewFile( 2103 kContentType, 2104 kContentData, 2105 fake_service_.GetRootResourceId(), 2106 kTitle, 2107 true, // shared_with_me 2108 test_util::CreateCopyResultCallback(&error, &resource_entry)); 2109 base::RunLoop().RunUntilIdle(); 2110 2111 EXPECT_EQ(HTTP_CREATED, error); 2112 ASSERT_TRUE(resource_entry); 2113 EXPECT_TRUE(resource_entry->is_file()); 2114 EXPECT_EQ(kContentType, resource_entry->content_mime_type()); 2115 EXPECT_EQ(static_cast<int64>(kContentData.size()), 2116 resource_entry->file_size()); 2117 EXPECT_EQ("resource_id_1", resource_entry->resource_id()); 2118 EXPECT_EQ(kTitle, resource_entry->title()); 2119 EXPECT_TRUE(HasParent(resource_entry->resource_id(), 2120 fake_service_.GetRootResourceId())); 2121 ASSERT_EQ(1U, resource_entry->labels().size()); 2122 EXPECT_EQ("shared-with-me", resource_entry->labels()[0]); 2123 // Should be incremented as a new directory was created. 2124 EXPECT_EQ(old_largest_change_id + 1, fake_service_.largest_changestamp()); 2125 EXPECT_EQ(old_largest_change_id + 1, GetLargestChangeByAboutResource()); 2126 EXPECT_EQ(base::MD5String(kContentData), resource_entry->file_md5()); 2127 } 2128 2129 TEST_F(FakeDriveServiceTest, SetLastModifiedTime_ExistingFile) { 2130 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 2131 "gdata/root_feed.json")); 2132 2133 const std::string kResourceId = "file:2_file_resource_id"; 2134 base::Time time; 2135 ASSERT_TRUE(base::Time::FromString("1 April 2013 12:34:56", &time)); 2136 2137 GDataErrorCode error = GDATA_OTHER_ERROR; 2138 scoped_ptr<ResourceEntry> resource_entry; 2139 fake_service_.SetLastModifiedTime( 2140 kResourceId, 2141 time, 2142 test_util::CreateCopyResultCallback(&error, &resource_entry)); 2143 base::RunLoop().RunUntilIdle(); 2144 2145 EXPECT_EQ(HTTP_SUCCESS, error); 2146 ASSERT_TRUE(resource_entry); 2147 EXPECT_EQ(time, resource_entry->updated_time()); 2148 } 2149 2150 TEST_F(FakeDriveServiceTest, SetLastModifiedTime_NonexistingFile) { 2151 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 2152 "gdata/root_feed.json")); 2153 2154 const std::string kResourceId = "file:nonexisting_resource_id"; 2155 base::Time time; 2156 ASSERT_TRUE(base::Time::FromString("1 April 2013 12:34:56", &time)); 2157 2158 GDataErrorCode error = GDATA_OTHER_ERROR; 2159 scoped_ptr<ResourceEntry> resource_entry; 2160 fake_service_.SetLastModifiedTime( 2161 kResourceId, 2162 time, 2163 test_util::CreateCopyResultCallback(&error, &resource_entry)); 2164 base::RunLoop().RunUntilIdle(); 2165 2166 EXPECT_EQ(HTTP_NOT_FOUND, error); 2167 EXPECT_FALSE(resource_entry); 2168 } 2169 2170 TEST_F(FakeDriveServiceTest, SetLastModifiedTime_Offline) { 2171 ASSERT_TRUE(fake_service_.LoadResourceListForWapi( 2172 "gdata/root_feed.json")); 2173 fake_service_.set_offline(true); 2174 2175 const std::string kResourceId = "file:2_file_resource_id"; 2176 base::Time time; 2177 ASSERT_TRUE(base::Time::FromString("1 April 2013 12:34:56", &time)); 2178 2179 GDataErrorCode error = GDATA_OTHER_ERROR; 2180 scoped_ptr<ResourceEntry> resource_entry; 2181 fake_service_.SetLastModifiedTime( 2182 kResourceId, 2183 time, 2184 test_util::CreateCopyResultCallback(&error, &resource_entry)); 2185 base::RunLoop().RunUntilIdle(); 2186 2187 EXPECT_EQ(GDATA_NO_CONNECTION, error); 2188 EXPECT_FALSE(resource_entry); 2189 } 2190 2191 } // namespace 2192 2193 } // namespace drive 2194