| 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/run_loop.h" | 6 #include "base/run_loop.h" |
| 7 #include "content/browser/service_worker/embedded_worker_registry.h" | 7 #include "content/browser/service_worker/embedded_worker_registry.h" |
| 8 #include "content/browser/service_worker/embedded_worker_test_helper.h" | 8 #include "content/browser/service_worker/embedded_worker_test_helper.h" |
| 9 #include "content/browser/service_worker/service_worker_context_core.h" | 9 #include "content/browser/service_worker/service_worker_context_core.h" |
| 10 #include "content/browser/service_worker/service_worker_registration.h" | 10 #include "content/browser/service_worker/service_worker_registration.h" |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 context_.reset(new ServiceWorkerContextCore(base::FilePath(), NULL)); | 93 context_.reset(new ServiceWorkerContextCore(base::FilePath(), NULL)); |
| 94 helper_.reset(new MessageReceiver(context_.get())); | 94 helper_.reset(new MessageReceiver(context_.get())); |
| 95 | 95 |
| 96 registration_ = new ServiceWorkerRegistration( | 96 registration_ = new ServiceWorkerRegistration( |
| 97 GURL("http://www.example.com/*"), | 97 GURL("http://www.example.com/*"), |
| 98 GURL("http://www.example.com/service_worker.js"), | 98 GURL("http://www.example.com/service_worker.js"), |
| 99 1L); | 99 1L); |
| 100 version_ = new ServiceWorkerVersion( | 100 version_ = new ServiceWorkerVersion( |
| 101 registration_, | 101 registration_, |
| 102 embedded_worker_registry(), | 102 embedded_worker_registry(), |
| 103 1L); | 103 1L, |
| 104 ServiceWorkerVersion::NEW); |
| 104 | 105 |
| 105 // Simulate adding one process to the worker. | 106 // Simulate adding one process to the worker. |
| 106 int embedded_worker_id = version_->embedded_worker()->embedded_worker_id(); | 107 int embedded_worker_id = version_->embedded_worker()->embedded_worker_id(); |
| 107 helper_->SimulateAddProcessToWorker(embedded_worker_id, kRenderProcessId); | 108 helper_->SimulateAddProcessToWorker(embedded_worker_id, kRenderProcessId); |
| 108 } | 109 } |
| 109 | 110 |
| 110 virtual void TearDown() OVERRIDE { | 111 virtual void TearDown() OVERRIDE { |
| 111 version_->Shutdown(); | 112 version_->Shutdown(); |
| 112 version_ = 0; | 113 version_ = 0; |
| 113 registration_->Shutdown(); | 114 registration_->Shutdown(); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 129 }; | 130 }; |
| 130 | 131 |
| 131 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { | 132 TEST_F(ServiceWorkerVersionTest, ConcurrentStartAndStop) { |
| 132 // Call StartWorker() multiple times. | 133 // Call StartWorker() multiple times. |
| 133 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; | 134 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; |
| 134 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; | 135 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; |
| 135 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; | 136 ServiceWorkerStatusCode status3 = SERVICE_WORKER_ERROR_FAILED; |
| 136 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); | 137 version_->StartWorker(CreateReceiverOnCurrentThread(&status1)); |
| 137 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); | 138 version_->StartWorker(CreateReceiverOnCurrentThread(&status2)); |
| 138 | 139 |
| 139 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->status()); | 140 EXPECT_EQ(ServiceWorkerVersion::STARTING, version_->running_status()); |
| 140 base::RunLoop().RunUntilIdle(); | 141 base::RunLoop().RunUntilIdle(); |
| 141 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->status()); | 142 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 142 | 143 |
| 143 // Call StartWorker() after it's started. | 144 // Call StartWorker() after it's started. |
| 144 version_->StartWorker(CreateReceiverOnCurrentThread(&status3)); | 145 version_->StartWorker(CreateReceiverOnCurrentThread(&status3)); |
| 145 base::RunLoop().RunUntilIdle(); | 146 base::RunLoop().RunUntilIdle(); |
| 146 | 147 |
| 147 // All should just succeed. | 148 // All should just succeed. |
| 148 EXPECT_EQ(SERVICE_WORKER_OK, status1); | 149 EXPECT_EQ(SERVICE_WORKER_OK, status1); |
| 149 EXPECT_EQ(SERVICE_WORKER_OK, status2); | 150 EXPECT_EQ(SERVICE_WORKER_OK, status2); |
| 150 EXPECT_EQ(SERVICE_WORKER_OK, status3); | 151 EXPECT_EQ(SERVICE_WORKER_OK, status3); |
| 151 | 152 |
| 152 // Call StopWorker() multiple times. | 153 // Call StopWorker() multiple times. |
| 153 status1 = SERVICE_WORKER_ERROR_FAILED; | 154 status1 = SERVICE_WORKER_ERROR_FAILED; |
| 154 status2 = SERVICE_WORKER_ERROR_FAILED; | 155 status2 = SERVICE_WORKER_ERROR_FAILED; |
| 155 status3 = SERVICE_WORKER_ERROR_FAILED; | 156 status3 = SERVICE_WORKER_ERROR_FAILED; |
| 156 version_->StopWorker(CreateReceiverOnCurrentThread(&status1)); | 157 version_->StopWorker(CreateReceiverOnCurrentThread(&status1)); |
| 157 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); | 158 version_->StopWorker(CreateReceiverOnCurrentThread(&status2)); |
| 158 | 159 |
| 159 // Also try calling StartWorker while StopWorker is in queue. | 160 // Also try calling StartWorker while StopWorker is in queue. |
| 160 version_->StartWorker(CreateReceiverOnCurrentThread(&status3)); | 161 version_->StartWorker(CreateReceiverOnCurrentThread(&status3)); |
| 161 | 162 |
| 162 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->status()); | 163 EXPECT_EQ(ServiceWorkerVersion::STOPPING, version_->running_status()); |
| 163 base::RunLoop().RunUntilIdle(); | 164 base::RunLoop().RunUntilIdle(); |
| 164 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->status()); | 165 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 165 | 166 |
| 166 // All StopWorker should just succeed, while StartWorker fails. | 167 // All StopWorker should just succeed, while StartWorker fails. |
| 167 EXPECT_EQ(SERVICE_WORKER_OK, status1); | 168 EXPECT_EQ(SERVICE_WORKER_OK, status1); |
| 168 EXPECT_EQ(SERVICE_WORKER_OK, status2); | 169 EXPECT_EQ(SERVICE_WORKER_OK, status2); |
| 169 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status3); | 170 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status3); |
| 170 } | 171 } |
| 171 | 172 |
| 172 TEST_F(ServiceWorkerVersionTest, SendMessage) { | 173 TEST_F(ServiceWorkerVersionTest, SendMessage) { |
| 173 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->status()); | 174 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 174 | 175 |
| 175 // Send a message without starting the worker. | 176 // Send a message without starting the worker. |
| 176 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; | 177 ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_FAILED; |
| 177 version_->SendMessage(TestMsg_Message(), | 178 version_->SendMessage(TestMsg_Message(), |
| 178 CreateReceiverOnCurrentThread(&status)); | 179 CreateReceiverOnCurrentThread(&status)); |
| 179 base::RunLoop().RunUntilIdle(); | 180 base::RunLoop().RunUntilIdle(); |
| 180 EXPECT_EQ(SERVICE_WORKER_OK, status); | 181 EXPECT_EQ(SERVICE_WORKER_OK, status); |
| 181 | 182 |
| 182 // The worker should be now started. | 183 // The worker should be now started. |
| 183 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->status()); | 184 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 184 | 185 |
| 185 // Stop the worker, and then send the message immediately. | 186 // Stop the worker, and then send the message immediately. |
| 186 ServiceWorkerStatusCode msg_status = SERVICE_WORKER_ERROR_FAILED; | 187 ServiceWorkerStatusCode msg_status = SERVICE_WORKER_ERROR_FAILED; |
| 187 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED; | 188 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED; |
| 188 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status)); | 189 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status)); |
| 189 version_->SendMessage(TestMsg_Message(), | 190 version_->SendMessage(TestMsg_Message(), |
| 190 CreateReceiverOnCurrentThread(&msg_status)); | 191 CreateReceiverOnCurrentThread(&msg_status)); |
| 191 base::RunLoop().RunUntilIdle(); | 192 base::RunLoop().RunUntilIdle(); |
| 192 EXPECT_EQ(SERVICE_WORKER_OK, stop_status); | 193 EXPECT_EQ(SERVICE_WORKER_OK, stop_status); |
| 193 | 194 |
| 194 // SendMessage should return START_WORKER_FAILED error since it tried to | 195 // SendMessage should return START_WORKER_FAILED error since it tried to |
| 195 // start a worker while it was stopping. | 196 // start a worker while it was stopping. |
| 196 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, msg_status); | 197 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, msg_status); |
| 197 } | 198 } |
| 198 | 199 |
| 199 TEST_F(ServiceWorkerVersionTest, ReSendMessageAfterStop) { | 200 TEST_F(ServiceWorkerVersionTest, ReSendMessageAfterStop) { |
| 200 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->status()); | 201 EXPECT_EQ(ServiceWorkerVersion::STOPPED, version_->running_status()); |
| 201 | 202 |
| 202 // Start the worker. | 203 // Start the worker. |
| 203 ServiceWorkerStatusCode start_status = SERVICE_WORKER_ERROR_FAILED; | 204 ServiceWorkerStatusCode start_status = SERVICE_WORKER_ERROR_FAILED; |
| 204 version_->StartWorker(CreateReceiverOnCurrentThread(&start_status)); | 205 version_->StartWorker(CreateReceiverOnCurrentThread(&start_status)); |
| 205 base::RunLoop().RunUntilIdle(); | 206 base::RunLoop().RunUntilIdle(); |
| 206 EXPECT_EQ(SERVICE_WORKER_OK, start_status); | 207 EXPECT_EQ(SERVICE_WORKER_OK, start_status); |
| 207 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->status()); | 208 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 208 | 209 |
| 209 // Stop the worker, and then send the message immediately. | 210 // Stop the worker, and then send the message immediately. |
| 210 ServiceWorkerStatusCode msg_status = SERVICE_WORKER_ERROR_FAILED; | 211 ServiceWorkerStatusCode msg_status = SERVICE_WORKER_ERROR_FAILED; |
| 211 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED; | 212 ServiceWorkerStatusCode stop_status = SERVICE_WORKER_ERROR_FAILED; |
| 212 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status)); | 213 version_->StopWorker(CreateReceiverOnCurrentThread(&stop_status)); |
| 213 version_->SendMessage(TestMsg_Message(), | 214 version_->SendMessage(TestMsg_Message(), |
| 214 CreateReceiverOnCurrentThread(&msg_status)); | 215 CreateReceiverOnCurrentThread(&msg_status)); |
| 215 base::RunLoop().RunUntilIdle(); | 216 base::RunLoop().RunUntilIdle(); |
| 216 EXPECT_EQ(SERVICE_WORKER_OK, stop_status); | 217 EXPECT_EQ(SERVICE_WORKER_OK, stop_status); |
| 217 | 218 |
| 218 // SendMessage should return START_WORKER_FAILED error since it tried to | 219 // SendMessage should return START_WORKER_FAILED error since it tried to |
| 219 // start a worker while it was stopping. | 220 // start a worker while it was stopping. |
| 220 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, msg_status); | 221 EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, msg_status); |
| 221 | 222 |
| 222 // Resend the message, which should succeed and restart the worker. | 223 // Resend the message, which should succeed and restart the worker. |
| 223 version_->SendMessage(TestMsg_Message(), | 224 version_->SendMessage(TestMsg_Message(), |
| 224 CreateReceiverOnCurrentThread(&msg_status)); | 225 CreateReceiverOnCurrentThread(&msg_status)); |
| 225 base::RunLoop().RunUntilIdle(); | 226 base::RunLoop().RunUntilIdle(); |
| 226 EXPECT_EQ(SERVICE_WORKER_OK, msg_status); | 227 EXPECT_EQ(SERVICE_WORKER_OK, msg_status); |
| 227 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->status()); | 228 EXPECT_EQ(ServiceWorkerVersion::RUNNING, version_->running_status()); |
| 228 } | 229 } |
| 229 | 230 |
| 230 TEST_F(ServiceWorkerVersionTest, SendMessageAndRegisterCallback) { | 231 TEST_F(ServiceWorkerVersionTest, SendMessageAndRegisterCallback) { |
| 231 // Send multiple messages and verify responses. | 232 // Send multiple messages and verify responses. |
| 232 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; | 233 ServiceWorkerStatusCode status1 = SERVICE_WORKER_ERROR_FAILED; |
| 233 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; | 234 ServiceWorkerStatusCode status2 = SERVICE_WORKER_ERROR_FAILED; |
| 234 int value1 = -1, value2 = -1; | 235 int value1 = -1, value2 = -1; |
| 235 | 236 |
| 236 version_->SendMessageAndRegisterCallback( | 237 version_->SendMessageAndRegisterCallback( |
| 237 TestMsg_Request(111), | 238 TestMsg_Request(111), |
| 238 base::Bind(&ReceiveResponse, &status1, &value1)); | 239 base::Bind(&ReceiveResponse, &status1, &value1)); |
| 239 version_->SendMessageAndRegisterCallback( | 240 version_->SendMessageAndRegisterCallback( |
| 240 TestMsg_Request(333), | 241 TestMsg_Request(333), |
| 241 base::Bind(&ReceiveResponse, &status2, &value2)); | 242 base::Bind(&ReceiveResponse, &status2, &value2)); |
| 242 base::RunLoop().RunUntilIdle(); | 243 base::RunLoop().RunUntilIdle(); |
| 243 | 244 |
| 244 EXPECT_EQ(SERVICE_WORKER_OK, status1); | 245 EXPECT_EQ(SERVICE_WORKER_OK, status1); |
| 245 EXPECT_EQ(SERVICE_WORKER_OK, status2); | 246 EXPECT_EQ(SERVICE_WORKER_OK, status2); |
| 246 EXPECT_EQ(111 * 2, value1); | 247 EXPECT_EQ(111 * 2, value1); |
| 247 EXPECT_EQ(333 * 2, value2); | 248 EXPECT_EQ(333 * 2, value2); |
| 248 } | 249 } |
| 249 | 250 |
| 250 } // namespace content | 251 } // namespace content |
| OLD | NEW |