Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 21 matching lines...) Expand all Loading... | |
| 32 | 32 |
| 33 #define IPC_MESSAGE_IMPL | 33 #define IPC_MESSAGE_IMPL |
| 34 #include "ipc/ipc_message_macros.h" | 34 #include "ipc/ipc_message_macros.h" |
| 35 | 35 |
| 36 #define IPC_MESSAGE_START TestMsgStart | 36 #define IPC_MESSAGE_START TestMsgStart |
| 37 | 37 |
| 38 IPC_MESSAGE_CONTROL0(TestMsg_Message) | 38 IPC_MESSAGE_CONTROL0(TestMsg_Message) |
| 39 IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int) | 39 IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int) |
| 40 | 40 |
| 41 IPC_MESSAGE_CONTROL1(TestMsg_TestEvent, int) | 41 IPC_MESSAGE_CONTROL1(TestMsg_TestEvent, int) |
| 42 IPC_MESSAGE_CONTROL2(TestMsg_TestEvent_Multiple, int, int) | 42 IPC_MESSAGE_CONTROL2(TestMsg_TestEvent_Multiple, int, int) |
|
leonhsl(Using Gerrit)
2017/04/25 06:53:27
Remove useless messages.
xiaofengzhang
2017/04/25 07:18:15
Acknowledged.
| |
| 43 IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string) | 43 IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string) |
| 44 | 44 |
| 45 // --------------------------------------------------------------------------- | 45 // --------------------------------------------------------------------------- |
| 46 | 46 |
| 47 namespace content { | 47 namespace content { |
| 48 | 48 |
| 49 namespace { | 49 namespace { |
| 50 | 50 |
| 51 class MessageReceiver : public EmbeddedWorkerTestHelper { | 51 class MessageReceiver : public EmbeddedWorkerTestHelper { |
| 52 public: | 52 public: |
| 53 MessageReceiver() | 53 MessageReceiver() : EmbeddedWorkerTestHelper(base::FilePath()) {} |
| 54 : EmbeddedWorkerTestHelper(base::FilePath()), | |
| 55 current_embedded_worker_id_(0) {} | |
| 56 ~MessageReceiver() override {} | 54 ~MessageReceiver() override {} |
| 57 | 55 |
| 58 bool OnMessageToWorker(int thread_id, | |
| 59 int embedded_worker_id, | |
| 60 const IPC::Message& message) override { | |
| 61 if (EmbeddedWorkerTestHelper::OnMessageToWorker( | |
| 62 thread_id, embedded_worker_id, message)) { | |
| 63 return true; | |
| 64 } | |
| 65 current_embedded_worker_id_ = embedded_worker_id; | |
| 66 bool handled = true; | |
| 67 IPC_BEGIN_MESSAGE_MAP(MessageReceiver, message) | |
| 68 IPC_MESSAGE_HANDLER(TestMsg_Message, OnMessage) | |
| 69 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 70 IPC_END_MESSAGE_MAP() | |
| 71 return handled; | |
| 72 } | |
| 73 | |
| 74 void SimulateSendValueToBrowser(int embedded_worker_id, int value) { | 56 void SimulateSendValueToBrowser(int embedded_worker_id, int value) { |
| 75 SimulateSend(new TestMsg_MessageFromWorker(embedded_worker_id, value)); | 57 SimulateSend(new TestMsg_MessageFromWorker(embedded_worker_id, value)); |
| 76 } | 58 } |
| 77 | 59 |
| 78 void SimulateSendEventResult(int embedded_worker_id, | 60 void SimulateSendEventResult(int embedded_worker_id, |
| 79 int request_id, | 61 int request_id, |
| 80 const std::string& reply) { | 62 const std::string& reply) { |
| 81 SimulateSend( | 63 SimulateSend( |
| 82 new TestMsg_TestEventResult(embedded_worker_id, request_id, reply)); | 64 new TestMsg_TestEventResult(embedded_worker_id, request_id, reply)); |
| 83 } | 65 } |
| 84 | 66 |
| 85 private: | 67 private: |
| 86 void OnMessage() { | 68 void OnMessage() { |
| 87 // Do nothing. | 69 // Do nothing. |
| 88 } | 70 } |
| 89 | 71 |
| 90 int current_embedded_worker_id_; | |
| 91 DISALLOW_COPY_AND_ASSIGN(MessageReceiver); | 72 DISALLOW_COPY_AND_ASSIGN(MessageReceiver); |
| 92 }; | 73 }; |
| 93 | 74 |
| 94 void VerifyCalled(bool* called) { | 75 void VerifyCalled(bool* called) { |
| 95 *called = true; | 76 *called = true; |
| 96 } | 77 } |
| 97 | 78 |
| 98 void ObserveStatusChanges(ServiceWorkerVersion* version, | 79 void ObserveStatusChanges(ServiceWorkerVersion* version, |
| 99 std::vector<ServiceWorkerVersion::Status>* statuses) { | 80 std::vector<ServiceWorkerVersion::Status>* statuses) { |
| 100 statuses->push_back(version->status()); | 81 statuses->push_back(version->status()); |
| (...skipping 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1249 std::vector<GURL> valid_scopes; | 1230 std::vector<GURL> valid_scopes; |
| 1250 valid_scopes.push_back(valid_scope_1); | 1231 valid_scopes.push_back(valid_scope_1); |
| 1251 valid_scopes.push_back(valid_scope_2); | 1232 valid_scopes.push_back(valid_scope_2); |
| 1252 | 1233 |
| 1253 std::vector<url::Origin> all_origins; | 1234 std::vector<url::Origin> all_origins; |
| 1254 url::Origin valid_origin(GURL("https://chromium.org/")); | 1235 url::Origin valid_origin(GURL("https://chromium.org/")); |
| 1255 std::vector<url::Origin> valid_origin_list(1, valid_origin); | 1236 std::vector<url::Origin> valid_origin_list(1, valid_origin); |
| 1256 | 1237 |
| 1257 // Invalid subscope, should kill worker (but in tests will only increase bad | 1238 // Invalid subscope, should kill worker (but in tests will only increase bad |
| 1258 // message count). | 1239 // message count). |
| 1259 version_->OnRegisterForeignFetchScopes(std::vector<GURL>(1, GURL()), | 1240 version_->RegisterForeignFetchScopes(std::vector<GURL>(1, GURL()), |
| 1260 valid_origin_list); | 1241 valid_origin_list); |
| 1261 base::RunLoop().RunUntilIdle(); | 1242 base::RunLoop().RunUntilIdle(); |
| 1262 EXPECT_EQ(1, helper_->mock_render_process_host()->bad_msg_count()); | 1243 EXPECT_EQ(1, helper_->mock_render_process_host()->bad_msg_count()); |
| 1263 EXPECT_EQ(0u, version_->foreign_fetch_scopes_.size()); | 1244 EXPECT_EQ(0u, version_->foreign_fetch_scopes_.size()); |
| 1264 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); | 1245 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); |
| 1265 | 1246 |
| 1266 // Subscope outside the scope of the worker. | 1247 // Subscope outside the scope of the worker. |
| 1267 version_->OnRegisterForeignFetchScopes( | 1248 version_->RegisterForeignFetchScopes( |
| 1268 std::vector<GURL>(1, GURL("http://www.example.com/wrong")), | 1249 std::vector<GURL>(1, GURL("http://www.example.com/wrong")), |
| 1269 valid_origin_list); | 1250 valid_origin_list); |
| 1270 base::RunLoop().RunUntilIdle(); | 1251 base::RunLoop().RunUntilIdle(); |
| 1271 EXPECT_EQ(2, helper_->mock_render_process_host()->bad_msg_count()); | 1252 EXPECT_EQ(2, helper_->mock_render_process_host()->bad_msg_count()); |
| 1272 EXPECT_EQ(0u, version_->foreign_fetch_scopes_.size()); | 1253 EXPECT_EQ(0u, version_->foreign_fetch_scopes_.size()); |
| 1273 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); | 1254 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); |
| 1274 | 1255 |
| 1275 // Subscope on wrong origin. | 1256 // Subscope on wrong origin. |
| 1276 version_->OnRegisterForeignFetchScopes( | 1257 version_->RegisterForeignFetchScopes( |
| 1277 std::vector<GURL>(1, GURL("http://example.com/test/")), | 1258 std::vector<GURL>(1, GURL("http://example.com/test/")), |
| 1278 valid_origin_list); | 1259 valid_origin_list); |
| 1279 base::RunLoop().RunUntilIdle(); | 1260 base::RunLoop().RunUntilIdle(); |
| 1280 EXPECT_EQ(3, helper_->mock_render_process_host()->bad_msg_count()); | 1261 EXPECT_EQ(3, helper_->mock_render_process_host()->bad_msg_count()); |
| 1281 EXPECT_EQ(0u, version_->foreign_fetch_scopes_.size()); | 1262 EXPECT_EQ(0u, version_->foreign_fetch_scopes_.size()); |
| 1282 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); | 1263 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); |
| 1283 | 1264 |
| 1284 // Invalid origin. | 1265 // Invalid origin. |
| 1285 version_->OnRegisterForeignFetchScopes( | 1266 version_->RegisterForeignFetchScopes( |
| 1286 valid_scopes, std::vector<url::Origin>(1, url::Origin())); | 1267 valid_scopes, std::vector<url::Origin>(1, url::Origin())); |
| 1287 base::RunLoop().RunUntilIdle(); | 1268 base::RunLoop().RunUntilIdle(); |
| 1288 EXPECT_EQ(4, helper_->mock_render_process_host()->bad_msg_count()); | 1269 EXPECT_EQ(4, helper_->mock_render_process_host()->bad_msg_count()); |
| 1289 EXPECT_EQ(0u, version_->foreign_fetch_scopes_.size()); | 1270 EXPECT_EQ(0u, version_->foreign_fetch_scopes_.size()); |
| 1290 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); | 1271 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); |
| 1291 | 1272 |
| 1292 // Valid subscope, no origins. | 1273 // Valid subscope, no origins. |
| 1293 version_->OnRegisterForeignFetchScopes(std::vector<GURL>(1, valid_scope_1), | 1274 version_->RegisterForeignFetchScopes(std::vector<GURL>(1, valid_scope_1), |
| 1294 all_origins); | 1275 all_origins); |
| 1295 base::RunLoop().RunUntilIdle(); | 1276 base::RunLoop().RunUntilIdle(); |
| 1296 EXPECT_EQ(4, helper_->mock_render_process_host()->bad_msg_count()); | 1277 EXPECT_EQ(4, helper_->mock_render_process_host()->bad_msg_count()); |
| 1297 EXPECT_EQ(1u, version_->foreign_fetch_scopes_.size()); | 1278 EXPECT_EQ(1u, version_->foreign_fetch_scopes_.size()); |
| 1298 EXPECT_EQ(valid_scope_1, version_->foreign_fetch_scopes_[0]); | 1279 EXPECT_EQ(valid_scope_1, version_->foreign_fetch_scopes_[0]); |
| 1299 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); | 1280 EXPECT_EQ(0u, version_->foreign_fetch_origins_.size()); |
| 1300 | 1281 |
| 1301 // Valid subscope, explicit origins. | 1282 // Valid subscope, explicit origins. |
| 1302 version_->OnRegisterForeignFetchScopes(valid_scopes, valid_origin_list); | 1283 version_->RegisterForeignFetchScopes(valid_scopes, valid_origin_list); |
| 1303 base::RunLoop().RunUntilIdle(); | 1284 base::RunLoop().RunUntilIdle(); |
| 1304 EXPECT_EQ(4, helper_->mock_render_process_host()->bad_msg_count()); | 1285 EXPECT_EQ(4, helper_->mock_render_process_host()->bad_msg_count()); |
| 1305 EXPECT_EQ(2u, version_->foreign_fetch_scopes_.size()); | 1286 EXPECT_EQ(2u, version_->foreign_fetch_scopes_.size()); |
| 1306 EXPECT_EQ(valid_scope_1, version_->foreign_fetch_scopes_[0]); | 1287 EXPECT_EQ(valid_scope_1, version_->foreign_fetch_scopes_[0]); |
| 1307 EXPECT_EQ(valid_scope_2, version_->foreign_fetch_scopes_[1]); | 1288 EXPECT_EQ(valid_scope_2, version_->foreign_fetch_scopes_[1]); |
| 1308 EXPECT_EQ(1u, version_->foreign_fetch_origins_.size()); | 1289 EXPECT_EQ(1u, version_->foreign_fetch_origins_.size()); |
| 1309 EXPECT_EQ(valid_origin, version_->foreign_fetch_origins_[0]); | 1290 EXPECT_EQ(valid_origin, version_->foreign_fetch_origins_[0]); |
| 1310 } | 1291 } |
| 1311 | 1292 |
| 1312 TEST_F(ServiceWorkerVersionTest, RendererCrashDuringEvent) { | 1293 TEST_F(ServiceWorkerVersionTest, RendererCrashDuringEvent) { |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 1334 | 1315 |
| 1335 // Callback completed. | 1316 // Callback completed. |
| 1336 EXPECT_EQ(SERVICE_WORKER_ERROR_FAILED, status); | 1317 EXPECT_EQ(SERVICE_WORKER_ERROR_FAILED, status); |
| 1337 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); | 1318 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); |
| 1338 | 1319 |
| 1339 // Request already failed, calling finsh should return false. | 1320 // Request already failed, calling finsh should return false. |
| 1340 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, | 1321 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, |
| 1341 base::Time::Now())); | 1322 base::Time::Now())); |
| 1342 } | 1323 } |
| 1343 | 1324 |
| 1344 TEST_F(ServiceWorkerVersionTest, DispatchEvent) { | 1325 TEST_F(ServiceWorkerVersionTest, RegisterRequestCallback) { |
| 1345 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | 1326 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| 1346 | 1327 |
| 1347 // Activate and start worker. | 1328 // Activate and start worker. |
| 1348 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | 1329 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| 1349 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, | 1330 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, |
| 1350 CreateReceiverOnCurrentThread(&status)); | 1331 CreateReceiverOnCurrentThread(&status)); |
| 1351 base::RunLoop().RunUntilIdle(); | 1332 base::RunLoop().RunUntilIdle(); |
| 1352 EXPECT_EQ(SERVICE_WORKER_OK, status); | 1333 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 1353 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | 1334 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); |
| 1354 | 1335 |
| 1355 // Start request and dispatch test event. | 1336 // Start request and dispatch test event. |
| 1356 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); | 1337 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); |
| 1357 int request_id = version_->StartRequest( | 1338 int request_id = version_->StartRequest( |
| 1358 ServiceWorkerMetrics::EventType::SYNC, | 1339 ServiceWorkerMetrics::EventType::SYNC, |
| 1359 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); | 1340 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); |
| 1360 int received_request_id = 0; | 1341 int received_request_id = 0; |
| 1361 std::string received_data; | 1342 std::string received_data; |
| 1362 version_->RegisterRequestCallback<TestMsg_TestEventResult>( | 1343 version_->RegisterRequestCallback<TestMsg_TestEventResult>( |
| 1363 request_id, base::Bind(&ReceiveTestEventResult, &received_request_id, | 1344 request_id, base::Bind(&ReceiveTestEventResult, &received_request_id, |
| 1364 &received_data, runner->QuitClosure())); | 1345 &received_data, runner->QuitClosure())); |
| 1365 version_->DispatchEvent({request_id}, TestMsg_TestEvent(request_id)); | |
| 1366 | |
| 1367 // Verify event got dispatched to worker. | |
| 1368 base::RunLoop().RunUntilIdle(); | |
| 1369 ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count()); | |
| 1370 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0); | |
| 1371 EXPECT_EQ(TestMsg_TestEvent::ID, msg->type()); | |
| 1372 | 1346 |
| 1373 // Simulate sending reply to event. | 1347 // Simulate sending reply to event. |
| 1374 std::string reply("foobar"); | 1348 std::string reply("foobar"); |
| 1375 helper_->SimulateSendEventResult( | 1349 helper_->SimulateSendEventResult( |
| 1376 version_->embedded_worker()->embedded_worker_id(), request_id, reply); | 1350 version_->embedded_worker()->embedded_worker_id(), request_id, reply); |
| 1377 runner->Run(); | 1351 runner->Run(); |
| 1378 | 1352 |
| 1379 // Verify message callback got called with correct reply. | 1353 // Verify message callback got called with correct reply. |
| 1380 EXPECT_EQ(request_id, received_request_id); | 1354 EXPECT_EQ(request_id, received_request_id); |
| 1381 EXPECT_EQ(reply, received_data); | 1355 EXPECT_EQ(reply, received_data); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1462 // StartWorker message will be sent again because OnStopped is called before | 1436 // StartWorker message will be sent again because OnStopped is called before |
| 1463 // OnStarted. | 1437 // OnStarted. |
| 1464 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); | 1438 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); |
| 1465 base::RunLoop().RunUntilIdle(); | 1439 base::RunLoop().RunUntilIdle(); |
| 1466 | 1440 |
| 1467 EXPECT_EQ(SERVICE_WORKER_OK, status1); | 1441 EXPECT_EQ(SERVICE_WORKER_OK, status1); |
| 1468 EXPECT_EQ(SERVICE_WORKER_OK, status2); | 1442 EXPECT_EQ(SERVICE_WORKER_OK, status2); |
| 1469 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | 1443 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); |
| 1470 } | 1444 } |
| 1471 | 1445 |
| 1472 TEST_F(ServiceWorkerVersionTest, DispatchConcurrentEvent) { | |
| 1473 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value | |
| 1474 | |
| 1475 // Activate and start worker. | |
| 1476 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | |
| 1477 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, | |
| 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 first request and dispatch test event. | |
| 1484 scoped_refptr<MessageLoopRunner> runner1(new MessageLoopRunner); | |
| 1485 ServiceWorkerStatusCode status1 = SERVICE_WORKER_OK; // dummy value | |
| 1486 int request_id1 = version_->StartRequest( | |
| 1487 ServiceWorkerMetrics::EventType::SYNC, | |
| 1488 CreateReceiverOnCurrentThread(&status1, runner1->QuitClosure())); | |
| 1489 int received_request_id1 = 0; | |
| 1490 std::string received_data1; | |
| 1491 version_->RegisterRequestCallback<TestMsg_TestEventResult>( | |
| 1492 request_id1, base::Bind(&ReceiveTestEventResult, &received_request_id1, | |
| 1493 &received_data1, runner1->QuitClosure())); | |
| 1494 version_->DispatchEvent({request_id1}, TestMsg_TestEvent(request_id1)); | |
| 1495 | |
| 1496 // Start second request and dispatch test event. | |
| 1497 scoped_refptr<MessageLoopRunner> runner2(new MessageLoopRunner); | |
| 1498 ServiceWorkerStatusCode status2 = SERVICE_WORKER_OK; // dummy value | |
| 1499 int request_id2 = version_->StartRequest( | |
| 1500 ServiceWorkerMetrics::EventType::SYNC, | |
| 1501 CreateReceiverOnCurrentThread(&status2, runner2->QuitClosure())); | |
| 1502 int received_request_id2 = 0; | |
| 1503 std::string received_data2; | |
| 1504 version_->RegisterRequestCallback<TestMsg_TestEventResult>( | |
| 1505 request_id2, base::Bind(&ReceiveTestEventResult, &received_request_id2, | |
| 1506 &received_data2, runner2->QuitClosure())); | |
| 1507 version_->DispatchEvent({request_id2}, TestMsg_TestEvent(request_id2)); | |
| 1508 | |
| 1509 // Make sure events got dispatched in same order. | |
| 1510 base::RunLoop().RunUntilIdle(); | |
| 1511 ASSERT_EQ(2u, helper_->inner_ipc_sink()->message_count()); | |
| 1512 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0); | |
| 1513 ASSERT_EQ(TestMsg_TestEvent::ID, msg->type()); | |
| 1514 TestMsg_TestEvent::Param params; | |
| 1515 TestMsg_TestEvent::Read(msg, ¶ms); | |
| 1516 EXPECT_EQ(request_id1, std::get<0>(params)); | |
| 1517 msg = helper_->inner_ipc_sink()->GetMessageAt(1); | |
| 1518 ASSERT_EQ(TestMsg_TestEvent::ID, msg->type()); | |
| 1519 TestMsg_TestEvent::Read(msg, ¶ms); | |
| 1520 EXPECT_EQ(request_id2, std::get<0>(params)); | |
| 1521 | |
| 1522 // Reply to second event. | |
| 1523 std::string reply2("foobar"); | |
| 1524 helper_->SimulateSendEventResult( | |
| 1525 version_->embedded_worker()->embedded_worker_id(), request_id2, reply2); | |
| 1526 runner2->Run(); | |
| 1527 | |
| 1528 // Verify correct message callback got called with correct reply. | |
| 1529 EXPECT_EQ(0, received_request_id1); | |
| 1530 EXPECT_EQ(request_id2, received_request_id2); | |
| 1531 EXPECT_EQ(reply2, received_data2); | |
| 1532 EXPECT_EQ(SERVICE_WORKER_OK, status2); | |
| 1533 EXPECT_TRUE(version_->FinishRequest(request_id2, true /* was_handled */, | |
| 1534 base::Time::Now())); | |
| 1535 | |
| 1536 // Reply to first event. | |
| 1537 std::string reply1("hello world"); | |
| 1538 helper_->SimulateSendEventResult( | |
| 1539 version_->embedded_worker()->embedded_worker_id(), request_id1, reply1); | |
| 1540 runner1->Run(); | |
| 1541 | |
| 1542 // Verify correct response was received. | |
| 1543 EXPECT_EQ(request_id1, received_request_id1); | |
| 1544 EXPECT_EQ(request_id2, received_request_id2); | |
| 1545 EXPECT_EQ(reply1, received_data1); | |
| 1546 EXPECT_EQ(SERVICE_WORKER_OK, status1); | |
| 1547 EXPECT_TRUE(version_->FinishRequest(request_id1, true /* was_handled */, | |
| 1548 base::Time::Now())); | |
| 1549 } | |
| 1550 | |
| 1551 TEST_F(ServiceWorkerVersionTest, DispatchEvent_MultipleResponse) { | |
| 1552 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; | |
| 1553 | |
| 1554 // Activate and start worker. | |
| 1555 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); | |
| 1556 version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN, | |
| 1557 CreateReceiverOnCurrentThread(&status)); | |
| 1558 base::RunLoop().RunUntilIdle(); | |
| 1559 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
| 1560 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); | |
| 1561 | |
| 1562 // Start request and dispatch test event. | |
| 1563 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner); | |
| 1564 int request_id1 = version_->StartRequest( | |
| 1565 ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, | |
| 1566 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); | |
| 1567 int request_id2 = version_->StartRequest( | |
| 1568 ServiceWorkerMetrics::EventType::FETCH_WAITUNTIL, | |
| 1569 CreateReceiverOnCurrentThread(&status, runner->QuitClosure())); | |
| 1570 int received_request_id1 = 0; | |
| 1571 int received_request_id2 = 0; | |
| 1572 std::string received_data1; | |
| 1573 std::string received_data2; | |
| 1574 version_->RegisterRequestCallback<TestMsg_TestEventResult>( | |
| 1575 request_id1, base::Bind(&ReceiveTestEventResult, &received_request_id1, | |
| 1576 &received_data1, runner->QuitClosure())); | |
| 1577 version_->RegisterRequestCallback<TestMsg_TestEventResult>( | |
| 1578 request_id2, base::Bind(&ReceiveTestEventResult, &received_request_id2, | |
| 1579 &received_data2, runner->QuitClosure())); | |
| 1580 version_->DispatchEvent({request_id1, request_id2}, | |
| 1581 TestMsg_TestEvent_Multiple(request_id1, request_id2)); | |
| 1582 | |
| 1583 // Verify event got dispatched to worker. | |
| 1584 base::RunLoop().RunUntilIdle(); | |
| 1585 ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count()); | |
| 1586 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0); | |
| 1587 EXPECT_EQ(TestMsg_TestEvent_Multiple::ID, msg->type()); | |
| 1588 | |
| 1589 // Simulate sending reply to event. | |
| 1590 std::string reply1("foobar1"); | |
| 1591 std::string reply2("foobar2"); | |
| 1592 helper_->SimulateSendEventResult( | |
| 1593 version_->embedded_worker()->embedded_worker_id(), request_id1, reply1); | |
| 1594 runner->Run(); | |
| 1595 | |
| 1596 // Verify message callback got called with correct reply. | |
| 1597 EXPECT_EQ(request_id1, received_request_id1); | |
| 1598 EXPECT_EQ(reply1, received_data1); | |
| 1599 EXPECT_NE(request_id2, received_request_id2); | |
| 1600 EXPECT_NE(reply2, received_data2); | |
| 1601 | |
| 1602 // Simulate sending reply to event. | |
| 1603 helper_->SimulateSendEventResult( | |
| 1604 version_->embedded_worker()->embedded_worker_id(), request_id2, reply2); | |
| 1605 runner->Run(); | |
| 1606 | |
| 1607 // Verify message callback got called with correct reply. | |
| 1608 EXPECT_EQ(request_id2, received_request_id2); | |
| 1609 EXPECT_EQ(reply2, received_data2); | |
| 1610 | |
| 1611 // Should not have timed out, so error callback should not have been | |
| 1612 // called and FinishRequest should return true. | |
| 1613 EXPECT_EQ(SERVICE_WORKER_OK, status); | |
| 1614 EXPECT_TRUE(version_->FinishRequest(request_id1, true /* was_handled */, | |
| 1615 base::Time::Now())); | |
| 1616 EXPECT_TRUE(version_->FinishRequest(request_id2, true /* was_handled */, | |
| 1617 base::Time::Now())); | |
| 1618 } | |
| 1619 | |
| 1620 } // namespace content | 1446 } // namespace content |
| OLD | NEW |