sync_file_system_apitest.cc revision e5d81f57cb97b3b6b7fccc9c5610d21eb81db09d
1// Copyright (c) 2012 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 "base/bind.h"
6#include "base/command_line.h"
7#include "base/path_service.h"
8#include "base/run_loop.h"
9#include "chrome/browser/extensions/extension_apitest.h"
10#include "chrome/browser/sync_file_system/drive_backend_v1/drive_file_sync_service.h"
11#include "chrome/browser/sync_file_system/file_status_observer.h"
12#include "chrome/browser/sync_file_system/local_change_processor.h"
13#include "chrome/browser/sync_file_system/mock_remote_file_sync_service.h"
14#include "chrome/browser/sync_file_system/sync_file_system_service.h"
15#include "chrome/browser/sync_file_system/sync_file_system_service_factory.h"
16#include "chrome/browser/sync_file_system/sync_status_code.h"
17#include "chrome/browser/sync_file_system/syncable_file_system_util.h"
18#include "chrome/common/chrome_version_info.h"
19#include "chrome/test/base/test_switches.h"
20#include "testing/gmock/include/gmock/gmock.h"
21#include "testing/gtest/include/gtest/gtest.h"
22#include "webkit/browser/fileapi/file_system_url.h"
23#include "webkit/browser/quota/quota_manager.h"
24
25using ::testing::_;
26using ::testing::Eq;
27using ::testing::Ne;
28using ::testing::Property;
29using ::testing::Return;
30using fileapi::FileSystemURL;
31using sync_file_system::MockRemoteFileSyncService;
32using sync_file_system::RemoteFileSyncService;
33using sync_file_system::SyncFileSystemServiceFactory;
34
35namespace {
36
37class SyncFileSystemApiTest : public ExtensionApiTest {
38 public:
39  SyncFileSystemApiTest()
40      : mock_remote_service_(NULL),
41        real_minimum_preserved_space_(0),
42        real_default_quota_(0) {}
43
44  virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
45    ExtensionApiTest::SetUpInProcessBrowserTestFixture();
46
47    real_minimum_preserved_space_ =
48        quota::QuotaManager::kMinimumPreserveForSystem;
49    quota::QuotaManager::kMinimumPreserveForSystem = 0;
50
51    // TODO(calvinlo): Update test code after default quota is made const
52    // (http://crbug.com/155488).
53    real_default_quota_ = quota::QuotaManager::kSyncableStorageDefaultHostQuota;
54    quota::QuotaManager::kSyncableStorageDefaultHostQuota = 123456;
55  }
56
57  virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
58    quota::QuotaManager::kMinimumPreserveForSystem =
59        real_minimum_preserved_space_;
60    quota::QuotaManager::kSyncableStorageDefaultHostQuota = real_default_quota_;
61    ExtensionApiTest::TearDownInProcessBrowserTestFixture();
62  }
63
64  virtual void SetUpOnMainThread() OVERRIDE {
65    // Must happen after the browser process is created because instantiating
66    // the factory will instantiate ExtensionSystemFactory which depends on
67    // ExtensionsBrowserClient setup in BrowserProcessImpl.
68    mock_remote_service_ = new ::testing::NiceMock<MockRemoteFileSyncService>;
69    SyncFileSystemServiceFactory::GetInstance()->set_mock_remote_file_service(
70        scoped_ptr<RemoteFileSyncService>(mock_remote_service_));
71    ExtensionApiTest::SetUpOnMainThread();
72  }
73
74  ::testing::NiceMock<MockRemoteFileSyncService>* mock_remote_service() {
75    return mock_remote_service_;
76  }
77
78 private:
79  ::testing::NiceMock<MockRemoteFileSyncService>* mock_remote_service_;
80  int64 real_minimum_preserved_space_;
81  int64 real_default_quota_;
82};
83
84ACTION_P(NotifyOkStateAndCallback, mock_remote_service) {
85  mock_remote_service->NotifyRemoteServiceStateUpdated(
86      sync_file_system::REMOTE_SERVICE_OK, "Test event description.");
87  base::MessageLoopProxy::current()->PostTask(
88      FROM_HERE, base::Bind(arg1, sync_file_system::SYNC_STATUS_OK));
89}
90
91ACTION_P2(UpdateRemoteChangeQueue, origin, mock_remote_service) {
92  *origin = arg0;
93  mock_remote_service->NotifyRemoteChangeQueueUpdated(1);
94}
95
96ACTION_P5(ReturnWithFakeFileAddedStatus,
97          origin,
98          mock_remote_service,
99          sync_direction,
100          sync_file_status,
101          sync_action_taken) {
102  FileSystemURL mock_url = sync_file_system::CreateSyncableFileSystemURL(
103      *origin,
104      base::FilePath(FILE_PATH_LITERAL("foo.txt")));
105  mock_remote_service->NotifyRemoteChangeQueueUpdated(0);
106  base::MessageLoopProxy::current()->PostTask(
107      FROM_HERE, base::Bind(arg0,
108                            sync_file_system::SYNC_STATUS_OK,
109                            mock_url));
110  mock_remote_service->NotifyFileStatusChanged(
111      mock_url, sync_direction, sync_file_status, sync_action_taken);
112}
113
114}  // namespace
115
116IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, GetFileStatus) {
117  EXPECT_CALL(*mock_remote_service(), IsConflicting(_)).WillOnce(Return(true));
118  ASSERT_TRUE(RunPlatformAppTest("sync_file_system/get_file_status"))
119      << message_;
120}
121
122IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, GetFileStatuses) {
123  // Mocking to return IsConflicting() == true only for the path "Conflicting".
124  base::FilePath conflicting = base::FilePath::FromUTF8Unsafe("Conflicting");
125  EXPECT_CALL(*mock_remote_service(),
126              IsConflicting(Property(&FileSystemURL::path, Eq(conflicting))))
127      .WillOnce(Return(true));
128  EXPECT_CALL(*mock_remote_service(),
129              IsConflicting(Property(&FileSystemURL::path, Ne(conflicting))))
130      .WillRepeatedly(Return(false));
131
132  ASSERT_TRUE(RunPlatformAppTest("sync_file_system/get_file_statuses"))
133      << message_;
134}
135
136IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, GetUsageAndQuota) {
137  ASSERT_TRUE(RunExtensionTest("sync_file_system/get_usage_and_quota"))
138      << message_;
139}
140
141IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, OnFileStatusChanged) {
142  // Mock a pending remote change to be synced.
143  GURL origin;
144  EXPECT_CALL(*mock_remote_service(), RegisterOrigin(_, _))
145      .WillOnce(UpdateRemoteChangeQueue(&origin, mock_remote_service()));
146  EXPECT_CALL(*mock_remote_service(), ProcessRemoteChange(_))
147      .WillOnce(ReturnWithFakeFileAddedStatus(
148          &origin,
149          mock_remote_service(),
150          sync_file_system::SYNC_FILE_STATUS_SYNCED,
151          sync_file_system::SYNC_ACTION_ADDED,
152          sync_file_system::SYNC_DIRECTION_REMOTE_TO_LOCAL));
153  ASSERT_TRUE(RunPlatformAppTest("sync_file_system/on_file_status_changed"))
154      << message_;
155}
156
157IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, OnFileStatusChangedDeleted) {
158  // Mock a pending remote change to be synced.
159  GURL origin;
160  EXPECT_CALL(*mock_remote_service(), RegisterOrigin(_, _))
161      .WillOnce(UpdateRemoteChangeQueue(&origin, mock_remote_service()));
162  EXPECT_CALL(*mock_remote_service(), ProcessRemoteChange(_))
163      .WillOnce(ReturnWithFakeFileAddedStatus(
164          &origin,
165          mock_remote_service(),
166          sync_file_system::SYNC_FILE_STATUS_SYNCED,
167          sync_file_system::SYNC_ACTION_DELETED,
168          sync_file_system::SYNC_DIRECTION_REMOTE_TO_LOCAL));
169  ASSERT_TRUE(RunPlatformAppTest(
170      "sync_file_system/on_file_status_changed_deleted"))
171      << message_;
172}
173
174IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, OnServiceStatusChanged) {
175  EXPECT_CALL(*mock_remote_service(), RegisterOrigin(_, _))
176      .WillOnce(NotifyOkStateAndCallback(mock_remote_service()));
177  ASSERT_TRUE(RunPlatformAppTest("sync_file_system/on_service_status_changed"))
178      << message_;
179}
180
181IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, RequestFileSystem) {
182  EXPECT_CALL(*mock_remote_service(), RegisterOrigin(_, _)).Times(1);
183  ASSERT_TRUE(RunPlatformAppTest("sync_file_system/request_file_system"))
184      << message_;
185}
186
187IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, WriteFileThenGetUsage) {
188  ASSERT_TRUE(RunPlatformAppTest("sync_file_system/write_file_then_get_usage"))
189      << message_;
190}
191
192IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, ConflictResolutionPolicy) {
193  ASSERT_TRUE(RunPlatformAppTest("sync_file_system/conflict_resolution_policy"))
194      << message_;
195}
196
197IN_PROC_BROWSER_TEST_F(SyncFileSystemApiTest, GetServiceStatus) {
198  mock_remote_service()->SetServiceState(
199      sync_file_system::REMOTE_SERVICE_AUTHENTICATION_REQUIRED);
200  ASSERT_TRUE(RunPlatformAppTest("sync_file_system/get_service_status"))
201      << message_;
202}
203