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

Side by Side Diff: content/browser/cache_storage/cache_storage_cache_unittest.cc

Issue 1113303003: CacheStorage: Support multiple batch operations (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@remove_responses
Patch Set: address review comments and add tests Created 5 years, 7 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 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 "content/browser/cache_storage/cache_storage_cache.h" 5 #include "content/browser/cache_storage/cache_storage_cache.h"
6 6
7 #include "base/files/file_path.h" 7 #include "base/files/file_path.h"
8 #include "base/files/scoped_temp_dir.h" 8 #include "base/files/scoped_temp_dir.h"
9 #include "base/message_loop/message_loop_proxy.h" 9 #include "base/message_loop/message_loop_proxy.h"
10 #include "base/run_loop.h" 10 #include "base/run_loop.h"
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 blink::WebServiceWorkerResponseTypeDefault, headers, "", 0, GURL()); 245 blink::WebServiceWorkerResponseTypeDefault, headers, "", 0, GURL());
246 } 246 }
247 247
248 scoped_ptr<ServiceWorkerFetchRequest> CopyFetchRequest( 248 scoped_ptr<ServiceWorkerFetchRequest> CopyFetchRequest(
249 const ServiceWorkerFetchRequest& request) { 249 const ServiceWorkerFetchRequest& request) {
250 return make_scoped_ptr(new ServiceWorkerFetchRequest( 250 return make_scoped_ptr(new ServiceWorkerFetchRequest(
251 request.url, request.method, request.headers, request.referrer, 251 request.url, request.method, request.headers, request.referrer,
252 request.is_reload)); 252 request.is_reload));
253 } 253 }
254 254
255 scoped_ptr<ServiceWorkerResponse> CopyFetchResponse( 255 CacheStorageCache::ErrorType BatchOperation(
256 const ServiceWorkerResponse& response) { 256 const std::vector<CacheStorageBatchOperation>& operations) {
257 scoped_ptr<ServiceWorkerResponse> sw_response(new ServiceWorkerResponse(
258 response.url, response.status_code, response.status_text,
259 response.response_type, response.headers, response.blob_uuid,
260 response.blob_size, response.stream_url));
261 return sw_response.Pass();
262 }
263
264 bool Put(const ServiceWorkerFetchRequest& request,
265 const ServiceWorkerResponse& response) {
266 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); 257 scoped_ptr<base::RunLoop> loop(new base::RunLoop());
267 258
268 cache_->Put( 259 cache_->BatchOperation(
269 CopyFetchRequest(request), CopyFetchResponse(response), 260 operations,
270 base::Bind(&CacheStorageCacheTest::ErrorTypeCallback, 261 base::Bind(&CacheStorageCacheTest::ErrorTypeCallback,
271 base::Unretained(this), base::Unretained(loop.get()))); 262 base::Unretained(this), base::Unretained(loop.get())));
272 // TODO(jkarlin): These functions should use base::RunLoop().RunUntilIdle() 263 // TODO(jkarlin): These functions should use base::RunLoop().RunUntilIdle()
273 // once the cache uses a passed in MessageLoopProxy instead of the CACHE 264 // once the cache uses a passed in MessageLoopProxy instead of the CACHE
274 // thread. 265 // thread.
275 loop->Run(); 266 loop->Run();
276 267
277 return callback_error_ == CacheStorageCache::ERROR_TYPE_OK; 268 return callback_error_;
269 }
270
271 bool Put(const ServiceWorkerFetchRequest& request,
272 const ServiceWorkerResponse& response) {
273 CacheStorageBatchOperation operation;
274 operation.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
275 operation.request = request;
276 operation.response = response;
277
278 CacheStorageCache::ErrorType error =
279 BatchOperation(std::vector<CacheStorageBatchOperation>(1, operation));
280 return error == CacheStorageCache::ERROR_TYPE_OK;
278 } 281 }
279 282
280 bool Match(const ServiceWorkerFetchRequest& request) { 283 bool Match(const ServiceWorkerFetchRequest& request) {
281 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); 284 scoped_ptr<base::RunLoop> loop(new base::RunLoop());
282 285
283 cache_->Match( 286 cache_->Match(
284 CopyFetchRequest(request), 287 CopyFetchRequest(request),
285 base::Bind(&CacheStorageCacheTest::ResponseAndErrorCallback, 288 base::Bind(&CacheStorageCacheTest::ResponseAndErrorCallback,
286 base::Unretained(this), base::Unretained(loop.get()))); 289 base::Unretained(this), base::Unretained(loop.get())));
287 loop->Run(); 290 loop->Run();
288 291
289 return callback_error_ == CacheStorageCache::ERROR_TYPE_OK; 292 return callback_error_ == CacheStorageCache::ERROR_TYPE_OK;
290 } 293 }
291 294
292 bool Delete(const ServiceWorkerFetchRequest& request) { 295 bool Delete(const ServiceWorkerFetchRequest& request) {
293 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); 296 CacheStorageBatchOperation operation;
297 operation.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_DELETE;
298 operation.request = request;
294 299
295 cache_->Delete( 300 CacheStorageCache::ErrorType error =
296 CopyFetchRequest(request), 301 BatchOperation(std::vector<CacheStorageBatchOperation>(1, operation));
297 base::Bind(&CacheStorageCacheTest::ErrorTypeCallback, 302 return error == CacheStorageCache::ERROR_TYPE_OK;
298 base::Unretained(this), base::Unretained(loop.get())));
299 loop->Run();
300
301 return callback_error_ == CacheStorageCache::ERROR_TYPE_OK;
302 } 303 }
303 304
304 bool Keys() { 305 bool Keys() {
305 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); 306 scoped_ptr<base::RunLoop> loop(new base::RunLoop());
306 307
307 cache_->Keys(base::Bind(&CacheStorageCacheTest::RequestsCallback, 308 cache_->Keys(base::Bind(&CacheStorageCacheTest::RequestsCallback,
308 base::Unretained(this), 309 base::Unretained(this),
309 base::Unretained(loop.get()))); 310 base::Unretained(loop.get())));
310 loop->Run(); 311 loop->Run();
311 312
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
452 }; 453 };
453 454
454 TEST_P(CacheStorageCacheTestP, PutNoBody) { 455 TEST_P(CacheStorageCacheTestP, PutNoBody) {
455 EXPECT_TRUE(Put(no_body_request_, no_body_response_)); 456 EXPECT_TRUE(Put(no_body_request_, no_body_response_));
456 } 457 }
457 458
458 TEST_P(CacheStorageCacheTestP, PutBody) { 459 TEST_P(CacheStorageCacheTestP, PutBody) {
459 EXPECT_TRUE(Put(body_request_, body_response_)); 460 EXPECT_TRUE(Put(body_request_, body_response_));
460 } 461 }
461 462
463 TEST_P(CacheStorageCacheTestP, PutBody_Multiple) {
464 CacheStorageBatchOperation operation1;
465 operation1.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
466 operation1.request = body_request_;
467 operation1.request.url = GURL("http://example.com/1");
468 operation1.response = body_response_;
469 operation1.response.url = GURL("http://example.com/1");
470
471 CacheStorageBatchOperation operation2;
472 operation2.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
473 operation2.request = body_request_;
474 operation2.request.url = GURL("http://example.com/2");
475 operation2.response = body_response_;
476 operation2.response.url = GURL("http://example.com/2");
477
478 CacheStorageBatchOperation operation3;
479 operation3.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
480 operation3.request = body_request_;
481 operation3.request.url = GURL("http://example.com/3");
482 operation3.response = body_response_;
483 operation3.response.url = GURL("http://example.com/3");
484
485 std::vector<CacheStorageBatchOperation> operations;
486 operations.push_back(operation1);
487 operations.push_back(operation2);
488 operations.push_back(operation3);
489
490 EXPECT_EQ(CacheStorageCache::ERROR_TYPE_OK, BatchOperation(operations));
491 EXPECT_TRUE(Match(operation1.request));
492 EXPECT_TRUE(Match(operation2.request));
493 EXPECT_TRUE(Match(operation3.request));
494 }
495
462 TEST_P(CacheStorageCacheTestP, ResponseURLDiffersFromRequestURL) { 496 TEST_P(CacheStorageCacheTestP, ResponseURLDiffersFromRequestURL) {
463 no_body_response_.url = GURL("http://example.com/foobar"); 497 no_body_response_.url = GURL("http://example.com/foobar");
464 EXPECT_STRNE("http://example.com/foobar", 498 EXPECT_STRNE("http://example.com/foobar",
465 no_body_request_.url.spec().c_str()); 499 no_body_request_.url.spec().c_str());
466 EXPECT_TRUE(Put(no_body_request_, no_body_response_)); 500 EXPECT_TRUE(Put(no_body_request_, no_body_response_));
467 EXPECT_TRUE(Match(no_body_request_)); 501 EXPECT_TRUE(Match(no_body_request_));
468 EXPECT_STREQ("http://example.com/foobar", 502 EXPECT_STREQ("http://example.com/foobar",
469 callback_response_->url.spec().c_str()); 503 callback_response_->url.spec().c_str());
470 } 504 }
471 505
472 TEST_P(CacheStorageCacheTestP, ResponseURLEmpty) { 506 TEST_P(CacheStorageCacheTestP, ResponseURLEmpty) {
473 no_body_response_.url = GURL(); 507 no_body_response_.url = GURL();
474 EXPECT_STRNE("", no_body_request_.url.spec().c_str()); 508 EXPECT_STRNE("", no_body_request_.url.spec().c_str());
475 EXPECT_TRUE(Put(no_body_request_, no_body_response_)); 509 EXPECT_TRUE(Put(no_body_request_, no_body_response_));
476 EXPECT_TRUE(Match(no_body_request_)); 510 EXPECT_TRUE(Match(no_body_request_));
477 EXPECT_STREQ("", callback_response_->url.spec().c_str()); 511 EXPECT_STREQ("", callback_response_->url.spec().c_str());
478 } 512 }
479 513
480 TEST_F(CacheStorageCacheTest, PutBodyDropBlobRef) { 514 TEST_F(CacheStorageCacheTest, PutBodyDropBlobRef) {
515 CacheStorageBatchOperation operation;
516 operation.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
517 operation.request = body_request_;
518 operation.response = body_response_;
519
481 scoped_ptr<base::RunLoop> loop(new base::RunLoop()); 520 scoped_ptr<base::RunLoop> loop(new base::RunLoop());
482 cache_->Put(CopyFetchRequest(body_request_), 521 cache_->BatchOperation(
483 CopyFetchResponse(body_response_), 522 std::vector<CacheStorageBatchOperation>(1, operation),
484 base::Bind(&CacheStorageCacheTestP::ErrorTypeCallback, 523 base::Bind(&CacheStorageCacheTestP::ErrorTypeCallback,
485 base::Unretained(this), base::Unretained(loop.get()))); 524 base::Unretained(this), base::Unretained(loop.get())));
486 // The handle should be held by the cache now so the deref here should be 525 // The handle should be held by the cache now so the deref here should be
487 // okay. 526 // okay.
488 blob_handle_.reset(); 527 blob_handle_.reset();
489 loop->Run(); 528 loop->Run();
490 529
491 EXPECT_EQ(CacheStorageCache::ERROR_TYPE_OK, callback_error_); 530 EXPECT_EQ(CacheStorageCache::ERROR_TYPE_OK, callback_error_);
492 } 531 }
493 532
494 TEST_P(CacheStorageCacheTestP, PutReplace) { 533 TEST_P(CacheStorageCacheTestP, PutReplace) {
495 EXPECT_TRUE(Put(body_request_, no_body_response_)); 534 EXPECT_TRUE(Put(body_request_, no_body_response_));
496 EXPECT_TRUE(Match(body_request_)); 535 EXPECT_TRUE(Match(body_request_));
497 EXPECT_FALSE(callback_response_data_); 536 EXPECT_FALSE(callback_response_data_);
498 537
499 EXPECT_TRUE(Put(body_request_, body_response_)); 538 EXPECT_TRUE(Put(body_request_, body_response_));
500 EXPECT_TRUE(Match(body_request_)); 539 EXPECT_TRUE(Match(body_request_));
501 EXPECT_TRUE(callback_response_data_); 540 EXPECT_TRUE(callback_response_data_);
502 541
503 EXPECT_TRUE(Put(body_request_, no_body_response_)); 542 EXPECT_TRUE(Put(body_request_, no_body_response_));
504 EXPECT_TRUE(Match(body_request_)); 543 EXPECT_TRUE(Match(body_request_));
505 EXPECT_FALSE(callback_response_data_); 544 EXPECT_FALSE(callback_response_data_);
506 } 545 }
507 546
547 TEST_P(CacheStorageCacheTestP, PutReplcaceInBatch) {
548 CacheStorageBatchOperation operation1;
549 operation1.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
550 operation1.request = body_request_;
551 operation1.response = no_body_response_;
552
553 CacheStorageBatchOperation operation2;
554 operation2.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
555 operation2.request = body_request_;
556 operation2.response = body_response_;
557
558 std::vector<CacheStorageBatchOperation> operations;
559 operations.push_back(operation1);
560 operations.push_back(operation2);
561
562 EXPECT_EQ(CacheStorageCache::ERROR_TYPE_OK, BatchOperation(operations));
563
564 // |operation2| should win.
565 EXPECT_TRUE(Match(operation2.request));
566 EXPECT_TRUE(callback_response_data_);
567 }
568
jkarlin 2015/05/08 11:45:43 Add a test to show that you can mix delete and put
jkarlin 2015/05/08 11:45:43 Also add a test that if the first batch operation
nhiroki 2015/05/08 15:09:01 Do you have any ideas to fail only one operation i
nhiroki 2015/05/08 15:09:01 The current implementation has "DCHECK_EQ(1u, oper
jkarlin 2015/05/08 15:27:27 Yes, please add a TODO to add the test and add a b
jkarlin 2015/05/08 15:27:27 Good point. Never mind on this test.
nhiroki 2015/05/11 07:35:04 Done.
508 TEST_P(CacheStorageCacheTestP, MatchNoBody) { 569 TEST_P(CacheStorageCacheTestP, MatchNoBody) {
509 EXPECT_TRUE(Put(no_body_request_, no_body_response_)); 570 EXPECT_TRUE(Put(no_body_request_, no_body_response_));
510 EXPECT_TRUE(Match(no_body_request_)); 571 EXPECT_TRUE(Match(no_body_request_));
511 EXPECT_EQ(200, callback_response_->status_code); 572 EXPECT_EQ(200, callback_response_->status_code);
512 EXPECT_STREQ("OK", callback_response_->status_text.c_str()); 573 EXPECT_STREQ("OK", callback_response_->status_text.c_str());
513 EXPECT_STREQ("http://example.com/no_body.html", 574 EXPECT_STREQ("http://example.com/no_body.html",
514 callback_response_->url.spec().c_str()); 575 callback_response_->url.spec().c_str());
515 EXPECT_STREQ("", callback_response_->blob_uuid.c_str()); 576 EXPECT_STREQ("", callback_response_->blob_uuid.c_str());
516 EXPECT_EQ(0u, callback_response_->blob_size); 577 EXPECT_EQ(0u, callback_response_->blob_size);
517 } 578 }
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
757 818
758 TEST_P(CacheStorageCacheTestP, VerifySerialScheduling) { 819 TEST_P(CacheStorageCacheTestP, VerifySerialScheduling) {
759 // Start two operations, the first one is delayed but the second isn't. The 820 // Start two operations, the first one is delayed but the second isn't. The
760 // second should wait for the first. 821 // second should wait for the first.
761 EXPECT_TRUE(Keys()); // Opens the backend. 822 EXPECT_TRUE(Keys()); // Opens the backend.
762 DelayableBackend* delayable_backend = cache_->UseDelayableBackend(); 823 DelayableBackend* delayable_backend = cache_->UseDelayableBackend();
763 delayable_backend->set_delay_open(true); 824 delayable_backend->set_delay_open(true);
764 825
765 int sequence_out = -1; 826 int sequence_out = -1;
766 827
767 scoped_ptr<ServiceWorkerResponse> response1 = 828 CacheStorageBatchOperation operation1;
768 CopyFetchResponse(body_response_); 829 operation1.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
830 operation1.request = body_request_;
831 operation1.response = body_response_;
832
769 scoped_ptr<base::RunLoop> close_loop1(new base::RunLoop()); 833 scoped_ptr<base::RunLoop> close_loop1(new base::RunLoop());
770 cache_->Put( 834 cache_->BatchOperation(
771 CopyFetchRequest(body_request_), response1.Pass(), 835 std::vector<CacheStorageBatchOperation>(1, operation1),
772 base::Bind(&CacheStorageCacheTest::SequenceCallback, 836 base::Bind(&CacheStorageCacheTest::SequenceCallback,
773 base::Unretained(this), 1, &sequence_out, close_loop1.get())); 837 base::Unretained(this), 1, &sequence_out, close_loop1.get()));
774 838
775 // Blocks on opening the cache entry. 839 // Blocks on opening the cache entry.
776 base::RunLoop().RunUntilIdle(); 840 base::RunLoop().RunUntilIdle();
777 841
842 CacheStorageBatchOperation operation2;
843 operation2.operation_type = CACHE_STORAGE_CACHE_OPERATION_TYPE_PUT;
844 operation2.request = body_request_;
845 operation2.response = body_response_;
846
778 delayable_backend->set_delay_open(false); 847 delayable_backend->set_delay_open(false);
779 scoped_ptr<ServiceWorkerResponse> response2 =
780 CopyFetchResponse(body_response_);
781 scoped_ptr<base::RunLoop> close_loop2(new base::RunLoop()); 848 scoped_ptr<base::RunLoop> close_loop2(new base::RunLoop());
782 cache_->Put( 849 cache_->BatchOperation(
783 CopyFetchRequest(body_request_), response2.Pass(), 850 std::vector<CacheStorageBatchOperation>(1, operation2),
784 base::Bind(&CacheStorageCacheTest::SequenceCallback, 851 base::Bind(&CacheStorageCacheTest::SequenceCallback,
785 base::Unretained(this), 2, &sequence_out, close_loop2.get())); 852 base::Unretained(this), 2, &sequence_out, close_loop2.get()));
786 853
787 // The second put operation should wait for the first to complete. 854 // The second put operation should wait for the first to complete.
788 base::RunLoop().RunUntilIdle(); 855 base::RunLoop().RunUntilIdle();
789 EXPECT_FALSE(callback_response_); 856 EXPECT_FALSE(callback_response_);
790 857
791 delayable_backend->OpenEntryContinue(); 858 delayable_backend->OpenEntryContinue();
792 close_loop1->Run(); 859 close_loop1->Run();
793 EXPECT_EQ(1, sequence_out); 860 EXPECT_EQ(1, sequence_out);
794 close_loop2->Run(); 861 close_loop2->Run();
795 EXPECT_EQ(2, sequence_out); 862 EXPECT_EQ(2, sequence_out);
796 } 863 }
797 864
798 INSTANTIATE_TEST_CASE_P(CacheStorageCacheTest, 865 INSTANTIATE_TEST_CASE_P(CacheStorageCacheTest,
799 CacheStorageCacheTestP, 866 CacheStorageCacheTestP,
800 ::testing::Values(false, true)); 867 ::testing::Values(false, true));
801 868
802 } // namespace content 869 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698