Index: content/browser/service_worker/service_worker_cache_unittest.cc |
diff --git a/content/browser/service_worker/service_worker_cache_unittest.cc b/content/browser/service_worker/service_worker_cache_unittest.cc |
index e7dbb07ef8c9752b7c32e4def98c99c666eb9a0d..c313228e98a60bfff9524f0d838cf2bc65b66eef 100644 |
--- a/content/browser/service_worker/service_worker_cache_unittest.cc |
+++ b/content/browser/service_worker/service_worker_cache_unittest.cc |
@@ -908,6 +908,45 @@ TEST_P(ServiceWorkerCacheTestP, ClosedDuringPutOpenEntry) { |
VerifyAllOpsFail(); |
} |
+TEST_P(ServiceWorkerCacheTestP, VerifySerialScheduling) { |
+ // Start two operations, the first one is delayed but the second isn't. The |
+ // second should wait for the first. |
+ EXPECT_TRUE(Keys()); // Opens the backend. |
+ DelayableBackend* delayable_backend = cache_->UseDelayableBackend(); |
+ delayable_backend->set_delay_open(true); |
+ |
+ scoped_ptr<ServiceWorkerResponse> response1 = |
+ CopyFetchResponse(body_response_); |
+ response1->status_code = 1; |
+ |
+ scoped_ptr<base::RunLoop> close_loop1(new base::RunLoop()); |
+ cache_->Put(CopyFetchRequest(body_request_), response1.Pass(), |
+ base::Bind(&ServiceWorkerCacheTest::ResponseAndErrorCallback, |
+ base::Unretained(this), close_loop1.get())); |
+ |
+ // Blocks on opening the cache entry. |
+ base::RunLoop().RunUntilIdle(); |
+ |
+ delayable_backend->set_delay_open(false); |
+ scoped_ptr<ServiceWorkerResponse> response2 = |
+ CopyFetchResponse(body_response_); |
+ response2->status_code = 2; |
+ scoped_ptr<base::RunLoop> close_loop2(new base::RunLoop()); |
+ cache_->Put(CopyFetchRequest(body_request_), response2.Pass(), |
+ base::Bind(&ServiceWorkerCacheTest::ResponseAndErrorCallback, |
+ base::Unretained(this), close_loop2.get())); |
+ |
+ // The second put operation should wait for the first to complete. |
+ base::RunLoop().RunUntilIdle(); |
+ EXPECT_FALSE(callback_response_); |
+ |
+ delayable_backend->OpenEntryContinue(); |
+ close_loop1->Run(); |
+ EXPECT_EQ(1, callback_response_->status_code); |
+ close_loop2->Run(); |
+ EXPECT_EQ(2, callback_response_->status_code); |
+} |
+ |
INSTANTIATE_TEST_CASE_P(ServiceWorkerCacheTest, |
ServiceWorkerCacheTestP, |
::testing::Values(false, true)); |