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

Side by Side Diff: net/http/http_cache_unittest.cc

Issue 2970133002: DoomPartialEntry should not attempt to doom an already doomed entry. (Closed)
Patch Set: Rebased with refs/heads/master@{#485330} Created 3 years, 5 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 (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "net/http/http_cache.h" 5 #include "net/http/http_cache.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <algorithm> 9 #include <algorithm>
10 #include <memory> 10 #include <memory>
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
140 // same value. 140 // same value.
141 EXPECT_FALSE(load_timing_info.send_start.is_null()); 141 EXPECT_FALSE(load_timing_info.send_start.is_null());
142 EXPECT_EQ(load_timing_info.send_start, load_timing_info.send_end); 142 EXPECT_EQ(load_timing_info.send_start, load_timing_info.send_end);
143 143
144 // Set by URLRequest / URLRequestHttpJob, at a higher level. 144 // Set by URLRequest / URLRequestHttpJob, at a higher level.
145 EXPECT_TRUE(load_timing_info.request_start_time.is_null()); 145 EXPECT_TRUE(load_timing_info.request_start_time.is_null());
146 EXPECT_TRUE(load_timing_info.request_start.is_null()); 146 EXPECT_TRUE(load_timing_info.request_start.is_null());
147 EXPECT_TRUE(load_timing_info.receive_headers_end.is_null()); 147 EXPECT_TRUE(load_timing_info.receive_headers_end.is_null());
148 } 148 }
149 149
150 void DeferNetworkStart(bool* defer) { 150 void DeferCallback(bool* defer) {
151 *defer = true; 151 *defer = true;
152 } 152 }
153 153
154 class DeleteCacheCompletionCallback : public TestCompletionCallbackBase { 154 class DeleteCacheCompletionCallback : public TestCompletionCallbackBase {
155 public: 155 public:
156 explicit DeleteCacheCompletionCallback(MockHttpCache* cache) 156 explicit DeleteCacheCompletionCallback(MockHttpCache* cache)
157 : cache_(cache), 157 : cache_(cache),
158 callback_(base::Bind(&DeleteCacheCompletionCallback::OnComplete, 158 callback_(base::Bind(&DeleteCacheCompletionCallback::OnComplete,
159 base::Unretained(this))) { 159 base::Unretained(this))) {
160 } 160 }
(...skipping 1310 matching lines...) Expand 10 before | Expand all | Expand 10 after
1471 c->result = c->callback.WaitForResult(); 1471 c->result = c->callback.WaitForResult();
1472 1472
1473 ReadAndVerifyTransaction(c->trans.get(), kRangeGET_TransactionOK); 1473 ReadAndVerifyTransaction(c->trans.get(), kRangeGET_TransactionOK);
1474 } 1474 }
1475 1475
1476 EXPECT_EQ(5, cache.network_layer()->transaction_count()); 1476 EXPECT_EQ(5, cache.network_layer()->transaction_count());
1477 EXPECT_EQ(0, cache.disk_cache()->open_count()); 1477 EXPECT_EQ(0, cache.disk_cache()->open_count());
1478 EXPECT_EQ(5, cache.disk_cache()->create_count()); 1478 EXPECT_EQ(5, cache.disk_cache()->create_count());
1479 } 1479 }
1480 1480
1481 // Tests that if a transaction is dooming the entry and the entry was doomed by
1482 // another transaction that was not part of the entry and created a new entry,
1483 // the new entry should not be incorrectly doomed. (crbug.com/736993)
1484 TEST(HttpCache, RangeGET_ParallelValidationNoMatchDoomEntry) {
1485 MockHttpCache cache;
1486
1487 ScopedMockTransaction transaction(kRangeGET_TransactionOK);
1488 MockHttpRequest request(transaction);
1489
1490 MockTransaction dooming_transaction(kRangeGET_TransactionOK);
1491 dooming_transaction.load_flags |= LOAD_BYPASS_CACHE;
1492 MockHttpRequest dooming_request(dooming_transaction);
1493
1494 std::vector<std::unique_ptr<Context>> context_list;
1495 const int kNumTransactions = 3;
1496
1497 for (int i = 0; i < kNumTransactions; ++i) {
1498 context_list.push_back(base::MakeUnique<Context>());
1499 auto& c = context_list[i];
1500
1501 c->result = cache.CreateTransaction(&c->trans);
1502 ASSERT_THAT(c->result, IsOk());
1503 EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
1504
1505 MockHttpRequest* this_request = &request;
1506
1507 if (i == 2)
1508 this_request = &dooming_request;
1509
1510 if (i == 1)
1511 cache.disk_cache()->SetDefer(kRangeGET_TransactionOK.url, DEFER_READ);
1512
1513 c->result = c->trans->Start(this_request, c->callback.callback(),
1514 NetLogWithSource());
1515
1516 // Continue the transactions. 2nd will pause at the cache reading state and
1517 // 3rd transaction will doom the entry.
1518 base::RunLoop().RunUntilIdle();
1519 }
1520
1521 EXPECT_TRUE(
1522 cache.disk_cache()->IsDiskEntryDoomed(kRangeGET_TransactionOK.url));
1523
1524 // Resume cache read by 1st transaction which will lead to dooming the entry
1525 // as well since the entry cannot be validated. This double dooming should not
1526 // lead to an assertion.
1527 // Pause before it creates an entry so we can check the status of entry
1528 // created by the third transaction.
1529 cache.disk_cache()->SetDefer(DEFER_CREATE);
1530 cache.disk_cache()->ResumeDoomedEntryCacheOperation(
1531 kRangeGET_TransactionOK.url);
1532 base::RunLoop().RunUntilIdle();
1533
1534 EXPECT_TRUE(
1535 cache.disk_cache()->IsDiskEntryNotDoomed(kRangeGET_TransactionOK.url));
1536
1537 // Resume creation of entry by 2nd transaction.
1538 cache.disk_cache()->ResumeCacheOperation();
1539 base::RunLoop().RunUntilIdle();
1540
1541 EXPECT_EQ(3, cache.network_layer()->transaction_count());
1542 EXPECT_EQ(0, cache.disk_cache()->open_count());
1543 EXPECT_EQ(3, cache.disk_cache()->create_count());
1544
1545 for (auto& context : context_list) {
1546 EXPECT_EQ(LOAD_STATE_IDLE, context->trans->GetLoadState());
1547 }
1548
1549 for (auto& c : context_list) {
1550 ReadAndVerifyTransaction(c->trans.get(), kRangeGET_TransactionOK);
1551 }
1552
1553 EXPECT_EQ(3, cache.network_layer()->transaction_count());
1554 EXPECT_EQ(0, cache.disk_cache()->open_count());
1555 EXPECT_EQ(3, cache.disk_cache()->create_count());
1556 }
1557
1558 // Same as above but tests that the 2nd transaction does not do anything if
1559 // there is nothing to doom. (crbug.com/736993)
1560 TEST(HttpCache, RangeGET_ParallelValidationNoMatchDoomEntry1) {
1561 MockHttpCache cache;
1562
1563 ScopedMockTransaction transaction(kRangeGET_TransactionOK);
1564 MockHttpRequest request(transaction);
1565
1566 MockTransaction dooming_transaction(kRangeGET_TransactionOK);
1567 dooming_transaction.load_flags |= LOAD_BYPASS_CACHE;
1568 MockHttpRequest dooming_request(dooming_transaction);
1569
1570 std::vector<std::unique_ptr<Context>> context_list;
1571 const int kNumTransactions = 3;
1572
1573 for (int i = 0; i < kNumTransactions; ++i) {
1574 context_list.push_back(base::MakeUnique<Context>());
1575 auto& c = context_list[i];
1576
1577 c->result = cache.CreateTransaction(&c->trans);
1578 ASSERT_THAT(c->result, IsOk());
1579 EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
1580
1581 MockHttpRequest* this_request = &request;
1582
1583 if (i == 2) {
1584 this_request = &dooming_request;
1585 cache.disk_cache()->SetDefer(DEFER_CREATE);
1586 }
1587
1588 if (i == 1)
1589 cache.disk_cache()->SetDefer(kRangeGET_TransactionOK.url, DEFER_READ);
1590
1591 c->result = c->trans->Start(this_request, c->callback.callback(),
1592 NetLogWithSource());
1593
1594 // Continue the transactions. 2nd will pause at the cache reading state and
1595 // 3rd transaction will doom the entry and pause before creating a new
1596 // entry.
1597 base::RunLoop().RunUntilIdle();
1598 }
1599
1600 EXPECT_TRUE(
1601 cache.disk_cache()->IsDiskEntryDoomed(kRangeGET_TransactionOK.url));
1602
1603 // Resume cache read by 2nd transaction which will lead to dooming the entry
1604 // as well since the entry cannot be validated. This double dooming should not
1605 // lead to an assertion.
1606 cache.disk_cache()->ResumeDoomedEntryCacheOperation(
1607 kRangeGET_TransactionOK.url);
1608 base::RunLoop().RunUntilIdle();
1609
1610 // Resume creation of entry by 3rd transaction.
1611 cache.disk_cache()->ResumeCacheOperation();
1612 base::RunLoop().RunUntilIdle();
1613
1614 // Note that 2nd transaction gets added to entry created by transaction 3rd
1615 // transaction, thus only 2 entries get created.
1616 EXPECT_EQ(3, cache.network_layer()->transaction_count());
1617 EXPECT_EQ(0, cache.disk_cache()->open_count());
1618 EXPECT_EQ(2, cache.disk_cache()->create_count());
1619
1620 for (auto& context : context_list) {
1621 EXPECT_EQ(LOAD_STATE_IDLE, context->trans->GetLoadState());
1622 }
1623
1624 for (auto& c : context_list) {
1625 ReadAndVerifyTransaction(c->trans.get(), kRangeGET_TransactionOK);
1626 }
1627
1628 EXPECT_EQ(3, cache.network_layer()->transaction_count());
1629 EXPECT_EQ(0, cache.disk_cache()->open_count());
1630 EXPECT_EQ(2, cache.disk_cache()->create_count());
1631 }
1632
1481 // Tests parallel validation on range requests with non-overlapping ranges. 1633 // Tests parallel validation on range requests with non-overlapping ranges.
1482 TEST(HttpCache, RangeGET_ParallelValidationDifferentRanges) { 1634 TEST(HttpCache, RangeGET_ParallelValidationDifferentRanges) {
1483 MockHttpCache cache; 1635 MockHttpCache cache;
1484 1636
1485 ScopedMockTransaction transaction(kRangeGET_TransactionOK); 1637 ScopedMockTransaction transaction(kRangeGET_TransactionOK);
1486 1638
1487 std::vector<std::unique_ptr<Context>> context_list; 1639 std::vector<std::unique_ptr<Context>> context_list;
1488 const int kNumTransactions = 2; 1640 const int kNumTransactions = 2;
1489 1641
1490 for (int i = 0; i < kNumTransactions; ++i) { 1642 for (int i = 0; i < kNumTransactions; ++i) {
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after
2152 for (int i = 0; i < kNumTransactions; ++i) { 2304 for (int i = 0; i < kNumTransactions; ++i) {
2153 context_list.push_back(base::MakeUnique<Context>()); 2305 context_list.push_back(base::MakeUnique<Context>());
2154 auto& c = context_list[i]; 2306 auto& c = context_list[i];
2155 2307
2156 c->result = cache.CreateTransaction(&c->trans); 2308 c->result = cache.CreateTransaction(&c->trans);
2157 ASSERT_THAT(c->result, IsOk()); 2309 ASSERT_THAT(c->result, IsOk());
2158 2310
2159 MockHttpRequest* this_request = &request; 2311 MockHttpRequest* this_request = &request;
2160 if (i == 3) { 2312 if (i == 3) {
2161 this_request = &validate_request; 2313 this_request = &validate_request;
2162 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferNetworkStart)); 2314 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferCallback));
2163 } 2315 }
2164 2316
2165 c->result = c->trans->Start(this_request, c->callback.callback(), 2317 c->result = c->trans->Start(this_request, c->callback.callback(),
2166 NetLogWithSource()); 2318 NetLogWithSource());
2167 } 2319 }
2168 2320
2169 // Allow all requests to move from the Create queue to the active entry. 2321 // Allow all requests to move from the Create queue to the active entry.
2170 base::RunLoop().RunUntilIdle(); 2322 base::RunLoop().RunUntilIdle();
2171 2323
2172 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 2324 EXPECT_EQ(2, cache.network_layer()->transaction_count());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2250 for (int i = 0; i < kNumTransactions; ++i) { 2402 for (int i = 0; i < kNumTransactions; ++i) {
2251 context_list.push_back(base::MakeUnique<Context>()); 2403 context_list.push_back(base::MakeUnique<Context>());
2252 auto& c = context_list[i]; 2404 auto& c = context_list[i];
2253 2405
2254 c->result = cache.CreateTransaction(&c->trans); 2406 c->result = cache.CreateTransaction(&c->trans);
2255 ASSERT_THAT(c->result, IsOk()); 2407 ASSERT_THAT(c->result, IsOk());
2256 2408
2257 MockHttpRequest* this_request = &request; 2409 MockHttpRequest* this_request = &request;
2258 if (i == 2) { 2410 if (i == 2) {
2259 this_request = &validate_request; 2411 this_request = &validate_request;
2260 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferNetworkStart)); 2412 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferCallback));
2261 } 2413 }
2262 2414
2263 c->result = c->trans->Start(this_request, c->callback.callback(), 2415 c->result = c->trans->Start(this_request, c->callback.callback(),
2264 NetLogWithSource()); 2416 NetLogWithSource());
2265 } 2417 }
2266 2418
2267 // Allow all requests to move from the Create queue to the active entry. 2419 // Allow all requests to move from the Create queue to the active entry.
2268 base::RunLoop().RunUntilIdle(); 2420 base::RunLoop().RunUntilIdle();
2269 2421
2270 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 2422 EXPECT_EQ(2, cache.network_layer()->transaction_count());
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
2388 for (int i = 0; i < kNumTransactions; ++i) { 2540 for (int i = 0; i < kNumTransactions; ++i) {
2389 context_list.push_back(base::MakeUnique<Context>()); 2541 context_list.push_back(base::MakeUnique<Context>());
2390 auto& c = context_list[i]; 2542 auto& c = context_list[i];
2391 2543
2392 c->result = cache.CreateTransaction(&c->trans); 2544 c->result = cache.CreateTransaction(&c->trans);
2393 ASSERT_THAT(c->result, IsOk()); 2545 ASSERT_THAT(c->result, IsOk());
2394 2546
2395 MockHttpRequest* this_request = &request; 2547 MockHttpRequest* this_request = &request;
2396 if (i == 2) { 2548 if (i == 2) {
2397 this_request = &validate_request; 2549 this_request = &validate_request;
2398 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferNetworkStart)); 2550 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferCallback));
2399 } 2551 }
2400 2552
2401 c->result = c->trans->Start(this_request, c->callback.callback(), 2553 c->result = c->trans->Start(this_request, c->callback.callback(),
2402 NetLogWithSource()); 2554 NetLogWithSource());
2403 } 2555 }
2404 2556
2405 // Allow all requests to move from the Create queue to the active entry. 2557 // Allow all requests to move from the Create queue to the active entry.
2406 base::RunLoop().RunUntilIdle(); 2558 base::RunLoop().RunUntilIdle();
2407 2559
2408 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 2560 EXPECT_EQ(2, cache.network_layer()->transaction_count());
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2454 std::vector<std::unique_ptr<Context>> context_list; 2606 std::vector<std::unique_ptr<Context>> context_list;
2455 2607
2456 for (int i = 0; i < kNumTransactions; ++i) { 2608 for (int i = 0; i < kNumTransactions; ++i) {
2457 context_list.push_back(base::MakeUnique<Context>()); 2609 context_list.push_back(base::MakeUnique<Context>());
2458 auto& c = context_list[i]; 2610 auto& c = context_list[i];
2459 2611
2460 c->result = cache.CreateTransaction(&c->trans); 2612 c->result = cache.CreateTransaction(&c->trans);
2461 ASSERT_THAT(c->result, IsOk()); 2613 ASSERT_THAT(c->result, IsOk());
2462 2614
2463 if (i == 0) 2615 if (i == 0)
2464 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferNetworkStart)); 2616 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferCallback));
2465 2617
2466 c->result = 2618 c->result =
2467 c->trans->Start(&request, c->callback.callback(), NetLogWithSource()); 2619 c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
2468 } 2620 }
2469 2621
2470 base::RunLoop().RunUntilIdle(); 2622 base::RunLoop().RunUntilIdle();
2471 2623
2472 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url)); 2624 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url));
2473 EXPECT_EQ(1, cache.GetCountAddToEntryQueue(kSimpleGET_Transaction.url)); 2625 EXPECT_EQ(1, cache.GetCountAddToEntryQueue(kSimpleGET_Transaction.url));
2474 2626
(...skipping 6884 matching lines...) Expand 10 before | Expand all | Expand 10 after
9359 ASSERT_TRUE(attrs->GetDictionary( 9511 ASSERT_TRUE(attrs->GetDictionary(
9360 base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs)); 9512 base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs));
9361 std::string size; 9513 std::string size;
9362 ASSERT_TRUE(size_attrs->GetString("value", &size)); 9514 ASSERT_TRUE(size_attrs->GetString("value", &size));
9363 int actual_size = 0; 9515 int actual_size = 0;
9364 ASSERT_TRUE(base::HexStringToInt(size, &actual_size)); 9516 ASSERT_TRUE(base::HexStringToInt(size, &actual_size));
9365 ASSERT_LT(0, actual_size); 9517 ASSERT_LT(0, actual_size);
9366 } 9518 }
9367 9519
9368 } // namespace net 9520 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698