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