Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(271)

Side by Side Diff: content/browser/service_worker/service_worker_version_unittest.cc

Issue 739383002: Don't drop messages/events send to a service worker that is stopping. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@termnate_sw
Patch Set: address nit Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « content/browser/service_worker/service_worker_version.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "base/basictypes.h" 5 #include "base/basictypes.h"
6 #include "base/run_loop.h" 6 #include "base/run_loop.h"
7 #include "content/browser/service_worker/embedded_worker_registry.h" 7 #include "content/browser/service_worker/embedded_worker_registry.h"
8 #include "content/browser/service_worker/embedded_worker_test_helper.h" 8 #include "content/browser/service_worker/embedded_worker_test_helper.h"
9 #include "content/browser/service_worker/service_worker_context_core.h" 9 #include "content/browser/service_worker/service_worker_context_core.h"
10 #include "content/browser/service_worker/service_worker_registration.h" 10 #include "content/browser/service_worker/service_worker_registration.h"
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 // A specialized listener class to receive test messages from a worker. 81 // A specialized listener class to receive test messages from a worker.
82 class MessageReceiverFromWorker : public EmbeddedWorkerInstance::Listener { 82 class MessageReceiverFromWorker : public EmbeddedWorkerInstance::Listener {
83 public: 83 public:
84 explicit MessageReceiverFromWorker(EmbeddedWorkerInstance* instance) 84 explicit MessageReceiverFromWorker(EmbeddedWorkerInstance* instance)
85 : instance_(instance) { 85 : instance_(instance) {
86 instance_->AddListener(this); 86 instance_->AddListener(this);
87 } 87 }
88 ~MessageReceiverFromWorker() override { instance_->RemoveListener(this); } 88 ~MessageReceiverFromWorker() override { instance_->RemoveListener(this); }
89 89
90 void OnStarted() override { NOTREACHED(); } 90 void OnStarted() override { NOTREACHED(); }
91 void OnStopped() override { NOTREACHED(); } 91 void OnStopped(EmbeddedWorkerInstance::Status old_status) override {
92 NOTREACHED();
93 }
92 bool OnMessageReceived(const IPC::Message& message) override { 94 bool OnMessageReceived(const IPC::Message& message) override {
93 bool handled = true; 95 bool handled = true;
94 IPC_BEGIN_MESSAGE_MAP(MessageReceiverFromWorker, message) 96 IPC_BEGIN_MESSAGE_MAP(MessageReceiverFromWorker, message)
95 IPC_MESSAGE_HANDLER(TestMsg_MessageFromWorker, OnMessageFromWorker) 97 IPC_MESSAGE_HANDLER(TestMsg_MessageFromWorker, OnMessageFromWorker)
96 IPC_MESSAGE_UNHANDLED(handled = false) 98 IPC_MESSAGE_UNHANDLED(handled = false)
97 IPC_END_MESSAGE_MAP() 99 IPC_END_MESSAGE_MAP()
98 return handled; 100 return handled;
99 } 101 }
100 102
101 void OnMessageFromWorker(int value) { received_values_.push_back(value); } 103 void OnMessageFromWorker(int value) { received_values_.push_back(value); }
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 base::RunLoop().RunUntilIdle(); 204 base::RunLoop().RunUntilIdle();
203 205
204 // All should just succeed. 206 // All should just succeed.
205 EXPECT_EQ(SERVICE_WORKER_OK, status1); 207 EXPECT_EQ(SERVICE_WORKER_OK, status1);
206 EXPECT_EQ(SERVICE_WORKER_OK, status2); 208 EXPECT_EQ(SERVICE_WORKER_OK, status2);
207 EXPECT_EQ(SERVICE_WORKER_OK, status3); 209 EXPECT_EQ(SERVICE_WORKER_OK, status3);
208 210
209 // Call StopWorker() multiple times. 211 // Call StopWorker() multiple times.
210 status1 = SERVICE_WORKER_ERROR_FAILED; 212 status1 = SERVICE_WORKER_ERROR_FAILED;
211 status2 = SERVICE_WORKER_ERROR_FAILED; 213 status2 = SERVICE_WORKER_ERROR_FAILED;
212 status3 = SERVICE_WORKER_ERROR_FAILED;
213 version_->StopWorker(CreateReceiverOnCurrentThread(&status1)); 214 version_->StopWorker(CreateReceiverOnCurrentThread(&status1));
214 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); 215 version_->StopWorker(CreateReceiverOnCurrentThread(&status2));
215 216
216 // Also try calling StartWorker while StopWorker is in queue.
217 version_->StartWorker(CreateReceiverOnCurrentThread(&status3));
218
219 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status()); 217 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status());
220 base::RunLoop().RunUntilIdle(); 218 base::RunLoop().RunUntilIdle();
221 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); 219 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status());
222 220
223 // All StopWorker should just succeed, while StartWorker fails. 221 // All StopWorker should just succeed.
224 EXPECT_EQ(SERVICE_WORKER_OK, status1); 222 EXPECT_EQ(SERVICE_WORKER_OK, status1);
225 EXPECT_EQ(SERVICE_WORKER_OK, status2); 223 EXPECT_EQ(SERVICE_WORKER_OK, status2);
226 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status3); 224
225 // Start worker again.
226 status1 = SERVICE_WORKER_ERROR_FAILED;
227 status2 = SERVICE_WORKER_ERROR_FAILED;
228 status3 = SERVICE_WORKER_ERROR_FAILED;
229
230 version_->StartWorker(CreateReceiverOnCurrentThread(&status1));
231
232 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status());
233 base::RunLoop().RunUntilIdle();
234 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
235
236 // Call StopWorker()
237 status2 = SERVICE_WORKER_ERROR_FAILED;
238 version_->StopWorker(CreateReceiverOnCurrentThread(&status2));
239
240 // And try calling StartWorker while StopWorker is in queue.
241 version_->StartWorker(CreateReceiverOnCurrentThread(&status3));
242
243 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status());
244 base::RunLoop().RunUntilIdle();
245 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
246
247 // All should just succeed.
248 EXPECT_EQ(SERVICE_WORKER_OK, status1);
249 EXPECT_EQ(SERVICE_WORKER_OK, status2);
250 EXPECT_EQ(SERVICE_WORKER_OK, status3);
227 } 251 }
228 252
229 TEST_F(ServiceWorkerVersionTest, SendMessage) { 253 TEST_F(ServiceWorkerVersionTest, SendMessage) {
230 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); 254 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status());
231 255
232 // Send a message without starting the worker. 256 // Send a message without starting the worker.
233 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; 257 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
234 version_->SendMessage(TestMsg_Message(), 258 version_->SendMessage(TestMsg_Message(),
235 CreateReceiverOnCurrentThread(&status)); 259 CreateReceiverOnCurrentThread(&status));
236 base::RunLoop().RunUntilIdle(); 260 base::RunLoop().RunUntilIdle();
237 EXPECT_EQ(SERVICE_WORKER_OK, status); 261 EXPECT_EQ(SERVICE_WORKER_OK, status);
238 262
239 // The worker should be now started. 263 // The worker should be now started.
240 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); 264 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
241 265
242 // Stop the worker, and then send the message immediately. 266 // Stop the worker, and then send the message immediately.
243 ServiceWorkerStatusCode msg_status = SERVICE_WORKER_ERROR_FAILED; 267 ServiceWorkerStatusCode msg_status = SERVICE_WORKER_ERROR_FAILED;
244 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED; 268 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED;
245 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status)); 269 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status));
246 version_->SendMessage(TestMsg_Message(), 270 version_->SendMessage(TestMsg_Message(),
247 CreateReceiverOnCurrentThread(&msg_status)); 271 CreateReceiverOnCurrentThread(&msg_status));
248 base::RunLoop().RunUntilIdle(); 272 base::RunLoop().RunUntilIdle();
249 EXPECT_EQ(SERVICE_WORKER_OK, stop_status); 273 EXPECT_EQ(SERVICE_WORKER_OK, stop_status);
250 274
251 // SendMessage should return START_WORKER_FAILED error since it tried to 275 // SendMessage should return SERVICE_WORKER_OK since the worker should have
252 // start a worker while it was stopping. 276 // been restarted to deliver the message.
253 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, msg_status); 277 EXPECT_EQ(SERVICE_WORKER_OK, msg_status);
254 }
255 278
256 TEST_F(ServiceWorkerVersionTest, ReSendMessageAfterStop) { 279 // The worker should be now started again.
257 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status());
258
259 // Start the worker.
260 ServiceWorkerStatusCode start_status = SERVICE_WORKER_ERROR_FAILED;
261 version_->StartWorker(CreateReceiverOnCurrentThread(&start_status));
262 base::RunLoop().RunUntilIdle();
263 EXPECT_EQ(SERVICE_WORKER_OK, start_status);
264 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
265
266 // Stop the worker, and then send the message immediately.
267 ServiceWorkerStatusCode msg_status = SERVICE_WORKER_ERROR_FAILED;
268 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED;
269 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status));
270 version_->SendMessage(TestMsg_Message(),
271 CreateReceiverOnCurrentThread(&msg_status));
272 base::RunLoop().RunUntilIdle();
273 EXPECT_EQ(SERVICE_WORKER_OK, stop_status);
274
275 // SendMessage should return START_WORKER_FAILED error since it tried to
276 // start a worker while it was stopping.
277 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, msg_status);
278
279 // Resend the message, which should succeed and restart the worker.
280 version_->SendMessage(TestMsg_Message(),
281 CreateReceiverOnCurrentThread(&msg_status));
282 base::RunLoop().RunUntilIdle();
283 EXPECT_EQ(SERVICE_WORKER_OK, msg_status);
284 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); 280 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
285 } 281 }
286 282
287 TEST_F(ServiceWorkerVersionTest, ReceiveMessageFromWorker) { 283 TEST_F(ServiceWorkerVersionTest, ReceiveMessageFromWorker) {
288 MessageReceiverFromWorker receiver(version_->embedded_worker()); 284 MessageReceiverFromWorker receiver(version_->embedded_worker());
289 285
290 // Simulate sending some dummy values from the worker. 286 // Simulate sending some dummy values from the worker.
291 helper_->SimulateSendValueToBrowser( 287 helper_->SimulateSendValueToBrowser(
292 version_->embedded_worker()->embedded_worker_id(), 555); 288 version_->embedded_worker()->embedded_worker_id(), 555);
293 helper_->SimulateSendValueToBrowser( 289 helper_->SimulateSendValueToBrowser(
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 helper_->context()->embedded_worker_registry()->RemoveChildProcessSender( 442 helper_->context()->embedded_worker_registry()->RemoveChildProcessSender(
447 process_id); 443 process_id);
448 base::RunLoop().RunUntilIdle(); 444 base::RunLoop().RunUntilIdle();
449 445
450 // Callback completed. 446 // Callback completed.
451 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status); 447 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status);
452 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); 448 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status());
453 } 449 }
454 450
455 } // namespace content 451 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/service_worker/service_worker_version.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698