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