blob: 608a18085e9d7099831a2b6eef458e4d7355a046 [file] [log] [blame]
Ben Murdoch7dbb3d52013-07-17 14:55:54 +01001// 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"
Ben Murdochca12bfa2013-07-23 11:17:05 +010012#include "chrome/browser/google_apis/drive_api_parser.h"
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010013#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
Ben Murdochca12bfa2013-07-23 11:17:05 +010018#define FPL(a) FILE_PATH_LITERAL(a)
19
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010020namespace sync_file_system {
21namespace drive_backend {
22
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010023namespace {
24
25const int64 kInitialChangeID = 1234;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010026
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:
Ben Murdochca12bfa2013-07-23 11:17:05 +010046 MetadataDatabaseTest()
47 : next_change_id_(kInitialChangeID + 1),
48 next_file_id_number_(1),
49 next_md5_sequence_number_(1) {}
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010050
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
Ben Murdochca12bfa2013-07-23 11:17:05 +010064 SyncStatusCode InitializeMetadataDatabase() {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010065 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
Ben Murdochca12bfa2013-07-23 11:17:05 +010087 scoped_ptr<leveldb::DB> InitializeLevelDB() {
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010088 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());
Ben Murdochca12bfa2013-07-23 11:17:05 +010095
96 db->Put(leveldb::WriteOptions(), "VERSION", base::Int64ToString(3));
97 SetUpServiceMetadata(db);
98
Ben Murdoch7dbb3d52013-07-17 14:55:54 +010099 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);
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100105 std::string value;
106 ASSERT_TRUE(service_metadata.SerializeToString(&value));
107 db->Put(leveldb::WriteOptions(), "SERVICE", value);
108 }
109
Ben Murdochca12bfa2013-07-23 11:17:05 +0100110 void PushToChangeList(scoped_ptr<google_apis::ChangeResource> change,
111 ScopedVector<google_apis::ChangeResource>* changes) {
112 changes->push_back(change.release());
113 }
114
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100115 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
Ben Murdochca12bfa2013-07-23 11:17:05 +0100149 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
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100158 private:
159 base::ScopedTempDir database_dir_;
160 base::MessageLoop message_loop_;
161
162 scoped_ptr<MetadataDatabase> metadata_database_;
163
Ben Murdochca12bfa2013-07-23 11:17:05 +0100164 int64 next_change_id_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100165 int64 next_file_id_number_;
Ben Murdochca12bfa2013-07-23 11:17:05 +0100166 int64 next_md5_sequence_number_;
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100167
168 DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseTest);
169};
170
Ben Murdochbb1529c2013-08-08 10:24:53 +0100171TEST_F(MetadataDatabaseTest, InitializationTest_Empty) {
172 EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase());
173 DropDatabase();
174 EXPECT_EQ(SYNC_STATUS_OK, InitializeMetadataDatabase());
175}
176
Ben Murdoch7dbb3d52013-07-17 14:55:54 +0100177} // namespace drive_backend
178} // namespace sync_file_system