| OLD | NEW |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
" | 5 #include "chrome/browser/sync_file_system/drive_backend/local_to_remote_syncer.h
" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/callback.h" | 10 #include "base/callback.h" |
| (...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 if (retry_count++ > kRetryLimit) | 203 if (retry_count++ > kRetryLimit) |
| 204 break; | 204 break; |
| 205 status = RunRemoteToLocalSyncer(); | 205 status = RunRemoteToLocalSyncer(); |
| 206 } while (status == SYNC_STATUS_OK || | 206 } while (status == SYNC_STATUS_OK || |
| 207 status == SYNC_STATUS_RETRY || | 207 status == SYNC_STATUS_RETRY || |
| 208 GetMetadataDatabase()->PromoteDemotedTrackers()); | 208 GetMetadataDatabase()->PromoteDemotedTrackers()); |
| 209 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, status); | 209 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, status); |
| 210 return status; | 210 return status; |
| 211 } | 211 } |
| 212 | 212 |
| 213 ScopedVector<google_apis::FileResource> | 213 std::vector<std::unique_ptr<google_apis::FileResource>> |
| 214 GetResourceEntriesForParentAndTitle(const std::string& parent_folder_id, | 214 GetResourceEntriesForParentAndTitle(const std::string& parent_folder_id, |
| 215 const std::string& title) { | 215 const std::string& title) { |
| 216 ScopedVector<google_apis::FileResource> entries; | 216 std::vector<std::unique_ptr<google_apis::FileResource>> entries; |
| 217 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 217 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| 218 fake_drive_helper_->SearchByTitle( | 218 fake_drive_helper_->SearchByTitle( |
| 219 parent_folder_id, title, &entries)); | 219 parent_folder_id, title, &entries)); |
| 220 return entries; | 220 return entries; |
| 221 } | 221 } |
| 222 | 222 |
| 223 std::string GetFileIDForParentAndTitle(const std::string& parent_folder_id, | 223 std::string GetFileIDForParentAndTitle(const std::string& parent_folder_id, |
| 224 const std::string& title) { | 224 const std::string& title) { |
| 225 ScopedVector<google_apis::FileResource> entries = | 225 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 226 GetResourceEntriesForParentAndTitle(parent_folder_id, title); | 226 GetResourceEntriesForParentAndTitle(parent_folder_id, title); |
| 227 if (entries.size() != 1) | 227 if (entries.size() != 1) |
| 228 return std::string(); | 228 return std::string(); |
| 229 return entries[0]->file_id(); | 229 return entries[0]->file_id(); |
| 230 } | 230 } |
| 231 | 231 |
| 232 void VerifyTitleUniqueness( | 232 void VerifyTitleUniqueness( |
| 233 const std::string& parent_folder_id, | 233 const std::string& parent_folder_id, |
| 234 const std::string& title, | 234 const std::string& title, |
| 235 test_util::FileResourceKind kind) { | 235 test_util::FileResourceKind kind) { |
| 236 ScopedVector<google_apis::FileResource> entries; | 236 std::vector<std::unique_ptr<google_apis::FileResource>> entries; |
| 237 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 237 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| 238 fake_drive_helper_->SearchByTitle( | 238 fake_drive_helper_->SearchByTitle( |
| 239 parent_folder_id, title, &entries)); | 239 parent_folder_id, title, &entries)); |
| 240 ASSERT_EQ(1u, entries.size()); | 240 ASSERT_EQ(1u, entries.size()); |
| 241 EXPECT_EQ(kind, test_util::GetFileResourceKind(*entries[0])); | 241 EXPECT_EQ(kind, test_util::GetFileResourceKind(*entries[0])); |
| 242 } | 242 } |
| 243 | 243 |
| 244 void VerifyFileDeletion(const std::string& parent_folder_id, | 244 void VerifyFileDeletion(const std::string& parent_folder_id, |
| 245 const std::string& title) { | 245 const std::string& title) { |
| 246 ScopedVector<google_apis::FileResource> entries; | 246 std::vector<std::unique_ptr<google_apis::FileResource>> entries; |
| 247 EXPECT_EQ(google_apis::HTTP_SUCCESS, | 247 EXPECT_EQ(google_apis::HTTP_SUCCESS, |
| 248 fake_drive_helper_->SearchByTitle( | 248 fake_drive_helper_->SearchByTitle( |
| 249 parent_folder_id, title, &entries)); | 249 parent_folder_id, title, &entries)); |
| 250 EXPECT_TRUE(entries.empty()); | 250 EXPECT_TRUE(entries.empty()); |
| 251 } | 251 } |
| 252 | 252 |
| 253 private: | 253 private: |
| 254 content::TestBrowserThreadBundle thread_bundle_; | 254 content::TestBrowserThreadBundle thread_bundle_; |
| 255 base::ScopedTempDir database_dir_; | 255 base::ScopedTempDir database_dir_; |
| 256 std::unique_ptr<leveldb::Env> in_memory_env_; | 256 std::unique_ptr<leveldb::Env> in_memory_env_; |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 370 RegisterApp(kOrigin.host(), app_root); | 370 RegisterApp(kOrigin.host(), app_root); |
| 371 | 371 |
| 372 CreateRemoteFolder(app_root, "foo"); | 372 CreateRemoteFolder(app_root, "foo"); |
| 373 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 373 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 374 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 374 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
| 375 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 375 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 376 SYNC_FILE_TYPE_FILE), | 376 SYNC_FILE_TYPE_FILE), |
| 377 URL(kOrigin, "foo"))); | 377 URL(kOrigin, "foo"))); |
| 378 | 378 |
| 379 // There should exist both file and folder on remote. | 379 // There should exist both file and folder on remote. |
| 380 ScopedVector<google_apis::FileResource> entries = | 380 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 381 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 381 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
| 382 ASSERT_EQ(2u, entries.size()); | 382 ASSERT_EQ(2u, entries.size()); |
| 383 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, | 383 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, |
| 384 test_util::GetFileResourceKind(*entries[0])); | 384 test_util::GetFileResourceKind(*entries[0])); |
| 385 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 385 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
| 386 test_util::GetFileResourceKind(*entries[1])); | 386 test_util::GetFileResourceKind(*entries[1])); |
| 387 } | 387 } |
| 388 | 388 |
| 389 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFolderOnFile) { | 389 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFolderOnFile) { |
| 390 const GURL kOrigin("chrome-extension://example"); | 390 const GURL kOrigin("chrome-extension://example"); |
| 391 const std::string sync_root = CreateSyncRoot(); | 391 const std::string sync_root = CreateSyncRoot(); |
| 392 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 392 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
| 393 InitializeMetadataDatabase(); | 393 InitializeMetadataDatabase(); |
| 394 RegisterApp(kOrigin.host(), app_root); | 394 RegisterApp(kOrigin.host(), app_root); |
| 395 | 395 |
| 396 CreateRemoteFile(app_root, "foo", "data"); | 396 CreateRemoteFile(app_root, "foo", "data"); |
| 397 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 397 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 398 | 398 |
| 399 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 399 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
| 400 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 400 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 401 SYNC_FILE_TYPE_DIRECTORY), | 401 SYNC_FILE_TYPE_DIRECTORY), |
| 402 URL(kOrigin, "foo"))); | 402 URL(kOrigin, "foo"))); |
| 403 | 403 |
| 404 // There should exist both file and folder on remote. | 404 // There should exist both file and folder on remote. |
| 405 ScopedVector<google_apis::FileResource> entries = | 405 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 406 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 406 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
| 407 ASSERT_EQ(2u, entries.size()); | 407 ASSERT_EQ(2u, entries.size()); |
| 408 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 408 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
| 409 test_util::GetFileResourceKind(*entries[0])); | 409 test_util::GetFileResourceKind(*entries[0])); |
| 410 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, | 410 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, |
| 411 test_util::GetFileResourceKind(*entries[1])); | 411 test_util::GetFileResourceKind(*entries[1])); |
| 412 } | 412 } |
| 413 | 413 |
| 414 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFileOnFile) { | 414 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFileOnFile) { |
| 415 const GURL kOrigin("chrome-extension://example"); | 415 const GURL kOrigin("chrome-extension://example"); |
| 416 const std::string sync_root = CreateSyncRoot(); | 416 const std::string sync_root = CreateSyncRoot(); |
| 417 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 417 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
| 418 InitializeMetadataDatabase(); | 418 InitializeMetadataDatabase(); |
| 419 RegisterApp(kOrigin.host(), app_root); | 419 RegisterApp(kOrigin.host(), app_root); |
| 420 | 420 |
| 421 CreateRemoteFile(app_root, "foo", "data"); | 421 CreateRemoteFile(app_root, "foo", "data"); |
| 422 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 422 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 423 | 423 |
| 424 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 424 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
| 425 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 425 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 426 SYNC_FILE_TYPE_FILE), | 426 SYNC_FILE_TYPE_FILE), |
| 427 URL(kOrigin, "foo"))); | 427 URL(kOrigin, "foo"))); |
| 428 | 428 |
| 429 // There should exist both files on remote. | 429 // There should exist both files on remote. |
| 430 ScopedVector<google_apis::FileResource> entries = | 430 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 431 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 431 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
| 432 ASSERT_EQ(2u, entries.size()); | 432 ASSERT_EQ(2u, entries.size()); |
| 433 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 433 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
| 434 test_util::GetFileResourceKind(*entries[0])); | 434 test_util::GetFileResourceKind(*entries[0])); |
| 435 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 435 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
| 436 test_util::GetFileResourceKind(*entries[1])); | 436 test_util::GetFileResourceKind(*entries[1])); |
| 437 } | 437 } |
| 438 | 438 |
| 439 TEST_F(LocalToRemoteSyncerTest, Conflict_UpdateDeleteOnFile) { | 439 TEST_F(LocalToRemoteSyncerTest, Conflict_UpdateDeleteOnFile) { |
| 440 const GURL kOrigin("chrome-extension://example"); | 440 const GURL kOrigin("chrome-extension://example"); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 452 | 452 |
| 453 EXPECT_EQ(SYNC_STATUS_FILE_BUSY, RunLocalToRemoteSyncer( | 453 EXPECT_EQ(SYNC_STATUS_FILE_BUSY, RunLocalToRemoteSyncer( |
| 454 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 454 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 455 SYNC_FILE_TYPE_FILE), | 455 SYNC_FILE_TYPE_FILE), |
| 456 URL(kOrigin, "foo"))); | 456 URL(kOrigin, "foo"))); |
| 457 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 457 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
| 458 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 458 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 459 SYNC_FILE_TYPE_FILE), | 459 SYNC_FILE_TYPE_FILE), |
| 460 URL(kOrigin, "foo"))); | 460 URL(kOrigin, "foo"))); |
| 461 | 461 |
| 462 ScopedVector<google_apis::FileResource> entries = | 462 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 463 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 463 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
| 464 ASSERT_EQ(1u, entries.size()); | 464 ASSERT_EQ(1u, entries.size()); |
| 465 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 465 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
| 466 test_util::GetFileResourceKind(*entries[0])); | 466 test_util::GetFileResourceKind(*entries[0])); |
| 467 EXPECT_TRUE(!entries[0]->labels().is_trashed()); | 467 EXPECT_TRUE(!entries[0]->labels().is_trashed()); |
| 468 EXPECT_NE(file_id, entries[0]->file_id()); | 468 EXPECT_NE(file_id, entries[0]->file_id()); |
| 469 } | 469 } |
| 470 | 470 |
| 471 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateDeleteOnFile) { | 471 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateDeleteOnFile) { |
| 472 const GURL kOrigin("chrome-extension://example"); | 472 const GURL kOrigin("chrome-extension://example"); |
| 473 const std::string sync_root = CreateSyncRoot(); | 473 const std::string sync_root = CreateSyncRoot(); |
| 474 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 474 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
| 475 InitializeMetadataDatabase(); | 475 InitializeMetadataDatabase(); |
| 476 RegisterApp(kOrigin.host(), app_root); | 476 RegisterApp(kOrigin.host(), app_root); |
| 477 | 477 |
| 478 const std::string file_id = CreateRemoteFile(app_root, "foo", "data"); | 478 const std::string file_id = CreateRemoteFile(app_root, "foo", "data"); |
| 479 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 479 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 480 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, | 480 EXPECT_EQ(SYNC_STATUS_NO_CHANGE_TO_SYNC, |
| 481 RunRemoteToLocalSyncerUntilIdle()); | 481 RunRemoteToLocalSyncerUntilIdle()); |
| 482 | 482 |
| 483 DeleteResource(file_id); | 483 DeleteResource(file_id); |
| 484 | 484 |
| 485 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); | 485 EXPECT_EQ(SYNC_STATUS_OK, ListChanges()); |
| 486 | 486 |
| 487 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 487 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
| 488 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 488 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 489 SYNC_FILE_TYPE_FILE), | 489 SYNC_FILE_TYPE_FILE), |
| 490 URL(kOrigin, "foo"))); | 490 URL(kOrigin, "foo"))); |
| 491 | 491 |
| 492 ScopedVector<google_apis::FileResource> entries = | 492 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 493 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 493 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
| 494 ASSERT_EQ(1u, entries.size()); | 494 ASSERT_EQ(1u, entries.size()); |
| 495 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, | 495 EXPECT_EQ(test_util::RESOURCE_KIND_FILE, |
| 496 test_util::GetFileResourceKind(*entries[0])); | 496 test_util::GetFileResourceKind(*entries[0])); |
| 497 EXPECT_TRUE(!entries[0]->labels().is_trashed()); | 497 EXPECT_TRUE(!entries[0]->labels().is_trashed()); |
| 498 EXPECT_NE(file_id, entries[0]->file_id()); | 498 EXPECT_NE(file_id, entries[0]->file_id()); |
| 499 } | 499 } |
| 500 | 500 |
| 501 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFolderOnFolder) { | 501 TEST_F(LocalToRemoteSyncerTest, Conflict_CreateFolderOnFolder) { |
| 502 const GURL kOrigin("chrome-extension://example"); | 502 const GURL kOrigin("chrome-extension://example"); |
| 503 const std::string sync_root = CreateSyncRoot(); | 503 const std::string sync_root = CreateSyncRoot(); |
| 504 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); | 504 const std::string app_root = CreateRemoteFolder(sync_root, kOrigin.host()); |
| 505 InitializeMetadataDatabase(); | 505 InitializeMetadataDatabase(); |
| 506 RegisterApp(kOrigin.host(), app_root); | 506 RegisterApp(kOrigin.host(), app_root); |
| 507 | 507 |
| 508 const std::string folder_id = CreateRemoteFolder(app_root, "foo"); | 508 const std::string folder_id = CreateRemoteFolder(app_root, "foo"); |
| 509 | 509 |
| 510 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( | 510 EXPECT_EQ(SYNC_STATUS_OK, RunLocalToRemoteSyncer( |
| 511 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 511 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 512 SYNC_FILE_TYPE_DIRECTORY), | 512 SYNC_FILE_TYPE_DIRECTORY), |
| 513 URL(kOrigin, "foo"))); | 513 URL(kOrigin, "foo"))); |
| 514 | 514 |
| 515 ScopedVector<google_apis::FileResource> entries = | 515 std::vector<std::unique_ptr<google_apis::FileResource>> entries = |
| 516 GetResourceEntriesForParentAndTitle(app_root, "foo"); | 516 GetResourceEntriesForParentAndTitle(app_root, "foo"); |
| 517 ASSERT_EQ(2u, entries.size()); | 517 ASSERT_EQ(2u, entries.size()); |
| 518 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, | 518 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, |
| 519 test_util::GetFileResourceKind(*entries[0])); | 519 test_util::GetFileResourceKind(*entries[0])); |
| 520 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, | 520 EXPECT_EQ(test_util::RESOURCE_KIND_FOLDER, |
| 521 test_util::GetFileResourceKind(*entries[1])); | 521 test_util::GetFileResourceKind(*entries[1])); |
| 522 EXPECT_TRUE(!entries[0]->labels().is_trashed()); | 522 EXPECT_TRUE(!entries[0]->labels().is_trashed()); |
| 523 EXPECT_TRUE(!entries[1]->labels().is_trashed()); | 523 EXPECT_TRUE(!entries[1]->labels().is_trashed()); |
| 524 EXPECT_TRUE(folder_id == entries[0]->file_id() || | 524 EXPECT_TRUE(folder_id == entries[0]->file_id() || |
| 525 folder_id == entries[1]->file_id()); | 525 folder_id == entries[1]->file_id()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 546 EXPECT_EQ(SYNC_STATUS_UNKNOWN_ORIGIN, RunLocalToRemoteSyncer( | 546 EXPECT_EQ(SYNC_STATUS_UNKNOWN_ORIGIN, RunLocalToRemoteSyncer( |
| 547 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, | 547 FileChange(FileChange::FILE_CHANGE_ADD_OR_UPDATE, |
| 548 SYNC_FILE_TYPE_DIRECTORY), | 548 SYNC_FILE_TYPE_DIRECTORY), |
| 549 URL(kOrigin, "foo"))); | 549 URL(kOrigin, "foo"))); |
| 550 | 550 |
| 551 // SyncEngine will re-register the app and resurrect the app root later. | 551 // SyncEngine will re-register the app and resurrect the app root later. |
| 552 } | 552 } |
| 553 | 553 |
| 554 } // namespace drive_backend | 554 } // namespace drive_backend |
| 555 } // namespace sync_file_system | 555 } // namespace sync_file_system |
| OLD | NEW |