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

Unified Diff: content/browser/service_worker/service_worker_version_unittest.cc

Issue 2034663002: ServiceWorker: Keep the worker alive until FetchEvent.waitUntil settles (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase Created 4 years, 6 months 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 side-by-side diff with in-line comments
Download patch
Index: content/browser/service_worker/service_worker_version_unittest.cc
diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc
index 3240d541fae42dd4328195e819268a089a1e0b2f..ef98d79c96c910b4e513c9d30d260777b3f7efe3 100644
--- a/content/browser/service_worker/service_worker_version_unittest.cc
+++ b/content/browser/service_worker/service_worker_version_unittest.cc
@@ -35,6 +35,7 @@ IPC_MESSAGE_CONTROL0(TestMsg_Message)
IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int)
IPC_MESSAGE_CONTROL1(TestMsg_TestEvent, int)
+IPC_MESSAGE_CONTROL2(TestMsg_TestEvent_Multiple, int, int)
IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string)
IPC_MESSAGE_ROUTED2(TestMsg_TestSimpleEventResult,
int,
@@ -1231,10 +1232,10 @@ TEST_F(ServiceWorkerVersionTest, DispatchEvent) {
CreateReceiverOnCurrentThread(&status, runner->QuitClosure()));
int received_request_id = 0;
std::string received_data;
- version_->DispatchEvent<TestMsg_TestEventResult>(
- request_id, TestMsg_TestEvent(request_id),
- base::Bind(&ReceiveTestEventResult, &received_request_id, &received_data,
- runner->QuitClosure()));
+ version_->RegisterRequestCallback<TestMsg_TestEventResult>(
+ request_id, base::Bind(&ReceiveTestEventResult, &received_request_id,
+ &received_data, runner->QuitClosure()));
+ version_->DispatchEvent({request_id}, TestMsg_TestEvent(request_id));
// Verify event got dispatched to worker.
base::RunLoop().RunUntilIdle();
@@ -1336,10 +1337,10 @@ TEST_F(ServiceWorkerVersionTest, DispatchConcurrentEvent) {
CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure()));
int received_request_id1 = 0;
std::string received_data1;
- version_->DispatchEvent<TestMsg_TestEventResult>(
- request_id1, TestMsg_TestEvent(request_id1),
- base::Bind(&ReceiveTestEventResult, &received_request_id1,
- &received_data1, runner1->QuitClosure()));
+ version_->RegisterRequestCallback<TestMsg_TestEventResult>(
+ request_id1, base::Bind(&ReceiveTestEventResult, &received_request_id1,
+ &received_data1, runner1->QuitClosure()));
+ version_->DispatchEvent({request_id1}, TestMsg_TestEvent(request_id1));
// Start second request and dispatch test event.
scoped_refptr<MessageLoopRunner> runner2(new MessageLoopRunner);
@@ -1349,10 +1350,10 @@ TEST_F(ServiceWorkerVersionTest, DispatchConcurrentEvent) {
CreateReceiverOnCurrentThread(&status2, runner2->QuitClosure()));
int received_request_id2 = 0;
std::string received_data2;
- version_->DispatchEvent<TestMsg_TestEventResult>(
- request_id2, TestMsg_TestEvent(request_id2),
- base::Bind(&ReceiveTestEventResult, &received_request_id2,
- &received_data2, runner2->QuitClosure()));
+ version_->RegisterRequestCallback<TestMsg_TestEventResult>(
+ request_id2, base::Bind(&ReceiveTestEventResult, &received_request_id2,
+ &received_data2, runner2->QuitClosure()));
+ version_->DispatchEvent({request_id2}, TestMsg_TestEvent(request_id2));
// Make sure events got dispatched in same order.
base::RunLoop().RunUntilIdle();
@@ -1468,4 +1469,71 @@ TEST_F(ServiceWorkerVersionTest, DispatchSimpleEvent_Rejected) {
EXPECT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status);
}
+TEST_F(ServiceWorkerVersionTest, DispatchEvent_MultipleResponse) {
+ ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy
falken 2016/06/16 06:23:10 Lately it's common to use status = SERVICE_WORKER_
shimazu 2016/06/21 02:43:38 Done.
+
+ // Activate and start worker.
+ version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
+ version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC,
falken 2016/06/16 06:23:11 nit: I'd use UNKNOWN for a dummy event type.
shimazu 2016/06/21 02:43:38 Done.
+ CreateReceiverOnCurrentThread(&status));
+ base::RunLoop().RunUntilIdle();
+ EXPECT_EQ(SERVICE_WORKER_OK, status);
+ EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
+
+ // Start request and dispatch test event.
+ scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner);
+ int request_id1 = version_->StartRequest(
+ ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME,
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure()));
+ int request_id2 = version_->StartRequest(
+ ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL,
+ CreateReceiverOnCurrentThread(&status, runner->QuitClosure()));
+ int received_request_id1 = 0;
+ int received_request_id2 = 0;
+ std::string received_data1;
+ std::string received_data2;
+ version_->RegisterRequestCallback<TestMsg_TestEventResult>(
+ request_id1, base::Bind(&ReceiveTestEventResult, &received_request_id1,
+ &received_data1, runner->QuitClosure()));
+ version_->RegisterRequestCallback<TestMsg_TestEventResult>(
+ request_id2, base::Bind(&ReceiveTestEventResult, &received_request_id2,
+ &received_data2, runner->QuitClosure()));
+ version_->DispatchEvent({request_id1, request_id2},
+ TestMsg_TestEvent_Multiple(request_id1, request_id2));
+
+ // Verify event got dispatched to worker.
+ base::RunLoop().RunUntilIdle();
+ ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count());
+ const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0);
+ EXPECT_EQ(TestMsg_TestEvent_Multiple::ID, msg->type());
+
+ // Simulate sending reply to event.
+ std::string reply1("foobar1");
+ std::string reply2("foobar2");
+ helper_->SimulateSendEventResult(
+ version_->embedded_worker()->embedded_worker_id(), request_id1, reply1);
+ runner->Run();
+
+ // Verify message callback got called with correct reply.
+ EXPECT_EQ(request_id1, received_request_id1);
+ EXPECT_EQ(reply1, received_data1);
+ EXPECT_NE(request_id2, received_request_id2);
+ EXPECT_NE(reply2, received_data2);
+
+ // Simulate sending reply to event.
+ helper_->SimulateSendEventResult(
+ version_->embedded_worker()->embedded_worker_id(), request_id2, reply2);
+ runner->Run();
+
+ // Verify message callback got called with correct reply.
+ EXPECT_EQ(request_id2, received_request_id2);
+ EXPECT_EQ(reply2, received_data2);
+
+ // Should not have timed out, so error callback should not have been
+ // called and FinishRequest should return true.
+ EXPECT_EQ(SERVICE_WORKER_OK, status);
+ EXPECT_TRUE(version_->FinishRequest(request_id1, true));
+ EXPECT_TRUE(version_->FinishRequest(request_id2, true));
falken 2016/06/16 06:23:11 Nice test!
shimazu 2016/06/21 02:43:38 Thanks!
+}
+
} // namespace content

Powered by Google App Engine
This is Rietveld 408576698