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

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

Issue 2628553002: ServiceWorker: OnSimpleEventFinished could be called after timed out (Closed)
Patch Set: Update comments Created 3 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
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 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest); 300 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerVersionTest);
301 }; 301 };
302 302
303 class MessageReceiverDisallowStart : public MessageReceiver { 303 class MessageReceiverDisallowStart : public MessageReceiver {
304 public: 304 public:
305 MessageReceiverDisallowStart() : MessageReceiver() {} 305 MessageReceiverDisallowStart() : MessageReceiver() {}
306 ~MessageReceiverDisallowStart() override {} 306 ~MessageReceiverDisallowStart() override {}
307 307
308 enum class StartMode { STALL, FAIL, SUCCEED }; 308 enum class StartMode { STALL, FAIL, SUCCEED };
309 309
310 void OnStartWorker(int embedded_worker_id, 310 void OnStartWorker(
311 int64_t service_worker_version_id, 311 int embedded_worker_id,
312 const GURL& scope, 312 int64_t service_worker_version_id,
313 const GURL& script_url, 313 const GURL& scope,
314 bool pause_after_download) override { 314 const GURL& script_url,
315 bool pause_after_download,
316 mojom::ServiceWorkerEventDispatcherRequest request) override {
315 switch (mode_) { 317 switch (mode_) {
316 case StartMode::STALL: 318 case StartMode::STALL:
317 break; // Do nothing. 319 break; // Do nothing.
318 case StartMode::FAIL: 320 case StartMode::FAIL:
319 ASSERT_EQ(current_mock_instance_index_ + 1, 321 ASSERT_EQ(current_mock_instance_index_ + 1,
320 mock_instance_clients()->size()); 322 mock_instance_clients()->size());
321 // Remove the connection by peer 323 // Remove the connection by peer
322 mock_instance_clients()->at(current_mock_instance_index_).reset(); 324 mock_instance_clients()->at(current_mock_instance_index_).reset();
323 break; 325 break;
324 case StartMode::SUCCEED: 326 case StartMode::SUCCEED:
325 MessageReceiver::OnStartWorker(embedded_worker_id, 327 MessageReceiver::OnStartWorker(
326 service_worker_version_id, scope, 328 embedded_worker_id, service_worker_version_id, scope, script_url,
327 script_url, pause_after_download); 329 pause_after_download, std::move(request));
328 break; 330 break;
329 } 331 }
330 current_mock_instance_index_++; 332 current_mock_instance_index_++;
331 } 333 }
332 334
333 void set_start_mode(StartMode mode) { mode_ = mode; } 335 void set_start_mode(StartMode mode) { mode_ = mode; }
334 336
335 private: 337 private:
336 uint32_t current_mock_instance_index_ = 0; 338 uint32_t current_mock_instance_index_ = 0;
337 StartMode mode_ = StartMode::STALL; 339 StartMode mode_ = StartMode::STALL;
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
381 }; 383 };
382 384
383 class MessageReceiverDisallowStop : public MessageReceiver { 385 class MessageReceiverDisallowStop : public MessageReceiver {
384 public: 386 public:
385 MessageReceiverDisallowStop() : MessageReceiver() { 387 MessageReceiverDisallowStop() : MessageReceiver() {
386 CreateAndRegisterMockInstanceClient< 388 CreateAndRegisterMockInstanceClient<
387 NoOpStopWorkerEmbeddedWorkerInstanceClient>(AsWeakPtr()); 389 NoOpStopWorkerEmbeddedWorkerInstanceClient>(AsWeakPtr());
388 } 390 }
389 ~MessageReceiverDisallowStop() override {} 391 ~MessageReceiverDisallowStop() override {}
390 392
391 void OnStopWorker(int embedded_worker_id) override { 393 void OnStopWorker(
394 const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& callback)
395 override {
392 // Do nothing. 396 // Do nothing.
393 } 397 }
394 398
395 private: 399 private:
396 DISALLOW_COPY_AND_ASSIGN(MessageReceiverDisallowStop); 400 DISALLOW_COPY_AND_ASSIGN(MessageReceiverDisallowStop);
397 }; 401 };
398 402
399 class ServiceWorkerStallInStoppingTest : public ServiceWorkerVersionTest { 403 class ServiceWorkerStallInStoppingTest : public ServiceWorkerVersionTest {
400 protected: 404 protected:
401 ServiceWorkerStallInStoppingTest() : ServiceWorkerVersionTest() {} 405 ServiceWorkerStallInStoppingTest() : ServiceWorkerVersionTest() {}
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 // Update timer is not deferred. 827 // Update timer is not deferred.
824 base::TimeTicks run_time = version_->update_timer_.desired_run_time(); 828 base::TimeTicks run_time = version_->update_timer_.desired_run_time();
825 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); 829 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH);
826 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); 830 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH);
827 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH); 831 SimulateDispatchEvent(ServiceWorkerMetrics::EventType::PUSH);
828 base::RunLoop().RunUntilIdle(); 832 base::RunLoop().RunUntilIdle();
829 EXPECT_TRUE(version_->stale_time_.is_null()); 833 EXPECT_TRUE(version_->stale_time_.is_null());
830 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time()); 834 EXPECT_EQ(run_time, version_->update_timer_.desired_run_time());
831 } 835 }
832 836
833 TEST_F(ServiceWorkerVersionTest, RequestTimeout) { 837 class MessageReceiverControlEvents : public MessageReceiver {
834 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value 838 public:
839 MessageReceiverControlEvents() : MessageReceiver() {}
840 ~MessageReceiverControlEvents() override {}
841
842 void OnExtendableMessageEvent(
843 mojom::ExtendableMessageEventPtr event,
844 const mojom::ServiceWorkerEventDispatcher::
845 DispatchExtendableMessageEventCallback& callback) override {
846 EXPECT_FALSE(extendable_message_event_callback_);
847 extendable_message_event_callback_ = callback;
848 }
849
850 void OnStopWorker(
851 const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback& callback)
852 override {
853 EXPECT_FALSE(stop_worker_callback_);
854 stop_worker_callback_ = callback;
855 }
856
857 const mojom::ServiceWorkerEventDispatcher::
858 DispatchExtendableMessageEventCallback&
859 extendable_message_event_callback() {
860 return extendable_message_event_callback_;
861 }
862
863 const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback&
864 stop_worker_callback() {
865 return stop_worker_callback_;
866 }
867
868 private:
869 mojom::ServiceWorkerEventDispatcher::DispatchExtendableMessageEventCallback
870 extendable_message_event_callback_;
871 mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback stop_worker_callback_;
872 };
873
874 class ServiceWorkerRequestTimeoutTest : public ServiceWorkerVersionTest {
875 protected:
876 ServiceWorkerRequestTimeoutTest() : ServiceWorkerVersionTest() {}
877
878 std::unique_ptr<MessageReceiver> GetMessageReceiver() override {
879 return base::MakeUnique<MessageReceiverControlEvents>();
880 }
881
882 const mojom::ServiceWorkerEventDispatcher::
883 DispatchExtendableMessageEventCallback&
884 extendable_message_event_callback() {
885 return static_cast<MessageReceiverControlEvents*>(helper_.get())
886 ->extendable_message_event_callback();
887 }
888
889 const mojom::EmbeddedWorkerInstanceClient::StopWorkerCallback&
890 stop_worker_callback() {
891 return static_cast<MessageReceiverControlEvents*>(helper_.get())
892 ->stop_worker_callback();
893 }
894
895 private:
896 DISALLOW_COPY_AND_ASSIGN(ServiceWorkerRequestTimeoutTest);
897 };
898
899 TEST_F(ServiceWorkerRequestTimeoutTest, RequestTimeout) {
900 ServiceWorkerStatusCode error_status =
901 SERVICE_WORKER_ERROR_NETWORK; // dummy value
835 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); 902 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
836 903
837 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, 904 version_->StartWorker(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME,
838 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 905 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
839 base::RunLoop().RunUntilIdle(); 906 base::RunLoop().RunUntilIdle();
840 907
841 // Create a request. 908 // Create a request.
842 int request_id = 909 int request_id =
843 version_->StartRequest(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME, 910 version_->StartRequest(ServiceWorkerMetrics::EventType::FETCH_MAIN_FRAME,
844 CreateReceiverOnCurrentThread(&status)); 911 CreateReceiverOnCurrentThread(&error_status));
912
913 // Dispatch a dummy event whose response will be received by SWVersion.
914 EXPECT_FALSE(extendable_message_event_callback());
915 version_->event_dispatcher()->DispatchExtendableMessageEvent(
916 mojom::ExtendableMessageEvent::New(),
917 base::Bind(&ServiceWorkerVersion::OnSimpleEventFinished, version_,
918 request_id));
845 base::RunLoop().RunUntilIdle(); 919 base::RunLoop().RunUntilIdle();
920 // The renderer should have received an ExtendableMessageEvent request.
921 EXPECT_TRUE(extendable_message_event_callback());
846 922
847 // Callback has not completed yet. 923 // Callback has not completed yet.
848 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, status); 924 EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, error_status);
849 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); 925 EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status());
850 926
851 // Simulate timeout. 927 // Simulate timeout.
928 EXPECT_FALSE(stop_worker_callback());
852 EXPECT_TRUE(version_->timeout_timer_.IsRunning()); 929 EXPECT_TRUE(version_->timeout_timer_.IsRunning());
853 version_->SetAllRequestExpirations(base::TimeTicks::Now()); 930 version_->SetAllRequestExpirations(base::TimeTicks::Now());
854 version_->timeout_timer_.user_task().Run(); 931 version_->timeout_timer_.user_task().Run();
855 base::RunLoop().RunUntilIdle(); 932 base::RunLoop().RunUntilIdle();
856 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, status); 933 // The renderer should have received a StopWorker request.
857 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); 934 EXPECT_TRUE(stop_worker_callback());
falken 2017/01/12 04:14:47 I'd put the empty line at 933 instead of 935, all
shimazu 2017/01/12 05:25:21 Done.
935
936 // The request should have timed out.
937 EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, error_status);
938 // Calling FinishRequest should be no-op, since the request timed out.
858 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */, 939 EXPECT_FALSE(version_->FinishRequest(request_id, true /* was_handled */,
859 base::Time::Now())); 940 base::Time::Now()));
941
942 // Simulate the renderer aborting the pending event.
943 // This should not crash: https://crbug.com/676984.
944 extendable_message_event_callback().Run(SERVICE_WORKER_ERROR_ABORT,
945 base::Time::Now());
946 base::RunLoop().RunUntilIdle();
947
948 // Simulate the renderer stopping the worker.
949 stop_worker_callback().Run();
950 base::RunLoop().RunUntilIdle();
951 EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status());
860 } 952 }
861 953
862 TEST_F(ServiceWorkerVersionTest, RequestNowTimeout) { 954 TEST_F(ServiceWorkerVersionTest, RequestNowTimeout) {
863 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value 955 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value
864 version_->SetStatus(ServiceWorkerVersion::ACTIVATED); 956 version_->SetStatus(ServiceWorkerVersion::ACTIVATED);
865 957
866 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, 958 version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC,
867 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 959 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
868 base::RunLoop().RunUntilIdle(); 960 base::RunLoop().RunUntilIdle();
869 961
(...skipping 893 matching lines...) Expand 10 before | Expand all | Expand 10 after
1763 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1); 1855 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1);
1764 histogram_tester_.ExpectTotalCount(kLinkTapDown, 0); 1856 histogram_tester_.ExpectTotalCount(kLinkTapDown, 0);
1765 EXPECT_EQ(SERVICE_WORKER_OK, status); 1857 EXPECT_EQ(SERVICE_WORKER_OK, status);
1766 StopWorker(); 1858 StopWorker();
1767 // The UMA for kLinkMouseDown must be recorded when the worker stopped. 1859 // The UMA for kLinkMouseDown must be recorded when the worker stopped.
1768 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1); 1860 histogram_tester_.ExpectTotalCount(kLinkMouseDown, 1);
1769 histogram_tester_.ExpectTotalCount(kLinkTapDown, 1); 1861 histogram_tester_.ExpectTotalCount(kLinkTapDown, 1);
1770 } 1862 }
1771 1863
1772 } // namespace content 1864 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698