1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "content/browser/service_worker/service_worker_registration.h"
7 #include "base/files/scoped_temp_dir.h"
8 #include "base/logging.h"
9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h"
11 #include "base/thread_task_runner_handle.h"
12 #include "content/browser/browser_thread_impl.h"
13 #include "content/browser/service_worker/service_worker_context_core.h"
14 #include "content/browser/service_worker/service_worker_registration_handle.h"
15 #include "testing/gtest/include/gtest/gtest.h"
20 class ServiceWorkerRegistrationTest : public testing::Test {
22 ServiceWorkerRegistrationTest()
23 : io_thread_(BrowserThread::IO, &message_loop_) {}
25 virtual void SetUp() OVERRIDE {
27 new ServiceWorkerContextCore(base::FilePath(),
28 base::ThreadTaskRunnerHandle::Get(),
29 base::ThreadTaskRunnerHandle::Get(),
30 base::ThreadTaskRunnerHandle::Get(),
34 context_ptr_ = context_->AsWeakPtr();
37 virtual void TearDown() OVERRIDE {
39 base::RunLoop().RunUntilIdle();
42 class RegistrationListener : public ServiceWorkerRegistration::Listener {
44 RegistrationListener() {}
45 ~RegistrationListener() {
46 if (observed_registration_.get())
47 observed_registration_->RemoveListener(this);
50 virtual void OnVersionAttributesChanged(
51 ServiceWorkerRegistration* registration,
52 ChangedVersionAttributesMask changed_mask,
53 const ServiceWorkerRegistrationInfo& info) OVERRIDE {
54 observed_registration_ = registration;
55 observed_changed_mask_ = changed_mask;
56 observed_info_ = info;
59 virtual void OnRegistrationFailed(
60 ServiceWorkerRegistration* registration) OVERRIDE {
64 virtual void OnRegistrationFinishedUninstalling(
65 ServiceWorkerRegistration* registration) OVERRIDE {
69 virtual void OnUpdateFound(
70 ServiceWorkerRegistration* registration) OVERRIDE {
75 observed_registration_ = NULL;
76 observed_changed_mask_ = ChangedVersionAttributesMask();
77 observed_info_ = ServiceWorkerRegistrationInfo();
80 scoped_refptr<ServiceWorkerRegistration> observed_registration_;
81 ChangedVersionAttributesMask observed_changed_mask_;
82 ServiceWorkerRegistrationInfo observed_info_;
86 scoped_ptr<ServiceWorkerContextCore> context_;
87 base::WeakPtr<ServiceWorkerContextCore> context_ptr_;
88 base::MessageLoopForIO message_loop_;
89 BrowserThreadImpl io_thread_;
92 TEST_F(ServiceWorkerRegistrationTest, SetAndUnsetVersions) {
93 const GURL kScope("http://www.example.not/");
94 const GURL kScript("http://www.example.not/service_worker.js");
95 int64 kRegistrationId = 1L;
96 scoped_refptr<ServiceWorkerRegistration> registration =
97 new ServiceWorkerRegistration(
102 const int64 version_1_id = 1L;
103 const int64 version_2_id = 2L;
104 scoped_refptr<ServiceWorkerVersion> version_1 = new ServiceWorkerVersion(
105 registration.get(), kScript, version_1_id, context_ptr_);
106 scoped_refptr<ServiceWorkerVersion> version_2 = new ServiceWorkerVersion(
107 registration.get(), kScript, version_2_id, context_ptr_);
109 RegistrationListener listener;
110 registration->AddListener(&listener);
111 registration->SetActiveVersion(version_1.get());
113 EXPECT_EQ(version_1.get(), registration->active_version());
114 EXPECT_EQ(registration, listener.observed_registration_);
115 EXPECT_EQ(ChangedVersionAttributesMask::ACTIVE_VERSION,
116 listener.observed_changed_mask_.changed());
117 EXPECT_EQ(kScope, listener.observed_info_.pattern);
118 EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
119 EXPECT_EQ(kScript, listener.observed_info_.active_version.script_url);
120 EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
121 EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
122 EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
125 registration->SetInstallingVersion(version_2.get());
127 EXPECT_EQ(version_2.get(), registration->installing_version());
128 EXPECT_EQ(ChangedVersionAttributesMask::INSTALLING_VERSION,
129 listener.observed_changed_mask_.changed());
130 EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
131 EXPECT_EQ(version_2_id,
132 listener.observed_info_.installing_version.version_id);
133 EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
134 EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
137 registration->SetWaitingVersion(version_2.get());
139 EXPECT_EQ(version_2.get(), registration->waiting_version());
140 EXPECT_FALSE(registration->installing_version());
141 EXPECT_TRUE(listener.observed_changed_mask_.waiting_changed());
142 EXPECT_TRUE(listener.observed_changed_mask_.installing_changed());
143 EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
144 EXPECT_EQ(version_2_id, listener.observed_info_.waiting_version.version_id);
145 EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
146 EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
149 registration->UnsetVersion(version_2.get());
151 EXPECT_FALSE(registration->waiting_version());
152 EXPECT_EQ(ChangedVersionAttributesMask::WAITING_VERSION,
153 listener.observed_changed_mask_.changed());
154 EXPECT_EQ(version_1_id, listener.observed_info_.active_version.version_id);
155 EXPECT_TRUE(listener.observed_info_.waiting_version.is_null);
156 EXPECT_TRUE(listener.observed_info_.installing_version.is_null);
157 EXPECT_TRUE(listener.observed_info_.controlling_version.is_null);
160 TEST_F(ServiceWorkerRegistrationTest, FailedRegistrationNoCrash) {
161 const GURL kScope("http://www.example.not/");
162 int64 kRegistrationId = 1L;
164 scoped_refptr<ServiceWorkerRegistration> registration =
165 new ServiceWorkerRegistration(
169 scoped_ptr<ServiceWorkerRegistrationHandle> handle(
170 new ServiceWorkerRegistrationHandle(context_ptr_,
173 registration.get()));
174 registration->NotifyRegistrationFailed();
175 // Don't crash when handle gets destructed.
178 } // namespace content