Home | History | Annotate | Download | only in drive_backend
      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
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/sync_file_system/drive_backend/drive_metadata_store.h"
      6 
      7 #include <utility>
      8 
      9 #include "base/files/file_path.h"
     10 #include "base/files/scoped_temp_dir.h"
     11 #include "base/message_loop/message_loop.h"
     12 #include "base/single_thread_task_runner.h"
     13 #include "base/stl_util.h"
     14 #include "base/strings/string_number_conversions.h"
     15 #include "base/strings/string_util.h"
     16 #include "base/threading/thread.h"
     17 #include "base/values.h"
     18 #include "chrome/browser/sync_file_system/drive_backend/drive_file_sync_service.h"
     19 #include "chrome/browser/sync_file_system/drive_backend/drive_file_sync_util.h"
     20 #include "chrome/browser/sync_file_system/drive_backend/metadata_db_migration_util.h"
     21 #include "chrome/browser/sync_file_system/sync_file_system.pb.h"
     22 #include "chrome/browser/sync_file_system/syncable_file_system_util.h"
     23 #include "content/public/browser/browser_thread.h"
     24 #include "testing/gtest/include/gtest/gtest.h"
     25 #include "third_party/leveldatabase/src/include/leveldb/db.h"
     26 #include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
     27 #include "webkit/browser/fileapi/isolated_context.h"
     28 
     29 #define FPL FILE_PATH_LITERAL
     30 
     31 using content::BrowserThread;
     32 
     33 namespace sync_file_system {
     34 
     35 namespace {
     36 
     37 const char kOrigin[] = "chrome-extension://example";
     38 
     39 typedef DriveMetadataStore::ResourceIdByOrigin ResourceIdByOrigin;
     40 typedef DriveMetadataStore::OriginByResourceId OriginByResourceId;
     41 
     42 fileapi::FileSystemURL URL(const base::FilePath& path) {
     43   return CreateSyncableFileSystemURL(GURL(kOrigin), path);
     44 }
     45 
     46 std::string GetResourceID(const ResourceIdByOrigin& sync_origins,
     47                           const GURL& origin) {
     48   ResourceIdByOrigin::const_iterator itr = sync_origins.find(origin);
     49   if (itr == sync_origins.end())
     50     return std::string();
     51   return itr->second;
     52 }
     53 
     54 std::string CreateResourceId(const std::string& resource_id) {
     55   return IsDriveAPIDisabled() ? resource_id
     56                               : drive_backend::RemoveWapiIdPrefix(resource_id);
     57 }
     58 
     59 DriveMetadata CreateMetadata(const std::string& resource_id,
     60                              const std::string& md5_checksum,
     61                              bool conflicted,
     62                              bool to_be_fetched,
     63                              DriveMetadata_ResourceType file_type) {
     64   DriveMetadata metadata;
     65   metadata.set_resource_id(CreateResourceId(resource_id));
     66   metadata.set_md5_checksum(md5_checksum);
     67   metadata.set_conflicted(conflicted);
     68   metadata.set_to_be_fetched(to_be_fetched);
     69   metadata.set_type(file_type);
     70   return metadata;
     71 }
     72 
     73 }  // namespace
     74 
     75 class DriveMetadataStoreTest : public testing::Test {
     76  public:
     77   DriveMetadataStoreTest()
     78       : created_(false) {}
     79 
     80   virtual ~DriveMetadataStoreTest() {}
     81 
     82   virtual void SetUp() OVERRIDE {
     83     file_thread_.reset(new base::Thread("Thread_File"));
     84     file_thread_->Start();
     85 
     86     ui_task_runner_ = base::MessageLoopProxy::current();
     87     file_task_runner_ = file_thread_->message_loop_proxy();
     88 
     89     ASSERT_TRUE(base_dir_.CreateUniqueTempDir());
     90     RegisterSyncableFileSystem();
     91   }
     92 
     93   virtual void TearDown() OVERRIDE {
     94     SetDisableDriveAPI(false);
     95     RevokeSyncableFileSystem();
     96 
     97     DropDatabase();
     98     file_thread_->Stop();
     99     message_loop_.RunUntilIdle();
    100   }
    101 
    102  protected:
    103   void InitializeDatabase() {
    104     EXPECT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread());
    105 
    106     bool done = false;
    107     SyncStatusCode status = SYNC_STATUS_UNKNOWN;
    108     bool created = false;
    109 
    110     drive_metadata_store_.reset(
    111         new DriveMetadataStore(base_dir_.path(), file_task_runner_.get()));
    112     drive_metadata_store_->Initialize(
    113         base::Bind(&DriveMetadataStoreTest::DidInitializeDatabase,
    114                    base::Unretained(this),
    115                    &done,
    116                    &status,
    117                    &created));
    118     message_loop_.Run();
    119 
    120     EXPECT_TRUE(done);
    121     EXPECT_EQ(SYNC_STATUS_OK, status);
    122 
    123     if (created) {
    124       EXPECT_FALSE(created_);
    125       created_ = created;
    126       return;
    127     }
    128     EXPECT_TRUE(created_);
    129   }
    130 
    131   void DropDatabase() {
    132     EXPECT_TRUE(ui_task_runner_->RunsTasksOnCurrentThread());
    133     drive_metadata_store_.reset();
    134   }
    135 
    136   SyncStatusCode EnableOrigin(const GURL& origin) {
    137     SyncStatusCode status = SYNC_STATUS_UNKNOWN;
    138     drive_metadata_store_->EnableOrigin(
    139         origin, base::Bind(&DriveMetadataStoreTest::DidFinishDBTask,
    140                            base::Unretained(this), &status));
    141     message_loop_.Run();
    142     return status;
    143   }
    144 
    145   SyncStatusCode DisableOrigin(const GURL& origin) {
    146     SyncStatusCode status = SYNC_STATUS_UNKNOWN;
    147     drive_metadata_store_->DisableOrigin(
    148         origin, base::Bind(&DriveMetadataStoreTest::DidFinishDBTask,
    149                            base::Unretained(this), &status));
    150     message_loop_.Run();
    151     return status;
    152   }
    153 
    154   SyncStatusCode RemoveOrigin(const GURL& url) {
    155     SyncStatusCode status = SYNC_STATUS_UNKNOWN;
    156     drive_metadata_store_->RemoveOrigin(
    157         url, base::Bind(&DriveMetadataStoreTest::DidFinishDBTask,
    158                         base::Unretained(this), &status));
    159     message_loop_.Run();
    160     return status;
    161   }
    162 
    163   SyncStatusCode UpdateEntry(const fileapi::FileSystemURL& url,
    164                              const DriveMetadata& metadata) {
    165     SyncStatusCode status = SYNC_STATUS_UNKNOWN;
    166     drive_metadata_store_->UpdateEntry(
    167         url, metadata,
    168         base::Bind(&DriveMetadataStoreTest::DidFinishDBTask,
    169                    base::Unretained(this), &status));
    170     message_loop_.Run();
    171     return status;
    172   }
    173 
    174   SyncStatusCode DeleteEntry(const fileapi::FileSystemURL& url) {
    175     SyncStatusCode status = SYNC_STATUS_UNKNOWN;
    176     drive_metadata_store_->DeleteEntry(
    177         url,
    178         base::Bind(&DriveMetadataStoreTest::DidFinishDBTask,
    179                    base::Unretained(this), &status));
    180     message_loop_.Run();
    181     return status;
    182   }
    183 
    184   SyncStatusCode SetLargestChangeStamp(int64 changestamp) {
    185     SyncStatusCode status = SYNC_STATUS_UNKNOWN;
    186     drive_metadata_store_->SetLargestChangeStamp(
    187         changestamp, base::Bind(&DriveMetadataStoreTest::DidFinishDBTask,
    188                                 base::Unretained(this), &status));
    189     message_loop_.Run();
    190     return status;
    191   }
    192 
    193   void DidFinishDBTask(SyncStatusCode* status_out,
    194                        SyncStatusCode status) {
    195     *status_out = status;
    196     message_loop_.Quit();
    197   }
    198 
    199   void MarkAsCreated() {
    200     created_ = true;
    201   }
    202 
    203   void VerifyUntrackedOrigin(const GURL& origin) {
    204     EXPECT_FALSE(metadata_store()->IsIncrementalSyncOrigin(origin));
    205     EXPECT_FALSE(metadata_store()->IsOriginDisabled(origin));
    206   }
    207 
    208   void VerifyIncrementalSyncOrigin(const GURL& origin,
    209                                    const std::string& resource_id) {
    210     EXPECT_TRUE(metadata_store()->IsIncrementalSyncOrigin(origin));
    211     EXPECT_FALSE(metadata_store()->IsOriginDisabled(origin));
    212     EXPECT_EQ(resource_id,
    213               GetResourceID(metadata_store()->incremental_sync_origins(),
    214                             origin));
    215   }
    216 
    217   void VerifyDisabledOrigin(const GURL& origin,
    218                             const std::string& resource_id) {
    219     EXPECT_FALSE(metadata_store()->IsIncrementalSyncOrigin(origin));
    220     EXPECT_TRUE(metadata_store()->IsOriginDisabled(origin));
    221     EXPECT_EQ(resource_id,
    222               GetResourceID(metadata_store()->disabled_origins(), origin));
    223   }
    224 
    225   base::FilePath base_dir() {
    226     return base_dir_.path();
    227   }
    228 
    229   DriveMetadataStore* metadata_store() {
    230     return drive_metadata_store_.get();
    231   }
    232 
    233   leveldb::DB* metadata_db() {
    234     return drive_metadata_store_->GetDBInstanceForTesting();
    235   }
    236 
    237   const DriveMetadataStore::MetadataMap& metadata_map() {
    238     return drive_metadata_store_->metadata_map_;
    239   }
    240 
    241   void VerifyReverseMap() {
    242     const ResourceIdByOrigin& incremental_sync_origins =
    243         drive_metadata_store_->incremental_sync_origins_;
    244     const ResourceIdByOrigin& disabled_origins =
    245         drive_metadata_store_->disabled_origins_;
    246     const OriginByResourceId& origin_by_resource_id =
    247         drive_metadata_store_->origin_by_resource_id_;
    248 
    249     size_t expected_size = incremental_sync_origins.size() +
    250                            disabled_origins.size();
    251     size_t actual_size = origin_by_resource_id.size();
    252     EXPECT_EQ(expected_size, actual_size);
    253     EXPECT_TRUE(VerifyReverseMapInclusion(incremental_sync_origins,
    254                                           origin_by_resource_id));
    255     EXPECT_TRUE(VerifyReverseMapInclusion(disabled_origins,
    256                                           origin_by_resource_id));
    257   }
    258 
    259   void ReadWrite_Body();
    260   void GetConflictURLs_Body();
    261   void GetToBeFetchedFiles_Body();
    262   void StoreSyncRootDirectory_Body();
    263   void StoreSyncOrigin_Body();
    264   void DisableOrigin_Body();
    265   void RemoveOrigin_Body();
    266   void GetResourceIdForOrigin_Body();
    267   void ResetOriginRootDirectory_Body();
    268   void GetFileMetadataMap_Body();
    269 
    270  private:
    271   void DidInitializeDatabase(bool* done_out,
    272                              SyncStatusCode* status_out,
    273                              bool* created_out,
    274                              SyncStatusCode status,
    275                              bool created) {
    276     *done_out = true;
    277     *status_out = status;
    278     *created_out = created;
    279     message_loop_.Quit();
    280   }
    281 
    282   bool VerifyReverseMapInclusion(const ResourceIdByOrigin& left,
    283                                  const OriginByResourceId& right) {
    284     for (ResourceIdByOrigin::const_iterator itr = left.begin();
    285          itr != left.end(); ++itr) {
    286       OriginByResourceId::const_iterator found = right.find(itr->second);
    287       if (found == right.end() || found->second != itr->first)
    288         return false;
    289     }
    290     return true;
    291   }
    292 
    293   base::ScopedTempDir base_dir_;
    294 
    295   base::MessageLoop message_loop_;
    296   scoped_ptr<base::Thread> file_thread_;
    297 
    298   scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_;
    299   scoped_refptr<base::SequencedTaskRunner> file_task_runner_;
    300 
    301   scoped_ptr<DriveMetadataStore> drive_metadata_store_;
    302 
    303   bool created_;
    304 
    305   DISALLOW_COPY_AND_ASSIGN(DriveMetadataStoreTest);
    306 };
    307 
    308 void DriveMetadataStoreTest::ReadWrite_Body() {
    309   InitializeDatabase();
    310 
    311   const fileapi::FileSystemURL url = URL(base::FilePath());
    312   DriveMetadata metadata;
    313   EXPECT_EQ(SYNC_DATABASE_ERROR_NOT_FOUND,
    314             metadata_store()->ReadEntry(url, &metadata));
    315 
    316   metadata = CreateMetadata(
    317       "file:1234567890", "09876543210", true, false,
    318       DriveMetadata_ResourceType_RESOURCE_TYPE_FILE);
    319   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(url, metadata));
    320   EXPECT_EQ(SYNC_STATUS_OK, SetLargestChangeStamp(1));
    321 
    322   DropDatabase();
    323   InitializeDatabase();
    324 
    325   EXPECT_EQ(1, metadata_store()->GetLargestChangeStamp());
    326 
    327   DriveMetadata metadata2;
    328   EXPECT_EQ(SYNC_STATUS_OK,
    329             metadata_store()->ReadEntry(url, &metadata2));
    330   EXPECT_EQ(metadata.resource_id(), metadata2.resource_id());
    331   EXPECT_EQ(metadata.md5_checksum(), metadata2.md5_checksum());
    332   EXPECT_EQ(metadata.conflicted(), metadata2.conflicted());
    333 
    334   EXPECT_EQ(SYNC_STATUS_OK, DeleteEntry(url));
    335   EXPECT_EQ(SYNC_DATABASE_ERROR_NOT_FOUND,
    336             metadata_store()->ReadEntry(url, &metadata));
    337   EXPECT_EQ(SYNC_DATABASE_ERROR_NOT_FOUND, DeleteEntry(url));
    338 
    339   VerifyReverseMap();
    340 }
    341 
    342 void DriveMetadataStoreTest::GetConflictURLs_Body() {
    343   InitializeDatabase();
    344 
    345   fileapi::FileSystemURLSet urls;
    346   EXPECT_EQ(SYNC_STATUS_OK, metadata_store()->GetConflictURLs(&urls));
    347   EXPECT_EQ(0U, urls.size());
    348 
    349   const base::FilePath path1(FPL("file1"));
    350   const base::FilePath path2(FPL("file2"));
    351   const base::FilePath path3(FPL("file3"));
    352 
    353   // Populate metadata in DriveMetadataStore. The metadata identified by "file2"
    354   // and "file3" are marked as conflicted.
    355   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    356       URL(path1),
    357       CreateMetadata("file:1", "1", false, false,
    358                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    359   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    360       URL(path2),
    361       CreateMetadata("file:2", "2", true, false,
    362                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    363   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    364       URL(path3),
    365       CreateMetadata("file:3", "3", true, false,
    366                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    367 
    368   EXPECT_EQ(SYNC_STATUS_OK, metadata_store()->GetConflictURLs(&urls));
    369   EXPECT_EQ(2U, urls.size());
    370   EXPECT_FALSE(ContainsKey(urls, URL(path1)));
    371   EXPECT_TRUE(ContainsKey(urls, URL(path2)));
    372   EXPECT_TRUE(ContainsKey(urls, URL(path3)));
    373 
    374   VerifyReverseMap();
    375 }
    376 
    377 void DriveMetadataStoreTest::GetToBeFetchedFiles_Body() {
    378   InitializeDatabase();
    379 
    380   DriveMetadataStore::URLAndDriveMetadataList list;
    381   EXPECT_EQ(SYNC_STATUS_OK, metadata_store()->GetToBeFetchedFiles(&list));
    382   EXPECT_TRUE(list.empty());
    383 
    384   const base::FilePath path1(FPL("file1"));
    385   const base::FilePath path2(FPL("file2"));
    386   const base::FilePath path3(FPL("file3"));
    387 
    388   // Populate metadata in DriveMetadataStore. The metadata identified by "file2"
    389   // and "file3" are marked to be fetched.
    390   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    391       URL(path1),
    392       CreateMetadata("file:1", "1", false, false,
    393                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    394   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    395       URL(path2),
    396       CreateMetadata("file:2", "2", false, true,
    397                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    398   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    399       URL(path3),
    400       CreateMetadata("file:3", "3", false, true,
    401                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    402 
    403   EXPECT_EQ(SYNC_STATUS_OK,
    404             metadata_store()->GetToBeFetchedFiles(&list));
    405   EXPECT_EQ(2U, list.size());
    406   EXPECT_EQ(list[0].first, URL(path2));
    407   EXPECT_EQ(list[1].first, URL(path3));
    408 
    409   VerifyReverseMap();
    410 }
    411 
    412 void DriveMetadataStoreTest::StoreSyncRootDirectory_Body() {
    413   const std::string kResourceId(CreateResourceId("folder:hoge"));
    414 
    415   InitializeDatabase();
    416   EXPECT_TRUE(metadata_store()->sync_root_directory().empty());
    417 
    418   metadata_store()->SetSyncRootDirectory(kResourceId);
    419   EXPECT_EQ(kResourceId, metadata_store()->sync_root_directory());
    420 
    421   DropDatabase();
    422   InitializeDatabase();
    423   EXPECT_EQ(kResourceId, metadata_store()->sync_root_directory());
    424 }
    425 
    426 void DriveMetadataStoreTest::StoreSyncOrigin_Body() {
    427   const GURL kOrigin1("chrome-extension://example1");
    428   const GURL kOrigin2("chrome-extension://example2");
    429   const std::string kResourceId1(CreateResourceId("folder:hoge"));
    430   const std::string kResourceId2(CreateResourceId("folder:fuga"));
    431 
    432   InitializeDatabase();
    433 
    434   // Make sure origins have not been marked yet.
    435   VerifyUntrackedOrigin(kOrigin1);
    436   VerifyUntrackedOrigin(kOrigin2);
    437 
    438   // Mark origins as incremental sync origins.
    439   metadata_store()->AddIncrementalSyncOrigin(kOrigin1, kResourceId1);
    440   metadata_store()->AddIncrementalSyncOrigin(kOrigin2, kResourceId2);
    441   VerifyIncrementalSyncOrigin(kOrigin1, kResourceId1);
    442   VerifyIncrementalSyncOrigin(kOrigin2, kResourceId2);
    443 
    444   // Disabled origin 2, origin 1 should still be incremental.
    445   DisableOrigin(kOrigin2);
    446   VerifyIncrementalSyncOrigin(kOrigin1, kResourceId1);
    447   VerifyDisabledOrigin(kOrigin2, kResourceId2);
    448 
    449   DropDatabase();
    450   InitializeDatabase();
    451 
    452   // Make sure origins have been restored.
    453   VerifyIncrementalSyncOrigin(kOrigin1, kResourceId1);
    454   VerifyDisabledOrigin(kOrigin2, kResourceId2);
    455 
    456   VerifyReverseMap();
    457 }
    458 
    459 void DriveMetadataStoreTest::DisableOrigin_Body() {
    460   const GURL kOrigin1("chrome-extension://example1");
    461   const std::string kResourceId1(CreateResourceId("folder:hoge"));
    462 
    463   InitializeDatabase();
    464   EXPECT_EQ(SYNC_STATUS_OK, SetLargestChangeStamp(1));
    465 
    466   metadata_store()->AddIncrementalSyncOrigin(kOrigin1, kResourceId1);
    467   VerifyIncrementalSyncOrigin(kOrigin1, kResourceId1);
    468 
    469   DisableOrigin(kOrigin1);
    470   VerifyDisabledOrigin(kOrigin1, kResourceId1);
    471 
    472   // Re-enabled origins go back to DriveFileSyncService and are not tracked
    473   // in DriveMetadataStore.
    474   EnableOrigin(kOrigin1);
    475   VerifyUntrackedOrigin(kOrigin1);
    476 }
    477 
    478 void DriveMetadataStoreTest::RemoveOrigin_Body() {
    479   const GURL kOrigin1("chrome-extension://example1");
    480   const GURL kOrigin2("chrome-extension://example2");
    481   const GURL kOrigin3("chrome-extension://example3");
    482   const std::string kResourceId1(CreateResourceId("folder:hogera"));
    483   const std::string kResourceId2(CreateResourceId("folder:fugaga"));
    484   const std::string kResourceId3(CreateResourceId("folder:piyopiyo"));
    485 
    486   InitializeDatabase();
    487   EXPECT_EQ(SYNC_STATUS_OK, SetLargestChangeStamp(1));
    488 
    489   metadata_store()->AddIncrementalSyncOrigin(kOrigin1, kResourceId1);
    490   metadata_store()->AddIncrementalSyncOrigin(kOrigin2, kResourceId2);
    491   metadata_store()->AddIncrementalSyncOrigin(kOrigin3, kResourceId3);
    492   DisableOrigin(kOrigin3);
    493   EXPECT_EQ(2u, metadata_store()->incremental_sync_origins().size());
    494   EXPECT_EQ(1u, metadata_store()->disabled_origins().size());
    495 
    496   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    497       CreateSyncableFileSystemURL(kOrigin1, base::FilePath(FPL("guf"))),
    498       CreateMetadata("file:foo", "spam", false, false,
    499                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    500   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    501       CreateSyncableFileSystemURL(kOrigin2, base::FilePath(FPL("mof"))),
    502       CreateMetadata("file:bar", "ham", false, false,
    503                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    504   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    505       CreateSyncableFileSystemURL(kOrigin3, base::FilePath(FPL("waf"))),
    506       CreateMetadata("folder:baz", "egg", false, false,
    507                      DriveMetadata_ResourceType_RESOURCE_TYPE_FOLDER)));
    508 
    509   EXPECT_EQ(SYNC_STATUS_OK, RemoveOrigin(kOrigin2));
    510   EXPECT_EQ(SYNC_STATUS_OK, RemoveOrigin(kOrigin3));
    511 
    512   DropDatabase();
    513   InitializeDatabase();
    514 
    515   // kOrigin1 should be the only one left.
    516   EXPECT_EQ(1u, metadata_store()->incremental_sync_origins().size());
    517   EXPECT_EQ(0u, metadata_store()->disabled_origins().size());
    518   EXPECT_TRUE(metadata_store()->IsIncrementalSyncOrigin(kOrigin1));
    519   EXPECT_EQ(1u, metadata_map().size());
    520 
    521   DriveMetadataStore::MetadataMap::const_iterator found =
    522       metadata_map().find(kOrigin1);
    523   EXPECT_TRUE(found != metadata_map().end() && found->second.size() == 1u);
    524 
    525   VerifyReverseMap();
    526 }
    527 
    528 void DriveMetadataStoreTest::GetResourceIdForOrigin_Body() {
    529   const GURL kOrigin1("chrome-extension://example1");
    530   const GURL kOrigin2("chrome-extension://example2");
    531   const GURL kOrigin3("chrome-extension://example3");
    532   const std::string kResourceId1(CreateResourceId("folder:hogera"));
    533   const std::string kResourceId2(CreateResourceId("folder:fugaga"));
    534   const std::string kResourceId3(CreateResourceId("folder:piyopiyo"));
    535 
    536   InitializeDatabase();
    537   EXPECT_EQ(SYNC_STATUS_OK, SetLargestChangeStamp(1));
    538   metadata_store()->SetSyncRootDirectory(CreateResourceId("folder:root"));
    539 
    540   metadata_store()->AddIncrementalSyncOrigin(kOrigin1, kResourceId1);
    541   metadata_store()->AddIncrementalSyncOrigin(kOrigin2, kResourceId2);
    542   metadata_store()->AddIncrementalSyncOrigin(kOrigin3, kResourceId3);
    543   DisableOrigin(kOrigin3);
    544 
    545   EXPECT_EQ(kResourceId1, metadata_store()->GetResourceIdForOrigin(kOrigin1));
    546   EXPECT_EQ(kResourceId2, metadata_store()->GetResourceIdForOrigin(kOrigin2));
    547   EXPECT_EQ(kResourceId3, metadata_store()->GetResourceIdForOrigin(kOrigin3));
    548 
    549   DropDatabase();
    550   InitializeDatabase();
    551 
    552   EXPECT_EQ(kResourceId1, metadata_store()->GetResourceIdForOrigin(kOrigin1));
    553   EXPECT_EQ(kResourceId2, metadata_store()->GetResourceIdForOrigin(kOrigin2));
    554   EXPECT_EQ(kResourceId3, metadata_store()->GetResourceIdForOrigin(kOrigin3));
    555 
    556   // Resetting the root directory resource ID to empty makes any
    557   // GetResourceIdForOrigin return an empty resource ID too, regardless of
    558   // whether they are known origin or not.
    559   metadata_store()->SetSyncRootDirectory(std::string());
    560   EXPECT_TRUE(metadata_store()->GetResourceIdForOrigin(kOrigin1).empty());
    561   EXPECT_TRUE(metadata_store()->GetResourceIdForOrigin(kOrigin2).empty());
    562   EXPECT_TRUE(metadata_store()->GetResourceIdForOrigin(kOrigin3).empty());
    563 
    564   // Make sure they're still known origins.
    565   EXPECT_TRUE(metadata_store()->IsKnownOrigin(kOrigin1));
    566   EXPECT_TRUE(metadata_store()->IsKnownOrigin(kOrigin2));
    567   EXPECT_TRUE(metadata_store()->IsKnownOrigin(kOrigin3));
    568 
    569   VerifyReverseMap();
    570 }
    571 
    572 void DriveMetadataStoreTest::ResetOriginRootDirectory_Body() {
    573   const GURL kOrigin1("chrome-extension://example1");
    574   const std::string kResourceId1(CreateResourceId("folder:hoge"));
    575   const std::string kResourceId2(CreateResourceId("folder:fuga"));
    576 
    577   InitializeDatabase();
    578   EXPECT_EQ(SYNC_STATUS_OK, SetLargestChangeStamp(1));
    579 
    580   metadata_store()->AddIncrementalSyncOrigin(kOrigin1, kResourceId1);
    581   VerifyIncrementalSyncOrigin(kOrigin1, kResourceId1);
    582   VerifyReverseMap();
    583 
    584   metadata_store()->SetOriginRootDirectory(kOrigin1, kResourceId2);
    585   VerifyIncrementalSyncOrigin(kOrigin1, kResourceId2);
    586   VerifyReverseMap();
    587 }
    588 
    589 void DriveMetadataStoreTest::GetFileMetadataMap_Body() {
    590   InitializeDatabase();
    591 
    592   // Save one file and folder to the origin.
    593   const base::FilePath file_path = base::FilePath(FPL("file_0"));
    594   const base::FilePath folder_path = base::FilePath(FPL("folder_0"));
    595 
    596   const GURL origin = GURL("chrome-extension://app_a");
    597   const fileapi::FileSystemURL url_0 = CreateSyncableFileSystemURL(
    598       origin, file_path);
    599   const fileapi::FileSystemURL url_1 = CreateSyncableFileSystemURL(
    600       origin, folder_path);
    601 
    602   // Insert DrivaMetadata objects.
    603   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    604       url_0,
    605       CreateMetadata("file:0", "1", false, false,
    606                      DriveMetadata_ResourceType_RESOURCE_TYPE_FILE)));
    607   EXPECT_EQ(SYNC_STATUS_OK, UpdateEntry(
    608       url_1,
    609       CreateMetadata("folder:0", "2", false, true,
    610                      DriveMetadata_ResourceType_RESOURCE_TYPE_FOLDER)));
    611 
    612   // Check that DriveMetadata objects get mapped back to generalized
    613   // FileMetadata objects.
    614   scoped_ptr<base::ListValue> files = metadata_store()->DumpFiles(origin);
    615   ASSERT_EQ(2u, files->GetSize());
    616 
    617   base::DictionaryValue* file = NULL;
    618   std::string str;
    619 
    620   ASSERT_TRUE(files->GetDictionary(0, &file));
    621   EXPECT_TRUE(file->GetString("title", &str) && str == "file_0");
    622   EXPECT_TRUE(file->GetString("type", &str) && str == "file");
    623   EXPECT_TRUE(file->HasKey("details"));
    624 
    625   ASSERT_TRUE(files->GetDictionary(1, &file));
    626   EXPECT_TRUE(file->GetString("title", &str) && str == "folder_0");
    627   EXPECT_TRUE(file->GetString("type", &str) && str == "folder");
    628   EXPECT_TRUE(file->HasKey("details"));
    629 }
    630 
    631 TEST_F(DriveMetadataStoreTest, Initialization) {
    632   ASSERT_FALSE(IsDriveAPIDisabled());
    633   InitializeDatabase();
    634 }
    635 
    636 TEST_F(DriveMetadataStoreTest, Initialization_WAPI) {
    637   SetDisableDriveAPI(true);
    638   InitializeDatabase();
    639 }
    640 
    641 TEST_F(DriveMetadataStoreTest, ReadWrite) {
    642   ASSERT_FALSE(IsDriveAPIDisabled());
    643   ReadWrite_Body();
    644 }
    645 
    646 TEST_F(DriveMetadataStoreTest, ReadWrite_WAPI) {
    647   SetDisableDriveAPI(true);
    648   ReadWrite_Body();
    649 }
    650 
    651 TEST_F(DriveMetadataStoreTest, GetConflictURLs) {
    652   ASSERT_FALSE(IsDriveAPIDisabled());
    653   GetConflictURLs_Body();
    654 }
    655 
    656 TEST_F(DriveMetadataStoreTest, GetConflictURLs_WAPI) {
    657   SetDisableDriveAPI(true);
    658   GetConflictURLs_Body();
    659 }
    660 
    661 TEST_F(DriveMetadataStoreTest, GetToBeFetchedFiles) {
    662   ASSERT_FALSE(IsDriveAPIDisabled());
    663   GetToBeFetchedFiles_Body();
    664 }
    665 
    666 TEST_F(DriveMetadataStoreTest, GetToBeFetchedFiles_WAPI) {
    667   SetDisableDriveAPI(true);
    668   GetToBeFetchedFiles_Body();
    669 }
    670 
    671 TEST_F(DriveMetadataStoreTest, StoreSyncRootDirectory) {
    672   ASSERT_FALSE(IsDriveAPIDisabled());
    673   StoreSyncRootDirectory_Body();
    674 }
    675 
    676 TEST_F(DriveMetadataStoreTest, StoreSyncRootDirectory_WAPI) {
    677   SetDisableDriveAPI(true);
    678   StoreSyncRootDirectory_Body();
    679 }
    680 
    681 TEST_F(DriveMetadataStoreTest, StoreSyncOrigin) {
    682   ASSERT_FALSE(IsDriveAPIDisabled());
    683   StoreSyncOrigin_Body();
    684 }
    685 
    686 TEST_F(DriveMetadataStoreTest, StoreSyncOrigin_WAPI) {
    687   SetDisableDriveAPI(true);
    688   StoreSyncOrigin_Body();
    689 }
    690 
    691 TEST_F(DriveMetadataStoreTest, DisableOrigin) {
    692   ASSERT_FALSE(IsDriveAPIDisabled());
    693   DisableOrigin_Body();
    694 }
    695 
    696 TEST_F(DriveMetadataStoreTest, DisableOrigin_WAPI) {
    697   SetDisableDriveAPI(true);
    698   DisableOrigin_Body();
    699 }
    700 
    701 TEST_F(DriveMetadataStoreTest, RemoveOrigin) {
    702   ASSERT_FALSE(IsDriveAPIDisabled());
    703   RemoveOrigin_Body();
    704 }
    705 
    706 TEST_F(DriveMetadataStoreTest, RemoveOrigin_WAPI) {
    707   SetDisableDriveAPI(true);
    708   RemoveOrigin_Body();
    709 }
    710 
    711 TEST_F(DriveMetadataStoreTest, GetResourceIdForOrigin) {
    712   ASSERT_FALSE(IsDriveAPIDisabled());
    713   GetResourceIdForOrigin_Body();
    714 }
    715 
    716 TEST_F(DriveMetadataStoreTest, GetResourceIdForOrigin_WAPI) {
    717   SetDisableDriveAPI(true);
    718   GetResourceIdForOrigin_Body();
    719 }
    720 
    721 TEST_F(DriveMetadataStoreTest, ResetOriginRootDirectory) {
    722   ASSERT_FALSE(IsDriveAPIDisabled());
    723   ResetOriginRootDirectory_Body();
    724 }
    725 
    726 TEST_F(DriveMetadataStoreTest, ResetOriginRootDirectory_WAPI) {
    727   SetDisableDriveAPI(true);
    728   ResetOriginRootDirectory_Body();
    729 }
    730 
    731 TEST_F(DriveMetadataStoreTest, GetFileMetadataMap) {
    732   ASSERT_FALSE(IsDriveAPIDisabled());
    733   GetFileMetadataMap_Body();
    734 }
    735 
    736 TEST_F(DriveMetadataStoreTest, GetFileMetadataMap_WAPI) {
    737   SetDisableDriveAPI(true);
    738   GetFileMetadataMap_Body();
    739 }
    740 
    741 }  // namespace sync_file_system
    742