Index: content/browser/background_sync/background_sync_manager_unittest.cc |
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc |
index c47651a53a29b7445083a1b2cf3a588d5fd3bcad..d2f420ad652012e22efa9644321daf17ab27f353 100644 |
--- a/content/browser/background_sync/background_sync_manager_unittest.cc |
+++ b/content/browser/background_sync/background_sync_manager_unittest.cc |
@@ -9,19 +9,41 @@ |
#include "base/run_loop.h" |
#include "base/thread_task_runner_handle.h" |
#include "content/browser/browser_thread_impl.h" |
+#include "content/browser/service_worker/embedded_worker_test_helper.h" |
+#include "content/browser/service_worker/service_worker_context_core.h" |
#include "content/browser/service_worker/service_worker_context_wrapper.h" |
#include "content/browser/service_worker/service_worker_storage.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+namespace content { |
+ |
namespace { |
-const char kOriginUrl[] = "https://example.com"; |
-const int64 kServiceWorkerVersionId = 0; |
-const int64 kServiceWorkerId1 = 1; |
-const int64 kServiceWorkerId2 = 2; |
+ |
+const char kOrigin[] = "https://example.com"; |
+const char kPattern1[] = "https://example.com/a"; |
+const char kPattern2[] = "https://example.com/b"; |
+const char kScript1[] = "https://example.com/a/script.js"; |
+const char kScript2[] = "https://example.com/b/script.js"; |
+const int kRenderProcessId = 99; |
+ |
+void RegisterServiceWorkerCallback(bool* called, |
+ int64* store_registration_id, |
+ ServiceWorkerStatusCode status, |
+ const std::string& status_message, |
+ int64 registration_id) { |
+ EXPECT_EQ(SERVICE_WORKER_OK, status) << ServiceWorkerStatusToString(status); |
+ *called = true; |
+ *store_registration_id = registration_id; |
} |
-namespace content { |
+void UnregisterServiceWorkerCallback(bool* called, |
+ ServiceWorkerStatusCode code) { |
+ EXPECT_EQ(SERVICE_WORKER_OK, code); |
+ *called = true; |
+} |
+ |
+} // namespace |
// A BackgroundSyncManager that can simulate delaying and corrupting the |
// backend. This class assumes (and verifies) that only one operation runs at a |
@@ -115,32 +137,36 @@ class BackgroundSyncManagerTest : public testing::Test { |
public: |
BackgroundSyncManagerTest() |
: browser_thread_bundle_(TestBrowserThreadBundle::IO_MAINLOOP), |
- service_worker_context_(new ServiceWorkerContextWrapper(NULL)), |
- origin_(kOriginUrl), |
sync_reg_1_(BackgroundSyncManager::BackgroundSyncRegistration("foo")), |
sync_reg_2_(BackgroundSyncManager::BackgroundSyncRegistration("bar")), |
callback_error_(BackgroundSyncManager::ERROR_TYPE_OK), |
callback_sw_status_code_(SERVICE_WORKER_OK) {} |
void SetUp() override { |
- scoped_ptr<ServiceWorkerDatabaseTaskManager> database_task_manager( |
- new MockServiceWorkerDatabaseTaskManager( |
- base::ThreadTaskRunnerHandle::Get())); |
- |
- service_worker_context_->InitInternal( |
- base::FilePath(), database_task_manager.Pass(), |
- base::ThreadTaskRunnerHandle::Get(), NULL, NULL); |
- context_ptr_ = service_worker_context_->context()->AsWeakPtr(); |
+ helper_.reset( |
+ new EmbeddedWorkerTestHelper(base::FilePath(), kRenderProcessId)); |
background_sync_manager_ = |
- BackgroundSyncManager::Create(service_worker_context_); |
+ BackgroundSyncManager::Create(helper_->context_wrapper()); |
// Wait for storage to finish initializing before registering service |
// workers. |
base::RunLoop().RunUntilIdle(); |
- RegisterServiceWorker(kServiceWorkerId1); |
- RegisterServiceWorker(kServiceWorkerId2); |
+ bool called_1 = false; |
+ bool called_2 = false; |
+ helper_->context()->RegisterServiceWorker( |
+ GURL(kPattern1), GURL(kScript1), NULL, |
+ base::Bind(&RegisterServiceWorkerCallback, &called_1, |
+ &sw_registration_id_1_)); |
+ |
+ helper_->context()->RegisterServiceWorker( |
+ GURL(kPattern2), GURL(kScript2), NULL, |
+ base::Bind(&RegisterServiceWorkerCallback, &called_2, |
+ &sw_registration_id_2_)); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_TRUE(called_1); |
+ EXPECT_TRUE(called_2); |
} |
void StatusAndRegistrationCallback( |
@@ -161,7 +187,7 @@ class BackgroundSyncManagerTest : public testing::Test { |
protected: |
TestBackgroundSyncManager* UseTestBackgroundSyncManager() { |
TestBackgroundSyncManager* manager = |
- new TestBackgroundSyncManager(service_worker_context_); |
+ new TestBackgroundSyncManager(helper_->context_wrapper()); |
background_sync_manager_.reset(manager); |
manager->DoInit(); |
return manager; |
@@ -169,7 +195,8 @@ class BackgroundSyncManagerTest : public testing::Test { |
bool Register(const BackgroundSyncManager::BackgroundSyncRegistration& |
sync_registration) { |
- return RegisterWithServiceWorkerId(kServiceWorkerId1, sync_registration); |
+ return RegisterWithServiceWorkerId(sw_registration_id_1_, |
+ sync_registration); |
} |
bool RegisterWithServiceWorkerId( |
@@ -178,7 +205,7 @@ class BackgroundSyncManagerTest : public testing::Test { |
sync_registration) { |
bool was_called = false; |
background_sync_manager_->Register( |
- origin_, sw_registration_id, sync_registration, |
+ GURL(kOrigin), sw_registration_id, sync_registration, |
base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback, |
base::Unretained(this), &was_called)); |
base::RunLoop().RunUntilIdle(); |
@@ -188,7 +215,8 @@ class BackgroundSyncManagerTest : public testing::Test { |
bool Unregister(const BackgroundSyncManager::BackgroundSyncRegistration& |
sync_registration) { |
- return UnregisterWithServiceWorkerId(kServiceWorkerId1, sync_registration); |
+ return UnregisterWithServiceWorkerId(sw_registration_id_1_, |
+ sync_registration); |
} |
bool UnregisterWithServiceWorkerId( |
@@ -197,7 +225,7 @@ class BackgroundSyncManagerTest : public testing::Test { |
sync_registration) { |
bool was_called = false; |
background_sync_manager_->Unregister( |
- origin_, sw_registration_id, sync_registration.name, |
+ GURL(kOrigin), sw_registration_id, sync_registration.name, |
sync_registration.id, |
base::Bind(&BackgroundSyncManagerTest::StatusCallback, |
base::Unretained(this), &was_called)); |
@@ -207,7 +235,7 @@ class BackgroundSyncManagerTest : public testing::Test { |
} |
bool GetRegistration(const std::string& sync_registration_name) { |
- return GetRegistrationWithServiceWorkerId(kServiceWorkerId1, |
+ return GetRegistrationWithServiceWorkerId(sw_registration_id_1_, |
sync_registration_name); |
} |
@@ -216,7 +244,7 @@ class BackgroundSyncManagerTest : public testing::Test { |
const std::string& sync_registration_name) { |
bool was_called = false; |
background_sync_manager_->GetRegistration( |
- origin_, sw_registration_id, sync_registration_name, |
+ GURL(kOrigin), sw_registration_id, sync_registration_name, |
base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback, |
base::Unretained(this), &was_called)); |
base::RunLoop().RunUntilIdle(); |
@@ -232,32 +260,28 @@ class BackgroundSyncManagerTest : public testing::Test { |
callback_sw_status_code_ = result; |
} |
- void RegisterServiceWorker(uint64 sw_registration_id) { |
- scoped_refptr<ServiceWorkerRegistration> live_registration = |
- new ServiceWorkerRegistration(origin_, sw_registration_id, |
- context_ptr_); |
- |
- scoped_refptr<ServiceWorkerVersion> live_version = new ServiceWorkerVersion( |
- live_registration.get(), GURL(std::string(kOriginUrl) + "/script.js"), |
- kServiceWorkerVersionId, context_ptr_); |
- live_version->SetStatus(ServiceWorkerVersion::INSTALLED); |
- live_registration->SetWaitingVersion(live_version.get()); |
- |
- service_worker_context_->context()->storage()->StoreRegistration( |
- live_registration.get(), live_version.get(), |
- base::Bind(&BackgroundSyncManagerTest::StorageRegistrationCallback, |
- base::Unretained(this))); |
- |
+ void UnregisterServiceWorker(uint64 sw_registration_id) { |
+ bool called = false; |
+ helper_->context()->UnregisterServiceWorker( |
+ PatternForSWId(sw_registration_id), |
+ base::Bind(&UnregisterServiceWorkerCallback, &called)); |
base::RunLoop().RunUntilIdle(); |
- EXPECT_EQ(SERVICE_WORKER_OK, callback_sw_status_code_); |
+ EXPECT_TRUE(called); |
+ } |
+ |
+ GURL PatternForSWId(int64 sw_id) { |
+ EXPECT_TRUE(sw_id == sw_registration_id_1_ || |
+ sw_id == sw_registration_id_2_); |
+ return sw_id == sw_registration_id_1_ ? GURL(kPattern1) : GURL(kPattern2); |
} |
TestBrowserThreadBundle browser_thread_bundle_; |
- scoped_refptr<ServiceWorkerContextWrapper> service_worker_context_; |
+ scoped_ptr<EmbeddedWorkerTestHelper> helper_; |
scoped_ptr<BackgroundSyncManager> background_sync_manager_; |
- base::WeakPtr<ServiceWorkerContextCore> context_ptr_; |
- const GURL origin_; |
+ int64 sw_registration_id_1_; |
+ int64 sw_registration_id_2_; |
+ |
BackgroundSyncManager::BackgroundSyncRegistration sync_reg_1_; |
BackgroundSyncManager::BackgroundSyncRegistration sync_reg_2_; |
@@ -304,22 +328,8 @@ TEST_F(BackgroundSyncManagerTest, RegisterBadBackend) { |
manager->set_corrupt_backend(true); |
EXPECT_FALSE(Register(sync_reg_1_)); |
manager->set_corrupt_backend(false); |
- EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
-} |
- |
-TEST_F(BackgroundSyncManagerTest, RegisterOverwriteBadBackend) { |
- TestBackgroundSyncManager* manager = UseTestBackgroundSyncManager(); |
- EXPECT_TRUE(Register(sync_reg_1_)); |
- BackgroundSyncManager::BackgroundSyncRegistration first_registration = |
- callback_registration_; |
- |
- sync_reg_1_.min_period = 100; |
- |
- manager->set_corrupt_backend(true); |
EXPECT_FALSE(Register(sync_reg_1_)); |
- EXPECT_TRUE(GetRegistration(sync_reg_1_.name)); |
- EXPECT_EQ(callback_registration_.id, first_registration.id); |
- EXPECT_TRUE(callback_registration_.Equals(first_registration)); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
} |
TEST_F(BackgroundSyncManagerTest, TwoRegistrations) { |
@@ -342,10 +352,12 @@ TEST_F(BackgroundSyncManagerTest, GetRegistrationBadBackend) { |
EXPECT_TRUE(Register(sync_reg_1_)); |
manager->set_corrupt_backend(true); |
EXPECT_TRUE(GetRegistration(sync_reg_1_.name)); |
- EXPECT_FALSE(GetRegistration(sync_reg_2_.name)); |
+ EXPECT_FALSE(Register(sync_reg_2_)); |
+ // Registration should have discovered the bad backend and disabled the |
+ // BackgroundSyncManager. |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
manager->set_corrupt_backend(false); |
- EXPECT_TRUE(GetRegistration(sync_reg_1_.name)); |
- EXPECT_FALSE(GetRegistration(sync_reg_2_.name)); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
} |
TEST_F(BackgroundSyncManagerTest, Unregister) { |
@@ -383,11 +395,14 @@ TEST_F(BackgroundSyncManagerTest, UnregisterBadBackend) { |
TestBackgroundSyncManager* manager = UseTestBackgroundSyncManager(); |
sync_reg_1_.min_period += 1; |
EXPECT_TRUE(Register(sync_reg_1_)); |
+ EXPECT_TRUE(Register(sync_reg_2_)); |
manager->set_corrupt_backend(true); |
EXPECT_FALSE(Unregister(callback_registration_)); |
+ // Unregister should have discovered the bad backend and disabled the |
+ // BackgroundSyncManager. |
manager->set_corrupt_backend(false); |
- EXPECT_TRUE(GetRegistration(sync_reg_1_.name)); |
- EXPECT_TRUE(callback_registration_.Equals(sync_reg_1_)); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
+ EXPECT_FALSE(GetRegistration(sync_reg_2_.name)); |
} |
TEST_F(BackgroundSyncManagerTest, RegistrationIncreasesId) { |
@@ -411,40 +426,40 @@ TEST_F(BackgroundSyncManagerTest, RebootRecovery) { |
EXPECT_TRUE(Register(sync_reg_1_)); |
background_sync_manager_ = |
- BackgroundSyncManager::Create(service_worker_context_); |
+ BackgroundSyncManager::Create(helper_->context_wrapper()); |
EXPECT_TRUE(GetRegistration(sync_reg_1_.name)); |
EXPECT_FALSE(GetRegistration(sync_reg_2_.name)); |
} |
TEST_F(BackgroundSyncManagerTest, RebootRecoveryTwoServiceWorkers) { |
- EXPECT_TRUE(RegisterWithServiceWorkerId(kServiceWorkerId1, sync_reg_1_)); |
- EXPECT_TRUE(RegisterWithServiceWorkerId(kServiceWorkerId2, sync_reg_2_)); |
+ EXPECT_TRUE(RegisterWithServiceWorkerId(sw_registration_id_1_, sync_reg_1_)); |
+ EXPECT_TRUE(RegisterWithServiceWorkerId(sw_registration_id_2_, sync_reg_2_)); |
background_sync_manager_ = |
- BackgroundSyncManager::Create(service_worker_context_); |
- |
- EXPECT_TRUE( |
- GetRegistrationWithServiceWorkerId(kServiceWorkerId1, sync_reg_1_.name)); |
- EXPECT_FALSE( |
- GetRegistrationWithServiceWorkerId(kServiceWorkerId1, sync_reg_2_.name)); |
- EXPECT_FALSE( |
- GetRegistrationWithServiceWorkerId(kServiceWorkerId2, sync_reg_1_.name)); |
- EXPECT_TRUE( |
- GetRegistrationWithServiceWorkerId(kServiceWorkerId2, sync_reg_2_.name)); |
- |
- EXPECT_TRUE( |
- GetRegistrationWithServiceWorkerId(kServiceWorkerId1, sync_reg_1_.name)); |
- EXPECT_TRUE( |
- GetRegistrationWithServiceWorkerId(kServiceWorkerId2, sync_reg_2_.name)); |
- |
- EXPECT_TRUE(RegisterWithServiceWorkerId(kServiceWorkerId1, sync_reg_2_)); |
- EXPECT_TRUE(RegisterWithServiceWorkerId(kServiceWorkerId2, sync_reg_1_)); |
+ BackgroundSyncManager::Create(helper_->context_wrapper()); |
+ |
+ EXPECT_TRUE(GetRegistrationWithServiceWorkerId(sw_registration_id_1_, |
+ sync_reg_1_.name)); |
+ EXPECT_FALSE(GetRegistrationWithServiceWorkerId(sw_registration_id_1_, |
+ sync_reg_2_.name)); |
+ EXPECT_FALSE(GetRegistrationWithServiceWorkerId(sw_registration_id_2_, |
+ sync_reg_1_.name)); |
+ EXPECT_TRUE(GetRegistrationWithServiceWorkerId(sw_registration_id_2_, |
+ sync_reg_2_.name)); |
+ |
+ EXPECT_TRUE(GetRegistrationWithServiceWorkerId(sw_registration_id_1_, |
+ sync_reg_1_.name)); |
+ EXPECT_TRUE(GetRegistrationWithServiceWorkerId(sw_registration_id_2_, |
+ sync_reg_2_.name)); |
+ |
+ EXPECT_TRUE(RegisterWithServiceWorkerId(sw_registration_id_1_, sync_reg_2_)); |
+ EXPECT_TRUE(RegisterWithServiceWorkerId(sw_registration_id_2_, sync_reg_1_)); |
} |
-TEST_F(BackgroundSyncManagerTest, InitWithCorruptBackend) { |
+TEST_F(BackgroundSyncManagerTest, InitWithBadBackend) { |
TestBackgroundSyncManager* manager = |
- new TestBackgroundSyncManager(service_worker_context_); |
+ new TestBackgroundSyncManager(helper_->context_wrapper()); |
background_sync_manager_.reset(manager); |
manager->set_corrupt_backend(true); |
manager->DoInit(); |
@@ -457,7 +472,7 @@ TEST_F(BackgroundSyncManagerTest, SequentialOperations) { |
// Schedule Init and all of the operations on a delayed backend. Verify that |
// the operations complete sequentially. |
TestBackgroundSyncManager* manager = |
- new TestBackgroundSyncManager(service_worker_context_); |
+ new TestBackgroundSyncManager(helper_->context_wrapper()); |
background_sync_manager_.reset(manager); |
manager->set_delay_backend(true); |
manager->DoInit(); |
@@ -469,15 +484,15 @@ TEST_F(BackgroundSyncManagerTest, SequentialOperations) { |
bool unregister_called = false; |
bool get_registration_called = false; |
manager->Register( |
- origin_, kServiceWorkerId1, sync_reg_1_, |
+ GURL(kOrigin), sw_registration_id_1_, sync_reg_1_, |
base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback, |
base::Unretained(this), ®ister_called)); |
- manager->Unregister(origin_, kServiceWorkerId1, sync_reg_1_.name, |
+ manager->Unregister(GURL(kOrigin), sw_registration_id_1_, sync_reg_1_.name, |
kExpectedInitialId, |
base::Bind(&BackgroundSyncManagerTest::StatusCallback, |
base::Unretained(this), &unregister_called)); |
manager->GetRegistration( |
- origin_, kServiceWorkerId1, sync_reg_1_.name, |
+ GURL(kOrigin), sw_registration_id_1_, sync_reg_1_.name, |
base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback, |
base::Unretained(this), &get_registration_called)); |
@@ -512,4 +527,96 @@ TEST_F(BackgroundSyncManagerTest, SequentialOperations) { |
EXPECT_TRUE(get_registration_called); |
} |
+TEST_F(BackgroundSyncManagerTest, UnregisterServiceWorker) { |
+ EXPECT_TRUE(Register(sync_reg_1_)); |
+ UnregisterServiceWorker(sw_registration_id_1_); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
+} |
+ |
+TEST_F(BackgroundSyncManagerTest, |
+ UnregisterServiceWorkerDuringSyncRegistration) { |
+ TestBackgroundSyncManager* manager = |
+ new TestBackgroundSyncManager(helper_->context_wrapper()); |
+ background_sync_manager_.reset(manager); |
+ manager->DoInit(); |
+ |
+ EXPECT_TRUE(Register(sync_reg_1_)); |
+ |
+ manager->set_delay_backend(true); |
+ bool callback_called = false; |
+ manager->Register( |
+ GURL(kOrigin), sw_registration_id_1_, sync_reg_2_, |
+ base::Bind(&BackgroundSyncManagerTest::StatusAndRegistrationCallback, |
+ base::Unretained(this), &callback_called)); |
+ |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_FALSE(callback_called); |
+ UnregisterServiceWorker(sw_registration_id_1_); |
+ |
+ manager->Continue(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_TRUE(callback_called); |
+ EXPECT_EQ(BackgroundSyncManager::ERROR_TYPE_STORAGE, callback_error_); |
+ |
+ manager->set_delay_backend(false); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
+} |
+ |
+TEST_F(BackgroundSyncManagerTest, DeleteAndStartOverServiceWorkerContext) { |
+ EXPECT_TRUE(Register(sync_reg_1_)); |
+ helper_->context()->ScheduleDeleteAndStartOver(); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
+} |
+ |
+TEST_F(BackgroundSyncManagerTest, DisabledManagerWorksAfterBrowserRestart) { |
+ TestBackgroundSyncManager* manager = |
+ new TestBackgroundSyncManager(helper_->context_wrapper()); |
+ background_sync_manager_.reset(manager); |
+ manager->DoInit(); |
+ EXPECT_TRUE(Register(sync_reg_1_)); |
+ manager->set_corrupt_backend(true); |
+ EXPECT_FALSE(Register(sync_reg_2_)); |
+ |
+ // The manager is now disabled and not accepting new requests until browser |
+ // restart or notification that the storage has been wiped. |
+ manager->set_corrupt_backend(false); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
+ EXPECT_FALSE(Register(sync_reg_2_)); |
+ |
+ // Simulate restarting the browser by creating a new BackgroundSyncManager. |
+ background_sync_manager_.reset( |
+ new TestBackgroundSyncManager(helper_->context_wrapper())); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
+ EXPECT_TRUE(Register(sync_reg_1_)); |
+} |
+ |
+TEST_F(BackgroundSyncManagerTest, DisabledManagerWorksAfterDeleteAndStartOver) { |
+ TestBackgroundSyncManager* manager = |
+ new TestBackgroundSyncManager(helper_->context_wrapper()); |
+ background_sync_manager_.reset(manager); |
+ manager->DoInit(); |
+ EXPECT_TRUE(Register(sync_reg_1_)); |
+ manager->set_corrupt_backend(true); |
+ EXPECT_FALSE(Register(sync_reg_2_)); |
+ |
+ // The manager is now disabled and not accepting new requests until browser |
+ // restart or notification that the storage has been wiped. |
+ manager->set_corrupt_backend(false); |
+ helper_->context()->ScheduleDeleteAndStartOver(); |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ bool called = false; |
+ helper_->context()->RegisterServiceWorker( |
+ GURL(kPattern1), GURL(kScript1), NULL, |
+ base::Bind(&RegisterServiceWorkerCallback, &called, |
+ &sw_registration_id_1_)); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_TRUE(called); |
+ |
+ EXPECT_TRUE(Register(sync_reg_2_)); |
+ EXPECT_FALSE(GetRegistration(sync_reg_1_.name)); |
+ EXPECT_TRUE(GetRegistration(sync_reg_2_.name)); |
+} |
+ |
} // namespace content |