sync_engine_initializer_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
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/sync_engine_initializer.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 "chrome/browser/drive/drive_api_util.h"
11#include "chrome/browser/drive/fake_drive_service.h"
12#include "chrome/browser/google_apis/drive_api_parser.h"
13#include "chrome/browser/sync_file_system/drive_backend/metadata_database.h"
14#include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h"
15#include "content/public/test/test_browser_thread_bundle.h"
16#include "testing/gtest/include/gtest/gtest.h"
17
18namespace sync_file_system {
19namespace drive_backend {
20
21namespace {
22
23void SyncStatusResultCallback(SyncStatusCode* status_out,
24                              SyncStatusCode status) {
25  ASSERT_TRUE(status_out);
26  EXPECT_EQ(SYNC_STATUS_UNKNOWN, *status_out);
27  *status_out = status;
28}
29
30void ResourceEntryResultCallback(
31    google_apis::GDataErrorCode* error_out,
32    scoped_ptr<google_apis::ResourceEntry>* entry_out,
33    google_apis::GDataErrorCode error,
34    scoped_ptr<google_apis::ResourceEntry> entry) {
35  ASSERT_TRUE(error_out);
36  ASSERT_TRUE(entry_out);
37  EXPECT_EQ(google_apis::GDATA_OTHER_ERROR, *error_out);
38  *error_out = error;
39  *entry_out = entry.Pass();
40}
41
42}  // namespace
43
44class SyncEngineInitializerTest : public testing::Test {
45 public:
46  struct TrackedFile {
47    scoped_ptr<google_apis::FileResource> resource;
48    FileMetadata metadata;
49    FileTracker tracker;
50  };
51
52  SyncEngineInitializerTest() {}
53  virtual ~SyncEngineInitializerTest() {}
54
55  virtual void SetUp() OVERRIDE {
56    ASSERT_TRUE(database_dir_.CreateUniqueTempDir());
57    ASSERT_TRUE(fake_drive_service_.LoadAccountMetadataForWapi(
58        "sync_file_system/account_metadata.json"));
59    ASSERT_TRUE(fake_drive_service_.LoadResourceListForWapi(
60        "gdata/empty_feed.json"));
61  }
62
63  virtual void TearDown() OVERRIDE {
64  }
65
66  base::FilePath database_path() {
67    return database_dir_.path();
68  }
69
70  SyncStatusCode RunInitializer() {
71    initializer_.reset(new SyncEngineInitializer(
72        base::MessageLoopProxy::current(),
73        &fake_drive_service_,
74        database_path()));
75    SyncStatusCode status = SYNC_STATUS_UNKNOWN;
76
77    initializer_->Run(base::Bind(&SyncStatusResultCallback, &status));
78    base::MessageLoop::current()->RunUntilIdle();
79
80    metadata_database_ = initializer_->PassMetadataDatabase();
81    return status;
82  }
83
84  google_apis::GDataErrorCode FillTrackedFileByTrackerID(
85      int64 tracker_id,
86      scoped_ptr<TrackedFile>* file_out) {
87    scoped_ptr<TrackedFile> file(new TrackedFile);
88    if (!metadata_database_->FindTrackerByTrackerID(
89            tracker_id, &file->tracker))
90      return google_apis::HTTP_NOT_FOUND;
91    if (!metadata_database_->FindFileByFileID(
92            file->tracker.file_id(), &file->metadata))
93      return google_apis::HTTP_NOT_FOUND;
94
95    google_apis::GDataErrorCode error = google_apis::GDATA_OTHER_ERROR;
96    scoped_ptr<google_apis::ResourceEntry> entry;
97    fake_drive_service_.GetResourceEntry(
98        file->metadata.file_id(),
99        base::Bind(&ResourceEntryResultCallback,
100                   &error, &entry));
101    base::MessageLoop::current()->RunUntilIdle();
102
103    if (entry) {
104      file->resource =
105          drive::util::ConvertResourceEntryToFileResource(*entry);
106    }
107
108    if (file_out)
109      *file_out = file.Pass();
110    return error;
111  }
112
113  google_apis::GDataErrorCode GetSyncRoot(
114      scoped_ptr<TrackedFile>* sync_root_out) {
115    return FillTrackedFileByTrackerID(
116        metadata_database_->GetSyncRootTrackerID(),
117        sync_root_out);
118  }
119
120 private:
121  content::TestBrowserThreadBundle browser_threads_;
122  base::ScopedTempDir database_dir_;
123  drive::FakeDriveService fake_drive_service_;
124
125  scoped_ptr<SyncEngineInitializer> initializer_;
126  scoped_ptr<MetadataDatabase> metadata_database_;
127
128  DISALLOW_COPY_AND_ASSIGN(SyncEngineInitializerTest);
129};
130
131TEST_F(SyncEngineInitializerTest, EmptyDatabase_NoRemoteSyncRoot) {
132  EXPECT_EQ(SYNC_STATUS_OK, RunInitializer());
133
134  scoped_ptr<TrackedFile> sync_root;
135  ASSERT_EQ(google_apis::HTTP_SUCCESS, GetSyncRoot(&sync_root));
136  EXPECT_EQ("Chrome Syncable FileSystem", sync_root->resource->title());
137}
138
139}  // namespace drive_backend
140}  // namespace sync_file_system
141