Index: content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
diff --git a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
index 74822260e9d204cfd3214101cfdb4200233d794e..ae1a53895d9254e365df22d77c5fc236061a30d1 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host_unittest.cc |
@@ -12,6 +12,7 @@ |
#include "base/files/file_path.h" |
#include "base/memory/ptr_util.h" |
#include "base/run_loop.h" |
+#include "base/test/simple_test_tick_clock.h" |
#include "base/time/time.h" |
#include "content/browser/browser_thread_impl.h" |
#include "content/browser/message_port_service.h" |
@@ -694,11 +695,34 @@ TEST_P(ServiceWorkerDispatcherHostTestP, DispatchExtendableMessageEvent) { |
version_->version_id()); |
const int ref_count = sender_worker_handle->ref_count(); |
+ // Set mock clock on version_ to check timeout behavior. |
+ base::SimpleTestTickClock* tick_clock = new base::SimpleTestTickClock(); |
+ tick_clock->SetNowTicks(base::TimeTicks::Now()); |
+ version_->SetTickClockForTesting(base::WrapUnique(tick_clock)); |
+ |
+ // Make sure worker has a non-zero timeout. |
+ bool called = false; |
+ ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
+ version_->StartWorker(ServiceWorkerMetrics::EventType::UNKNOWN, |
+ base::Bind(&SaveStatusCallback, &called, &status)); |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_TRUE(called); |
+ EXPECT_EQ(SERVICE_WORKER_OK, status); |
+ version_->StartRequestWithCustomTimeout( |
+ ServiceWorkerMetrics::EventType::ACTIVATE, |
+ base::Bind(&ServiceWorkerUtils::NoOpStatusCallback), |
+ base::TimeDelta::FromSeconds(10), ServiceWorkerVersion::KILL_ON_TIMEOUT); |
+ |
+ // Advance clock by a couple seconds. |
+ tick_clock->Advance(base::TimeDelta::FromSeconds(4)); |
+ base::TimeDelta remaining_time = version_->remaining_timeout(); |
+ EXPECT_EQ(base::TimeDelta::FromSeconds(6), remaining_time); |
+ |
// Dispatch ExtendableMessageEvent. |
std::vector<int> ports; |
SetUpDummyMessagePort(&ports); |
- bool called = false; |
- ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_MAX_VALUE; |
+ called = false; |
+ status = SERVICE_WORKER_ERROR_MAX_VALUE; |
DispatchExtendableMessageEvent( |
version_, base::string16(), url::Origin(version_->scope().GetOrigin()), |
ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status)); |
@@ -714,6 +738,9 @@ TEST_P(ServiceWorkerDispatcherHostTestP, DispatchExtendableMessageEvent) { |
EXPECT_TRUE(MessagePortService::GetInstance()->AreMessagesHeld(port)); |
EXPECT_EQ(ref_count + 1, sender_worker_handle->ref_count()); |
+ |
+ // Timeout of message event should not have extended life of service worker. |
+ EXPECT_EQ(remaining_time, version_->remaining_timeout()); |
} |
TEST_P(ServiceWorkerDispatcherHostTestP, DispatchExtendableMessageEvent_Fail) { |
@@ -721,20 +748,9 @@ TEST_P(ServiceWorkerDispatcherHostTestP, DispatchExtendableMessageEvent_Fail) { |
GURL script_url = GURL("http://www.example.com/service_worker.js"); |
Initialize(base::WrapUnique(new FailToStartWorkerTestHelper)); |
- SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_CONTROLLER, pattern); |
+ SendProviderCreated(SERVICE_WORKER_PROVIDER_FOR_WORKER, pattern); |
SetUpRegistration(pattern, script_url); |
- // Set the running hosted version so that we can retrieve a valid service |
- // worker object information for the source attribute of the message event. |
- provider_host_->running_hosted_version_ = version_; |
- |
- // Set aside the initial refcount of the worker handle. |
- provider_host_->GetOrCreateServiceWorkerHandle(version_.get()); |
- ServiceWorkerHandle* sender_worker_handle = |
- dispatcher_host_->FindServiceWorkerHandle(provider_host_->provider_id(), |
- version_->version_id()); |
- const int ref_count = sender_worker_handle->ref_count(); |
- |
// Try to dispatch ExtendableMessageEvent. This should fail to start the |
// worker and to dispatch the event. |
std::vector<int> ports; |
@@ -746,7 +762,6 @@ TEST_P(ServiceWorkerDispatcherHostTestP, DispatchExtendableMessageEvent_Fail) { |
ports, provider_host_, base::Bind(&SaveStatusCallback, &called, &status)); |
for (int port : ports) |
EXPECT_TRUE(MessagePortService::GetInstance()->AreMessagesHeld(port)); |
- EXPECT_EQ(ref_count + 1, sender_worker_handle->ref_count()); |
base::RunLoop().RunUntilIdle(); |
EXPECT_TRUE(called); |
EXPECT_EQ(SERVICE_WORKER_ERROR_START_WORKER_FAILED, status); |
@@ -754,7 +769,6 @@ TEST_P(ServiceWorkerDispatcherHostTestP, DispatchExtendableMessageEvent_Fail) { |
// The error callback should clean up the ports and handle. |
for (int port : ports) |
EXPECT_FALSE(MessagePortService::GetInstance()->AreMessagesHeld(port)); |
- EXPECT_EQ(ref_count, sender_worker_handle->ref_count()); |
} |
TEST_P(ServiceWorkerDispatcherHostTestP, OnSetHostedVersionId) { |