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

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

Issue 1579413004: Move push event dispatching out of ServiceWorkerVersion. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix DispatchSimpleEvent comment Created 4 years, 11 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
« 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 <stdint.h> 5 #include <stdint.h>
6 6
7 #include "base/macros.h" 7 #include "base/macros.h"
8 #include "base/run_loop.h" 8 #include "base/run_loop.h"
9 #include "content/browser/message_port_service.h" 9 #include "content/browser/message_port_service.h"
10 #include "content/browser/service_worker/embedded_worker_registry.h" 10 #include "content/browser/service_worker/embedded_worker_registry.h"
(...skipping 15 matching lines...) Expand all
26 #define IPC_MESSAGE_IMPL 26 #define IPC_MESSAGE_IMPL
27 #include "ipc/ipc_message_macros.h" 27 #include "ipc/ipc_message_macros.h"
28 28
29 #define IPC_MESSAGE_START TestMsgStart 29 #define IPC_MESSAGE_START TestMsgStart
30 30
31 IPC_MESSAGE_CONTROL0(TestMsg_Message) 31 IPC_MESSAGE_CONTROL0(TestMsg_Message)
32 IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int) 32 IPC_MESSAGE_ROUTED1(TestMsg_MessageFromWorker, int)
33 33
34 IPC_MESSAGE_CONTROL1(TestMsg_TestEvent, int) 34 IPC_MESSAGE_CONTROL1(TestMsg_TestEvent, int)
35 IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string) 35 IPC_MESSAGE_ROUTED2(TestMsg_TestEventResult, int, std::string)
36 IPC_MESSAGE_ROUTED2(TestMsg_TestSimpleEventResult,
37 int,
38 blink::WebServiceWorkerEventResult)
39
40 IPC_ENUM_TRAITS_MAX_VALUE(blink::WebServiceWorkerEventResult,
41 blink::WebServiceWorkerEventResultLast)
36 42
37 // --------------------------------------------------------------------------- 43 // ---------------------------------------------------------------------------
38 44
39 namespace content { 45 namespace content {
40 46
41 namespace { 47 namespace {
42 48
43 class MessageReceiver : public EmbeddedWorkerTestHelper { 49 class MessageReceiver : public EmbeddedWorkerTestHelper {
44 public: 50 public:
45 MessageReceiver() 51 MessageReceiver()
(...skipping 21 matching lines...) Expand all
67 SimulateSend(new TestMsg_MessageFromWorker(embedded_worker_id, value)); 73 SimulateSend(new TestMsg_MessageFromWorker(embedded_worker_id, value));
68 } 74 }
69 75
70 void SimulateSendEventResult(int embedded_worker_id, 76 void SimulateSendEventResult(int embedded_worker_id,
71 int request_id, 77 int request_id,
72 const std::string& reply) { 78 const std::string& reply) {
73 SimulateSend( 79 SimulateSend(
74 new TestMsg_TestEventResult(embedded_worker_id, request_id, reply)); 80 new TestMsg_TestEventResult(embedded_worker_id, request_id, reply));
75 } 81 }
76 82
83 void SimulateSendSimpleEventResult(int embedded_worker_id,
84 int request_id,
85 blink::WebServiceWorkerEventResult reply) {
86 SimulateSend(new TestMsg_TestSimpleEventResult(embedded_worker_id,
87 request_id, reply));
88 }
89
77 private: 90 private:
78 void OnMessage() { 91 void OnMessage() {
79 // Do nothing. 92 // Do nothing.
80 } 93 }
81 94
82 int current_embedded_worker_id_; 95 int current_embedded_worker_id_;
83 DISALLOW_COPY_AND_ASSIGN(MessageReceiver); 96 DISALLOW_COPY_AND_ASSIGN(MessageReceiver);
84 }; 97 };
85 98
86 void VerifyCalled(bool* called) { 99 void VerifyCalled(bool* called) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 virtual scoped_ptr<MessageReceiver> GetMessageReceiver() { 246 virtual scoped_ptr<MessageReceiver> GetMessageReceiver() {
234 return make_scoped_ptr(new MessageReceiver()); 247 return make_scoped_ptr(new MessageReceiver());
235 } 248 }
236 249
237 void TearDown() override { 250 void TearDown() override {
238 version_ = 0; 251 version_ = 0;
239 registration_ = 0; 252 registration_ = 0;
240 helper_.reset(); 253 helper_.reset();
241 } 254 }
242 255
256 void SimulateDispatchEvent() {
257 ServiceWorkerStatusCode status =
258 SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value
259
260 // Make sure worker is running.
261 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner);
262 version_->RunAfterStartWorker(runner->QuitClosure(),
263 CreateReceiverOnCurrentThread(&status));
264 runner->Run();
265 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status);
266 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
267
268 // Start request, as if an event is being dispatched.
269 int request_id =
270 version_->StartRequest(ServiceWorkerMetrics::EventType::PUSH,
271 CreateReceiverOnCurrentThread(&status));
272 base::RunLoop().RunUntilIdle();
273
274 // And finish request, as if a response to the event was received.
275 EXPECT_TRUE(version_->FinishRequest(request_id));
276 base::RunLoop().RunUntilIdle();
277 EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status);
278 }
279
243 TestBrowserThreadBundle thread_bundle_; 280 TestBrowserThreadBundle thread_bundle_;
244 scoped_ptr<MessageReceiver> helper_; 281 scoped_ptr<MessageReceiver> helper_;
245 scoped_refptr<ServiceWorkerRegistration> registration_; 282 scoped_refptr<ServiceWorkerRegistration> registration_;
246 scoped_refptr<ServiceWorkerVersion> version_; 283 scoped_refptr<ServiceWorkerVersion> version_;
247 GURL pattern_; 284 GURL pattern_;
248 285
249 private: 286 private:
250 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest); 287 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest);
251 }; 288 };
252 289
(...skipping 463 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 EXPECT_EQ(SERVICE_WORKER_OK, status); 753 EXPECT_EQ(SERVICE_WORKER_OK, status);
717 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); 754 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
718 EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status); 755 EXPECT_EQ(ServiceWorkerVersion::RUNNING, listener.last_status);
719 756
720 version_ = nullptr; 757 version_ = nullptr;
721 EXPECT_EQ(ServiceWorkerVersion::STOPPING, listener.last_status); 758 EXPECT_EQ(ServiceWorkerVersion::STOPPING, listener.last_status);
722 } 759 }
723 760
724 // Test that update isn't triggered for a non-stale worker. 761 // Test that update isn't triggered for a non-stale worker.
725 TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) { 762 TEST_F(ServiceWorkerVersionTest, StaleUpdate_FreshWorker) {
726 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
727
728 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); 763 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
729 registration_->SetActiveVersion(version_); 764 registration_->SetActiveVersion(version_);
730 registration_->set_last_update_check(base::Time::Now()); 765 registration_->set_last_update_check(base::Time::Now());
731 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), 766 SimulateDispatchEvent();
732 std::string());
733 base::RunLoop().RunUntilIdle();
734 767
735 EXPECT_EQ(SERVICE_WORKER_OK, status);
736 EXPECT_TRUE(version_->stale_time_.is_null()); 768 EXPECT_TRUE(version_->stale_time_.is_null());
737 EXPECT_FALSE(version_->update_timer_.IsRunning()); 769 EXPECT_FALSE(version_->update_timer_.IsRunning());
738 } 770 }
739 771
740 // Test that update isn't triggered for a non-active worker. 772 // Test that update isn't triggered for a non-active worker.
741 TEST_F(ServiceWorkerVersionTest, StaleUpdate_NonActiveWorker) { 773 TEST_F(ServiceWorkerVersionTest, StaleUpdate_NonActiveWorker) {
742 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; 774 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
743 775
744 version_->SetStatus(ServiceWorkerVersion::INSTALLING); 776 version_->SetStatus(ServiceWorkerVersion::INSTALLING);
745 registration_->SetInstallingVersion(version_); 777 registration_->SetInstallingVersion(version_);
746 registration_->set_last_update_check(GetYesterday()); 778 registration_->set_last_update_check(GetYesterday());
747 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status)); 779 version_->DispatchInstallEvent(CreateReceiverOnCurrentThread(&status));
748 base::RunLoop().RunUntilIdle(); 780 base::RunLoop().RunUntilIdle();
749 781
750 EXPECT_EQ(SERVICE_WORKER_OK, status); 782 EXPECT_EQ(SERVICE_WORKER_OK, status);
751 EXPECT_TRUE(version_->stale_time_.is_null()); 783 EXPECT_TRUE(version_->stale_time_.is_null());
752 EXPECT_FALSE(version_->update_timer_.IsRunning()); 784 EXPECT_FALSE(version_->update_timer_.IsRunning());
753 } 785 }
754 786
755 // Test that staleness is detected when starting a worker. 787 // Test that staleness is detected when starting a worker.
756 TEST_F(ServiceWorkerVersionTest, StaleUpdate_StartWorker) { 788 TEST_F(ServiceWorkerVersionTest, StaleUpdate_StartWorker) {
757 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; 789 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
758 790
759 // Starting the worker marks it as stale. 791 // Starting the worker marks it as stale.
760 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); 792 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
761 registration_->SetActiveVersion(version_); 793 registration_->SetActiveVersion(version_);
762 registration_->set_last_update_check(GetYesterday()); 794 registration_->set_last_update_check(GetYesterday());
763 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), 795 SimulateDispatchEvent();
764 std::string());
765 base::RunLoop().RunUntilIdle();
766 EXPECT_EQ(SERVICE_WORKER_OK, status);
767 EXPECT_FALSE(version_->stale_time_.is_null()); 796 EXPECT_FALSE(version_->stale_time_.is_null());
768 EXPECT_FALSE(version_->update_timer_.IsRunning()); 797 EXPECT_FALSE(version_->update_timer_.IsRunning());
769 798
770 // Update is actually scheduled after the worker stops. 799 // Update is actually scheduled after the worker stops.
771 version_->StopWorker(CreateReceiverOnCurrentThread(&status)); 800 version_->StopWorker(CreateReceiverOnCurrentThread(&status));
772 base::RunLoop().RunUntilIdle(); 801 base::RunLoop().RunUntilIdle();
773 EXPECT_EQ(SERVICE_WORKER_OK, status); 802 EXPECT_EQ(SERVICE_WORKER_OK, status);
774 EXPECT_TRUE(version_->stale_time_.is_null()); 803 EXPECT_TRUE(version_->stale_time_.is_null());
775 EXPECT_TRUE(version_->update_timer_.IsRunning()); 804 EXPECT_TRUE(version_->update_timer_.IsRunning());
776 } 805 }
777 806
778 // Test that staleness is detected on a running worker. 807 // Test that staleness is detected on a running worker.
779 TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) { 808 TEST_F(ServiceWorkerVersionTest, StaleUpdate_RunningWorker) {
780 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED;
781
782 // Start a fresh worker. 809 // Start a fresh worker.
783 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); 810 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
784 registration_->SetActiveVersion(version_); 811 registration_->SetActiveVersion(version_);
785 registration_->set_last_update_check(base::Time::Now()); 812 registration_->set_last_update_check(base::Time::Now());
786 version_->DispatchPushEvent(CreateReceiverOnCurrentThread(&status), 813 SimulateDispatchEvent();
787 std::string());
788 base::RunLoop().RunUntilIdle();
789 EXPECT_EQ(SERVICE_WORKER_OK, status);
790 EXPECT_TRUE(version_->stale_time_.is_null()); 814 EXPECT_TRUE(version_->stale_time_.is_null());
791 815
792 // Simulate it running for a day. It will be marked stale. 816 // Simulate it running for a day. It will be marked stale.
793 registration_->set_last_update_check(GetYesterday()); 817 registration_->set_last_update_check(GetYesterday());
794 version_->OnTimeoutTimer(); 818 version_->OnTimeoutTimer();
795 EXPECT_FALSE(version_->stale_time_.is_null()); 819 EXPECT_FALSE(version_->stale_time_.is_null());
796 EXPECT_FALSE(version_->update_timer_.IsRunning()); 820 EXPECT_FALSE(version_->update_timer_.IsRunning());
797 821
798 // Simulate it running for past the wait threshold. The update will be 822 // Simulate it running for past the wait threshold. The update will be
799 // scheduled. 823 // scheduled.
(...skipping 12 matching lines...) Expand all
812 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); 836 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
813 registration_->SetActiveVersion(version_); 837 registration_->SetActiveVersion(version_);
814 registration_->set_last_update_check(GetYesterday()); 838 registration_->set_last_update_check(GetYesterday());
815 base::TimeTicks stale_time = 839 base::TimeTicks stale_time =
816 base::TimeTicks::Now() - 840 base::TimeTicks::Now() -
817 base::TimeDelta::FromMinutes( 841 base::TimeDelta::FromMinutes(
818 ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1); 842 ServiceWorkerVersion::kStartNewWorkerTimeoutMinutes + 1);
819 version_->stale_time_ = stale_time; 843 version_->stale_time_ = stale_time;
820 844
821 // Stale time is not deferred. 845 // Stale time is not deferred.
822 version_->DispatchPushEvent( 846 version_->RunAfterStartWorker(
823 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); 847 base::Bind(&base::DoNothing),
824 version_->DispatchPushEvent( 848 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
825 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); 849 version_->RunAfterStartWorker(
850 base::Bind(&base::DoNothing),
851 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
852 base::RunLoop().RunUntilIdle();
826 EXPECT_EQ(stale_time, version_->stale_time_); 853 EXPECT_EQ(stale_time, version_->stale_time_);
827 854
828 // Timeout triggers the update. 855 // Timeout triggers the update.
829 version_->OnTimeoutTimer(); 856 version_->OnTimeoutTimer();
830 EXPECT_TRUE(version_->stale_time_.is_null()); 857 EXPECT_TRUE(version_->stale_time_.is_null());
831 EXPECT_TRUE(version_->update_timer_.IsRunning()); 858 EXPECT_TRUE(version_->update_timer_.IsRunning());
832 859
833 // Update timer is not deferred. 860 // Update timer is not deferred.
834 base::TimeTicks run_time = version_->update_timer_.desired_run_time(); 861 base::TimeTicks run_time = version_->update_timer_.desired_run_time();
835 version_->DispatchPushEvent( 862 SimulateDispatchEvent();
836 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string()); 863 SimulateDispatchEvent();
837 version_->DispatchPushEvent( 864 SimulateDispatchEvent();
838 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string());
839 version_->DispatchPushEvent(
840 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), std::string());
841 base::RunLoop().RunUntilIdle(); 865 base::RunLoop().RunUntilIdle();
842 EXPECT_TRUE(version_->stale_time_.is_null()); 866 EXPECT_TRUE(version_->stale_time_.is_null());
843 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); 867 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time());
844 } 868 }
845 869
846 TEST_F(ServiceWorkerWaitForeverInFetchTest, RequestTimeout) { 870 TEST_F(ServiceWorkerWaitForeverInFetchTest, RequestTimeout) {
847 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value 871 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value
848 872
849 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); 873 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
850 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(), 874 version_->DispatchFetchEvent(ServiceWorkerFetchRequest(),
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after
1418 runner1->Run(); 1442 runner1->Run();
1419 1443
1420 // Verify correct response was received. 1444 // Verify correct response was received.
1421 EXPECT_EQ(request_id1, received_request_id1); 1445 EXPECT_EQ(request_id1, received_request_id1);
1422 EXPECT_EQ(request_id2, received_request_id2); 1446 EXPECT_EQ(request_id2, received_request_id2);
1423 EXPECT_EQ(reply1, received_data1); 1447 EXPECT_EQ(reply1, received_data1);
1424 EXPECT_EQ(SERVICE_WORKER_OK, status1); 1448 EXPECT_EQ(SERVICE_WORKER_OK, status1);
1425 EXPECT_TRUE(version_->FinishRequest(request_id1)); 1449 EXPECT_TRUE(version_->FinishRequest(request_id1));
1426 } 1450 }
1427 1451
1452 TEST_F(ServiceWorkerVersionTest, DispatchSimpleEvent_Completed) {
1453 ServiceWorkerStatusCode status =
1454 SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value
1455
1456 // Activate and start worker.
1457 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
1458 version_->StartWorker(CreateReceiverOnCurrentThread(&status));
1459 base::RunLoop().RunUntilIdle();
1460 EXPECT_EQ(SERVICE_WORKER_OK, status);
1461 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
1462
1463 // Start request and dispatch test event.
1464 status = SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value
1465 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner);
1466 int request_id = version_->StartRequest(
1467 ServiceWorkerMetrics::EventType::SYNC,
1468 CreateReceiverOnCurrentThread(&status, runner->QuitClosure()));
1469 version_->DispatchSimpleEvent<TestMsg_TestSimpleEventResult>(
1470 request_id, TestMsg_TestEvent(request_id));
1471
1472 // Verify event got dispatched to worker.
1473 base::RunLoop().RunUntilIdle();
1474 ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count());
1475 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0);
1476 EXPECT_EQ(TestMsg_TestEvent::ID, msg->type());
1477
1478 // Simulate sending reply to event.
1479 helper_->SimulateSendSimpleEventResult(
1480 version_->embedded_worker()->embedded_worker_id(), request_id,
1481 blink::WebServiceWorkerEventResultCompleted);
1482 runner->Run();
1483
1484 // Verify callback was called with correct status.
1485 EXPECT_EQ(SERVICE_WORKER_OK, status);
1486 }
1487
1488 TEST_F(ServiceWorkerVersionTest, DispatchSimpleEvent_Rejected) {
1489 ServiceWorkerStatusCode status =
1490 SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value
1491
1492 // Activate and start worker.
1493 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
1494 version_->StartWorker(CreateReceiverOnCurrentThread(&status));
1495 base::RunLoop().RunUntilIdle();
1496 EXPECT_EQ(SERVICE_WORKER_OK, status);
1497 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status());
1498
1499 // Start request and dispatch test event.
1500 status = SERVICE_WORKER_ERROR_MAX_VALUE; // dummy value
1501 scoped_refptr<MessageLoopRunner> runner(new MessageLoopRunner);
1502 int request_id = version_->StartRequest(
1503 ServiceWorkerMetrics::EventType::SYNC,
1504 CreateReceiverOnCurrentThread(&status, runner->QuitClosure()));
1505 version_->DispatchSimpleEvent<TestMsg_TestSimpleEventResult>(
1506 request_id, TestMsg_TestEvent(request_id));
1507
1508 // Verify event got dispatched to worker.
1509 base::RunLoop().RunUntilIdle();
1510 ASSERT_EQ(1u, helper_->inner_ipc_sink()->message_count());
1511 const IPC::Message* msg = helper_->inner_ipc_sink()->GetMessageAt(0);
1512 EXPECT_EQ(TestMsg_TestEvent::ID, msg->type());
1513
1514 // Simulate sending reply to event.
1515 helper_->SimulateSendSimpleEventResult(
1516 version_->embedded_worker()->embedded_worker_id(), request_id,
1517 blink::WebServiceWorkerEventResultRejected);
1518 runner->Run();
1519
1520 // Verify callback was called with correct status.
1521 EXPECT_EQ(SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, status);
1522 }
1523
1428 } // namespace content 1524 } // 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