sync_engine_unittest.cc revision 03b57e008b61dfcb1fbad3aea950ae0e001748b0
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.h" 6 7#include "base/files/scoped_temp_dir.h" 8#include "base/macros.h" 9#include "base/run_loop.h" 10#include "base/thread_task_runner_handle.h" 11#include "chrome/browser/drive/drive_uploader.h" 12#include "chrome/browser/drive/fake_drive_service.h" 13#include "chrome/browser/sync_file_system/drive_backend/callback_helper.h" 14#include "chrome/browser/sync_file_system/drive_backend/fake_sync_worker.h" 15#include "chrome/browser/sync_file_system/drive_backend/sync_worker_interface.h" 16#include "chrome/browser/sync_file_system/remote_file_sync_service.h" 17#include "chrome/browser/sync_file_system/sync_file_system_test_util.h" 18#include "content/public/browser/browser_thread.h" 19#include "content/public/test/test_browser_thread_bundle.h" 20#include "testing/gtest/include/gtest/gtest.h" 21 22namespace sync_file_system { 23namespace drive_backend { 24 25class SyncEngineTest : public testing::Test, 26 public base::SupportsWeakPtr<SyncEngineTest> { 27 public: 28 typedef RemoteFileSyncService::OriginStatusMap RemoteOriginStatusMap; 29 30 SyncEngineTest() {} 31 virtual ~SyncEngineTest() {} 32 33 virtual void SetUp() OVERRIDE { 34 ASSERT_TRUE(profile_dir_.CreateUniqueTempDir()); 35 36 scoped_ptr<drive::DriveServiceInterface> 37 fake_drive_service(new drive::FakeDriveService); 38 39 worker_pool_ = new base::SequencedWorkerPool(1, "Worker"); 40 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner = 41 base::ThreadTaskRunnerHandle::Get(); 42 worker_task_runner_ = 43 worker_pool_->GetSequencedTaskRunnerWithShutdownBehavior( 44 worker_pool_->GetSequenceToken(), 45 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); 46 47 sync_engine_.reset(new drive_backend::SyncEngine( 48 ui_task_runner, 49 worker_task_runner_, 50 NULL /* drive_task_runner */, 51 profile_dir_.path(), 52 NULL /* task_logger */, 53 NULL /* notification_manager */, 54 NULL /* extension_service */, 55 NULL /* signin_manager */, 56 NULL /* token_service */, 57 NULL /* request_context */, 58 scoped_ptr<SyncEngine::DriveServiceFactory>(), 59 NULL /* in_memory_env */)); 60 61 sync_engine_->InitializeForTesting( 62 fake_drive_service.Pass(), 63 scoped_ptr<drive::DriveUploaderInterface>(), 64 scoped_ptr<SyncWorkerInterface>(new FakeSyncWorker)); 65 sync_engine_->SetSyncEnabled(true); 66 sync_engine_->OnReadyToSendRequests(); 67 68 WaitForWorkerTaskRunner(); 69 } 70 71 virtual void TearDown() OVERRIDE { 72 sync_engine_.reset(); 73 WaitForWorkerTaskRunner(); 74 worker_pool_->Shutdown(); 75 base::RunLoop().RunUntilIdle(); 76 } 77 78 bool FindOriginStatus(const GURL& origin, std::string* status) { 79 scoped_ptr<RemoteOriginStatusMap> status_map; 80 sync_engine()->GetOriginStatusMap(CreateResultReceiver(&status_map)); 81 WaitForWorkerTaskRunner(); 82 83 RemoteOriginStatusMap::const_iterator itr = status_map->find(origin); 84 if (itr == status_map->end()) 85 return false; 86 87 *status = itr->second; 88 // If an origin is uninstalled, it should not be found actually. 89 if (*status == "Uninstalled") 90 return false; 91 return true; 92 } 93 94 void PostUpdateServiceState(RemoteServiceState state, 95 const std::string& description) { 96 worker_task_runner_->PostTask( 97 FROM_HERE, 98 base::Bind(&FakeSyncWorker::UpdateServiceState, 99 base::Unretained(fake_sync_worker()), 100 state, 101 description)); 102 WaitForWorkerTaskRunner(); 103 } 104 105 void WaitForWorkerTaskRunner() { 106 DCHECK(worker_task_runner_); 107 108 base::RunLoop run_loop; 109 worker_task_runner_->PostTask( 110 FROM_HERE, 111 RelayCallbackToCurrentThread( 112 FROM_HERE, run_loop.QuitClosure())); 113 run_loop.Run(); 114 } 115 116 // Accessors 117 SyncEngine* sync_engine() { return sync_engine_.get(); } 118 119 FakeSyncWorker* fake_sync_worker() { 120 return static_cast<FakeSyncWorker*>(sync_engine_->sync_worker_.get()); 121 } 122 123 private: 124 content::TestBrowserThreadBundle browser_threads_; 125 base::ScopedTempDir profile_dir_; 126 scoped_ptr<drive_backend::SyncEngine> sync_engine_; 127 128 scoped_refptr<base::SequencedWorkerPool> worker_pool_; 129 scoped_refptr<base::SequencedTaskRunner> worker_task_runner_; 130 131 DISALLOW_COPY_AND_ASSIGN(SyncEngineTest); 132}; 133 134TEST_F(SyncEngineTest, OriginTest) { 135 GURL origin("chrome-extension://app_0"); 136 137 SyncStatusCode sync_status; 138 std::string status; 139 140 sync_engine()->RegisterOrigin( 141 origin, 142 CreateResultReceiver(&sync_status)); 143 WaitForWorkerTaskRunner(); 144 EXPECT_EQ(SYNC_STATUS_OK, sync_status); 145 ASSERT_TRUE(FindOriginStatus(origin, &status)); 146 EXPECT_EQ("Registered", status); 147 148 sync_engine()->DisableOrigin( 149 origin, 150 CreateResultReceiver(&sync_status)); 151 WaitForWorkerTaskRunner(); 152 EXPECT_EQ(SYNC_STATUS_OK, sync_status); 153 ASSERT_TRUE(FindOriginStatus(origin, &status)); 154 EXPECT_EQ("Disabled", status); 155 156 sync_engine()->EnableOrigin( 157 origin, 158 CreateResultReceiver(&sync_status)); 159 WaitForWorkerTaskRunner(); 160 EXPECT_EQ(SYNC_STATUS_OK, sync_status); 161 ASSERT_TRUE(FindOriginStatus(origin, &status)); 162 EXPECT_EQ("Enabled", status); 163 164 sync_engine()->UninstallOrigin( 165 origin, 166 RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE, 167 CreateResultReceiver(&sync_status)); 168 WaitForWorkerTaskRunner(); 169 EXPECT_EQ(SYNC_STATUS_OK, sync_status); 170 EXPECT_FALSE(FindOriginStatus(origin, &status)); 171 EXPECT_EQ("Uninstalled", status); 172} 173 174TEST_F(SyncEngineTest, GetOriginStatusMap) { 175 SyncStatusCode sync_status = SYNC_STATUS_UNKNOWN; 176 177 sync_engine()->RegisterOrigin(GURL("chrome-extension://app_0"), 178 CreateResultReceiver(&sync_status)); 179 WaitForWorkerTaskRunner(); 180 EXPECT_EQ(SYNC_STATUS_OK, sync_status); 181 182 sync_engine()->RegisterOrigin(GURL("chrome-extension://app_1"), 183 CreateResultReceiver(&sync_status)); 184 WaitForWorkerTaskRunner(); 185 EXPECT_EQ(SYNC_STATUS_OK, sync_status); 186 187 scoped_ptr<RemoteOriginStatusMap> status_map; 188 sync_engine()->GetOriginStatusMap(CreateResultReceiver(&status_map)); 189 WaitForWorkerTaskRunner(); 190 ASSERT_EQ(2u, status_map->size()); 191 EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_0")]); 192 EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_1")]); 193 194 sync_engine()->DisableOrigin(GURL("chrome-extension://app_1"), 195 CreateResultReceiver(&sync_status)); 196 WaitForWorkerTaskRunner(); 197 EXPECT_EQ(SYNC_STATUS_OK, sync_status); 198 199 sync_engine()->GetOriginStatusMap(CreateResultReceiver(&status_map)); 200 WaitForWorkerTaskRunner(); 201 ASSERT_EQ(2u, status_map->size()); 202 EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_0")]); 203 EXPECT_EQ("Disabled", (*status_map)[GURL("chrome-extension://app_1")]); 204} 205 206TEST_F(SyncEngineTest, UpdateServiceState) { 207 struct { 208 RemoteServiceState state; 209 const char* description; 210 } test_data[] = { 211 {REMOTE_SERVICE_OK, "OK"}, 212 {REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, "TEMPORARY_UNAVAILABLE"}, 213 {REMOTE_SERVICE_AUTHENTICATION_REQUIRED, "AUTHENTICATION_REQUIRED"}, 214 {REMOTE_SERVICE_DISABLED, "DISABLED"}, 215 }; 216 217 for (size_t i = 0; i < ARRAYSIZE_UNSAFE(test_data); ++i) { 218 PostUpdateServiceState(test_data[i].state, test_data[i].description); 219 EXPECT_EQ(test_data[i].state, sync_engine()->GetCurrentState()) 220 << "Expected state: REMOTE_SERVICE_" << test_data[i].description; 221 } 222} 223 224TEST_F(SyncEngineTest, ProcessRemoteChange) { 225 SyncStatusCode sync_status; 226 storage::FileSystemURL url; 227 sync_engine()->ProcessRemoteChange(CreateResultReceiver(&sync_status, &url)); 228 WaitForWorkerTaskRunner(); 229 EXPECT_EQ(SYNC_STATUS_OK, sync_status); 230} 231 232} // namespace drive_backend 233} // namespace sync_file_system 234