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

Side by Side 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 unified diff | Download patch
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 "content/browser/service_worker/service_worker_version.h" 5 #include "content/browser/service_worker/service_worker_version.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 #include <tuple> 8 #include <tuple>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 17 matching lines...) Expand all
28 28
29 #define IPC_MESSAGE_IMPL 29 #define IPC_MESSAGE_IMPL
30 #include "ipc/ipc_message_macros.h" 30 #include "ipc/ipc_message_macros.h"
31 31
32 #define IPC_MESSAGE_START TestMsgStart 32 #define IPC_MESSAGE_START TestMsgStart
33 33
34 IPC_MESSAGE_CONTROL0(TestMsg_Message) 34 IPC_MESSAGE_CONTROL0(TestMsg_Message)
35 IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int) 35 IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int)
36 36
37 IPC_MESSAGE_CONTROL1(TestMsg_TestEvent, int) 37 IPC_MESSAGE_CONTROL1(TestMsg_TestEvent, int)
38 IPC_MESSAGE_CONTROL2(TestMsg_TestEvent_Multiple, int, int)
38 IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string) 39 IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string)
39 IPC_MESSAGE_ROUTED2(TestMsg_TestSimpleEventResult, 40 IPC_MESSAGE_ROUTED2(TestMsg_TestSimpleEventResult,
40 int, 41 int,
41 blink::WebServiceWorkerEventResult) 42 blink::WebServiceWorkerEventResult)
42 43
43 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebServiceWorkerEventResult, 44 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebServiceWorkerEventResult,
44 blink::WebServiceWorkerEventResultLast) 45 blink::WebServiceWorkerEventResultLast)
45 46
46 // --------------------------------------------------------------------------- 47 // ---------------------------------------------------------------------------
47 48
(...skipping 1176 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 EXPECT_EQ(SERVICE_WORKER_OK, status); 1225 EXPECT_EQ(SERVICE_WORKER_OK, status);
1225 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); 1226 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
1226 1227
1227 // Start request and dispatch test event. 1228 // Start request and dispatch test event.
1228 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); 1229 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner);
1229 int request_id = version_->StartRequest( 1230 int request_id = version_->StartRequest(
1230 ServiceWorkerMetrics::EventType::SYNC, 1231 ServiceWorkerMetrics::EventType::SYNC,
1231 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); 1232 CreateReceiverOnCurrentThread(&status, runner->QuitClosure()));
1232 int received_request_id = 0; 1233 int received_request_id = 0;
1233 std::string received_data; 1234 std::string received_data;
1234 version_->DispatchEvent<TestMsg_TestEventResult>( 1235 version_->RegisterRequestCallback<TestMsg_TestEventResult>(
1235 request_id, TestMsg_TestEvent(request_id), 1236 request_id, base::Bind(&ReceiveTestEventResult, &received_request_id,
1236 base::Bind(&ReceiveTestEventResult, &received_request_id, &received_data, 1237 &received_data, runner->QuitClosure()));
1237 runner->QuitClosure())); 1238 version_->DispatchEvent({request_id}, TestMsg_TestEvent(request_id));
1238 1239
1239 // Verify event got dispatched to worker. 1240 // Verify event got dispatched to worker.
1240 base::RunLoop().RunUntilIdle(); 1241 base::RunLoop().RunUntilIdle();
1241 ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count()); 1242 ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count());
1242 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0); 1243 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0);
1243 EXPECT_EQ(TestMsg_TestEvent::ID, msg->type()); 1244 EXPECT_EQ(TestMsg_TestEvent::ID, msg->type());
1244 1245
1245 // Simulate sending reply to event. 1246 // Simulate sending reply to event.
1246 std::string reply("foobar"); 1247 std::string reply("foobar");
1247 helper_->SimulateSendEventResult( 1248 helper_->SimulateSendEventResult(
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
1329 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); 1330 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
1330 1331
1331 // Start first request and dispatch test event. 1332 // Start first request and dispatch test event.
1332 scoped_refptr<MessageLoopRunner> runner1(new MessageLoopRunner); 1333 scoped_refptr<MessageLoopRunner> runner1(new MessageLoopRunner);
1333 ServiceWorkerStatusCode status1 = SERVICE_WORKER_OK; // dummy value 1334 ServiceWorkerStatusCode status1 = SERVICE_WORKER_OK; // dummy value
1334 int request_id1 = version_->StartRequest( 1335 int request_id1 = version_->StartRequest(
1335 ServiceWorkerMetrics::EventType::SYNC, 1336 ServiceWorkerMetrics::EventType::SYNC,
1336 CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure())); 1337 CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure()));
1337 int received_request_id1 = 0; 1338 int received_request_id1 = 0;
1338 std::string received_data1; 1339 std::string received_data1;
1339 version_->DispatchEvent<TestMsg_TestEventResult>( 1340 version_->RegisterRequestCallback<TestMsg_TestEventResult>(
1340 request_id1, TestMsg_TestEvent(request_id1), 1341 request_id1, base::Bind(&ReceiveTestEventResult, &received_request_id1,
1341 base::Bind(&ReceiveTestEventResult, &received_request_id1, 1342 &received_data1, runner1->QuitClosure()));
1342 &received_data1, runner1->QuitClosure())); 1343 version_->DispatchEvent({request_id1}, TestMsg_TestEvent(request_id1));
1343 1344
1344 // Start second request and dispatch test event. 1345 // Start second request and dispatch test event.
1345 scoped_refptr<MessageLoopRunner> runner2(new MessageLoopRunner); 1346 scoped_refptr<MessageLoopRunner> runner2(new MessageLoopRunner);
1346 ServiceWorkerStatusCode status2 = SERVICE_WORKER_OK; // dummy value 1347 ServiceWorkerStatusCode status2 = SERVICE_WORKER_OK; // dummy value
1347 int request_id2 = version_->StartRequest( 1348 int request_id2 = version_->StartRequest(
1348 ServiceWorkerMetrics::EventType::SYNC, 1349 ServiceWorkerMetrics::EventType::SYNC,
1349 CreateReceiverOnCurrentThread(&status2, runner2->QuitClosure())); 1350 CreateReceiverOnCurrentThread(&status2, runner2->QuitClosure()));
1350 int received_request_id2 = 0; 1351 int received_request_id2 = 0;
1351 std::string received_data2; 1352 std::string received_data2;
1352 version_->DispatchEvent<TestMsg_TestEventResult>( 1353 version_->RegisterRequestCallback<TestMsg_TestEventResult>(
1353 request_id2, TestMsg_TestEvent(request_id2), 1354 request_id2, base::Bind(&ReceiveTestEventResult, &received_request_id2,
1354 base::Bind(&ReceiveTestEventResult, &received_request_id2, 1355 &received_data2, runner2->QuitClosure()));
1355 &received_data2, runner2->QuitClosure())); 1356 version_->DispatchEvent({request_id2}, TestMsg_TestEvent(request_id2));
1356 1357
1357 // Make sure events got dispatched in same order. 1358 // Make sure events got dispatched in same order.
1358 base::RunLoop().RunUntilIdle(); 1359 base::RunLoop().RunUntilIdle();
1359 ASSERT_EQ(2u, helper_->inner_ipc_sink()->message_count()); 1360 ASSERT_EQ(2u, helper_->inner_ipc_sink()->message_count());
1360 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0); 1361 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0);
1361 ASSERT_EQ(TestMsg_TestEvent::ID, msg->type()); 1362 ASSERT_EQ(TestMsg_TestEvent::ID, msg->type());
1362 TestMsg_TestEvent::Param params; 1363 TestMsg_TestEvent::Param params;
1363 TestMsg_TestEvent::Read(msg, &params); 1364 TestMsg_TestEvent::Read(msg, &params);
1364 EXPECT_EQ(request_id1, std::get<0>(params)); 1365 EXPECT_EQ(request_id1, std::get<0>(params));
1365 msg = helper_->inner_ipc_sink()->GetMessageAt(1); 1366 msg = helper_->inner_ipc_sink()->GetMessageAt(1);
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
1461 // Simulate sending reply to event. 1462 // Simulate sending reply to event.
1462 helper_->SimulateSendSimpleEventResult( 1463 helper_->SimulateSendSimpleEventResult(
1463 version_->embedded_worker()->embedded_worker_id(), request_id, 1464 version_->embedded_worker()->embedded_worker_id(), request_id,
1464 blink::WebServiceWorkerEventResultRejected); 1465 blink::WebServiceWorkerEventResultRejected);
1465 runner->Run(); 1466 runner->Run();
1466 1467
1467 // Verify callback was called with correct status. 1468 // Verify callback was called with correct status.
1468 EXPECT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status); 1469 EXPECT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status);
1469 } 1470 }
1470 1471
1472 TEST_F(ServiceWorkerVersionTest, DispatchEvent_MultipleResponse) {
1473 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.
1474
1475 // Activate and start worker.
1476 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
1477 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.
1478 CreateReceiverOnCurrentThread(&status));
1479 base::RunLoop().RunUntilIdle();
1480 EXPECT_EQ(SERVICE_WORKER_OK, status);
1481 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
1482
1483 // Start request and dispatch test event.
1484 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner);
1485 int request_id1 = version_->StartRequest(
1486 ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME,
1487 CreateReceiverOnCurrentThread(&status, runner->QuitClosure()));
1488 int request_id2 = version_->StartRequest(
1489 ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL,
1490 CreateReceiverOnCurrentThread(&status, runner->QuitClosure()));
1491 int received_request_id1 = 0;
1492 int received_request_id2 = 0;
1493 std::string received_data1;
1494 std::string received_data2;
1495 version_->RegisterRequestCallback<TestMsg_TestEventResult>(
1496 request_id1, base::Bind(&ReceiveTestEventResult, &received_request_id1,
1497 &received_data1, runner->QuitClosure()));
1498 version_->RegisterRequestCallback<TestMsg_TestEventResult>(
1499 request_id2, base::Bind(&ReceiveTestEventResult, &received_request_id2,
1500 &received_data2, runner->QuitClosure()));
1501 version_->DispatchEvent({request_id1, request_id2},
1502 TestMsg_TestEvent_Multiple(request_id1, request_id2));
1503
1504 // Verify event got dispatched to worker.
1505 base::RunLoop().RunUntilIdle();
1506 ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count());
1507 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0);
1508 EXPECT_EQ(TestMsg_TestEvent_Multiple::ID, msg->type());
1509
1510 // Simulate sending reply to event.
1511 std::string reply1("foobar1");
1512 std::string reply2("foobar2");
1513 helper_->SimulateSendEventResult(
1514 version_->embedded_worker()->embedded_worker_id(), request_id1, reply1);
1515 runner->Run();
1516
1517 // Verify message callback got called with correct reply.
1518 EXPECT_EQ(request_id1, received_request_id1);
1519 EXPECT_EQ(reply1, received_data1);
1520 EXPECT_NE(request_id2, received_request_id2);
1521 EXPECT_NE(reply2, received_data2);
1522
1523 // Simulate sending reply to event.
1524 helper_->SimulateSendEventResult(
1525 version_->embedded_worker()->embedded_worker_id(), request_id2, reply2);
1526 runner->Run();
1527
1528 // Verify message callback got called with correct reply.
1529 EXPECT_EQ(request_id2, received_request_id2);
1530 EXPECT_EQ(reply2, received_data2);
1531
1532 // Should not have timed out, so error callback should not have been
1533 // called and FinishRequest should return true.
1534 EXPECT_EQ(SERVICE_WORKER_OK, status);
1535 EXPECT_TRUE(version_->FinishRequest(request_id1, true));
1536 EXPECT_TRUE(version_->FinishRequest(request_id2, true));
falken 2016/06/16 06:23:11 Nice test!
shimazu 2016/06/21 02:43:38 Thanks!
1537 }
1538
1471 } // namespace content 1539 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698