metadata_database_unittest.cc revision 3240926e260ce088908e02ac07a6cf7b0c0cbf44
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/metadata_database.h" 6 7#include "base/bind.h" 8#include "base/files/scoped_temp_dir.h" 9#include "base/message_loop/message_loop.h" 10#include "base/message_loop/message_loop_proxy.h" 11#include "base/strings/string_number_conversions.h" 12#include "chrome/browser/google_apis/drive_api_parser.h" 13#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" 14#include "testing/gtest/include/gtest/gtest.h" 15#include "third_party/leveldatabase/src/include/leveldb/db.h" 16#include "third_party/leveldatabase/src/include/leveldb/write_batch.h" 17 18#define FPL(a) FILE_PATH_LITERAL(a) 19 20namespace sync_file_system { 21namespace drive_backend { 22 23namespace { 24 25const int64 kInitialChangeID = 1234; 26 27void SyncStatusResultCallback(SyncStatusCode* status_out, 28 SyncStatusCode status) { 29 EXPECT_EQ(SYNC_STATUS_UNKNOWN, *status_out); 30 *status_out = status; 31} 32 33void DatabaseCreateResultCallback(SyncStatusCode* status_out, 34 scoped_ptr<MetadataDatabase>* database_out, 35 SyncStatusCode status, 36 scoped_ptr<MetadataDatabase> database) { 37 EXPECT_EQ(SYNC_STATUS_UNKNOWN, *status_out); 38 *status_out = status; 39 *database_out = database.Pass(); 40} 41 42} // namespace 43 44class MetadataDatabaseTest : public testing::Test { 45 public: 46 MetadataDatabaseTest() 47 : next_change_id_(kInitialChangeID + 1), 48 next_file_id_number_(1), 49 next_md5_sequence_number_(1) {} 50 51 virtual ~MetadataDatabaseTest() {} 52 53 virtual void SetUp() OVERRIDE { 54 ASSERT_TRUE(database_dir_.CreateUniqueTempDir()); 55 } 56 57 virtual void TearDown() OVERRIDE { DropDatabase(); } 58 59 protected: 60 std::string GenerateFileID() { 61 return "file_id_" + base::Int64ToString(next_file_id_number_++); 62 } 63 64 SyncStatusCode InitializeMetadataDatabase() { 65 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 66 MetadataDatabase::Create(base::MessageLoopProxy::current(), 67 database_dir_.path(), 68 base::Bind(&DatabaseCreateResultCallback, 69 &status, &metadata_database_)); 70 message_loop_.RunUntilIdle(); 71 return status; 72 } 73 74 void DropDatabase() { 75 metadata_database_.reset(); 76 message_loop_.RunUntilIdle(); 77 } 78 79 MetadataDatabase* metadata_database() { return metadata_database_.get(); } 80 81 leveldb::DB* db() { 82 if (!metadata_database_) 83 return NULL; 84 return metadata_database_->db_.get(); 85 } 86 87 scoped_ptr<leveldb::DB> InitializeLevelDB() { 88 leveldb::DB* db = NULL; 89 leveldb::Options options; 90 options.create_if_missing = true; 91 options.max_open_files = 0; // Use minimum. 92 leveldb::Status status = 93 leveldb::DB::Open(options, database_dir_.path().AsUTF8Unsafe(), &db); 94 EXPECT_TRUE(status.ok()); 95 96 db->Put(leveldb::WriteOptions(), "VERSION", base::Int64ToString(3)); 97 SetUpServiceMetadata(db); 98 99 return make_scoped_ptr(db); 100 } 101 102 void SetUpServiceMetadata(leveldb::DB* db) { 103 ServiceMetadata service_metadata; 104 service_metadata.set_largest_change_id(kInitialChangeID); 105 std::string value; 106 ASSERT_TRUE(service_metadata.SerializeToString(&value)); 107 db->Put(leveldb::WriteOptions(), "SERVICE", value); 108 } 109 110 void PushToChangeList(scoped_ptr<google_apis::ChangeResource> change, 111 ScopedVector<google_apis::ChangeResource>* changes) { 112 changes->push_back(change.release()); 113 } 114 115 SyncStatusCode RegisterApp(const std::string& app_id, 116 const std::string& folder_id) { 117 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 118 metadata_database_->RegisterApp( 119 app_id, folder_id, 120 base::Bind(&SyncStatusResultCallback, &status)); 121 message_loop_.RunUntilIdle(); 122 return status; 123 } 124 125 SyncStatusCode DisableApp(const std::string& app_id) { 126 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 127 metadata_database_->DisableApp( 128 app_id, base::Bind(&SyncStatusResultCallback, &status)); 129 message_loop_.RunUntilIdle(); 130 return status; 131 } 132 133 SyncStatusCode EnableApp(const std::string& app_id) { 134 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 135 metadata_database_->EnableApp( 136 app_id, base::Bind(&SyncStatusResultCallback, &status)); 137 message_loop_.RunUntilIdle(); 138 return status; 139 } 140 141 SyncStatusCode UnregisterApp(const std::string& app_id) { 142 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 143 metadata_database_->UnregisterApp( 144 app_id, base::Bind(&SyncStatusResultCallback, &status)); 145 message_loop_.RunUntilIdle(); 146 return status; 147 } 148 149 SyncStatusCode UpdateByChangeList( 150 ScopedVector<google_apis::ChangeResource> changes) { 151 SyncStatusCode status = SYNC_STATUS_UNKNOWN; 152 metadata_database_->UpdateByChangeList( 153 changes.Pass(), base::Bind(&SyncStatusResultCallback, &status)); 154 message_loop_.RunUntilIdle(); 155 return status; 156 } 157 158 private: 159 160 base::ScopedTempDir database_dir_; 161 base::MessageLoop message_loop_; 162 163 scoped_ptr<MetadataDatabase> metadata_database_; 164 165 int64 next_change_id_; 166 int64 next_file_id_number_; 167 int64 next_md5_sequence_number_; 168 169 DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseTest); 170}; 171 172} // namespace drive_backend 173} // namespace sync_file_system 174