service_worker_registration_unittest.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
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" 13f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 14f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "url/gurl.h" 15f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 16f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)namespace content { 17f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class ServiceWorkerRegistrationTest : public testing::Test { 19f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) public: 20f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) ServiceWorkerRegistrationTest() 21f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) : io_thread_(BrowserThread::IO, &message_loop_) {} 22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetUp() OVERRIDE { 24cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) context_.reset( 25cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) new ServiceWorkerContextCore(base::FilePath(), 26cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current(), 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoopProxy::current(), 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoopProxy::current(), 29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, 30cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL, 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) NULL)); 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch context_ptr_ = context_->AsWeakPtr(); 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch } 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 35010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void TearDown() OVERRIDE { 36010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) context_.reset(); 37010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::RunLoop().RunUntilIdle(); 38010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) } 39010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) class RegistrationListener : public ServiceWorkerRegistration::Listener { 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) public: 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RegistrationListener() {} 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ~RegistrationListener() {} 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void OnVersionAttributesChanged( 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ServiceWorkerRegistration* registration, 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChangedVersionAttributesMask changed_mask, 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ServiceWorkerRegistrationInfo& info) OVERRIDE { 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_registration_ = registration; 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_changed_mask_ = changed_mask; 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_info_ = info; 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void Reset() { 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_registration_ = NULL; 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_changed_mask_ = ChangedVersionAttributesMask(); 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) observed_info_ = ServiceWorkerRegistrationInfo(); 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<ServiceWorkerRegistration> observed_registration_; 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ChangedVersionAttributesMask observed_changed_mask_; 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) ServiceWorkerRegistrationInfo observed_info_; 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) }; 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<ServiceWorkerContextCore> context_; 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::WeakPtr<ServiceWorkerContextCore> context_ptr_; 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::MessageLoopForIO message_loop_; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) BrowserThreadImpl io_thread_; 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)}; 71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)TEST_F(ServiceWorkerRegistrationTest, SetAndUnsetVersions) { 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL kScope("http://www.example.not/"); 745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const GURL kScript("http://www.example.not/service_worker.js"); 755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) int64 kRegistrationId = 1L; 765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<ServiceWorkerRegistration> registration = 775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ServiceWorkerRegistration( 785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kScope, 795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kScript, 805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) kRegistrationId, 815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) context_ptr_); 825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int64 version_1_id = 1L; 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const int64 version_2_id = 2L; 855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<ServiceWorkerVersion> version_1 = 865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ServiceWorkerVersion(registration, version_1_id, context_ptr_); 875f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<ServiceWorkerVersion> version_2 = 885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) new ServiceWorkerVersion(registration, version_2_id, context_ptr_); 895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) RegistrationListener listener; 915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->AddListener(&listener); 925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->SetActiveVersion(version_1); 935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1, registration->active_version()); 955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(registration, listener.observed_registration_); 965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ChangedVersionAttributesMask::ACTIVE_VERSION, 975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.observed_changed_mask_.changed()); 985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(kScope, listener.observed_info_.pattern); 995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(kScript, listener.observed_info_.script_url); 1005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); 1015f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.installing_version.is_null); 1025f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.waiting_version.is_null); 1035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.controlling_version.is_null); 1045f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.Reset(); 1055f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->SetInstallingVersion(version_2); 1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_2, registration->installing_version()); 1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ChangedVersionAttributesMask::INSTALLING_VERSION, 1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.observed_changed_mask_.changed()); 1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); 1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_2_id, 1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.observed_info_.installing_version.version_id); 1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.waiting_version.is_null); 1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.controlling_version.is_null); 1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.Reset(); 1175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->SetWaitingVersion(version_2); 1195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_2, registration->waiting_version()); 1215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(registration->installing_version()); 1225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_changed_mask_.waiting_changed()); 1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_changed_mask_.installing_changed()); 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_2_id, listener.observed_info_.waiting_version.version_id); 1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.installing_version.is_null); 1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.controlling_version.is_null); 1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.Reset(); 1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) registration->UnsetVersion(version_2); 1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_FALSE(registration->waiting_version()); 1335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(ChangedVersionAttributesMask::WAITING_VERSION, 1345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) listener.observed_changed_mask_.changed()); 1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id); 1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.waiting_version.is_null); 1375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.installing_version.is_null); 1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_TRUE(listener.observed_info_.controlling_version.is_null); 1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)} 1405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} // namespace content 142