Chromium Code Reviews| Index: content/browser/service_worker/service_worker_version_unittest.cc |
| diff --git a/content/browser/service_worker/service_worker_version_unittest.cc b/content/browser/service_worker/service_worker_version_unittest.cc |
| index b8a5e89414c9f719780b45165f1a2d6ae52c2485..2568057f118b61a8088e7da9665e30e5898d429a 100644 |
| --- a/content/browser/service_worker/service_worker_version_unittest.cc |
| +++ b/content/browser/service_worker/service_worker_version_unittest.cc |
| @@ -11,6 +11,7 @@ |
| #include "base/memory/ptr_util.h" |
| #include "base/run_loop.h" |
| #include "base/test/histogram_tester.h" |
| +#include "base/test/simple_test_tick_clock.h" |
| #include "base/time/time.h" |
| #include "content/browser/service_worker/embedded_worker_registry.h" |
| #include "content/browser/service_worker/embedded_worker_status.h" |
| @@ -281,6 +282,12 @@ class ServiceWorkerVersionTest : public testing::Test { |
| EXPECT_EQ(SERVICE_WORKER_ERROR_MAX_VALUE, status); |
| } |
| + base::SimpleTestTickClock* SetTickClockForTesting() { |
| + base::SimpleTestTickClock* tick_clock = new base::SimpleTestTickClock(); |
| + version_->SetTickClockForTesting(base::WrapUnique(tick_clock)); |
| + return tick_clock; |
| + } |
| + |
| TestBrowserThreadBundle thread_bundle_; |
| std::unique_ptr<MessageReceiver> helper_; |
| scoped_refptr<ServiceWorkerRegistration> registration_; |
| @@ -875,7 +882,7 @@ TEST_P(ServiceWorkerVersionTestP, RequestTimeout) { |
| base::Time::Now())); |
| } |
| -TEST_P(ServiceWorkerVersionTestP, RequestCustomizedTimeout) { |
| +TEST_P(ServiceWorkerVersionTestP, RequestNowTimeout) { |
| ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| @@ -902,7 +909,7 @@ TEST_P(ServiceWorkerVersionTestP, RequestCustomizedTimeout) { |
| EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); |
| } |
| -TEST_P(ServiceWorkerVersionTestP, RequestCustomizedTimeoutKill) { |
| +TEST_P(ServiceWorkerVersionTestP, RequestNowTimeoutKill) { |
| ServiceWorkerStatusCode status = SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| @@ -929,6 +936,68 @@ TEST_P(ServiceWorkerVersionTestP, RequestCustomizedTimeoutKill) { |
| EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); |
| } |
| +TEST_P(ServiceWorkerVersionTestP, RequestCustomizedTimeout) { |
| + ServiceWorkerStatusCode first_status = |
| + SERVICE_WORKER_ERROR_NETWORK; // dummy value |
|
Marijn Kruisselbrink
2016/12/02 00:15:52
nit: new code generally uses SERVICE_WORKER_ERROR_
harkness
2016/12/02 10:15:33
Done.
|
| + ServiceWorkerStatusCode second_status = |
| + SERVICE_WORKER_ERROR_NETWORK; // dummy value |
| + version_->SetStatus(ServiceWorkerVersion::ACTIVATED); |
| + |
| + version_->StartWorker(ServiceWorkerMetrics::EventType::SYNC, |
| + base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
| + base::RunLoop().RunUntilIdle(); |
| + |
| + base::SimpleTestTickClock* tick_clock = SetTickClockForTesting(); |
| + |
| + // Create two requests. One which times out in 10 seconds, one in 20 seconds. |
| + int timeout_seconds = 10; |
| + int first_request_id = version_->StartRequestWithCustomTimeout( |
| + ServiceWorkerMetrics::EventType::SYNC, |
| + CreateReceiverOnCurrentThread(&first_status), |
| + base::TimeDelta::FromSeconds(2 * timeout_seconds), |
| + ServiceWorkerVersion::KILL_ON_TIMEOUT); |
| + |
| + int second_request_id = version_->StartRequestWithCustomTimeout( |
| + ServiceWorkerMetrics::EventType::SYNC, |
| + CreateReceiverOnCurrentThread(&second_status), |
| + base::TimeDelta::FromSeconds(timeout_seconds), |
| + ServiceWorkerVersion::CONTINUE_ON_TIMEOUT); |
| + |
| + // The status should not have changed since neither task has timed out yet. |
| + base::RunLoop().RunUntilIdle(); |
| + EXPECT_TRUE(version_->timeout_timer_.IsRunning()); |
| + version_->timeout_timer_.user_task().Run(); |
| + base::RunLoop().RunUntilIdle(); |
| + EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, first_status); |
| + EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, second_status); |
| + |
| + // Now advance time until the second task timeout should expire. |
| + tick_clock->Advance(base::TimeDelta::FromSeconds(timeout_seconds + 1)); |
| + version_->timeout_timer_.user_task().Run(); |
| + base::RunLoop().RunUntilIdle(); |
| + EXPECT_EQ(SERVICE_WORKER_ERROR_NETWORK, first_status); |
| + EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, second_status); |
| + |
| + // CONTINUE_ON_TIMEOUT timeouts don't stop the service worker. |
| + EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, version_->running_status()); |
| + |
| + // Now advance time until both tasks should be expired. |
| + tick_clock->Advance(base::TimeDelta::FromSeconds(timeout_seconds + 1)); |
| + version_->timeout_timer_.user_task().Run(); |
| + base::RunLoop().RunUntilIdle(); |
| + EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, first_status); |
| + EXPECT_EQ(SERVICE_WORKER_ERROR_TIMEOUT, second_status); |
| + |
| + EXPECT_FALSE(version_->FinishRequest(first_request_id, true /* was_handled */, |
| + base::Time::Now())); |
| + |
| + EXPECT_FALSE(version_->FinishRequest( |
| + second_request_id, true /* was_handled */, base::Time::Now())); |
| + |
| + // KILL_ON_TIMEOUT timeouts should stop the service worker. |
| + EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, version_->running_status()); |
| +} |
| + |
| TEST_P(ServiceWorkerVersionTestP, MixedRequestTimeouts) { |
| ServiceWorkerStatusCode sync_status = |
| SERVICE_WORKER_ERROR_NETWORK; // dummy value |