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

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: Test and test framework changes added. 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, there should not be a
1483 // assertion hit. (crbug.com/736993)
jkarlin 2017/07/07 20:03:15 After F2F we discussed that this test doesn't actu
shivanisha 2017/07/10 18:51:27 Added 2 tests. Without the fix, the first dooms th
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()->SetBeforeCacheOperationCallback(
1512 kRangeGET_TransactionOK.url, base::Bind(&DeferCallback));
1513 }
1514
1515 c->result = c->trans->Start(this_request, c->callback.callback(),
1516 NetLogWithSource());
1517
1518 // Continue the transactions. 2nd will pause at the cache reading state and
1519 // 3rd transaction will doom the entry.
1520 base::RunLoop().RunUntilIdle();
1521 }
1522
1523 EXPECT_TRUE(
1524 cache.disk_cache()->IsDiskEntryDoomed(kRangeGET_TransactionOK.url));
1525
1526 // Resume cache read by 1st transaction which will lead to dooming the entry
1527 // as well since the entry cannot be validated. This double dooming should not
1528 // lead to an assertion.
1529 cache.disk_cache()->ResumeDoomedEntryCacheOperation(
1530 kRangeGET_TransactionOK.url);
1531 base::RunLoop().RunUntilIdle();
1532
1533 EXPECT_EQ(3, cache.network_layer()->transaction_count());
1534 EXPECT_EQ(0, cache.disk_cache()->open_count());
1535 EXPECT_EQ(3, cache.disk_cache()->create_count());
1536
1537 for (auto& context : context_list) {
1538 EXPECT_EQ(LOAD_STATE_IDLE, context->trans->GetLoadState());
1539 }
1540
1541 for (auto& c : context_list) {
1542 ReadAndVerifyTransaction(c->trans.get(), kRangeGET_TransactionOK);
1543 }
1544
1545 EXPECT_EQ(3, cache.network_layer()->transaction_count());
1546 EXPECT_EQ(0, cache.disk_cache()->open_count());
1547 EXPECT_EQ(3, cache.disk_cache()->create_count());
1548 }
1549
1481 // Tests parallel validation on range requests with non-overlapping ranges. 1550 // Tests parallel validation on range requests with non-overlapping ranges.
1482 TEST(HttpCache, RangeGET_ParallelValidationDifferentRanges) { 1551 TEST(HttpCache, RangeGET_ParallelValidationDifferentRanges) {
1483 MockHttpCache cache; 1552 MockHttpCache cache;
1484 1553
1485 ScopedMockTransaction transaction(kRangeGET_TransactionOK); 1554 ScopedMockTransaction transaction(kRangeGET_TransactionOK);
1486 1555
1487 std::vector<std::unique_ptr<Context>> context_list; 1556 std::vector<std::unique_ptr<Context>> context_list;
1488 const int kNumTransactions = 2; 1557 const int kNumTransactions = 2;
1489 1558
1490 for (int i = 0; i < kNumTransactions; ++i) { 1559 for (int i = 0; i < kNumTransactions; ++i) {
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after
2089 for (int i = 0; i < kNumTransactions; ++i) { 2158 for (int i = 0; i < kNumTransactions; ++i) {
2090 context_list.push_back(base::MakeUnique<Context>()); 2159 context_list.push_back(base::MakeUnique<Context>());
2091 auto& c = context_list[i]; 2160 auto& c = context_list[i];
2092 2161
2093 c->result = cache.CreateTransaction(&c->trans); 2162 c->result = cache.CreateTransaction(&c->trans);
2094 ASSERT_THAT(c->result, IsOk()); 2163 ASSERT_THAT(c->result, IsOk());
2095 2164
2096 MockHttpRequest* this_request = &request; 2165 MockHttpRequest* this_request = &request;
2097 if (i == 3) { 2166 if (i == 3) {
2098 this_request = &validate_request; 2167 this_request = &validate_request;
2099 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferNetworkStart)); 2168 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferCallback));
2100 } 2169 }
2101 2170
2102 c->result = c->trans->Start(this_request, c->callback.callback(), 2171 c->result = c->trans->Start(this_request, c->callback.callback(),
2103 NetLogWithSource()); 2172 NetLogWithSource());
2104 } 2173 }
2105 2174
2106 // Allow all requests to move from the Create queue to the active entry. 2175 // Allow all requests to move from the Create queue to the active entry.
2107 base::RunLoop().RunUntilIdle(); 2176 base::RunLoop().RunUntilIdle();
2108 2177
2109 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 2178 EXPECT_EQ(2, cache.network_layer()->transaction_count());
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
2187 for (int i = 0; i < kNumTransactions; ++i) { 2256 for (int i = 0; i < kNumTransactions; ++i) {
2188 context_list.push_back(base::MakeUnique<Context>()); 2257 context_list.push_back(base::MakeUnique<Context>());
2189 auto& c = context_list[i]; 2258 auto& c = context_list[i];
2190 2259
2191 c->result = cache.CreateTransaction(&c->trans); 2260 c->result = cache.CreateTransaction(&c->trans);
2192 ASSERT_THAT(c->result, IsOk()); 2261 ASSERT_THAT(c->result, IsOk());
2193 2262
2194 MockHttpRequest* this_request = &request; 2263 MockHttpRequest* this_request = &request;
2195 if (i == 2) { 2264 if (i == 2) {
2196 this_request = &validate_request; 2265 this_request = &validate_request;
2197 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferNetworkStart)); 2266 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferCallback));
2198 } 2267 }
2199 2268
2200 c->result = c->trans->Start(this_request, c->callback.callback(), 2269 c->result = c->trans->Start(this_request, c->callback.callback(),
2201 NetLogWithSource()); 2270 NetLogWithSource());
2202 } 2271 }
2203 2272
2204 // Allow all requests to move from the Create queue to the active entry. 2273 // Allow all requests to move from the Create queue to the active entry.
2205 base::RunLoop().RunUntilIdle(); 2274 base::RunLoop().RunUntilIdle();
2206 2275
2207 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 2276 EXPECT_EQ(2, cache.network_layer()->transaction_count());
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
2329 for (int i = 0; i < kNumTransactions; ++i) { 2398 for (int i = 0; i < kNumTransactions; ++i) {
2330 context_list.push_back(base::MakeUnique<Context>()); 2399 context_list.push_back(base::MakeUnique<Context>());
2331 auto& c = context_list[i]; 2400 auto& c = context_list[i];
2332 2401
2333 c->result = cache.CreateTransaction(&c->trans); 2402 c->result = cache.CreateTransaction(&c->trans);
2334 ASSERT_THAT(c->result, IsOk()); 2403 ASSERT_THAT(c->result, IsOk());
2335 2404
2336 MockHttpRequest* this_request = &request; 2405 MockHttpRequest* this_request = &request;
2337 if (i == 2) { 2406 if (i == 2) {
2338 this_request = &validate_request; 2407 this_request = &validate_request;
2339 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferNetworkStart)); 2408 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferCallback));
2340 } 2409 }
2341 2410
2342 c->result = c->trans->Start(this_request, c->callback.callback(), 2411 c->result = c->trans->Start(this_request, c->callback.callback(),
2343 NetLogWithSource()); 2412 NetLogWithSource());
2344 } 2413 }
2345 2414
2346 // Allow all requests to move from the Create queue to the active entry. 2415 // Allow all requests to move from the Create queue to the active entry.
2347 base::RunLoop().RunUntilIdle(); 2416 base::RunLoop().RunUntilIdle();
2348 2417
2349 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 2418 EXPECT_EQ(2, cache.network_layer()->transaction_count());
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2399 std::vector<std::unique_ptr<Context>> context_list; 2468 std::vector<std::unique_ptr<Context>> context_list;
2400 2469
2401 for (int i = 0; i < kNumTransactions; ++i) { 2470 for (int i = 0; i < kNumTransactions; ++i) {
2402 context_list.push_back(base::MakeUnique<Context>()); 2471 context_list.push_back(base::MakeUnique<Context>());
2403 auto& c = context_list[i]; 2472 auto& c = context_list[i];
2404 2473
2405 c->result = cache.CreateTransaction(&c->trans); 2474 c->result = cache.CreateTransaction(&c->trans);
2406 ASSERT_THAT(c->result, IsOk()); 2475 ASSERT_THAT(c->result, IsOk());
2407 2476
2408 if (i == 0) 2477 if (i == 0)
2409 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferNetworkStart)); 2478 c->trans->SetBeforeNetworkStartCallback(base::Bind(&DeferCallback));
2410 2479
2411 c->result = 2480 c->result =
2412 c->trans->Start(&request, c->callback.callback(), NetLogWithSource()); 2481 c->trans->Start(&request, c->callback.callback(), NetLogWithSource());
2413 } 2482 }
2414 2483
2415 base::RunLoop().RunUntilIdle(); 2484 base::RunLoop().RunUntilIdle();
2416 2485
2417 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url)); 2486 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url));
2418 EXPECT_EQ(1, cache.GetCountAddToEntryQueue(kSimpleGET_Transaction.url)); 2487 EXPECT_EQ(1, cache.GetCountAddToEntryQueue(kSimpleGET_Transaction.url));
2419 2488
(...skipping 6884 matching lines...) Expand 10 before | Expand all | Expand 10 after
9304 ASSERT_TRUE(attrs->GetDictionary( 9373 ASSERT_TRUE(attrs->GetDictionary(
9305 base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs)); 9374 base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs));
9306 std::string size; 9375 std::string size;
9307 ASSERT_TRUE(size_attrs->GetString("value", &size)); 9376 ASSERT_TRUE(size_attrs->GetString("value", &size));
9308 int actual_size = 0; 9377 int actual_size = 0;
9309 ASSERT_TRUE(base::HexStringToInt(size, &actual_size)); 9378 ASSERT_TRUE(base::HexStringToInt(size, &actual_size));
9310 ASSERT_LT(0, actual_size); 9379 ASSERT_LT(0, actual_size);
9311 } 9380 }
9312 9381
9313 } // namespace net 9382 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698