1 // Copyright 2015 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.
5 #include "content/browser/background_sync/background_sync_manager.h"
7 #include "base/files/scoped_temp_dir.h"
8 #include "base/location.h"
9 #include "base/logging.h"
10 #include "base/power_monitor/power_monitor.h"
11 #include "base/power_monitor/power_monitor_source.h"
12 #include "base/run_loop.h"
13 #include "base/single_thread_task_runner.h"
14 #include "base/thread_task_runner_handle.h"
15 #include "content/browser/background_sync/background_sync_status.h"
16 #include "content/browser/browser_thread_impl.h"
17 #include "content/browser/service_worker/embedded_worker_test_helper.h"
18 #include "content/browser/service_worker/service_worker_context_core.h"
19 #include "content/browser/service_worker/service_worker_context_wrapper.h"
20 #include "content/browser/service_worker/service_worker_storage.h"
21 #include "content/public/test/test_browser_thread_bundle.h"
22 #include "net/base/network_change_notifier.h"
23 #include "testing/gtest/include/gtest/gtest.h"
29 const char kPattern1
[] = "https://example.com/a";
30 const char kPattern2
[] = "https://example.com/b";
31 const char kScript1
[] = "https://example.com/a/script.js";
32 const char kScript2
[] = "https://example.com/b/script.js";
33 const int kRenderProcessId
= 99;
35 void RegisterServiceWorkerCallback(bool* called
,
36 int64
* store_registration_id
,
37 ServiceWorkerStatusCode status
,
38 const std::string
& status_message
,
39 int64 registration_id
) {
40 EXPECT_EQ(SERVICE_WORKER_OK
, status
) << ServiceWorkerStatusToString(status
);
42 *store_registration_id
= registration_id
;
45 void FindServiceWorkerRegistrationCallback(
46 scoped_refptr
<ServiceWorkerRegistration
>* out_registration
,
47 ServiceWorkerStatusCode status
,
48 const scoped_refptr
<ServiceWorkerRegistration
>& registration
) {
49 EXPECT_EQ(SERVICE_WORKER_OK
, status
) << ServiceWorkerStatusToString(status
);
50 *out_registration
= registration
;
53 void UnregisterServiceWorkerCallback(bool* called
,
54 ServiceWorkerStatusCode code
) {
55 EXPECT_EQ(SERVICE_WORKER_OK
, code
);
59 void OneShotSuccessfulCallback(
61 const scoped_refptr
<ServiceWorkerVersion
>& active_version
,
62 const ServiceWorkerVersion::StatusCallback
& callback
) {
64 callback
.Run(SERVICE_WORKER_OK
);
67 void OneShotFailedCallback(
69 const scoped_refptr
<ServiceWorkerVersion
>& active_version
,
70 const ServiceWorkerVersion::StatusCallback
& callback
) {
72 callback
.Run(SERVICE_WORKER_ERROR_FAILED
);
75 void OneShotDelayedCallback(
77 ServiceWorkerVersion::StatusCallback
* out_callback
,
78 const scoped_refptr
<ServiceWorkerVersion
>& active_version
,
79 const ServiceWorkerVersion::StatusCallback
& callback
) {
81 *out_callback
= callback
;
84 class TestPowerSource
: public base::PowerMonitorSource
{
86 void GeneratePowerStateEvent(bool on_battery_power
) {
87 test_on_battery_power_
= on_battery_power
;
88 ProcessPowerEvent(POWER_STATE_EVENT
);
92 bool IsOnBatteryPowerImpl() final
{ return test_on_battery_power_
; }
93 bool test_on_battery_power_
= false;
98 // A BackgroundSyncManager that can simulate delaying and corrupting the backend
99 // storage and service worker onsync events.
100 class TestBackgroundSyncManager
: public BackgroundSyncManager
{
102 using OneShotCallback
=
103 base::Callback
<void(const scoped_refptr
<ServiceWorkerVersion
>&,
104 const ServiceWorkerVersion::StatusCallback
&)>;
106 explicit TestBackgroundSyncManager(
107 const scoped_refptr
<ServiceWorkerContextWrapper
>& service_worker_context
)
108 : BackgroundSyncManager(service_worker_context
) {}
110 void DoInit() { Init(); }
112 void StoreDataInBackendContinue(
113 int64 sw_registration_id
,
115 const std::string
& key
,
116 const std::string
& data
,
117 const ServiceWorkerStorage::StatusCallback
& callback
) {
118 BackgroundSyncManager::StoreDataInBackend(sw_registration_id
, origin
, key
,
122 void GetDataFromBackendContinue(
123 const std::string
& key
,
124 const ServiceWorkerStorage::GetUserDataForAllRegistrationsCallback
&
126 BackgroundSyncManager::GetDataFromBackend(key
, callback
);
131 continuation_
.Reset();
134 void set_corrupt_backend(bool corrupt_backend
) {
135 corrupt_backend_
= corrupt_backend
;
137 void set_delay_backend(bool delay_backend
) { delay_backend_
= delay_backend
; }
138 void set_one_shot_callback(const OneShotCallback
& callback
) {
139 one_shot_callback_
= callback
;
143 void StoreDataInBackend(
144 int64 sw_registration_id
,
146 const std::string
& key
,
147 const std::string
& data
,
148 const ServiceWorkerStorage::StatusCallback
& callback
) override
{
149 EXPECT_TRUE(continuation_
.is_null());
150 if (corrupt_backend_
) {
151 base::ThreadTaskRunnerHandle::Get()->PostTask(
152 FROM_HERE
, base::Bind(callback
, SERVICE_WORKER_ERROR_FAILED
));
156 base::Bind(&TestBackgroundSyncManager::StoreDataInBackendContinue
,
157 base::Unretained(this), sw_registration_id
, origin
, key
,
165 void GetDataFromBackend(
166 const std::string
& key
,
167 const ServiceWorkerStorage::GetUserDataForAllRegistrationsCallback
&
169 EXPECT_TRUE(continuation_
.is_null());
170 if (corrupt_backend_
) {
171 base::ThreadTaskRunnerHandle::Get()->PostTask(
173 base::Bind(callback
, std::vector
<std::pair
<int64
, std::string
>>(),
174 SERVICE_WORKER_ERROR_FAILED
));
178 base::Bind(&TestBackgroundSyncManager::GetDataFromBackendContinue
,
179 base::Unretained(this), key
, callback
);
186 void FireOneShotSync(
187 const BackgroundSyncRegistration
& registration
,
188 const scoped_refptr
<ServiceWorkerVersion
>& active_version
,
189 const ServiceWorkerVersion::StatusCallback
& callback
) override
{
190 if (one_shot_callback_
.is_null()) {
191 BackgroundSyncManager::FireOneShotSync(registration
, active_version
,
194 one_shot_callback_
.Run(active_version
, callback
);
199 bool corrupt_backend_
= false;
200 bool delay_backend_
= false;
201 base::Closure continuation_
;
202 OneShotCallback one_shot_callback_
;
205 class BackgroundSyncManagerTest
: public testing::Test
{
207 BackgroundSyncManagerTest()
208 : browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP
),
209 network_change_notifier_(net::NetworkChangeNotifier::CreateMock()),
210 test_background_sync_manager_(nullptr),
211 callback_status_(BACKGROUND_SYNC_STATUS_OK
),
212 callback_sw_status_code_(SERVICE_WORKER_OK
),
213 sync_events_called_(0) {
214 sync_options_1_
.tag
= "foo";
215 sync_options_1_
.periodicity
= SYNC_ONE_SHOT
;
216 sync_options_1_
.network_state
= NETWORK_STATE_ONLINE
;
217 sync_options_1_
.power_state
= POWER_STATE_AUTO
;
219 sync_options_2_
.tag
= "bar";
220 sync_options_2_
.periodicity
= SYNC_ONE_SHOT
;
221 sync_options_2_
.network_state
= NETWORK_STATE_ONLINE
;
222 sync_options_2_
.power_state
= POWER_STATE_AUTO
;
225 void SetUp() override
{
227 new EmbeddedWorkerTestHelper(base::FilePath(), kRenderProcessId
));
229 power_monitor_source_
= new TestPowerSource();
230 // power_monitor_ takes ownership of power_monitor_source.
231 power_monitor_
.reset(new base::PowerMonitor(
232 scoped_ptr
<base::PowerMonitorSource
>(power_monitor_source_
)));
234 SetOnBatteryPower(false);
236 SetupBackgroundSyncManager();
238 // Wait for storage to finish initializing before registering service
240 base::RunLoop().RunUntilIdle();
241 RegisterServiceWorkers();
244 void RegisterServiceWorkers() {
245 bool called_1
= false;
246 bool called_2
= false;
247 helper_
->context()->RegisterServiceWorker(
248 GURL(kPattern1
), GURL(kScript1
), NULL
,
249 base::Bind(&RegisterServiceWorkerCallback
, &called_1
,
250 &sw_registration_id_1_
));
252 helper_
->context()->RegisterServiceWorker(
253 GURL(kPattern2
), GURL(kScript2
), NULL
,
254 base::Bind(&RegisterServiceWorkerCallback
, &called_2
,
255 &sw_registration_id_2_
));
256 base::RunLoop().RunUntilIdle();
257 EXPECT_TRUE(called_1
);
258 EXPECT_TRUE(called_2
);
260 // Register window clients for the service workers
261 host_1_
.reset(new ServiceWorkerProviderHost(
262 34 /* dummy render proces id */, MSG_ROUTING_NONE
/* render_frame_id */,
263 1 /* dummy provider id */, SERVICE_WORKER_PROVIDER_FOR_WINDOW
,
264 helper_
->context()->AsWeakPtr(), nullptr));
265 host_1_
->SetDocumentUrl(GURL(kPattern1
));
266 host_2_
.reset(new ServiceWorkerProviderHost(
267 34 /* dummy render proces id */, MSG_ROUTING_NONE
/* render_frame_id */,
268 1 /* dummy provider id */, SERVICE_WORKER_PROVIDER_FOR_WINDOW
,
269 helper_
->context()->AsWeakPtr(), nullptr));
270 host_2_
->SetDocumentUrl(GURL(kPattern2
));
272 // Hang onto the registrations as they need to be "live" when
273 // calling BackgroundSyncManager::Register.
274 helper_
->context_wrapper()->FindRegistrationForId(
275 sw_registration_id_1_
, GURL(kPattern1
).GetOrigin(),
276 base::Bind(FindServiceWorkerRegistrationCallback
, &sw_registration_1_
));
278 helper_
->context_wrapper()->FindRegistrationForId(
279 sw_registration_id_2_
, GURL(kPattern1
).GetOrigin(),
280 base::Bind(FindServiceWorkerRegistrationCallback
, &sw_registration_2_
));
281 base::RunLoop().RunUntilIdle();
282 EXPECT_TRUE(sw_registration_1_
);
283 EXPECT_TRUE(sw_registration_2_
);
285 sw_registration_1_
->active_version()->AddControllee(host_1_
.get());
286 sw_registration_2_
->active_version()->AddControllee(host_2_
.get());
289 void RemoveWindowClients() {
290 sw_registration_1_
->active_version()->RemoveControllee(host_1_
.get());
291 sw_registration_2_
->active_version()->RemoveControllee(host_2_
.get());
294 void SetNetwork(net::NetworkChangeNotifier::ConnectionType connection_type
) {
295 net::NetworkChangeNotifier::NotifyObserversOfNetworkChangeForTests(
297 base::RunLoop().RunUntilIdle();
300 void SetOnBatteryPower(bool on_battery_power
) {
301 power_monitor_source_
->GeneratePowerStateEvent(on_battery_power
);
302 base::RunLoop().RunUntilIdle();
305 void StatusAndRegistrationCallback(
307 BackgroundSyncStatus status
,
308 const BackgroundSyncRegistration
& registration
) {
310 callback_status_
= status
;
311 callback_registration_
= registration
;
314 void StatusAndRegistrationsCallback(
316 BackgroundSyncStatus status
,
317 const std::vector
<BackgroundSyncRegistration
>& registrations
) {
319 callback_status_
= status
;
320 callback_registrations_
= registrations
;
323 void StatusCallback(bool* was_called
, BackgroundSyncStatus status
) {
325 callback_status_
= status
;
329 void CreateBackgroundSyncManager() {
330 test_background_sync_manager_
=
331 new TestBackgroundSyncManager(helper_
->context_wrapper());
332 background_sync_manager_
.reset(test_background_sync_manager_
);
335 void InitBackgroundSyncManager() {
336 test_background_sync_manager_
->DoInit();
338 // Many tests do not expect the sync event to fire immediately after
339 // register (and cleanup up the sync registrations). Tests can control when
340 // the sync event fires by manipulating the network state as needed.
341 // NOTE: The setup of the network connection must happen after the
342 // BackgroundSyncManager has been setup.
343 SetNetwork(net::NetworkChangeNotifier::CONNECTION_NONE
);
346 void SetupBackgroundSyncManager() {
347 CreateBackgroundSyncManager();
348 InitBackgroundSyncManager();
351 void SetupCorruptBackgroundSyncManager() {
352 CreateBackgroundSyncManager();
353 test_background_sync_manager_
->set_corrupt_backend(true);
354 InitBackgroundSyncManager();
357 void SetupDelayedBackgroundSyncManager() {
358 CreateBackgroundSyncManager();
359 test_background_sync_manager_
->set_delay_backend(true);
360 InitBackgroundSyncManager();
363 void DeleteBackgroundSyncManager() {
364 background_sync_manager_
.reset();
365 test_background_sync_manager_
= nullptr;
368 bool Register(const BackgroundSyncRegistrationOptions
& sync_options
) {
369 return RegisterWithServiceWorkerId(sw_registration_id_1_
, sync_options
);
372 bool RegisterWithServiceWorkerId(
373 int64 sw_registration_id
,
374 const BackgroundSyncRegistrationOptions
& options
) {
375 bool was_called
= false;
376 background_sync_manager_
->Register(
377 sw_registration_id
, options
, true /* requested_from_service_worker */,
378 base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback
,
379 base::Unretained(this), &was_called
));
380 base::RunLoop().RunUntilIdle();
381 EXPECT_TRUE(was_called
);
382 return callback_status_
== BACKGROUND_SYNC_STATUS_OK
;
385 bool RegisterFromDocumentWithServiceWorkerId(
386 int64 sw_registration_id
,
387 const BackgroundSyncRegistrationOptions
& options
) {
388 bool was_called
= false;
389 background_sync_manager_
->Register(
390 sw_registration_id
, options
, false /* requested_from_service_worker */,
391 base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback
,
392 base::Unretained(this), &was_called
));
393 base::RunLoop().RunUntilIdle();
394 EXPECT_TRUE(was_called
);
395 return callback_status_
== BACKGROUND_SYNC_STATUS_OK
;
398 bool Unregister(const BackgroundSyncRegistration
& sync_registration
) {
399 return UnregisterWithServiceWorkerId(sw_registration_id_1_
,
403 bool UnregisterWithServiceWorkerId(
404 int64 sw_registration_id
,
405 const BackgroundSyncRegistration
& sync_registration
) {
406 bool was_called
= false;
407 background_sync_manager_
->Unregister(
408 sw_registration_id
, sync_registration
.options()->tag
,
409 sync_registration
.options()->periodicity
, sync_registration
.id(),
410 base::Bind(&BackgroundSyncManagerTest::StatusCallback
,
411 base::Unretained(this), &was_called
));
412 base::RunLoop().RunUntilIdle();
413 EXPECT_TRUE(was_called
);
414 return callback_status_
== BACKGROUND_SYNC_STATUS_OK
;
417 bool GetRegistration(const BackgroundSyncRegistrationOptions
& sync_options
) {
418 return GetRegistrationWithServiceWorkerId(sw_registration_id_1_
,
422 bool GetRegistrationWithServiceWorkerId(
423 int64 sw_registration_id
,
424 const BackgroundSyncRegistrationOptions
& sync_options
) {
425 bool was_called
= false;
426 background_sync_manager_
->GetRegistration(
427 sw_registration_id
, sync_options
.tag
, sync_options
.periodicity
,
428 base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback
,
429 base::Unretained(this), &was_called
));
430 base::RunLoop().RunUntilIdle();
431 EXPECT_TRUE(was_called
);
433 if (callback_status_
== BACKGROUND_SYNC_STATUS_OK
) {
434 EXPECT_STREQ(sync_options
.tag
.c_str(),
435 callback_registration_
.options()->tag
.c_str());
438 return callback_status_
== BACKGROUND_SYNC_STATUS_OK
;
441 bool GetRegistrations(SyncPeriodicity periodicity
) {
442 return GetRegistrationWithServiceWorkerId(sw_registration_id_1_
,
446 bool GetRegistrationWithServiceWorkerId(int64 sw_registration_id
,
447 SyncPeriodicity periodicity
) {
448 bool was_called
= false;
449 background_sync_manager_
->GetRegistrations(
450 sw_registration_id
, periodicity
,
451 base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationsCallback
,
452 base::Unretained(this), &was_called
));
453 base::RunLoop().RunUntilIdle();
454 EXPECT_TRUE(was_called
);
456 return callback_status_
== BACKGROUND_SYNC_STATUS_OK
;
459 void StorageRegistrationCallback(ServiceWorkerStatusCode result
) {
460 callback_sw_status_code_
= result
;
463 void UnregisterServiceWorker(uint64 sw_registration_id
) {
465 helper_
->context()->UnregisterServiceWorker(
466 PatternForSWId(sw_registration_id
),
467 base::Bind(&UnregisterServiceWorkerCallback
, &called
));
468 base::RunLoop().RunUntilIdle();
472 GURL
PatternForSWId(int64 sw_id
) {
473 EXPECT_TRUE(sw_id
== sw_registration_id_1_
||
474 sw_id
== sw_registration_id_2_
);
475 return sw_id
== sw_registration_id_1_
? GURL(kPattern1
) : GURL(kPattern2
);
478 void SetupForSyncEvent(
479 const TestBackgroundSyncManager::OneShotCallback
& callback
) {
480 test_background_sync_manager_
->set_one_shot_callback(callback
);
481 SetNetwork(net::NetworkChangeNotifier::CONNECTION_WIFI
);
484 void InitSyncEventTest() {
486 base::Bind(OneShotSuccessfulCallback
, &sync_events_called_
));
489 void InitFailedSyncEventTest() {
490 SetupForSyncEvent(base::Bind(OneShotFailedCallback
, &sync_events_called_
));
493 void InitDelayedSyncEventTest() {
494 SetupForSyncEvent(base::Bind(OneShotDelayedCallback
, &sync_events_called_
,
495 &sync_fired_callback_
));
498 void RegisterAndVerifySyncEventDelayed(
499 const BackgroundSyncRegistrationOptions
& sync_options
) {
500 int sync_events_called
= sync_events_called_
;
501 EXPECT_TRUE(sync_fired_callback_
.is_null());
503 EXPECT_TRUE(Register(sync_options
));
505 EXPECT_EQ(sync_events_called
+ 1, sync_events_called_
);
506 EXPECT_TRUE(GetRegistration(sync_options_1_
));
507 EXPECT_FALSE(sync_fired_callback_
.is_null());
510 TestBrowserThreadBundle browser_thread_bundle_
;
511 scoped_ptr
<net::NetworkChangeNotifier
> network_change_notifier_
;
512 TestPowerSource
* power_monitor_source_
; // owned by power_monitor_
513 scoped_ptr
<base::PowerMonitor
> power_monitor_
;
514 scoped_ptr
<EmbeddedWorkerTestHelper
> helper_
;
515 scoped_ptr
<BackgroundSyncManager
> background_sync_manager_
;
516 TestBackgroundSyncManager
* test_background_sync_manager_
;
518 scoped_ptr
<ServiceWorkerProviderHost
> host_1_
;
519 scoped_ptr
<ServiceWorkerProviderHost
> host_2_
;
520 int64 sw_registration_id_1_
;
521 int64 sw_registration_id_2_
;
522 scoped_refptr
<ServiceWorkerRegistration
> sw_registration_1_
;
523 scoped_refptr
<ServiceWorkerRegistration
> sw_registration_2_
;
525 BackgroundSyncRegistrationOptions sync_options_1_
;
526 BackgroundSyncRegistrationOptions sync_options_2_
;
529 BackgroundSyncStatus callback_status_
;
530 BackgroundSyncRegistration callback_registration_
;
531 std::vector
<BackgroundSyncRegistration
> callback_registrations_
;
532 ServiceWorkerStatusCode callback_sw_status_code_
;
533 int sync_events_called_
;
534 ServiceWorkerVersion::StatusCallback sync_fired_callback_
;
537 TEST_F(BackgroundSyncManagerTest
, Register
) {
538 EXPECT_TRUE(Register(sync_options_1_
));
541 TEST_F(BackgroundSyncManagerTest
, RegistractionIntact
) {
542 EXPECT_TRUE(Register(sync_options_1_
));
543 EXPECT_STREQ(sync_options_1_
.tag
.c_str(),
544 callback_registration_
.options()->tag
.c_str());
545 EXPECT_TRUE(callback_registration_
.IsValid());
548 TEST_F(BackgroundSyncManagerTest
, RegisterWithoutLiveSWRegistration
) {
549 sw_registration_1_
= nullptr;
550 EXPECT_FALSE(Register(sync_options_1_
));
551 EXPECT_EQ(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER
, callback_status_
);
554 TEST_F(BackgroundSyncManagerTest
, RegisterWithoutActiveSWRegistration
) {
555 sw_registration_1_
->UnsetVersion(sw_registration_1_
->active_version());
556 EXPECT_FALSE(Register(sync_options_1_
));
557 EXPECT_EQ(BACKGROUND_SYNC_STATUS_NO_SERVICE_WORKER
, callback_status_
);
560 TEST_F(BackgroundSyncManagerTest
, RegisterExistingKeepsId
) {
561 EXPECT_TRUE(Register(sync_options_1_
));
562 BackgroundSyncRegistration first_registration
= callback_registration_
;
563 EXPECT_TRUE(Register(sync_options_1_
));
564 EXPECT_TRUE(callback_registration_
.Equals(first_registration
));
565 EXPECT_EQ(first_registration
.id(), callback_registration_
.id());
568 TEST_F(BackgroundSyncManagerTest
, RegisterOverwrites
) {
569 EXPECT_TRUE(Register(sync_options_1_
));
570 BackgroundSyncRegistration first_registration
= callback_registration_
;
572 sync_options_1_
.min_period
= 100;
573 EXPECT_TRUE(Register(sync_options_1_
));
574 EXPECT_LT(first_registration
.id(), callback_registration_
.id());
575 EXPECT_FALSE(callback_registration_
.Equals(first_registration
));
578 TEST_F(BackgroundSyncManagerTest
, RegisterOverlappingPeriodicAndOneShotTags
) {
579 // Registrations with the same tags but different periodicities should not
581 sync_options_1_
.tag
= "";
582 sync_options_2_
.tag
= "";
583 sync_options_1_
.periodicity
= SYNC_PERIODIC
;
584 sync_options_2_
.periodicity
= SYNC_ONE_SHOT
;
585 EXPECT_TRUE(Register(sync_options_1_
));
586 EXPECT_TRUE(Register(sync_options_2_
));
587 EXPECT_TRUE(GetRegistration(sync_options_1_
));
588 EXPECT_EQ(SYNC_PERIODIC
, callback_registration_
.options()->periodicity
);
589 EXPECT_TRUE(GetRegistration(sync_options_2_
));
590 EXPECT_EQ(SYNC_ONE_SHOT
, callback_registration_
.options()->periodicity
);
593 TEST_F(BackgroundSyncManagerTest
, RegisterBadBackend
) {
594 test_background_sync_manager_
->set_corrupt_backend(true);
595 EXPECT_FALSE(Register(sync_options_1_
));
596 test_background_sync_manager_
->set_corrupt_backend(false);
597 EXPECT_FALSE(Register(sync_options_1_
));
598 EXPECT_FALSE(GetRegistration(sync_options_1_
));
601 TEST_F(BackgroundSyncManagerTest
, TwoRegistrations
) {
602 EXPECT_TRUE(Register(sync_options_1_
));
603 EXPECT_TRUE(Register(sync_options_2_
));
606 TEST_F(BackgroundSyncManagerTest
, GetRegistrationNonExisting
) {
607 EXPECT_FALSE(GetRegistration(sync_options_1_
));
610 TEST_F(BackgroundSyncManagerTest
, GetRegistrationExisting
) {
611 EXPECT_TRUE(Register(sync_options_1_
));
612 EXPECT_TRUE(GetRegistration(sync_options_1_
));
613 EXPECT_FALSE(GetRegistration(sync_options_2_
));
616 TEST_F(BackgroundSyncManagerTest
, GetRegistrationBadBackend
) {
617 EXPECT_TRUE(Register(sync_options_1_
));
618 test_background_sync_manager_
->set_corrupt_backend(true);
619 EXPECT_TRUE(GetRegistration(sync_options_1_
));
620 EXPECT_FALSE(Register(sync_options_2_
));
621 // Registration should have discovered the bad backend and disabled the
622 // BackgroundSyncManager.
623 EXPECT_FALSE(GetRegistration(sync_options_1_
));
624 test_background_sync_manager_
->set_corrupt_backend(false);
625 EXPECT_FALSE(GetRegistration(sync_options_1_
));
628 TEST_F(BackgroundSyncManagerTest
, GetRegistrationsZero
) {
629 EXPECT_TRUE(GetRegistrations(SYNC_ONE_SHOT
));
630 EXPECT_EQ(0u, callback_registrations_
.size());
633 TEST_F(BackgroundSyncManagerTest
, GetRegistrationsOne
) {
634 EXPECT_TRUE(Register(sync_options_1_
));
635 EXPECT_TRUE(GetRegistrations(sync_options_1_
.periodicity
));
637 EXPECT_EQ(1u, callback_registrations_
.size());
638 sync_options_1_
.Equals(*callback_registrations_
[0].options());
641 TEST_F(BackgroundSyncManagerTest
, GetRegistrationsTwo
) {
642 EXPECT_EQ(sync_options_1_
.periodicity
, sync_options_2_
.periodicity
);
644 EXPECT_TRUE(Register(sync_options_1_
));
645 EXPECT_TRUE(Register(sync_options_2_
));
646 EXPECT_TRUE(GetRegistrations(sync_options_1_
.periodicity
));
648 EXPECT_EQ(2u, callback_registrations_
.size());
649 sync_options_1_
.Equals(*callback_registrations_
[0].options());
650 sync_options_2_
.Equals(*callback_registrations_
[1].options());
653 TEST_F(BackgroundSyncManagerTest
, GetRegistrationsPeriodicity
) {
654 sync_options_1_
.periodicity
= SYNC_ONE_SHOT
;
655 sync_options_2_
.periodicity
= SYNC_PERIODIC
;
656 EXPECT_TRUE(Register(sync_options_1_
));
657 EXPECT_TRUE(Register(sync_options_2_
));
659 EXPECT_TRUE(GetRegistrations(SYNC_ONE_SHOT
));
660 EXPECT_EQ(1u, callback_registrations_
.size());
661 sync_options_1_
.Equals(*callback_registrations_
[0].options());
663 EXPECT_TRUE(GetRegistrations(SYNC_PERIODIC
));
664 EXPECT_EQ(1u, callback_registrations_
.size());
665 sync_options_2_
.Equals(*callback_registrations_
[0].options());
668 TEST_F(BackgroundSyncManagerTest
, GetRegistrationsBadBackend
) {
669 EXPECT_TRUE(Register(sync_options_1_
));
670 test_background_sync_manager_
->set_corrupt_backend(true);
671 EXPECT_TRUE(GetRegistrations(sync_options_1_
.periodicity
));
672 EXPECT_FALSE(Register(sync_options_2_
));
673 // Registration should have discovered the bad backend and disabled the
674 // BackgroundSyncManager.
675 EXPECT_FALSE(GetRegistrations(sync_options_1_
.periodicity
));
676 test_background_sync_manager_
->set_corrupt_backend(false);
677 EXPECT_FALSE(GetRegistrations(sync_options_1_
.periodicity
));
680 TEST_F(BackgroundSyncManagerTest
, Unregister
) {
681 EXPECT_TRUE(Register(sync_options_1_
));
682 EXPECT_TRUE(Unregister(callback_registration_
));
683 EXPECT_FALSE(GetRegistration(sync_options_1_
));
686 TEST_F(BackgroundSyncManagerTest
, UnregisterWrongId
) {
687 EXPECT_TRUE(Register(sync_options_1_
));
688 callback_registration_
.set_id(callback_registration_
.id() + 1);
689 EXPECT_FALSE(Unregister(callback_registration_
));
692 TEST_F(BackgroundSyncManagerTest
, Reregister
) {
693 EXPECT_TRUE(Register(sync_options_1_
));
694 EXPECT_TRUE(Unregister(callback_registration_
));
695 EXPECT_TRUE(Register(sync_options_1_
));
698 TEST_F(BackgroundSyncManagerTest
, UnregisterNonExisting
) {
699 BackgroundSyncRegistration nonexistant_registration
;
700 nonexistant_registration
.set_id(1);
701 EXPECT_FALSE(Unregister(nonexistant_registration
));
702 EXPECT_EQ(BACKGROUND_SYNC_STATUS_NOT_FOUND
, callback_status_
);
705 TEST_F(BackgroundSyncManagerTest
, UnregisterSecond
) {
706 EXPECT_TRUE(Register(sync_options_1_
));
707 EXPECT_TRUE(Register(sync_options_2_
));
708 EXPECT_TRUE(Unregister(callback_registration_
));
709 EXPECT_TRUE(GetRegistration(sync_options_1_
));
710 EXPECT_TRUE(Register(sync_options_2_
));
713 TEST_F(BackgroundSyncManagerTest
, UnregisterBadBackend
) {
714 sync_options_1_
.min_period
+= 1;
715 EXPECT_TRUE(Register(sync_options_1_
));
716 EXPECT_TRUE(Register(sync_options_2_
));
717 test_background_sync_manager_
->set_corrupt_backend(true);
718 EXPECT_FALSE(Unregister(callback_registration_
));
719 // Unregister should have discovered the bad backend and disabled the
720 // BackgroundSyncManager.
721 test_background_sync_manager_
->set_corrupt_backend(false);
722 EXPECT_FALSE(GetRegistration(sync_options_1_
));
723 EXPECT_FALSE(GetRegistration(sync_options_2_
));
726 TEST_F(BackgroundSyncManagerTest
, RegistrationIncreasesId
) {
727 EXPECT_TRUE(Register(sync_options_1_
));
728 BackgroundSyncRegistration registered_sync
= callback_registration_
;
729 BackgroundSyncRegistration::RegistrationId cur_id
=
730 callback_registration_
.id();
732 EXPECT_TRUE(GetRegistration(sync_options_1_
));
733 EXPECT_TRUE(Register(sync_options_2_
));
734 EXPECT_LT(cur_id
, callback_registration_
.id());
735 cur_id
= callback_registration_
.id();
737 EXPECT_TRUE(Unregister(registered_sync
));
738 EXPECT_TRUE(Register(sync_options_1_
));
739 EXPECT_LT(cur_id
, callback_registration_
.id());
742 TEST_F(BackgroundSyncManagerTest
, RebootRecovery
) {
743 EXPECT_TRUE(Register(sync_options_1_
));
745 SetupBackgroundSyncManager();
747 EXPECT_TRUE(GetRegistration(sync_options_1_
));
748 EXPECT_FALSE(GetRegistration(sync_options_2_
));
751 TEST_F(BackgroundSyncManagerTest
, RebootRecoveryTwoServiceWorkers
) {
753 RegisterWithServiceWorkerId(sw_registration_id_1_
, sync_options_1_
));
755 RegisterWithServiceWorkerId(sw_registration_id_2_
, sync_options_2_
));
757 SetupBackgroundSyncManager();
759 EXPECT_TRUE(GetRegistrationWithServiceWorkerId(sw_registration_id_1_
,
761 EXPECT_FALSE(GetRegistrationWithServiceWorkerId(sw_registration_id_1_
,
763 EXPECT_FALSE(GetRegistrationWithServiceWorkerId(sw_registration_id_2_
,
765 EXPECT_TRUE(GetRegistrationWithServiceWorkerId(sw_registration_id_2_
,
768 EXPECT_TRUE(GetRegistrationWithServiceWorkerId(sw_registration_id_1_
,
770 EXPECT_TRUE(GetRegistrationWithServiceWorkerId(sw_registration_id_2_
,
774 RegisterWithServiceWorkerId(sw_registration_id_1_
, sync_options_2_
));
776 RegisterWithServiceWorkerId(sw_registration_id_2_
, sync_options_1_
));
779 TEST_F(BackgroundSyncManagerTest
, InitWithBadBackend
) {
780 SetupCorruptBackgroundSyncManager();
782 EXPECT_FALSE(Register(sync_options_1_
));
783 EXPECT_FALSE(GetRegistration(sync_options_1_
));
786 TEST_F(BackgroundSyncManagerTest
, SequentialOperations
) {
787 // Schedule Init and all of the operations on a delayed backend. Verify that
788 // the operations complete sequentially.
789 SetupDelayedBackgroundSyncManager();
791 const int64 kExpectedInitialId
= BackgroundSyncRegistration::kInitialId
;
793 bool register_called
= false;
794 bool unregister_called
= false;
795 bool get_registration_called
= false;
796 test_background_sync_manager_
->Register(
797 sw_registration_id_1_
, sync_options_1_
,
798 true /* requested_from_service_worker */,
799 base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback
,
800 base::Unretained(this), ®ister_called
));
801 test_background_sync_manager_
->Unregister(
802 sw_registration_id_1_
, sync_options_1_
.tag
, sync_options_1_
.periodicity
,
804 base::Bind(&BackgroundSyncManagerTest::StatusCallback
,
805 base::Unretained(this), &unregister_called
));
806 test_background_sync_manager_
->GetRegistration(
807 sw_registration_id_1_
, sync_options_1_
.tag
, sync_options_1_
.periodicity
,
808 base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback
,
809 base::Unretained(this), &get_registration_called
));
811 base::RunLoop().RunUntilIdle();
812 // Init should be blocked while loading from the backend.
813 EXPECT_FALSE(register_called
);
814 EXPECT_FALSE(unregister_called
);
815 EXPECT_FALSE(get_registration_called
);
817 test_background_sync_manager_
->Continue();
818 base::RunLoop().RunUntilIdle();
819 // Register should be blocked while storing to the backend.
820 EXPECT_FALSE(register_called
);
821 EXPECT_FALSE(unregister_called
);
822 EXPECT_FALSE(get_registration_called
);
824 test_background_sync_manager_
->Continue();
825 base::RunLoop().RunUntilIdle();
826 EXPECT_TRUE(register_called
);
827 EXPECT_EQ(kExpectedInitialId
, callback_registration_
.id());
828 EXPECT_EQ(BACKGROUND_SYNC_STATUS_OK
, callback_status_
);
829 // Unregister should be blocked while storing to the backend.
830 EXPECT_FALSE(unregister_called
);
831 EXPECT_FALSE(get_registration_called
);
833 test_background_sync_manager_
->Continue();
834 base::RunLoop().RunUntilIdle();
835 // Unregister should be done and since GetRegistration doesn't require the
836 // backend it should be done too.
837 EXPECT_EQ(BACKGROUND_SYNC_STATUS_NOT_FOUND
, callback_status_
);
838 EXPECT_TRUE(unregister_called
);
839 EXPECT_TRUE(get_registration_called
);
842 TEST_F(BackgroundSyncManagerTest
, UnregisterServiceWorker
) {
843 EXPECT_TRUE(Register(sync_options_1_
));
844 UnregisterServiceWorker(sw_registration_id_1_
);
845 EXPECT_FALSE(GetRegistration(sync_options_1_
));
848 TEST_F(BackgroundSyncManagerTest
,
849 UnregisterServiceWorkerDuringSyncRegistration
) {
850 EXPECT_TRUE(Register(sync_options_1_
));
852 test_background_sync_manager_
->set_delay_backend(true);
853 bool callback_called
= false;
854 test_background_sync_manager_
->Register(
855 sw_registration_id_1_
, sync_options_2_
,
856 true /* requested_from_service_worker */,
857 base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback
,
858 base::Unretained(this), &callback_called
));
860 base::RunLoop().RunUntilIdle();
861 EXPECT_FALSE(callback_called
);
862 UnregisterServiceWorker(sw_registration_id_1_
);
864 test_background_sync_manager_
->Continue();
865 base::RunLoop().RunUntilIdle();
866 EXPECT_TRUE(callback_called
);
867 EXPECT_EQ(BACKGROUND_SYNC_STATUS_STORAGE_ERROR
, callback_status_
);
869 test_background_sync_manager_
->set_delay_backend(false);
870 EXPECT_FALSE(GetRegistration(sync_options_1_
));
873 TEST_F(BackgroundSyncManagerTest
, DeleteAndStartOverServiceWorkerContext
) {
874 EXPECT_TRUE(Register(sync_options_1_
));
875 helper_
->context()->ScheduleDeleteAndStartOver();
876 base::RunLoop().RunUntilIdle();
877 EXPECT_FALSE(GetRegistration(sync_options_1_
));
880 TEST_F(BackgroundSyncManagerTest
, DisabledManagerWorksAfterBrowserRestart
) {
881 EXPECT_TRUE(Register(sync_options_1_
));
882 test_background_sync_manager_
->set_corrupt_backend(true);
883 EXPECT_FALSE(Register(sync_options_2_
));
885 // The manager is now disabled and not accepting new requests until browser
886 // restart or notification that the storage has been wiped.
887 test_background_sync_manager_
->set_corrupt_backend(false);
888 EXPECT_FALSE(GetRegistration(sync_options_1_
));
889 EXPECT_FALSE(Register(sync_options_2_
));
891 // Simulate restarting the browser by creating a new BackgroundSyncManager.
892 SetupBackgroundSyncManager();
893 EXPECT_TRUE(GetRegistration(sync_options_1_
));
894 EXPECT_TRUE(Register(sync_options_2_
));
897 TEST_F(BackgroundSyncManagerTest
, DisabledManagerWorksAfterDeleteAndStartOver
) {
898 EXPECT_TRUE(Register(sync_options_1_
));
899 test_background_sync_manager_
->set_corrupt_backend(true);
900 EXPECT_FALSE(Register(sync_options_2_
));
902 // The manager is now disabled and not accepting new requests until browser
903 // restart or notification that the storage has been wiped.
904 test_background_sync_manager_
->set_corrupt_backend(false);
905 helper_
->context()->ScheduleDeleteAndStartOver();
906 base::RunLoop().RunUntilIdle();
908 RegisterServiceWorkers();
910 EXPECT_TRUE(Register(sync_options_2_
));
911 EXPECT_FALSE(GetRegistration(sync_options_1_
));
912 EXPECT_TRUE(GetRegistration(sync_options_2_
));
915 TEST_F(BackgroundSyncManagerTest
, RegistrationEqualsId
) {
916 BackgroundSyncRegistration reg_1
;
917 BackgroundSyncRegistration reg_2
;
919 EXPECT_TRUE(reg_1
.Equals(reg_2
));
920 reg_2
.set_id(reg_1
.id() + 1);
921 EXPECT_TRUE(reg_1
.Equals(reg_2
));
924 TEST_F(BackgroundSyncManagerTest
, RegistrationEqualsTag
) {
925 BackgroundSyncRegistration reg_1
;
926 BackgroundSyncRegistration reg_2
;
927 EXPECT_TRUE(reg_1
.Equals(reg_2
));
928 reg_2
.options()->tag
= "bar";
929 EXPECT_FALSE(reg_1
.Equals(reg_2
));
932 TEST_F(BackgroundSyncManagerTest
, RegistrationEqualsPeriodicity
) {
933 BackgroundSyncRegistration reg_1
;
934 BackgroundSyncRegistration reg_2
;
935 EXPECT_TRUE(reg_1
.Equals(reg_2
));
936 reg_1
.options()->periodicity
= SYNC_PERIODIC
;
937 reg_2
.options()->periodicity
= SYNC_ONE_SHOT
;
938 EXPECT_FALSE(reg_1
.Equals(reg_2
));
941 TEST_F(BackgroundSyncManagerTest
, RegistrationEqualsMinPeriod
) {
942 BackgroundSyncRegistration reg_1
;
943 BackgroundSyncRegistration reg_2
;
944 EXPECT_TRUE(reg_1
.Equals(reg_2
));
945 reg_2
.options()->min_period
= reg_1
.options()->min_period
+ 1;
946 EXPECT_FALSE(reg_1
.Equals(reg_2
));
949 TEST_F(BackgroundSyncManagerTest
, RegistrationEqualsNetworkState
) {
950 BackgroundSyncRegistration reg_1
;
951 BackgroundSyncRegistration reg_2
;
952 EXPECT_TRUE(reg_1
.Equals(reg_2
));
953 reg_1
.options()->network_state
= NETWORK_STATE_ANY
;
954 reg_2
.options()->network_state
= NETWORK_STATE_ONLINE
;
955 EXPECT_FALSE(reg_1
.Equals(reg_2
));
958 TEST_F(BackgroundSyncManagerTest
, RegistrationEqualsPowerState
) {
959 BackgroundSyncRegistration reg_1
;
960 BackgroundSyncRegistration reg_2
;
961 EXPECT_TRUE(reg_1
.Equals(reg_2
));
962 reg_1
.options()->power_state
= POWER_STATE_AUTO
;
963 reg_2
.options()->power_state
= POWER_STATE_AVOID_DRAINING
;
964 EXPECT_FALSE(reg_1
.Equals(reg_2
));
967 TEST_F(BackgroundSyncManagerTest
, StoreAndRetrievePreservesValues
) {
968 BackgroundSyncRegistrationOptions options
;
969 // Set non-default values for each field.
971 EXPECT_NE(SYNC_PERIODIC
, options
.periodicity
);
972 options
.periodicity
= SYNC_PERIODIC
;
973 options
.min_period
+= 1;
974 EXPECT_NE(NETWORK_STATE_ANY
, options
.network_state
);
975 options
.network_state
= NETWORK_STATE_ANY
;
976 EXPECT_NE(POWER_STATE_AUTO
, options
.power_state
);
977 options
.power_state
= POWER_STATE_AUTO
;
979 // Store the registration.
980 EXPECT_TRUE(Register(options
));
982 // Simulate restarting the sync manager, forcing the next read to come from
984 SetupBackgroundSyncManager();
986 EXPECT_TRUE(GetRegistration(options
));
987 EXPECT_TRUE(options
.Equals(*callback_registration_
.options()));
990 TEST_F(BackgroundSyncManagerTest
, EmptyTagSupported
) {
991 sync_options_1_
.tag
= "a";
992 EXPECT_TRUE(Register(sync_options_1_
));
993 EXPECT_TRUE(GetRegistration(sync_options_1_
));
994 EXPECT_TRUE(sync_options_1_
.Equals(*callback_registration_
.options()));
995 EXPECT_TRUE(Unregister(callback_registration_
));
996 EXPECT_FALSE(GetRegistration(sync_options_1_
));
999 TEST_F(BackgroundSyncManagerTest
, OverlappingPeriodicAndOneShotTags
) {
1000 // Registrations with the same tags but different periodicities should not
1002 sync_options_1_
.tag
= "";
1003 sync_options_2_
.tag
= "";
1004 sync_options_1_
.periodicity
= SYNC_PERIODIC
;
1005 sync_options_2_
.periodicity
= SYNC_ONE_SHOT
;
1007 EXPECT_TRUE(Register(sync_options_1_
));
1008 EXPECT_TRUE(Register(sync_options_2_
));
1010 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1011 EXPECT_EQ(SYNC_PERIODIC
, callback_registration_
.options()->periodicity
);
1012 EXPECT_TRUE(GetRegistration(sync_options_2_
));
1013 EXPECT_EQ(SYNC_ONE_SHOT
, callback_registration_
.options()->periodicity
);
1015 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1016 EXPECT_TRUE(Unregister(callback_registration_
));
1017 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1018 EXPECT_TRUE(GetRegistration(sync_options_2_
));
1019 EXPECT_EQ(SYNC_ONE_SHOT
, callback_registration_
.options()->periodicity
);
1021 EXPECT_TRUE(Unregister(callback_registration_
));
1022 EXPECT_FALSE(GetRegistration(sync_options_2_
));
1025 TEST_F(BackgroundSyncManagerTest
, OneShotFiresOnRegistration
) {
1026 InitSyncEventTest();
1028 EXPECT_TRUE(Register(sync_options_1_
));
1029 EXPECT_EQ(1, sync_events_called_
);
1030 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1033 // TODO(jkarlin): Change this to a periodic test as one-shots can't be power
1034 // dependent according to spec.
1035 TEST_F(BackgroundSyncManagerTest
, OneShotFiresOnPowerChange
) {
1036 InitSyncEventTest();
1037 sync_options_1_
.power_state
= POWER_STATE_AVOID_DRAINING
;
1039 SetOnBatteryPower(true);
1040 EXPECT_TRUE(Register(sync_options_1_
));
1041 EXPECT_EQ(0, sync_events_called_
);
1042 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1044 SetOnBatteryPower(false);
1045 EXPECT_EQ(1, sync_events_called_
);
1046 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1049 // TODO(jkarlin): Change this to a periodic test as one-shots can't be power
1050 // dependent according to spec.
1051 TEST_F(BackgroundSyncManagerTest
, MultipleOneShotsFireOnPowerChange
) {
1052 InitSyncEventTest();
1053 sync_options_1_
.power_state
= POWER_STATE_AVOID_DRAINING
;
1054 sync_options_2_
.power_state
= POWER_STATE_AVOID_DRAINING
;
1056 SetOnBatteryPower(true);
1057 EXPECT_TRUE(Register(sync_options_1_
));
1058 EXPECT_TRUE(Register(sync_options_2_
));
1059 EXPECT_EQ(0, sync_events_called_
);
1060 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1061 EXPECT_TRUE(GetRegistration(sync_options_2_
));
1063 SetOnBatteryPower(false);
1064 EXPECT_EQ(2, sync_events_called_
);
1065 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1066 EXPECT_FALSE(GetRegistration(sync_options_2_
));
1069 TEST_F(BackgroundSyncManagerTest
, OneShotFiresOnNetworkChange
) {
1070 InitSyncEventTest();
1072 SetNetwork(net::NetworkChangeNotifier::CONNECTION_NONE
);
1073 EXPECT_TRUE(Register(sync_options_1_
));
1074 EXPECT_EQ(0, sync_events_called_
);
1075 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1077 SetNetwork(net::NetworkChangeNotifier::CONNECTION_WIFI
);
1078 base::RunLoop().RunUntilIdle();
1079 EXPECT_EQ(1, sync_events_called_
);
1080 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1083 TEST_F(BackgroundSyncManagerTest
, MultipleOneShotsFireOnNetworkChange
) {
1084 InitSyncEventTest();
1086 SetNetwork(net::NetworkChangeNotifier::CONNECTION_NONE
);
1087 EXPECT_TRUE(Register(sync_options_1_
));
1088 EXPECT_TRUE(Register(sync_options_2_
));
1089 EXPECT_EQ(0, sync_events_called_
);
1090 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1091 EXPECT_TRUE(GetRegistration(sync_options_2_
));
1093 SetNetwork(net::NetworkChangeNotifier::CONNECTION_WIFI
);
1095 EXPECT_EQ(2, sync_events_called_
);
1096 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1097 EXPECT_FALSE(GetRegistration(sync_options_2_
));
1100 TEST_F(BackgroundSyncManagerTest
, OneShotFiresOnManagerRestart
) {
1101 InitSyncEventTest();
1103 // Initially the event won't run because there is no network.
1104 SetNetwork(net::NetworkChangeNotifier::CONNECTION_NONE
);
1105 EXPECT_TRUE(Register(sync_options_1_
));
1106 EXPECT_EQ(0, sync_events_called_
);
1107 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1109 // Simulate closing the browser.
1110 DeleteBackgroundSyncManager();
1112 // The next time the manager is started, the network is good.
1113 SetNetwork(net::NetworkChangeNotifier::CONNECTION_WIFI
);
1114 SetupBackgroundSyncManager();
1115 InitSyncEventTest();
1117 // The event should have fired.
1118 EXPECT_EQ(1, sync_events_called_
);
1119 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1122 TEST_F(BackgroundSyncManagerTest
, FailedOneShotStillExists
) {
1123 InitFailedSyncEventTest();
1125 EXPECT_TRUE(Register(sync_options_1_
));
1126 EXPECT_EQ(1, sync_events_called_
);
1127 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1129 // The failed one-shot should stay registered but not fire until the
1130 // ServiceWorker is reloaded with an active client. Therefore, changing the
1131 // network should not cause the event to run again.
1132 SetNetwork(net::NetworkChangeNotifier::CONNECTION_2G
);
1133 EXPECT_EQ(1, sync_events_called_
);
1134 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1137 TEST_F(BackgroundSyncManagerTest
, FailedOneShotReregisteredAndFires
) {
1138 InitFailedSyncEventTest();
1140 // The initial sync event fails.
1141 EXPECT_TRUE(Register(sync_options_1_
));
1142 EXPECT_EQ(1, sync_events_called_
);
1143 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1144 BackgroundSyncRegistration first_registration
= callback_registration_
;
1146 InitSyncEventTest();
1148 // Reregistering should cause the sync event to fire again, this time
1150 EXPECT_TRUE(Register(sync_options_1_
));
1151 EXPECT_EQ(first_registration
.id(), callback_registration_
.id());
1152 EXPECT_EQ(2, sync_events_called_
);
1153 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1156 TEST_F(BackgroundSyncManagerTest
, DelayOneShotMidSync
) {
1157 InitDelayedSyncEventTest();
1159 RegisterAndVerifySyncEventDelayed(sync_options_1_
);
1161 // Finish firing the event and verify that the registration is removed.
1162 sync_fired_callback_
.Run(SERVICE_WORKER_OK
);
1163 base::RunLoop().RunUntilIdle();
1164 EXPECT_EQ(1, sync_events_called_
);
1165 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1168 TEST_F(BackgroundSyncManagerTest
, OverwriteRegistrationMidSync
) {
1169 InitDelayedSyncEventTest();
1171 sync_options_1_
.network_state
= NETWORK_STATE_ANY
;
1172 SetNetwork(net::NetworkChangeNotifier::CONNECTION_NONE
);
1174 RegisterAndVerifySyncEventDelayed(sync_options_1_
);
1176 // Don't delay the next sync.
1177 test_background_sync_manager_
->set_one_shot_callback(
1178 base::Bind(OneShotSuccessfulCallback
, &sync_events_called_
));
1180 // Register a different sync event with the same tag, overwriting the first.
1181 sync_options_1_
.network_state
= NETWORK_STATE_ONLINE
;
1182 EXPECT_TRUE(Register(sync_options_1_
));
1184 // The new sync event won't run as the network requirements aren't met.
1185 EXPECT_EQ(1, sync_events_called_
);
1186 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1188 // Finish the first event, note that the second is still registered.
1189 sync_fired_callback_
.Run(SERVICE_WORKER_OK
);
1190 EXPECT_EQ(1, sync_events_called_
);
1191 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1193 // Change the network and the second should run.
1194 SetNetwork(net::NetworkChangeNotifier::CONNECTION_WIFI
);
1195 base::RunLoop().RunUntilIdle();
1196 EXPECT_EQ(2, sync_events_called_
);
1197 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1200 TEST_F(BackgroundSyncManagerTest
, ReregisterOneShotMidSync
) {
1201 InitDelayedSyncEventTest();
1203 RegisterAndVerifySyncEventDelayed(sync_options_1_
);
1205 // Register the same sync, but don't delay it. It shouldn't run as it's
1207 test_background_sync_manager_
->set_one_shot_callback(
1208 base::Bind(OneShotSuccessfulCallback
, &sync_events_called_
));
1209 EXPECT_TRUE(Register(sync_options_1_
));
1210 EXPECT_EQ(1, sync_events_called_
);
1211 EXPECT_TRUE(GetRegistration(sync_options_1_
));
1213 // Finish the original event, note that the second never runs.
1214 sync_fired_callback_
.Run(SERVICE_WORKER_OK
);
1215 base::RunLoop().RunUntilIdle();
1216 EXPECT_EQ(1, sync_events_called_
);
1217 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1220 TEST_F(BackgroundSyncManagerTest
, UnregisterOneShotMidSync
) {
1221 InitDelayedSyncEventTest();
1223 RegisterAndVerifySyncEventDelayed(sync_options_1_
);
1225 EXPECT_TRUE(Unregister(callback_registration_
));
1226 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1228 sync_fired_callback_
.Run(SERVICE_WORKER_OK
);
1229 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1232 TEST_F(BackgroundSyncManagerTest
, BadBackendMidSync
) {
1233 InitDelayedSyncEventTest();
1235 RegisterAndVerifySyncEventDelayed(sync_options_1_
);
1237 test_background_sync_manager_
->set_corrupt_backend(true);
1238 sync_fired_callback_
.Run(SERVICE_WORKER_OK
);
1239 base::RunLoop().RunUntilIdle();
1241 // The backend should now be disabled because it couldn't unregister the
1243 EXPECT_FALSE(Register(sync_options_2_
));
1245 RegisterWithServiceWorkerId(sw_registration_id_2_
, sync_options_2_
));
1248 TEST_F(BackgroundSyncManagerTest
, UnregisterServiceWorkerMidSync
) {
1249 InitDelayedSyncEventTest();
1251 RegisterAndVerifySyncEventDelayed(sync_options_1_
);
1252 UnregisterServiceWorker(sw_registration_id_1_
);
1254 sync_fired_callback_
.Run(SERVICE_WORKER_OK
);
1256 // The backend isn't disabled, but the first service worker registration is
1258 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1259 EXPECT_FALSE(Register(sync_options_1_
));
1261 RegisterWithServiceWorkerId(sw_registration_id_2_
, sync_options_1_
));
1264 TEST_F(BackgroundSyncManagerTest
, KillManagerMidSync
) {
1265 InitDelayedSyncEventTest();
1267 RegisterAndVerifySyncEventDelayed(sync_options_1_
);
1269 // Create a new manager which should fire the sync again on init.
1270 SetupBackgroundSyncManager();
1271 InitSyncEventTest();
1272 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1273 EXPECT_EQ(2, sync_events_called_
);
1276 TEST_F(BackgroundSyncManagerTest
, RegisterFailsWithoutWindow
) {
1277 RemoveWindowClients();
1278 EXPECT_FALSE(Register(sync_options_1_
));
1281 TEST_F(BackgroundSyncManagerTest
, RegisterExistingFailsWithoutWindow
) {
1282 EXPECT_TRUE(Register(sync_options_1_
));
1283 RemoveWindowClients();
1284 EXPECT_FALSE(Register(sync_options_1_
));
1287 TEST_F(BackgroundSyncManagerTest
, RegisterSucceedsFromUncontrolledWindow
) {
1288 RemoveWindowClients();
1289 EXPECT_TRUE(RegisterFromDocumentWithServiceWorkerId(sw_registration_id_1_
,
1293 TEST_F(BackgroundSyncManagerTest
, UnregisterSucceedsWithoutWindow
) {
1294 EXPECT_TRUE(Register(sync_options_1_
));
1295 RemoveWindowClients();
1296 EXPECT_TRUE(Unregister(callback_registration_
));
1297 EXPECT_FALSE(GetRegistration(sync_options_1_
));
1300 } // namespace content