Upstream version 10.39.225.0
[platform/framework/web/crosswalk.git] / src / content / browser / service_worker / service_worker_registration_unittest.cc
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.
4
5 #include "content/browser/service_worker/service_worker_registration.h"
6
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"
16 #include "url/gurl.h"
17
18 namespace content {
19
20 class ServiceWorkerRegistrationTest : public testing::Test {
21  public:
22   ServiceWorkerRegistrationTest()
23       : io_thread_(BrowserThread::IO, &message_loop_) {}
24
25   virtual void SetUp() OVERRIDE {
26     context_.reset(
27         new ServiceWorkerContextCore(base::FilePath(),
28                                      base::ThreadTaskRunnerHandle::Get(),
29                                      base::ThreadTaskRunnerHandle::Get(),
30                                      base::ThreadTaskRunnerHandle::Get(),
31                                      NULL,
32                                      NULL,
33                                      NULL));
34     context_ptr_ = context_->AsWeakPtr();
35   }
36
37   virtual void TearDown() OVERRIDE {
38     context_.reset();
39     base::RunLoop().RunUntilIdle();
40   }
41
42   class RegistrationListener : public ServiceWorkerRegistration::Listener {
43    public:
44     RegistrationListener() {}
45     ~RegistrationListener() {
46       if (observed_registration_.get())
47         observed_registration_->RemoveListener(this);
48     }
49
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;
57     }
58
59     virtual void OnRegistrationFailed(
60         ServiceWorkerRegistration* registration) OVERRIDE {
61       NOTREACHED();
62     }
63
64     virtual void OnRegistrationFinishedUninstalling(
65         ServiceWorkerRegistration* registration) OVERRIDE {
66       NOTREACHED();
67     }
68
69     virtual void OnUpdateFound(
70         ServiceWorkerRegistration* registration) OVERRIDE {
71       NOTREACHED();
72     }
73
74     void Reset() {
75       observed_registration_ = NULL;
76       observed_changed_mask_ = ChangedVersionAttributesMask();
77       observed_info_ = ServiceWorkerRegistrationInfo();
78     }
79
80     scoped_refptr<ServiceWorkerRegistration> observed_registration_;
81     ChangedVersionAttributesMask observed_changed_mask_;
82     ServiceWorkerRegistrationInfo observed_info_;
83   };
84
85  protected:
86   scoped_ptr<ServiceWorkerContextCore> context_;
87   base::WeakPtr<ServiceWorkerContextCore> context_ptr_;
88   base::MessageLoopForIO message_loop_;
89   BrowserThreadImpl io_thread_;
90 };
91
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(
98           kScope,
99           kRegistrationId,
100           context_ptr_);
101
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_);
108
109   RegistrationListener listener;
110   registration->AddListener(&listener);
111   registration->SetActiveVersion(version_1.get());
112
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);
123   listener.Reset();
124
125   registration->SetInstallingVersion(version_2.get());
126
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);
135   listener.Reset();
136
137   registration->SetWaitingVersion(version_2.get());
138
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);
147   listener.Reset();
148
149   registration->UnsetVersion(version_2.get());
150
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);
158 }
159
160 TEST_F(ServiceWorkerRegistrationTest, FailedRegistrationNoCrash) {
161   const GURL kScope("http://www.example.not/");
162   int64 kRegistrationId = 1L;
163   int kProviderId = 1;
164   scoped_refptr<ServiceWorkerRegistration> registration =
165       new ServiceWorkerRegistration(
166           kScope,
167           kRegistrationId,
168           context_ptr_);
169   scoped_ptr<ServiceWorkerRegistrationHandle> handle(
170       new ServiceWorkerRegistrationHandle(context_ptr_,
171                                           NULL,
172                                           kProviderId,
173                                           registration.get()));
174   registration->NotifyRegistrationFailed();
175   // Don't crash when handle gets destructed.
176 }
177
178 }  // namespace content