Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(611)

Unified Diff: chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc

Issue 18591004: [SyncFS] Implement MetadataDatabase initialization (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
diff --git a/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
new file mode 100644
index 0000000000000000000000000000000000000000..7372f95091614dad1117027177ddb9f22ca14c54
--- /dev/null
+++ b/chrome/browser/sync_file_system/drive_backend/metadata_database_unittest.cc
@@ -0,0 +1,221 @@
+// Copyright 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
+
+#include "base/bind.h"
+#include "base/files/scoped_temp_dir.h"
+#include "base/message_loop/message_loop.h"
+#include "base/message_loop/message_loop_proxy.h"
+#include "base/strings/string_number_conversions.h"
+#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/leveldatabase/src/include/leveldb/db.h"
+#include "third_party/leveldatabase/src/include/leveldb/write_batch.h"
+
+namespace sync_file_system {
+namespace drive_backend {
+
+namespace {
+
+const int64 kInitialChangeID = 1234;
+const char kSyncRootFolderID[] = "sync_root_folder_id";
+
+template <typename Value>
+bool AreEquivalentProtobufs(const Value& left, const Value& right) {
+ std::string serialized_left;
+ std::string serialized_right;
+ left.SerializeToString(&serialized_left);
+ right.SerializeToString(&serialized_right);
+ return serialized_left == serialized_right;
+}
+
+void SyncStatusResultCallback(SyncStatusCode* status_out,
+ SyncStatusCode status) {
+ EXPECT_EQ(SYNC_STATUS_UNKNOWN, *status_out);
+ *status_out = status;
+}
+
+void DatabaseCreateResultCallback(SyncStatusCode* status_out,
+ scoped_ptr<MetadataDatabase>* database_out,
+ SyncStatusCode status,
+ scoped_ptr<MetadataDatabase> database) {
+ EXPECT_EQ(SYNC_STATUS_UNKNOWN, *status_out);
+ *status_out = status;
+ *database_out = database.Pass();
+}
+
+} // namespace
+
+class MetadataDatabaseTest : public testing::Test {
+ public:
+ MetadataDatabaseTest() : next_file_id_number_(1) {}
+
+ virtual ~MetadataDatabaseTest() {}
+
+ virtual void SetUp() OVERRIDE {
+ ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
+ }
+
+ virtual void TearDown() OVERRIDE { DropDatabase(); }
+
+ protected:
+ std::string GenerateFileID() {
+ return "file_id_" + base::Int64ToString(next_file_id_number_++);
+ }
+
+ SyncStatusCode InitializeDatabase() {
+ SyncStatusCode status = SYNC_STATUS_UNKNOWN;
+ MetadataDatabase::Create(base::MessageLoopProxy::current(),
+ database_dir_.path(),
+ base::Bind(&DatabaseCreateResultCallback,
+ &status, &metadata_database_));
+ message_loop_.RunUntilIdle();
+ return status;
+ }
+
+ void DropDatabase() {
+ metadata_database_.reset();
+ message_loop_.RunUntilIdle();
+ }
+
+ MetadataDatabase* metadata_database() { return metadata_database_.get(); }
+
+ leveldb::DB* db() {
+ if (!metadata_database_)
+ return NULL;
+ return metadata_database_->db_.get();
+ }
+
+ scoped_ptr<leveldb::DB> OpenDB() {
+ leveldb::DB* db = NULL;
+ leveldb::Options options;
+ options.create_if_missing = true;
+ leveldb::Status status =
+ leveldb::DB::Open(options, database_dir_.path().AsUTF8Unsafe(), &db);
+ EXPECT_TRUE(status.ok());
+ return make_scoped_ptr(db);
+ }
+
+ void SetUpServiceMetadata(leveldb::DB* db) {
+ ServiceMetadata service_metadata;
+ service_metadata.set_largest_change_id(kInitialChangeID);
+ service_metadata.set_sync_root_folder_id(kSyncRootFolderID);
+ std::string value;
+ ASSERT_TRUE(service_metadata.SerializeToString(&value));
+ db->Put(leveldb::WriteOptions(), "SERVICE", value);
+ }
+
+ DriveFileMetadata CreateSyncRoot() {
+ DriveFileMetadata metadata;
+ metadata.set_file_id(kSyncRootFolderID);
+ metadata.set_parent_folder_id(std::string());
+ metadata.mutable_synced_details()->set_title("Chrome Syncable FileSystem");
+ metadata.mutable_synced_details()->set_kind(KIND_FOLDER);
+ metadata.set_active(true);
+ metadata.set_dirty(false);
+ return metadata;
+ }
+
+ DriveFileMetadata CreateUnknownFile(const std::string& app_id,
+ const std::string& parent_folder_id) {
+ DriveFileMetadata metadata;
+ metadata.set_file_id(GenerateFileID());
+ metadata.set_parent_folder_id(parent_folder_id);
+ metadata.set_app_id(app_id);
+ metadata.set_is_app_root(parent_folder_id == kSyncRootFolderID);
+ return metadata;
+ }
+
+ DriveFileMetadata CreateFile(const std::string& app_id,
+ const std::string& parent_folder_id,
+ const std::string& title) {
+ DriveFileMetadata file(CreateUnknownFile(app_id, parent_folder_id));
+ file.mutable_synced_details()->add_parent_folder_id(parent_folder_id);
+ file.mutable_synced_details()->set_title(title);
+ file.mutable_synced_details()->set_kind(KIND_FILE);
+ file.set_active(true);
+ file.set_dirty(false);
+ return file;
+ }
+
+ DriveFileMetadata CreateFolder(const std::string& app_id,
+ const std::string& parent_folder_id,
+ const std::string& title) {
+ DriveFileMetadata folder(CreateUnknownFile(app_id, parent_folder_id));
+ folder.mutable_synced_details()->add_parent_folder_id(parent_folder_id);
+ folder.mutable_synced_details()->set_title(title);
+ folder.mutable_synced_details()->set_kind(KIND_FOLDER);
+ folder.set_active(true);
+ folder.set_dirty(false);
+ return folder;
+ }
+
+ leveldb::Status PutFileToDB(leveldb::DB* db, const DriveFileMetadata& file) {
+ std::string key = "FILE: " + file.file_id();
+ std::string value;
+ file.SerializeToString(&value);
+ return db->Put(leveldb::WriteOptions(), key, value);
+ }
+
+ void VerifyMetadataExists(const DriveFileMetadata& file) {
+ DriveFileMetadata file_in_metadata_db;
+ ASSERT_TRUE(metadata_database()->FindFileByFileID(
+ file.file_id(), &file_in_metadata_db));
+ EXPECT_TRUE(AreEquivalentProtobufs(file, file_in_metadata_db));
+ }
+
+ private:
+ base::ScopedTempDir database_dir_;
+ base::MessageLoop message_loop_;
+
+ scoped_ptr<MetadataDatabase> metadata_database_;
+
+ int64 next_file_id_number_;
+
+ DISALLOW_COPY_AND_ASSIGN(MetadataDatabaseTest);
+};
+
+TEST_F(MetadataDatabaseTest, InitializationTest_Empty) {
+ EXPECT_EQ(SYNC_STATUS_OK, InitializeDatabase());
+ DropDatabase();
+ EXPECT_EQ(SYNC_STATUS_OK, InitializeDatabase());
+}
+
+TEST_F(MetadataDatabaseTest, InitializationTest_SimpleTree) {
+ std::string app_id = "app_id";
+ DriveFileMetadata sync_root(CreateSyncRoot());
+ DriveFileMetadata app_root(CreateFolder(app_id, kSyncRootFolderID, app_id));
+ DriveFileMetadata file(CreateFile(app_id, app_root.file_id(), "file"));
+ DriveFileMetadata folder(CreateFolder(app_id, app_root.file_id(), "folder"));
+ DriveFileMetadata file_in_folder(
+ CreateFile(app_id, folder.file_id(), "file_in_folder"));
+ DriveFileMetadata orphaned(CreateUnknownFile(std::string(), "root"));
+
+ {
+ scoped_ptr<leveldb::DB> db = OpenDB();
+ ASSERT_TRUE(db);
+ db->Put(leveldb::WriteOptions(), "VERSION", base::Int64ToString(3));
+ SetUpServiceMetadata(db.get());
+
+ EXPECT_TRUE(PutFileToDB(db.get(), sync_root).ok());
+ EXPECT_TRUE(PutFileToDB(db.get(), app_root).ok());
+ EXPECT_TRUE(PutFileToDB(db.get(), file).ok());
+ EXPECT_TRUE(PutFileToDB(db.get(), folder).ok());
+ EXPECT_TRUE(PutFileToDB(db.get(), file_in_folder).ok());
+ EXPECT_TRUE(PutFileToDB(db.get(), orphaned).ok());
+ }
+
+ EXPECT_EQ(SYNC_STATUS_OK, InitializeDatabase());
+
+ VerifyMetadataExists(sync_root);
+ VerifyMetadataExists(app_root);
+ VerifyMetadataExists(file);
+ VerifyMetadataExists(folder);
+ VerifyMetadataExists(file_in_folder);
+ EXPECT_FALSE(metadata_database()->FindFileByFileID(orphaned.file_id(), NULL));
+}
+
+} // namespace drive_backend
+} // namespace sync_file_system
« no previous file with comments | « chrome/browser/sync_file_system/drive_backend/metadata_database.proto ('k') | chrome/chrome_tests_unit.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698