service_worker_registration_unittest.cc revision 6e8cce623b6e4fe0c9e4af605d675dd9d0338c38
1f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// found in the LICENSE file. 4f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/service_worker/service_worker_registration.h" 6f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 7f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/files/scoped_temp_dir.h" 8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/logging.h" 9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "base/message_loop/message_loop.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/run_loop.h" 11f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "content/browser/browser_thread_impl.h" 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/browser/service_worker/service_worker_context_core.h" 136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "content/browser/service_worker/service_worker_registration_handle.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "url/gurl.h" 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content { 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ServiceWorkerRegistrationTest : public testing::Test { 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ServiceWorkerRegistrationTest() 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : io_thread_(BrowserThread::IO, &message_loop_) {} 23f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetUp() OVERRIDE { 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_.reset( 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ServiceWorkerContextCore(base::FilePath(), 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current(), 28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current(), 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoopProxy::current(), 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, 32cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL)); 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch context_ptr_ = context_->AsWeakPtr(); 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void TearDown() OVERRIDE { 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context_.reset(); 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 40010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) class RegistrationListener : public ServiceWorkerRegistration::Listener { 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RegistrationListener() {} 446e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ~RegistrationListener() { 456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) if (observed_registration_) 466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) observed_registration_->RemoveListener(this); 476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnVersionAttributesChanged( 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ServiceWorkerRegistration* registration, 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChangedVersionAttributesMask changed_mask, 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ServiceWorkerRegistrationInfo& info) OVERRIDE { 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_registration_ = registration; 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_changed_mask_ = changed_mask; 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_info_ = info; 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) virtual void OnRegistrationFailed( 596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ServiceWorkerRegistration* registration) OVERRIDE { 606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NOTREACHED(); 616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) } 626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void Reset() { 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_registration_ = NULL; 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_changed_mask_ = ChangedVersionAttributesMask(); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_info_ = ServiceWorkerRegistrationInfo(); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<ServiceWorkerRegistration> observed_registration_; 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChangedVersionAttributesMask observed_changed_mask_; 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ServiceWorkerRegistrationInfo observed_info_; 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<ServiceWorkerContextCore> context_; 76c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::WeakPtr<ServiceWorkerContextCore> context_ptr_; 77f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoopForIO message_loop_; 78f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThreadImpl io_thread_; 79f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 80f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ServiceWorkerRegistrationTest, SetAndUnsetVersions) { 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL kScope("http://www.example.not/"); 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL kScript("http://www.example.not/service_worker.js"); 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 kRegistrationId = 1L; 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<ServiceWorkerRegistration> registration = 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ServiceWorkerRegistration( 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kScope, 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kScript, 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kRegistrationId, 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context_ptr_); 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int64 version_1_id = 1L; 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int64 version_2_id = 2L; 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<ServiceWorkerVersion> version_1 = 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ServiceWorkerVersion(registration, version_1_id, context_ptr_); 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<ServiceWorkerVersion> version_2 = 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ServiceWorkerVersion(registration, version_2_id, context_ptr_); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RegistrationListener listener; 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->AddListener(&listener); 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->SetActiveVersion(version_1); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1, registration->active_version()); 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(registration, listener.observed_registration_); 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ChangedVersionAttributesMask::ACTIVE_VERSION, 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.observed_changed_mask_.changed()); 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(kScope, listener.observed_info_.pattern); 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(kScript, listener.observed_info_.script_url); 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.installing_version.is_null); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.waiting_version.is_null); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.controlling_version.is_null); 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.Reset(); 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->SetInstallingVersion(version_2); 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_2, registration->installing_version()); 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ChangedVersionAttributesMask::INSTALLING_VERSION, 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.observed_changed_mask_.changed()); 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_2_id, 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.observed_info_.installing_version.version_id); 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.waiting_version.is_null); 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.controlling_version.is_null); 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.Reset(); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->SetWaitingVersion(version_2); 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_2, registration->waiting_version()); 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(registration->installing_version()); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_changed_mask_.waiting_changed()); 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_changed_mask_.installing_changed()); 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_2_id, listener.observed_info_.waiting_version.version_id); 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.installing_version.is_null); 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.controlling_version.is_null); 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.Reset(); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->UnsetVersion(version_2); 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(registration->waiting_version()); 1425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ChangedVersionAttributesMask::WAITING_VERSION, 1435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.observed_changed_mask_.changed()); 1445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); 1455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.waiting_version.is_null); 1465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.installing_version.is_null); 1475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.controlling_version.is_null); 1485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)TEST_F(ServiceWorkerRegistrationTest, FailedRegistrationNoCrash) { 1516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL kScope("http://www.example.not/"); 1526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) const GURL kScript("http://www.example.not/service_worker.js"); 1536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int64 kRegistrationId = 1L; 1546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int kProviderId = 1; 1556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_refptr<ServiceWorkerRegistration> registration = 1566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new ServiceWorkerRegistration( 1576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kScope, 1586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kScript, 1596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kRegistrationId, 1606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) context_ptr_); 1616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) scoped_ptr<ServiceWorkerRegistrationHandle> handle( 1626e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) new ServiceWorkerRegistrationHandle(context_ptr_, 1636e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) NULL, 1646e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kProviderId, 1656e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration.get())); 1666e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) registration->NotifyRegistrationFailed(); 1676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Don't crash when handle gets destructed. 1686e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 1696e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace content 171