OLD | NEW |
---|---|
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine.h" | 5 #include "chrome/browser/sync_file_system/drive_backend/sync_engine.h" |
6 | 6 |
7 #include "base/files/scoped_temp_dir.h" | 7 #include "base/files/scoped_temp_dir.h" |
8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
9 #include "base/strings/stringprintf.h" | |
10 #include "chrome/browser/drive/drive_uploader.h" | 9 #include "chrome/browser/drive/drive_uploader.h" |
11 #include "chrome/browser/drive/fake_drive_service.h" | 10 #include "chrome/browser/drive/fake_drive_service.h" |
12 #include "chrome/browser/extensions/test_extension_service.h" | 11 #include "chrome/browser/sync_file_system/drive_backend/fake_sync_worker.h" |
13 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.h" | 12 #include "chrome/browser/sync_file_system/drive_backend/sync_worker_interface.h" |
14 #include "chrome/browser/sync_file_system/drive_backend/metadata_database.pb.h" | 13 #include "chrome/browser/sync_file_system/remote_file_sync_service.h" |
15 #include "chrome/browser/sync_file_system/drive_backend/sync_task.h" | |
16 #include "chrome/browser/sync_file_system/drive_backend/sync_task_manager.h" | |
17 #include "chrome/browser/sync_file_system/drive_backend/sync_worker.h" | |
18 #include "chrome/browser/sync_file_system/sync_file_system_test_util.h" | 14 #include "chrome/browser/sync_file_system/sync_file_system_test_util.h" |
15 #include "content/public/browser/browser_thread.h" | |
19 #include "content/public/test/test_browser_thread_bundle.h" | 16 #include "content/public/test/test_browser_thread_bundle.h" |
20 #include "extensions/common/extension.h" | |
21 #include "extensions/common/extension_builder.h" | |
22 #include "extensions/common/extension_set.h" | |
23 #include "extensions/common/value_builder.h" | |
24 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
25 #include "third_party/leveldatabase/src/helpers/memenv/memenv.h" | |
26 #include "third_party/leveldatabase/src/include/leveldb/env.h" | |
27 | 18 |
28 namespace sync_file_system { | 19 namespace sync_file_system { |
29 namespace drive_backend { | 20 namespace drive_backend { |
30 | 21 |
31 namespace { | 22 namespace { |
32 | 23 |
33 const char kAppID[] = "app_id"; | 24 template <typename T> |
34 | 25 void SetValueAndCallClosure(const base::Closure& closure, |
35 void EmptyTask(SyncStatusCode status, const SyncStatusCallback& callback) { | 26 T* arg_out, |
36 base::MessageLoop::current()->PostTask( | 27 T arg) { |
37 FROM_HERE, base::Bind(callback, status)); | 28 *arg_out = base::internal::CallbackForward(arg); |
29 closure.Run(); | |
38 } | 30 } |
39 | 31 |
32 void SyncStatusFileURL(const base::Closure& closure, | |
33 SyncStatusCode, | |
34 const fileapi::FileSystemURL&) { | |
35 closure.Run(); | |
36 } | |
37 | |
40 } // namespace | 38 } // namespace |
41 | 39 |
42 class MockSyncTask : public ExclusiveTask { | 40 class SyncEngineTest : public testing::Test, |
41 public RemoteFileSyncService::Observer, | |
nhiroki
2014/06/18 06:58:10
Although you ignore the result in OnRemoteXXX(), d
nhiroki
2014/06/18 07:11:30
Ah, I just got what you mean. You check the status
peria
2014/06/18 08:05:01
Due to a discussion with Tsuiki-san, yes, we can r
| |
42 public base::SupportsWeakPtr<SyncEngineTest> { | |
43 public: | 43 public: |
44 explicit MockSyncTask(bool used_network) { | 44 typedef RemoteFileSyncService::OriginStatusMap RemoteOriginStatusMap; |
45 set_used_network(used_network); | 45 |
46 } | |
47 virtual ~MockSyncTask() {} | |
48 | |
49 virtual void RunExclusive(const SyncStatusCallback& callback) OVERRIDE { | |
50 callback.Run(SYNC_STATUS_OK); | |
51 } | |
52 | |
53 private: | |
54 DISALLOW_COPY_AND_ASSIGN(MockSyncTask); | |
55 }; | |
56 | |
57 class MockExtensionService : public TestExtensionService { | |
58 public: | |
59 MockExtensionService() {} | |
60 virtual ~MockExtensionService() {} | |
61 | |
62 virtual const extensions::ExtensionSet* extensions() const OVERRIDE { | |
63 return &extensions_; | |
64 } | |
65 | |
66 virtual void AddExtension(const extensions::Extension* extension) OVERRIDE { | |
67 extensions_.Insert(make_scoped_refptr(extension)); | |
68 } | |
69 | |
70 virtual const extensions::Extension* GetInstalledExtension( | |
71 const std::string& extension_id) const OVERRIDE { | |
72 return extensions_.GetByID(extension_id); | |
73 } | |
74 | |
75 virtual bool IsExtensionEnabled( | |
76 const std::string& extension_id) const OVERRIDE { | |
77 return extensions_.Contains(extension_id) && | |
78 !disabled_extensions_.Contains(extension_id); | |
79 } | |
80 | |
81 void UninstallExtension(const std::string& extension_id) { | |
82 extensions_.Remove(extension_id); | |
83 disabled_extensions_.Remove(extension_id); | |
84 } | |
85 | |
86 void DisableExtension(const std::string& extension_id) { | |
87 if (!IsExtensionEnabled(extension_id)) | |
88 return; | |
89 const extensions::Extension* extension = extensions_.GetByID(extension_id); | |
90 disabled_extensions_.Insert(make_scoped_refptr(extension)); | |
91 } | |
92 | |
93 private: | |
94 extensions::ExtensionSet extensions_; | |
95 extensions::ExtensionSet disabled_extensions_; | |
96 | |
97 DISALLOW_COPY_AND_ASSIGN(MockExtensionService); | |
98 }; | |
99 | |
100 class SyncEngineTest | |
101 : public testing::Test, | |
102 public base::SupportsWeakPtr<SyncEngineTest> { | |
103 public: | |
104 SyncEngineTest() {} | 46 SyncEngineTest() {} |
105 virtual ~SyncEngineTest() {} | 47 virtual ~SyncEngineTest() {} |
106 | 48 |
107 virtual void SetUp() OVERRIDE { | 49 virtual void SetUp() OVERRIDE { |
108 ASSERT_TRUE(profile_dir_.CreateUniqueTempDir()); | 50 ASSERT_TRUE(profile_dir_.CreateUniqueTempDir()); |
109 in_memory_env_.reset(leveldb::NewMemEnv(leveldb::Env::Default())); | 51 |
110 | |
111 extension_service_.reset(new MockExtensionService); | |
112 scoped_ptr<drive::DriveServiceInterface> | 52 scoped_ptr<drive::DriveServiceInterface> |
113 fake_drive_service(new drive::FakeDriveService); | 53 fake_drive_service(new drive::FakeDriveService); |
114 | 54 |
55 scoped_refptr<base::SequencedWorkerPool> worker_pool = | |
56 content::BrowserThread::GetBlockingPool(); | |
57 scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner = | |
58 base::MessageLoopProxy::current(); | |
59 scoped_refptr<base::SequencedTaskRunner> worker_task_runner = | |
60 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( | |
61 worker_pool->GetSequenceToken(), | |
62 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | |
63 scoped_refptr<base::SequencedTaskRunner> file_task_runner = | |
64 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( | |
65 worker_pool->GetSequenceToken(), | |
66 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | |
67 scoped_refptr<base::SequencedTaskRunner> drive_task_runner = | |
68 worker_pool->GetSequencedTaskRunnerWithShutdownBehavior( | |
69 worker_pool->GetSequenceToken(), | |
70 base::SequencedWorkerPool::SKIP_ON_SHUTDOWN); | |
tzik
2014/06/18 07:39:55
I think we can pass NULL to file_task_runner and d
peria
2014/06/18 08:05:01
Done.
| |
71 | |
72 run_loop_.reset(); | |
73 | |
115 sync_engine_.reset(new drive_backend::SyncEngine( | 74 sync_engine_.reset(new drive_backend::SyncEngine( |
116 base::MessageLoopProxy::current(), // ui_task_runner | 75 ui_task_runner, |
117 base::MessageLoopProxy::current(), // worker_task_runner | 76 worker_task_runner, |
118 base::MessageLoopProxy::current(), // file_task_runner | 77 file_task_runner, |
119 base::MessageLoopProxy::current(), // drive_task_runner | 78 drive_task_runner, |
120 profile_dir_.path(), | 79 profile_dir_.path(), |
121 NULL, // task_logger | 80 NULL /* task_logger */, |
122 NULL, // notification_manager | 81 NULL /* notification_manager */, |
123 extension_service_.get(), | 82 NULL /* extension_service */, |
124 NULL, // signin_manager | 83 NULL /* signin_manager */, |
125 NULL, // token_service | 84 NULL /* token_service */, |
126 NULL, // request_context | 85 NULL /* request_context */, |
127 in_memory_env_.get())); | 86 NULL /* in_memory_env */)); |
87 | |
88 sync_engine_->AddServiceObserver(this); | |
128 | 89 |
129 sync_engine_->InitializeForTesting( | 90 sync_engine_->InitializeForTesting( |
130 fake_drive_service.Pass(), | 91 fake_drive_service.Pass(), |
131 scoped_ptr<drive::DriveUploaderInterface>(), | 92 scoped_ptr<drive::DriveUploaderInterface>(), |
132 scoped_ptr<SyncWorkerInterface>()); | 93 scoped_ptr<SyncWorkerInterface>(new FakeSyncWorker)); |
94 WaitAsyncCall(); | |
95 | |
133 sync_engine_->SetSyncEnabled(true); | 96 sync_engine_->SetSyncEnabled(true); |
97 WaitAsyncCall(); | |
98 | |
134 base::RunLoop().RunUntilIdle(); | 99 base::RunLoop().RunUntilIdle(); |
135 } | 100 } |
136 | 101 |
137 virtual void TearDown() OVERRIDE { | 102 virtual void TearDown() OVERRIDE { |
138 sync_engine_.reset(); | 103 sync_engine_.reset(); |
139 extension_service_.reset(); | 104 |
105 run_loop_.reset(); | |
140 base::RunLoop().RunUntilIdle(); | 106 base::RunLoop().RunUntilIdle(); |
141 } | 107 } |
142 | 108 |
143 MockExtensionService* extension_service() { return extension_service_.get(); } | 109 // RemoteFileSyncService::Observer overrides |
110 virtual void OnRemoteChangeQueueUpdated(int64) OVERRIDE { | |
111 if (run_loop_) | |
112 run_loop_->Quit(); | |
113 } | |
114 | |
115 virtual void OnRemoteServiceStateUpdated( | |
116 RemoteServiceState state, const std::string& description) OVERRIDE { | |
117 if (run_loop_) | |
118 run_loop_->Quit(); | |
119 } | |
120 | |
121 bool FindOriginStatus(const GURL& origin, std::string* status) { | |
122 scoped_ptr<RemoteOriginStatusMap> status_map; | |
123 | |
124 base::RunLoop run_loop; | |
125 sync_engine()->GetOriginStatusMap( | |
126 base::Bind(&SetValueAndCallClosure<scoped_ptr<RemoteOriginStatusMap> >, | |
127 run_loop.QuitClosure(), | |
128 &status_map)); | |
129 run_loop.Run(); | |
130 RemoteOriginStatusMap::const_iterator itr = status_map->find(origin); | |
131 if (itr == status_map->end()) | |
132 return false; | |
133 | |
134 *status = itr->second; | |
135 // If an origin is uninstalled, it should not be found actually. | |
136 if (*status == "Uninstalled") | |
137 return false; | |
138 return true; | |
139 } | |
140 | |
141 void PostUpdateServiceState(RemoteServiceState state, | |
142 const std::string& description) { | |
143 worker_task_runner()->PostTask( | |
144 FROM_HERE, | |
145 base::Bind(&FakeSyncWorker::UpdateServiceState, | |
146 base::Unretained(fake_sync_worker()), | |
147 state, | |
148 description)); | |
149 // Call tree from FakeSyncWorker will call OnRemoteServiceStateUpdated(). | |
150 WaitAsyncCall(); | |
151 } | |
152 | |
153 void WaitAsyncCall() { | |
154 run_loop_.reset(new base::RunLoop); | |
155 run_loop_->Run(); | |
156 run_loop_.reset(); | |
157 } | |
158 | |
159 // Accessors | |
144 SyncEngine* sync_engine() { return sync_engine_.get(); } | 160 SyncEngine* sync_engine() { return sync_engine_.get(); } |
145 | 161 FakeSyncWorker* fake_sync_worker() { |
146 SyncTaskManager* GetSyncTaskManager() { | 162 return static_cast<FakeSyncWorker*>(sync_engine_->sync_worker_.get()); |
147 return sync_engine_->sync_worker_->GetSyncTaskManager(); | 163 } |
148 } | 164 base::SequencedTaskRunner* worker_task_runner() { |
149 | 165 return sync_engine_->worker_task_runner_.get(); |
150 void CheckServiceState(SyncStatusCode expected_sync_status, | |
151 RemoteServiceState expected_service_status, | |
152 SyncStatusCode sync_status) { | |
153 EXPECT_EQ(expected_sync_status, sync_status); | |
154 EXPECT_EQ(expected_service_status, sync_engine_->GetCurrentState()); | |
155 } | |
156 | |
157 MetadataDatabase* metadata_database() { | |
158 return sync_engine_->sync_worker_->GetMetadataDatabase(); | |
159 } | |
160 | |
161 void SetHasRefreshToken(bool has_refresh_token) { | |
162 sync_engine_->sync_worker_->SetHasRefreshToken(has_refresh_token); | |
163 } | 166 } |
164 | 167 |
165 private: | 168 private: |
166 content::TestBrowserThreadBundle browser_threads_; | 169 content::TestBrowserThreadBundle browser_threads_; |
167 base::ScopedTempDir profile_dir_; | 170 base::ScopedTempDir profile_dir_; |
168 scoped_ptr<leveldb::Env> in_memory_env_; | |
169 | |
170 scoped_ptr<MockExtensionService> extension_service_; | |
171 scoped_ptr<drive_backend::SyncEngine> sync_engine_; | 171 scoped_ptr<drive_backend::SyncEngine> sync_engine_; |
172 scoped_ptr<base::RunLoop> run_loop_; | |
172 | 173 |
173 DISALLOW_COPY_AND_ASSIGN(SyncEngineTest); | 174 DISALLOW_COPY_AND_ASSIGN(SyncEngineTest); |
174 }; | 175 }; |
175 | 176 |
176 TEST_F(SyncEngineTest, EnableOrigin) { | 177 TEST_F(SyncEngineTest, OriginTest) { |
177 FileTracker tracker; | 178 GURL origin("chrome-extension://app_0"); |
179 | |
180 SyncStatusCode sync_status; | |
181 std::string status; | |
182 { | |
183 base::RunLoop run_loop; | |
184 sync_engine()->RegisterOrigin( | |
185 origin, | |
186 base::Bind(&SetValueAndCallClosure<SyncStatusCode>, | |
187 run_loop.QuitClosure(), | |
188 &sync_status)); | |
189 run_loop.Run(); | |
190 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | |
191 ASSERT_TRUE(FindOriginStatus(origin, &status)); | |
192 EXPECT_EQ("Registered", status); | |
193 } | |
194 { | |
195 base::RunLoop run_loop; | |
196 sync_engine()->DisableOrigin( | |
197 origin, | |
198 base::Bind(&SetValueAndCallClosure<SyncStatusCode>, | |
199 run_loop.QuitClosure(), | |
200 &sync_status)); | |
201 run_loop.Run(); | |
202 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | |
203 ASSERT_TRUE(FindOriginStatus(origin, &status)); | |
204 EXPECT_EQ("Disabled", status); | |
205 } | |
206 { | |
207 base::RunLoop run_loop; | |
208 sync_engine()->EnableOrigin( | |
209 origin, | |
210 base::Bind(&SetValueAndCallClosure<SyncStatusCode>, | |
211 run_loop.QuitClosure(), | |
212 &sync_status)); | |
213 run_loop.Run(); | |
214 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | |
215 ASSERT_TRUE(FindOriginStatus(origin, &status)); | |
216 EXPECT_EQ("Enabled", status); | |
217 } | |
218 { | |
219 base::RunLoop run_loop; | |
220 sync_engine()->UninstallOrigin( | |
221 origin, | |
222 RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE, | |
223 base::Bind(&SetValueAndCallClosure<SyncStatusCode>, | |
224 run_loop.QuitClosure(), | |
225 &sync_status)); | |
226 run_loop.Run(); | |
227 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | |
228 EXPECT_FALSE(FindOriginStatus(origin, &status)); | |
229 EXPECT_EQ("Uninstalled", status); | |
230 } | |
231 } | |
232 | |
233 TEST_F(SyncEngineTest, GetOriginStatusMap) { | |
178 SyncStatusCode sync_status = SYNC_STATUS_UNKNOWN; | 234 SyncStatusCode sync_status = SYNC_STATUS_UNKNOWN; |
179 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(kAppID); | 235 |
180 | 236 { |
181 sync_engine()->RegisterOrigin(origin, CreateResultReceiver(&sync_status)); | 237 base::RunLoop run_loop; |
182 base::RunLoop().RunUntilIdle(); | 238 sync_engine()->RegisterOrigin( |
239 GURL("chrome-extension://app_0"), | |
240 base::Bind(&SetValueAndCallClosure<SyncStatusCode>, | |
241 run_loop.QuitClosure(), | |
242 &sync_status)); | |
243 run_loop.Run(); | |
244 } | |
183 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | 245 EXPECT_EQ(SYNC_STATUS_OK, sync_status); |
184 ASSERT_TRUE(metadata_database()->FindAppRootTracker(kAppID, &tracker)); | |
185 EXPECT_EQ(TRACKER_KIND_APP_ROOT, tracker.tracker_kind()); | |
186 | |
187 sync_engine()->DisableOrigin(origin, CreateResultReceiver(&sync_status)); | |
188 base::RunLoop().RunUntilIdle(); | |
189 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | |
190 ASSERT_TRUE(metadata_database()->FindAppRootTracker(kAppID, &tracker)); | |
191 EXPECT_EQ(TRACKER_KIND_DISABLED_APP_ROOT, tracker.tracker_kind()); | |
192 | |
193 sync_engine()->EnableOrigin(origin, CreateResultReceiver(&sync_status)); | |
194 base::RunLoop().RunUntilIdle(); | |
195 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | |
196 ASSERT_TRUE(metadata_database()->FindAppRootTracker(kAppID, &tracker)); | |
197 EXPECT_EQ(TRACKER_KIND_APP_ROOT, tracker.tracker_kind()); | |
198 | |
199 sync_engine()->UninstallOrigin( | |
200 origin, | |
201 RemoteFileSyncService::UNINSTALL_AND_KEEP_REMOTE, | |
202 CreateResultReceiver(&sync_status)); | |
203 base::RunLoop().RunUntilIdle(); | |
204 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | |
205 ASSERT_FALSE(metadata_database()->FindAppRootTracker(kAppID, &tracker)); | |
206 } | |
207 | |
208 TEST_F(SyncEngineTest, GetOriginStatusMap) { | |
209 FileTracker tracker; | |
210 SyncStatusCode sync_status = SYNC_STATUS_UNKNOWN; | |
211 GURL origin = extensions::Extension::GetBaseURLFromExtensionId(kAppID); | |
212 | |
213 sync_engine()->RegisterOrigin(GURL("chrome-extension://app_0"), | |
214 CreateResultReceiver(&sync_status)); | |
215 base::RunLoop().RunUntilIdle(); | |
216 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | |
217 | 246 |
218 sync_engine()->RegisterOrigin(GURL("chrome-extension://app_1"), | 247 sync_engine()->RegisterOrigin(GURL("chrome-extension://app_1"), |
219 CreateResultReceiver(&sync_status)); | 248 CreateResultReceiver(&sync_status)); |
220 base::RunLoop().RunUntilIdle(); | 249 base::RunLoop().RunUntilIdle(); |
221 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | 250 EXPECT_EQ(SYNC_STATUS_OK, sync_status); |
222 | 251 |
223 scoped_ptr<RemoteFileSyncService::OriginStatusMap> status_map; | 252 scoped_ptr<RemoteOriginStatusMap> status_map; |
224 sync_engine()->GetOriginStatusMap(CreateResultReceiver(&status_map)); | 253 { |
225 base::RunLoop().RunUntilIdle(); | 254 base::RunLoop run_loop; |
255 sync_engine()->GetOriginStatusMap( | |
256 base::Bind(&SetValueAndCallClosure<scoped_ptr<RemoteOriginStatusMap> >, | |
257 run_loop.QuitClosure(), | |
258 &status_map)); | |
259 run_loop.Run(); | |
260 } | |
226 ASSERT_EQ(2u, status_map->size()); | 261 ASSERT_EQ(2u, status_map->size()); |
227 EXPECT_EQ("Enabled", (*status_map)[GURL("chrome-extension://app_0")]); | 262 EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_0")]); |
228 EXPECT_EQ("Enabled", (*status_map)[GURL("chrome-extension://app_1")]); | 263 EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_1")]); |
229 | 264 |
230 sync_engine()->DisableOrigin(GURL("chrome-extension://app_1"), | 265 { |
231 CreateResultReceiver(&sync_status)); | 266 base::RunLoop run_loop; |
232 base::RunLoop().RunUntilIdle(); | 267 sync_engine()->DisableOrigin( |
268 GURL("chrome-extension://app_1"), | |
269 base::Bind(&SetValueAndCallClosure<SyncStatusCode>, | |
270 run_loop.QuitClosure(), | |
271 &sync_status)); | |
272 run_loop.Run(); | |
273 } | |
233 EXPECT_EQ(SYNC_STATUS_OK, sync_status); | 274 EXPECT_EQ(SYNC_STATUS_OK, sync_status); |
234 | 275 |
235 sync_engine()->GetOriginStatusMap(CreateResultReceiver(&status_map)); | 276 { |
236 base::RunLoop().RunUntilIdle(); | 277 base::RunLoop run_loop; |
278 sync_engine()->GetOriginStatusMap( | |
279 base::Bind(&SetValueAndCallClosure<scoped_ptr<RemoteOriginStatusMap> >, | |
280 run_loop.QuitClosure(), | |
281 &status_map)); | |
282 run_loop.Run(); | |
283 } | |
237 ASSERT_EQ(2u, status_map->size()); | 284 ASSERT_EQ(2u, status_map->size()); |
238 EXPECT_EQ("Enabled", (*status_map)[GURL("chrome-extension://app_0")]); | 285 EXPECT_EQ("Registered", (*status_map)[GURL("chrome-extension://app_0")]); |
239 EXPECT_EQ("Disabled", (*status_map)[GURL("chrome-extension://app_1")]); | 286 EXPECT_EQ("Disabled", (*status_map)[GURL("chrome-extension://app_1")]); |
240 } | 287 } |
241 | 288 |
242 TEST_F(SyncEngineTest, UpdateServiceState) { | 289 TEST_F(SyncEngineTest, UpdateServiceState) { |
243 EXPECT_EQ(REMOTE_SERVICE_OK, sync_engine()->GetCurrentState()); | 290 struct { |
291 RemoteServiceState state; | |
292 const char* description; | |
293 } test_data[] = { | |
294 {REMOTE_SERVICE_OK, "OK"}, | |
295 {REMOTE_SERVICE_TEMPORARY_UNAVAILABLE, "TEMPORARY_UNAVAILABLE"}, | |
296 {REMOTE_SERVICE_AUTHENTICATION_REQUIRED, "AUTHENTICATION_REQUIRED"}, | |
297 {REMOTE_SERVICE_DISABLED, "DISABLED"}, | |
244 | 298 |
245 // Assume an user is in login state. | 299 {REMOTE_SERVICE_STATE_MAX, "STATE_MAX"}, // Will not be tested |
246 sync_engine()->OnReadyToSendRequests(); | 300 }; |
247 | 301 |
248 GetSyncTaskManager()->ScheduleTask( | 302 for (int i = 0; test_data[i].state != REMOTE_SERVICE_STATE_MAX; ++i) { |
249 FROM_HERE, | 303 PostUpdateServiceState(test_data[i].state, test_data[i].description); |
250 base::Bind(&EmptyTask, SYNC_STATUS_AUTHENTICATION_FAILED), | 304 EXPECT_EQ(test_data[i].state, sync_engine()->GetCurrentState()) |
251 SyncTaskManager::PRIORITY_MED, | 305 << "Expected state: REMOTE_SERVICE_" << test_data[i].description; |
252 base::Bind(&SyncEngineTest::CheckServiceState, | 306 } |
253 AsWeakPtr(), | 307 } |
254 SYNC_STATUS_AUTHENTICATION_FAILED, | |
255 REMOTE_SERVICE_AUTHENTICATION_REQUIRED)); | |
256 | 308 |
257 GetSyncTaskManager()->ScheduleTask( | 309 TEST_F(SyncEngineTest, ProcessRemoteChange) { |
258 FROM_HERE, | 310 base::RunLoop run_loop; |
259 base::Bind(&EmptyTask, SYNC_STATUS_ACCESS_FORBIDDEN), | 311 sync_engine()->ProcessRemoteChange( |
260 SyncTaskManager::PRIORITY_MED, | 312 base::Bind(&SyncStatusFileURL, run_loop.QuitClosure())); |
261 base::Bind(&SyncEngineTest::CheckServiceState, | 313 run_loop.Run(); |
262 AsWeakPtr(), | |
263 SYNC_STATUS_ACCESS_FORBIDDEN, | |
264 REMOTE_SERVICE_AUTHENTICATION_REQUIRED)); | |
265 | |
266 GetSyncTaskManager()->ScheduleTask( | |
267 FROM_HERE, | |
268 base::Bind(&EmptyTask, SYNC_STATUS_SERVICE_TEMPORARILY_UNAVAILABLE), | |
269 SyncTaskManager::PRIORITY_MED, | |
270 base::Bind(&SyncEngineTest::CheckServiceState, | |
271 AsWeakPtr(), | |
272 SYNC_STATUS_SERVICE_TEMPORARILY_UNAVAILABLE, | |
273 REMOTE_SERVICE_TEMPORARY_UNAVAILABLE)); | |
274 | |
275 GetSyncTaskManager()->ScheduleTask( | |
276 FROM_HERE, | |
277 base::Bind(&EmptyTask, SYNC_STATUS_NETWORK_ERROR), | |
278 SyncTaskManager::PRIORITY_MED, | |
279 base::Bind(&SyncEngineTest::CheckServiceState, | |
280 AsWeakPtr(), | |
281 SYNC_STATUS_NETWORK_ERROR, | |
282 REMOTE_SERVICE_TEMPORARY_UNAVAILABLE)); | |
283 | |
284 GetSyncTaskManager()->ScheduleTask( | |
285 FROM_HERE, | |
286 base::Bind(&EmptyTask, SYNC_STATUS_ABORT), | |
287 SyncTaskManager::PRIORITY_MED, | |
288 base::Bind(&SyncEngineTest::CheckServiceState, | |
289 AsWeakPtr(), | |
290 SYNC_STATUS_ABORT, | |
291 REMOTE_SERVICE_TEMPORARY_UNAVAILABLE)); | |
292 | |
293 GetSyncTaskManager()->ScheduleTask( | |
294 FROM_HERE, | |
295 base::Bind(&EmptyTask, SYNC_STATUS_FAILED), | |
296 SyncTaskManager::PRIORITY_MED, | |
297 base::Bind(&SyncEngineTest::CheckServiceState, | |
298 AsWeakPtr(), | |
299 SYNC_STATUS_FAILED, | |
300 REMOTE_SERVICE_TEMPORARY_UNAVAILABLE)); | |
301 | |
302 GetSyncTaskManager()->ScheduleTask( | |
303 FROM_HERE, | |
304 base::Bind(&EmptyTask, SYNC_DATABASE_ERROR_CORRUPTION), | |
305 SyncTaskManager::PRIORITY_MED, | |
306 base::Bind(&SyncEngineTest::CheckServiceState, | |
307 AsWeakPtr(), | |
308 SYNC_DATABASE_ERROR_CORRUPTION, | |
309 REMOTE_SERVICE_DISABLED)); | |
310 | |
311 GetSyncTaskManager()->ScheduleTask( | |
312 FROM_HERE, | |
313 base::Bind(&EmptyTask, SYNC_DATABASE_ERROR_IO_ERROR), | |
314 SyncTaskManager::PRIORITY_MED, | |
315 base::Bind(&SyncEngineTest::CheckServiceState, | |
316 AsWeakPtr(), | |
317 SYNC_DATABASE_ERROR_IO_ERROR, | |
318 REMOTE_SERVICE_DISABLED)); | |
319 | |
320 GetSyncTaskManager()->ScheduleTask( | |
321 FROM_HERE, | |
322 base::Bind(&EmptyTask, SYNC_DATABASE_ERROR_FAILED), | |
323 SyncTaskManager::PRIORITY_MED, | |
324 base::Bind(&SyncEngineTest::CheckServiceState, | |
325 AsWeakPtr(), | |
326 SYNC_DATABASE_ERROR_FAILED, | |
327 REMOTE_SERVICE_DISABLED)); | |
328 | |
329 GetSyncTaskManager()->ScheduleSyncTask( | |
330 FROM_HERE, | |
331 scoped_ptr<SyncTask>(new MockSyncTask(false)), | |
332 SyncTaskManager::PRIORITY_MED, | |
333 base::Bind(&SyncEngineTest::CheckServiceState, | |
334 AsWeakPtr(), | |
335 SYNC_STATUS_OK, | |
336 REMOTE_SERVICE_DISABLED)); | |
337 | |
338 GetSyncTaskManager()->ScheduleSyncTask( | |
339 FROM_HERE, | |
340 scoped_ptr<SyncTask>(new MockSyncTask(true)), | |
341 SyncTaskManager::PRIORITY_MED, | |
342 base::Bind(&SyncEngineTest::CheckServiceState, | |
343 AsWeakPtr(), | |
344 SYNC_STATUS_OK, | |
345 REMOTE_SERVICE_OK)); | |
346 | |
347 base::RunLoop().RunUntilIdle(); | |
348 } | 314 } |
349 | 315 |
350 } // namespace drive_backend | 316 } // namespace drive_backend |
351 } // namespace sync_file_system | 317 } // namespace sync_file_system |
OLD | NEW |