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

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

Issue 2779763004: Create ServiceWorkerProviderHost before starting worker (Closed)
Patch Set: Pass the param of BindWithProviderInfo by value instead of pointer Created 3 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_dispatcher_host.h" 5 #include "content/browser/service_worker/service_worker_dispatcher_host.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <utility> 9 #include <utility>
10 10
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 116
117 protected: 117 protected:
118 EmbeddedWorkerTestHelper* helper_; 118 EmbeddedWorkerTestHelper* helper_;
119 ~TestingServiceWorkerDispatcherHost() override {} 119 ~TestingServiceWorkerDispatcherHost() override {}
120 }; 120 };
121 121
122 class FailToStartWorkerTestHelper : public EmbeddedWorkerTestHelper { 122 class FailToStartWorkerTestHelper : public EmbeddedWorkerTestHelper {
123 public: 123 public:
124 FailToStartWorkerTestHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {} 124 FailToStartWorkerTestHelper() : EmbeddedWorkerTestHelper(base::FilePath()) {}
125 125
126 void OnStartWorker(int embedded_worker_id, 126 void OnStartWorker(
127 int64_t service_worker_version_id, 127 int embedded_worker_id,
128 const GURL& scope, 128 int64_t service_worker_version_id,
129 const GURL& script_url, 129 const GURL& scope,
130 bool pause_after_download, 130 const GURL& script_url,
131 mojom::ServiceWorkerEventDispatcherRequest request, 131 bool pause_after_download,
132 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo 132 mojom::ServiceWorkerEventDispatcherRequest request,
133 instance_host) override { 133 mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host,
134 mojom::ServiceWorkerProviderInfoForStartWorkerPtr provider_info)
135 override {
134 mojom::EmbeddedWorkerInstanceHostAssociatedPtr instance_host_ptr; 136 mojom::EmbeddedWorkerInstanceHostAssociatedPtr instance_host_ptr;
135 instance_host_ptr.Bind(std::move(instance_host)); 137 instance_host_ptr.Bind(std::move(instance_host));
136 instance_host_ptr->OnStopped(); 138 instance_host_ptr->OnStopped();
137 base::RunLoop().RunUntilIdle(); 139 base::RunLoop().RunUntilIdle();
138 } 140 }
139 }; 141 };
140 142
141 class ServiceWorkerDispatcherHostTest : public testing::Test { 143 class ServiceWorkerDispatcherHostTest : public testing::Test {
142 protected: 144 protected:
143 ServiceWorkerDispatcherHostTest() 145 ServiceWorkerDispatcherHostTest()
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 bool called = false; 191 bool called = false;
190 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 192 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
191 helper_->context()->storage()->StoreRegistration( 193 helper_->context()->storage()->StoreRegistration(
192 registration_.get(), version_.get(), 194 registration_.get(), version_.get(),
193 base::Bind(&SaveStatusCallback, &called, &status)); 195 base::Bind(&SaveStatusCallback, &called, &status));
194 base::RunLoop().RunUntilIdle(); 196 base::RunLoop().RunUntilIdle();
195 EXPECT_TRUE(called); 197 EXPECT_TRUE(called);
196 EXPECT_EQ(SERVICE_WORKER_OK, status); 198 EXPECT_EQ(SERVICE_WORKER_OK, status);
197 } 199 }
198 200
199 void SendSetHostedVersionId(int provider_id,
200 int64_t version_id,
201 int embedded_worker_id) {
202 dispatcher_host_->OnSetHostedVersionId(provider_id, version_id,
203 embedded_worker_id);
204 }
205
206 void SendProviderCreated(ServiceWorkerProviderType type, 201 void SendProviderCreated(ServiceWorkerProviderType type,
207 const GURL& pattern) { 202 const GURL& pattern) {
208 const int64_t kProviderId = 99; 203 const int64_t kProviderId = 99;
209 ServiceWorkerProviderHostInfo info(kProviderId, MSG_ROUTING_NONE, type, 204 ServiceWorkerProviderHostInfo info(kProviderId, MSG_ROUTING_NONE, type,
210 true /* is_parent_frame_secure */); 205 true /* is_parent_frame_secure */);
211 remote_endpoint_.BindWithProviderHostInfo(&info); 206 remote_endpoint_.BindWithProviderHostInfo(&info);
212 207
213 dispatcher_host_->OnProviderCreated(std::move(info)); 208 dispatcher_host_->OnProviderCreated(std::move(info));
214 helper_->SimulateAddProcessToPattern(pattern, 209 helper_->SimulateAddProcessToPattern(pattern,
215 helper_->mock_render_process_id()); 210 helper_->mock_render_process_id());
216 provider_host_ = context()->GetProviderHost( 211 provider_host_ = context()->GetProviderHost(
217 helper_->mock_render_process_id(), kProviderId); 212 helper_->mock_render_process_id(), kProviderId);
218 } 213 }
219 214
215 void PrepareProviderForServiceWorkerContext(ServiceWorkerVersion* version,
216 const GURL& pattern) {
217 std::unique_ptr<ServiceWorkerProviderHost> host =
218 CreateProviderHostForServiceWorkerContext(
219 helper_->mock_render_process_id(),
220 true /* is_parent_frame_secure */, version,
221 helper_->context()->AsWeakPtr(), &remote_endpoint_);
222 provider_host_ = host.get();
223 helper_->SimulateAddProcessToPattern(pattern,
224 helper_->mock_render_process_id());
225 context()->AddProviderHost(std::move(host));
226 }
227
220 void SendRegister(int64_t provider_id, GURL pattern, GURL worker_url) { 228 void SendRegister(int64_t provider_id, GURL pattern, GURL worker_url) {
221 dispatcher_host_->OnMessageReceived( 229 dispatcher_host_->OnMessageReceived(
222 ServiceWorkerHostMsg_RegisterServiceWorker( 230 ServiceWorkerHostMsg_RegisterServiceWorker(
223 -1, -1, provider_id, pattern, worker_url)); 231 -1, -1, provider_id, pattern, worker_url));
224 base::RunLoop().RunUntilIdle(); 232 base::RunLoop().RunUntilIdle();
225 } 233 }
226 234
227 void Register(int64_t provider_id, 235 void Register(int64_t provider_id,
228 GURL pattern, 236 GURL pattern,
229 GURL worker_url, 237 GURL worker_url,
(...skipping 523 matching lines...) Expand 10 before | Expand all | Expand 10 after
753 ServiceWorkerRemoteProviderEndpoint remote_endpoint; 761 ServiceWorkerRemoteProviderEndpoint remote_endpoint;
754 remote_endpoint.BindWithProviderHostInfo(&host_info); 762 remote_endpoint.BindWithProviderHostInfo(&host_info);
755 new_dispatcher_host->OnProviderCreated(std::move(host_info)); 763 new_dispatcher_host->OnProviderCreated(std::move(host_info));
756 EXPECT_EQ(0, new_dispatcher_host->bad_messages_received_count_); 764 EXPECT_EQ(0, new_dispatcher_host->bad_messages_received_count_);
757 } 765 }
758 766
759 TEST_F(ServiceWorkerDispatcherHostTest, DispatchExtendableMessageEvent) { 767 TEST_F(ServiceWorkerDispatcherHostTest, DispatchExtendableMessageEvent) {
760 GURL pattern = GURL("http://www.example.com/"); 768 GURL pattern = GURL("http://www.example.com/");
761 GURL script_url = GURL("http://www.example.com/service_worker.js"); 769 GURL script_url = GURL("http://www.example.com/service_worker.js");
762 770
763 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern);
764 SetUpRegistration(pattern, script_url); 771 SetUpRegistration(pattern, script_url);
772 PrepareProviderForServiceWorkerContext(version_.get(), pattern);
765 773
766 // Set the running hosted version so that we can retrieve a valid service 774 // Set the running hosted version so that we can retrieve a valid service
767 // worker object information for the source attribute of the message event. 775 // worker object information for the source attribute of the message event.
768 provider_host_->running_hosted_version_ = version_; 776 provider_host_->running_hosted_version_ = version_;
769 777
770 // Set aside the initial refcount of the worker handle. 778 // Set aside the initial refcount of the worker handle.
771 provider_host_->GetOrCreateServiceWorkerHandle(version_.get()); 779 provider_host_->GetOrCreateServiceWorkerHandle(version_.get());
772 ServiceWorkerHandle* sender_worker_handle = 780 ServiceWorkerHandle* sender_worker_handle =
773 dispatcher_host_->FindServiceWorkerHandle(provider_host_->provider_id(), 781 dispatcher_host_->FindServiceWorkerHandle(provider_host_->provider_id(),
774 version_->version_id()); 782 version_->version_id());
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
831 bool called = false; 839 bool called = false;
832 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; 840 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE;
833 DispatchExtendableMessageEvent( 841 DispatchExtendableMessageEvent(
834 version_, base::string16(), url::Origin(version_->scope().GetOrigin()), 842 version_, base::string16(), url::Origin(version_->scope().GetOrigin()),
835 ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status)); 843 ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status));
836 base::RunLoop().RunUntilIdle(); 844 base::RunLoop().RunUntilIdle();
837 EXPECT_TRUE(called); 845 EXPECT_TRUE(called);
838 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status); 846 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status);
839 } 847 }
840 848
841 TEST_F(ServiceWorkerDispatcherHostTest, OnSetHostedVersionId) {
842 GURL pattern = GURL("http://www.example.com/");
843 GURL script_url = GURL("http://www.example.com/service_worker.js");
844
845 Initialize(base::WrapUnique(new FailToStartWorkerTestHelper));
846 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern);
847 SetUpRegistration(pattern, script_url);
848
849 const int64_t kProviderId = 99; // Dummy value
850 bool called;
851 ServiceWorkerStatusCode status;
852 // StartWorker puts the worker in STARTING state but it will have no
853 // process id yet.
854 version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN,
855 base::Bind(&SaveStatusCallback, &called, &status));
856 EXPECT_NE(version_->embedded_worker()->process_id(),
857 provider_host_->process_id());
858 // SendSetHostedVersionId should reject because the provider host process id
859 // is different. It should call BadMessageReceived because it's not an
860 // expected error state.
861 SendSetHostedVersionId(kProviderId, version_->version_id(),
862 version_->embedded_worker()->embedded_worker_id());
863 base::RunLoop().RunUntilIdle();
864 EXPECT_FALSE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching(
865 ServiceWorkerMsg_AssociateRegistration::ID));
866 EXPECT_EQ(1, dispatcher_host_->bad_messages_received_count_);
867 }
868
869 TEST_F(ServiceWorkerDispatcherHostTest, OnSetHostedVersionId_DetachedWorker) {
870 GURL pattern = GURL("http://www.example.com/");
871 GURL script_url = GURL("http://www.example.com/service_worker.js");
872
873 Initialize(base::WrapUnique(new FailToStartWorkerTestHelper));
874 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern);
875 SetUpRegistration(pattern, script_url);
876
877 const int64_t kProviderId = 99; // Dummy value
878 bool called;
879 ServiceWorkerStatusCode status;
880 // StartWorker puts the worker in STARTING state.
881 version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN,
882 base::Bind(&SaveStatusCallback, &called, &status));
883
884 // SendSetHostedVersionId should bail because the embedded worker is
885 // different. It shouldn't call BadMessageReceived because receiving a message
886 // for a detached worker is a legitimite possibility.
887 int bad_embedded_worker_id =
888 version_->embedded_worker()->embedded_worker_id() + 1;
889 SendSetHostedVersionId(kProviderId, version_->version_id(),
890 bad_embedded_worker_id);
891 base::RunLoop().RunUntilIdle();
892 EXPECT_FALSE(dispatcher_host_->ipc_sink()->GetUniqueMessageMatching(
893 ServiceWorkerMsg_AssociateRegistration::ID));
894 EXPECT_EQ(0, dispatcher_host_->bad_messages_received_count_);
895 }
896
897 TEST_F(ServiceWorkerDispatcherHostTest, ReceivedTimedOutRequestResponse) { 849 TEST_F(ServiceWorkerDispatcherHostTest, ReceivedTimedOutRequestResponse) {
898 GURL pattern = GURL("https://www.example.com/"); 850 GURL pattern = GURL("https://www.example.com/");
899 GURL script_url = GURL("https://www.example.com/service_worker.js"); 851 GURL script_url = GURL("https://www.example.com/service_worker.js");
900 852
901 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_WINDOW, pattern); 853 SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_WINDOW, pattern);
902 SetUpRegistration(pattern, script_url); 854 SetUpRegistration(pattern, script_url);
903 855
904 version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN, 856 version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN,
905 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); 857 base::Bind(&ServiceWorkerUtils::NoOpStatusCallback));
906 base::RunLoop().RunUntilIdle(); 858 base::RunLoop().RunUntilIdle();
907 859
908 // Set the worker status to STOPPING. 860 // Set the worker status to STOPPING.
909 version_->embedded_worker()->Stop(); 861 version_->embedded_worker()->Stop();
910 EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, version_->running_status()); 862 EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, version_->running_status());
911 863
912 // Receive a response for a timed out request. The bad message count should 864 // Receive a response for a timed out request. The bad message count should
913 // not increase. 865 // not increase.
914 const int kFetchEventId = 91; // Dummy value 866 const int kFetchEventId = 91; // Dummy value
915 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_FetchEventResponse( 867 dispatcher_host_->OnMessageReceived(ServiceWorkerHostMsg_FetchEventResponse(
916 version_->embedded_worker()->embedded_worker_id(), kFetchEventId, 868 version_->embedded_worker()->embedded_worker_id(), kFetchEventId,
917 ServiceWorkerResponse(), base::Time::Now())); 869 ServiceWorkerResponse(), base::Time::Now()));
918 870
919 base::RunLoop().RunUntilIdle(); 871 base::RunLoop().RunUntilIdle();
920 EXPECT_EQ(0, dispatcher_host_->bad_messages_received_count_); 872 EXPECT_EQ(0, dispatcher_host_->bad_messages_received_count_);
921 } 873 }
922 874
923 } // namespace content 875 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698