OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "public/web/WebEmbeddedWorker.h" | 5 #include "public/web/WebEmbeddedWorker.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include "platform/testing/URLTestHelpers.h" | 8 #include "platform/testing/URLTestHelpers.h" |
9 #include "platform/testing/UnitTestHelpers.h" | 9 #include "platform/testing/UnitTestHelpers.h" |
10 #include "platform/wtf/PtrUtil.h" | 10 #include "platform/wtf/PtrUtil.h" |
11 #include "public/platform/Platform.h" | 11 #include "public/platform/Platform.h" |
12 #include "public/platform/WebURLLoaderMockFactory.h" | 12 #include "public/platform/WebURLLoaderMockFactory.h" |
13 #include "public/platform/WebURLResponse.h" | 13 #include "public/platform/WebURLResponse.h" |
| 14 #include "public/platform/modules/serviceworker/WebServiceWorkerNetworkProvider.
h" |
14 #include "public/platform/modules/serviceworker/WebServiceWorkerProvider.h" | 15 #include "public/platform/modules/serviceworker/WebServiceWorkerProvider.h" |
15 #include "public/web/WebEmbeddedWorkerStartData.h" | 16 #include "public/web/WebEmbeddedWorkerStartData.h" |
16 #include "public/web/WebSettings.h" | 17 #include "public/web/WebSettings.h" |
17 #include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h" | 18 #include "public/web/modules/serviceworker/WebServiceWorkerContextClient.h" |
18 #include "testing/gmock/include/gmock/gmock.h" | 19 #include "testing/gmock/include/gmock/gmock.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 20 #include "testing/gtest/include/gtest/gtest.h" |
20 | 21 |
21 namespace blink { | 22 namespace blink { |
22 namespace { | 23 namespace { |
23 | 24 |
24 class MockServiceWorkerContextClient : public WebServiceWorkerContextClient { | 25 class MockServiceWorkerContextClient : public WebServiceWorkerContextClient { |
25 public: | 26 public: |
26 MockServiceWorkerContextClient() : has_associated_registration_(true) {} | 27 MockServiceWorkerContextClient() : has_associated_registration_(true) {} |
27 ~MockServiceWorkerContextClient() override {} | 28 ~MockServiceWorkerContextClient() override {} |
28 MOCK_METHOD0(WorkerReadyForInspection, void()); | 29 MOCK_METHOD0(WorkerReadyForInspection, void()); |
29 MOCK_METHOD0(WorkerContextFailedToStart, void()); | 30 MOCK_METHOD0(WorkerContextFailedToStart, void()); |
30 MOCK_METHOD0(WorkerScriptLoaded, void()); | 31 MOCK_METHOD0(WorkerScriptLoaded, void()); |
31 MOCK_METHOD0(CreateServiceWorkerNetworkProvider, | 32 |
| 33 // Work-around for mocking a method that return unique_ptr. |
| 34 MOCK_METHOD0(CreateServiceWorkerNetworkProviderProxy, |
32 WebServiceWorkerNetworkProvider*()); | 35 WebServiceWorkerNetworkProvider*()); |
33 MOCK_METHOD0(CreateServiceWorkerProvider, WebServiceWorkerProvider*()); | 36 MOCK_METHOD0(CreateServiceWorkerProviderProxy, WebServiceWorkerProvider*()); |
| 37 std::unique_ptr<WebServiceWorkerNetworkProvider> |
| 38 CreateServiceWorkerNetworkProvider() override { |
| 39 return std::unique_ptr<WebServiceWorkerNetworkProvider>( |
| 40 CreateServiceWorkerNetworkProviderProxy()); |
| 41 } |
| 42 std::unique_ptr<WebServiceWorkerProvider> CreateServiceWorkerProvider() |
| 43 override { |
| 44 return std::unique_ptr<WebServiceWorkerProvider>( |
| 45 CreateServiceWorkerProviderProxy()); |
| 46 } |
| 47 |
34 bool HasAssociatedRegistration() override { | 48 bool HasAssociatedRegistration() override { |
35 return has_associated_registration_; | 49 return has_associated_registration_; |
36 } | 50 } |
37 void SetHasAssociatedRegistration(bool has_associated_registration) { | 51 void SetHasAssociatedRegistration(bool has_associated_registration) { |
38 has_associated_registration_ = has_associated_registration; | 52 has_associated_registration_ = has_associated_registration; |
39 } | 53 } |
40 void GetClient(const WebString&, | 54 void GetClient(const WebString&, |
41 std::unique_ptr<WebServiceWorkerClientCallbacks>) override { | 55 std::unique_ptr<WebServiceWorkerClientCallbacks>) override { |
42 NOTREACHED(); | 56 NOTREACHED(); |
43 } | 57 } |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 worker_->TerminateWorkerContext(); | 150 worker_->TerminateWorkerContext(); |
137 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 151 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
138 } | 152 } |
139 | 153 |
140 TEST_F(WebEmbeddedWorkerImplTest, TerminateWhileLoadingScript) { | 154 TEST_F(WebEmbeddedWorkerImplTest, TerminateWhileLoadingScript) { |
141 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); | 155 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); |
142 worker_->StartWorkerContext(start_data_); | 156 worker_->StartWorkerContext(start_data_); |
143 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 157 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
144 | 158 |
145 // Load the shadow page. | 159 // Load the shadow page. |
146 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProvider()) | 160 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProviderProxy()) |
147 .WillOnce(::testing::Return(nullptr)); | 161 .WillOnce(::testing::Return(nullptr)); |
148 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 162 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
149 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 163 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
150 | 164 |
151 // Terminate before loading the script. | 165 // Terminate before loading the script. |
152 EXPECT_CALL(*mock_client_, WorkerContextFailedToStart()).Times(1); | 166 EXPECT_CALL(*mock_client_, WorkerContextFailedToStart()).Times(1); |
153 worker_->TerminateWorkerContext(); | 167 worker_->TerminateWorkerContext(); |
154 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 168 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
155 } | 169 } |
156 | 170 |
157 TEST_F(WebEmbeddedWorkerImplTest, TerminateWhilePausedAfterDownload) { | 171 TEST_F(WebEmbeddedWorkerImplTest, TerminateWhilePausedAfterDownload) { |
158 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); | 172 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); |
159 start_data_.pause_after_download_mode = | 173 start_data_.pause_after_download_mode = |
160 WebEmbeddedWorkerStartData::kPauseAfterDownload; | 174 WebEmbeddedWorkerStartData::kPauseAfterDownload; |
161 worker_->StartWorkerContext(start_data_); | 175 worker_->StartWorkerContext(start_data_); |
162 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 176 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
163 | 177 |
164 // Load the shadow page. | 178 // Load the shadow page. |
165 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProvider()) | 179 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProviderProxy()) |
166 .WillOnce(::testing::Return(nullptr)); | 180 .WillOnce(::testing::Return(nullptr)); |
167 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 181 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
168 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 182 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
169 | 183 |
170 // Load the script. | 184 // Load the script. |
171 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(1); | 185 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(1); |
172 EXPECT_CALL(*mock_client_, CreateServiceWorkerProvider()).Times(0); | 186 EXPECT_CALL(*mock_client_, CreateServiceWorkerProviderProxy()).Times(0); |
173 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 187 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
174 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 188 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
175 | 189 |
176 // Terminate before resuming after download. | 190 // Terminate before resuming after download. |
177 EXPECT_CALL(*mock_client_, CreateServiceWorkerProvider()).Times(0); | 191 EXPECT_CALL(*mock_client_, CreateServiceWorkerProviderProxy()).Times(0); |
178 EXPECT_CALL(*mock_client_, WorkerContextFailedToStart()).Times(1); | 192 EXPECT_CALL(*mock_client_, WorkerContextFailedToStart()).Times(1); |
179 worker_->TerminateWorkerContext(); | 193 worker_->TerminateWorkerContext(); |
180 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 194 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
181 } | 195 } |
182 | 196 |
183 TEST_F(WebEmbeddedWorkerImplTest, ScriptNotFound) { | 197 TEST_F(WebEmbeddedWorkerImplTest, ScriptNotFound) { |
184 WebURL script_url = | 198 WebURL script_url = |
185 URLTestHelpers::ToKURL("https://www.example.com/sw-404.js"); | 199 URLTestHelpers::ToKURL("https://www.example.com/sw-404.js"); |
186 WebURLResponse response; | 200 WebURLResponse response; |
187 response.SetMIMEType("text/javascript"); | 201 response.SetMIMEType("text/javascript"); |
188 response.SetHTTPStatusCode(404); | 202 response.SetHTTPStatusCode(404); |
189 WebURLError error; | 203 WebURLError error; |
190 error.reason = 1010; | 204 error.reason = 1010; |
191 error.domain = "WebEmbeddedWorkerImplTest"; | 205 error.domain = "WebEmbeddedWorkerImplTest"; |
192 Platform::Current()->GetURLLoaderMockFactory()->RegisterErrorURL( | 206 Platform::Current()->GetURLLoaderMockFactory()->RegisterErrorURL( |
193 script_url, response, error); | 207 script_url, response, error); |
194 start_data_.script_url = script_url; | 208 start_data_.script_url = script_url; |
195 | 209 |
196 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); | 210 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); |
197 worker_->StartWorkerContext(start_data_); | 211 worker_->StartWorkerContext(start_data_); |
198 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 212 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
199 | 213 |
200 // Load the shadow page. | 214 // Load the shadow page. |
201 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProvider()) | 215 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProviderProxy()) |
202 .WillOnce(::testing::Return(nullptr)); | 216 .WillOnce(::testing::Return(nullptr)); |
203 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 217 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
204 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 218 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
205 | 219 |
206 // Load the script. | 220 // Load the script. |
207 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(0); | 221 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(0); |
208 EXPECT_CALL(*mock_client_, CreateServiceWorkerProvider()).Times(0); | 222 EXPECT_CALL(*mock_client_, CreateServiceWorkerProviderProxy()).Times(0); |
209 EXPECT_CALL(*mock_client_, WorkerContextFailedToStart()).Times(1); | 223 EXPECT_CALL(*mock_client_, WorkerContextFailedToStart()).Times(1); |
210 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 224 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
211 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 225 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
212 } | 226 } |
213 | 227 |
214 TEST_F(WebEmbeddedWorkerImplTest, NoRegistration) { | 228 TEST_F(WebEmbeddedWorkerImplTest, NoRegistration) { |
215 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); | 229 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); |
216 start_data_.pause_after_download_mode = | 230 start_data_.pause_after_download_mode = |
217 WebEmbeddedWorkerStartData::kPauseAfterDownload; | 231 WebEmbeddedWorkerStartData::kPauseAfterDownload; |
218 worker_->StartWorkerContext(start_data_); | 232 worker_->StartWorkerContext(start_data_); |
219 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 233 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
220 | 234 |
221 // Load the shadow page. | 235 // Load the shadow page. |
222 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProvider()) | 236 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProviderProxy()) |
223 .WillOnce(::testing::Return(nullptr)); | 237 .WillOnce(::testing::Return(nullptr)); |
224 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 238 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
225 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 239 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
226 | 240 |
227 // Load the script. | 241 // Load the script. |
228 mock_client_->SetHasAssociatedRegistration(false); | 242 mock_client_->SetHasAssociatedRegistration(false); |
229 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(0); | 243 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(0); |
230 EXPECT_CALL(*mock_client_, CreateServiceWorkerProvider()).Times(0); | 244 EXPECT_CALL(*mock_client_, CreateServiceWorkerProviderProxy()).Times(0); |
231 EXPECT_CALL(*mock_client_, WorkerContextFailedToStart()).Times(1); | 245 EXPECT_CALL(*mock_client_, WorkerContextFailedToStart()).Times(1); |
232 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 246 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
233 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 247 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
234 } | 248 } |
235 | 249 |
236 // The running worker is detected as a memory leak. crbug.com/586897 | 250 // The running worker is detected as a memory leak. crbug.com/586897 |
237 #if defined(ADDRESS_SANITIZER) | 251 #if defined(ADDRESS_SANITIZER) |
238 #define MAYBE_DontPauseAfterDownload DISABLED_DontPauseAfterDownload | 252 #define MAYBE_DontPauseAfterDownload DISABLED_DontPauseAfterDownload |
239 #else | 253 #else |
240 #define MAYBE_DontPauseAfterDownload DontPauseAfterDownload | 254 #define MAYBE_DontPauseAfterDownload DontPauseAfterDownload |
241 #endif | 255 #endif |
242 | 256 |
243 TEST_F(WebEmbeddedWorkerImplTest, MAYBE_DontPauseAfterDownload) { | 257 TEST_F(WebEmbeddedWorkerImplTest, MAYBE_DontPauseAfterDownload) { |
244 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); | 258 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); |
245 worker_->StartWorkerContext(start_data_); | 259 worker_->StartWorkerContext(start_data_); |
246 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 260 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
247 | 261 |
248 // Load the shadow page. | 262 // Load the shadow page. |
249 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProvider()) | 263 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProviderProxy()) |
250 .WillOnce(::testing::Return(nullptr)); | 264 .WillOnce(::testing::Return(nullptr)); |
251 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 265 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
252 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 266 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
253 | 267 |
254 // Load the script. | 268 // Load the script. |
255 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(1); | 269 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(1); |
256 EXPECT_CALL(*mock_client_, CreateServiceWorkerProvider()) | 270 EXPECT_CALL(*mock_client_, CreateServiceWorkerProviderProxy()) |
257 .WillOnce(::testing::Return(nullptr)); | 271 .WillOnce(::testing::Return(nullptr)); |
258 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 272 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
259 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 273 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
260 } | 274 } |
261 | 275 |
262 // The running worker is detected as a memory leak. crbug.com/586897 | 276 // The running worker is detected as a memory leak. crbug.com/586897 |
263 #if defined(ADDRESS_SANITIZER) | 277 #if defined(ADDRESS_SANITIZER) |
264 #define MAYBE_PauseAfterDownload DISABLED_PauseAfterDownload | 278 #define MAYBE_PauseAfterDownload DISABLED_PauseAfterDownload |
265 #else | 279 #else |
266 #define MAYBE_PauseAfterDownload PauseAfterDownload | 280 #define MAYBE_PauseAfterDownload PauseAfterDownload |
267 #endif | 281 #endif |
268 | 282 |
269 TEST_F(WebEmbeddedWorkerImplTest, MAYBE_PauseAfterDownload) { | 283 TEST_F(WebEmbeddedWorkerImplTest, MAYBE_PauseAfterDownload) { |
270 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); | 284 EXPECT_CALL(*mock_client_, WorkerReadyForInspection()).Times(1); |
271 start_data_.pause_after_download_mode = | 285 start_data_.pause_after_download_mode = |
272 WebEmbeddedWorkerStartData::kPauseAfterDownload; | 286 WebEmbeddedWorkerStartData::kPauseAfterDownload; |
273 worker_->StartWorkerContext(start_data_); | 287 worker_->StartWorkerContext(start_data_); |
274 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 288 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
275 | 289 |
276 // Load the shadow page. | 290 // Load the shadow page. |
277 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProvider()) | 291 EXPECT_CALL(*mock_client_, CreateServiceWorkerNetworkProviderProxy()) |
278 .WillOnce(::testing::Return(nullptr)); | 292 .WillOnce(::testing::Return(nullptr)); |
279 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 293 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
280 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 294 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
281 | 295 |
282 // Load the script. | 296 // Load the script. |
283 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(1); | 297 EXPECT_CALL(*mock_client_, WorkerScriptLoaded()).Times(1); |
284 EXPECT_CALL(*mock_client_, CreateServiceWorkerProvider()).Times(0); | 298 EXPECT_CALL(*mock_client_, CreateServiceWorkerProviderProxy()).Times(0); |
285 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); | 299 Platform::Current()->GetURLLoaderMockFactory()->ServeAsynchronousRequests(); |
286 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 300 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
287 | 301 |
288 // Resume after download. | 302 // Resume after download. |
289 EXPECT_CALL(*mock_client_, CreateServiceWorkerProvider()) | 303 EXPECT_CALL(*mock_client_, CreateServiceWorkerProviderProxy()) |
290 .WillOnce(::testing::Return(nullptr)); | 304 .WillOnce(::testing::Return(nullptr)); |
291 worker_->ResumeAfterDownload(); | 305 worker_->ResumeAfterDownload(); |
292 ::testing::Mock::VerifyAndClearExpectations(mock_client_); | 306 ::testing::Mock::VerifyAndClearExpectations(mock_client_); |
293 } | 307 } |
294 | 308 |
295 } // namespace blink | 309 } // namespace blink |
OLD | NEW |