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

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

Powered by Google App Engine
This is Rietveld 408576698