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

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

Issue 2886483002: Adds a new class HttpCache::Writers for multiple cache transactions reading from the network. (Closed)
Patch Set: Feedback addressed. 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 200 matching lines...) Expand 10 before | Expand all | Expand 10 after
211 // write to the cache 211 // write to the cache
212 212
213 std::unique_ptr<HttpTransaction> trans; 213 std::unique_ptr<HttpTransaction> trans;
214 int rv = cache->CreateTransaction(DEFAULT_PRIORITY, &trans); 214 int rv = cache->CreateTransaction(DEFAULT_PRIORITY, &trans);
215 EXPECT_THAT(rv, IsOk()); 215 EXPECT_THAT(rv, IsOk());
216 ASSERT_TRUE(trans.get()); 216 ASSERT_TRUE(trans.get());
217 217
218 rv = trans->Start(&request, callback.callback(), net_log); 218 rv = trans->Start(&request, callback.callback(), net_log);
219 if (rv == ERR_IO_PENDING) 219 if (rv == ERR_IO_PENDING)
220 rv = callback.WaitForResult(); 220 rv = callback.WaitForResult();
221 ASSERT_EQ(trans_info.return_code, rv); 221 ASSERT_EQ(trans_info.start_return_code, rv);
222 222
223 if (OK != rv) 223 if (OK != rv)
224 return; 224 return;
225 225
226 const HttpResponseInfo* response = trans->GetResponseInfo(); 226 const HttpResponseInfo* response = trans->GetResponseInfo();
227 ASSERT_TRUE(response); 227 ASSERT_TRUE(response);
228 228
229 if (response_info) 229 if (response_info)
230 *response_info = *response; 230 *response_info = *response;
231 231
(...skipping 837 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 MockTransaction transaction(kSimpleGET_Transaction); 1069 MockTransaction transaction(kSimpleGET_Transaction);
1070 transaction.response_headers = "Cache-Control: no-cache\n"; 1070 transaction.response_headers = "Cache-Control: no-cache\n";
1071 1071
1072 AddMockTransaction(&transaction); 1072 AddMockTransaction(&transaction);
1073 RunTransactionTest(cache.http_cache(), transaction); 1073 RunTransactionTest(cache.http_cache(), transaction);
1074 EXPECT_EQ(1, cache.network_layer()->transaction_count()); 1074 EXPECT_EQ(1, cache.network_layer()->transaction_count());
1075 EXPECT_EQ(1, cache.disk_cache()->create_count()); 1075 EXPECT_EQ(1, cache.disk_cache()->create_count());
1076 RemoveMockTransaction(&transaction); 1076 RemoveMockTransaction(&transaction);
1077 1077
1078 // Network failure with error; should fail but have was_cached set. 1078 // Network failure with error; should fail but have was_cached set.
1079 transaction.return_code = ERR_FAILED; 1079 transaction.start_return_code = ERR_FAILED;
1080 AddMockTransaction(&transaction); 1080 AddMockTransaction(&transaction);
1081 1081
1082 MockHttpRequest request(transaction); 1082 MockHttpRequest request(transaction);
1083 TestCompletionCallback callback; 1083 TestCompletionCallback callback;
1084 std::unique_ptr<HttpTransaction> trans; 1084 std::unique_ptr<HttpTransaction> trans;
1085 int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans); 1085 int rv = cache.http_cache()->CreateTransaction(DEFAULT_PRIORITY, &trans);
1086 EXPECT_THAT(rv, IsOk()); 1086 EXPECT_THAT(rv, IsOk());
1087 ASSERT_TRUE(trans.get()); 1087 ASSERT_TRUE(trans.get());
1088 rv = trans->Start(&request, callback.callback(), NetLogWithSource()); 1088 rv = trans->Start(&request, callback.callback(), NetLogWithSource());
1089 EXPECT_THAT(callback.GetResult(rv), IsError(ERR_FAILED)); 1089 EXPECT_THAT(callback.GetResult(rv), IsError(ERR_FAILED));
(...skipping 790 matching lines...) Expand 10 before | Expand all | Expand 10 after
1880 } 1880 }
1881 1881
1882 // Allow all requests to move from the Create queue to the active entry. 1882 // Allow all requests to move from the Create queue to the active entry.
1883 base::RunLoop().RunUntilIdle(); 1883 base::RunLoop().RunUntilIdle();
1884 1884
1885 // The first request should be a writer at this point, and the subsequent 1885 // The first request should be a writer at this point, and the subsequent
1886 // requests should have passed the validation phase and created their own 1886 // requests should have passed the validation phase and created their own
1887 // entries since none of them matched the headers of the earlier one. 1887 // entries since none of them matched the headers of the earlier one.
1888 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url)); 1888 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url));
1889 1889
1890 // Note that there are only 3 entries created and not 5 since every other
1891 // transaction would have gone to the network.
1892 EXPECT_EQ(5, cache.network_layer()->transaction_count()); 1890 EXPECT_EQ(5, cache.network_layer()->transaction_count());
1893 EXPECT_EQ(0, cache.disk_cache()->open_count()); 1891 EXPECT_EQ(0, cache.disk_cache()->open_count());
1894 EXPECT_EQ(3, cache.disk_cache()->create_count()); 1892 EXPECT_EQ(5, cache.disk_cache()->create_count());
1895 1893
1896 // All requests depend on the writer, and the writer is between Start and 1894 // All requests depend on the writer, and the writer is between Start and
1897 // Read, i.e. idle. 1895 // Read, i.e. idle.
1898 for (auto& context : context_list) { 1896 for (auto& context : context_list) {
1899 EXPECT_EQ(LOAD_STATE_IDLE, context->trans->GetLoadState()); 1897 EXPECT_EQ(LOAD_STATE_IDLE, context->trans->GetLoadState());
1900 } 1898 }
1901 1899
1902 for (auto& context : context_list) { 1900 for (auto& context : context_list) {
1903 if (context->result == ERR_IO_PENDING) 1901 if (context->result == ERR_IO_PENDING)
1904 context->result = context->callback.WaitForResult(); 1902 context->result = context->callback.WaitForResult();
1905 ReadAndVerifyTransaction(context->trans.get(), kSimpleGET_Transaction); 1903 ReadAndVerifyTransaction(context->trans.get(), kSimpleGET_Transaction);
1906 } 1904 }
1907 1905
1908 EXPECT_EQ(5, cache.network_layer()->transaction_count()); 1906 EXPECT_EQ(5, cache.network_layer()->transaction_count());
1909 EXPECT_EQ(0, cache.disk_cache()->open_count()); 1907 EXPECT_EQ(0, cache.disk_cache()->open_count());
1910 EXPECT_EQ(3, cache.disk_cache()->create_count()); 1908 EXPECT_EQ(5, cache.disk_cache()->create_count());
1909 }
1910
1911 // Parallel validation results in 200 for 1 transaction and validation matches
1912 // for subsequent transactions.
1913 TEST(HttpCache, SimpleGET_ParallelValidationNoMatch1) {
1914 MockHttpCache cache;
1915 MockHttpRequest request(kSimpleGET_Transaction);
1916
1917 MockTransaction transaction(kSimpleGET_Transaction);
1918 transaction.load_flags |= LOAD_VALIDATE_CACHE;
1919 MockHttpRequest validate_request(transaction);
1920 std::vector<std::unique_ptr<Context>> context_list;
1921 const int kNumTransactions = 5;
1922 for (int i = 0; i < kNumTransactions; ++i) {
1923 context_list.push_back(base::MakeUnique<Context>());
1924 auto& c = context_list[i];
1925 c->result = cache.CreateTransaction(&c->trans);
1926 ASSERT_THAT(c->result, IsOk());
1927 EXPECT_EQ(LOAD_STATE_IDLE, c->trans->GetLoadState());
1928
1929 MockHttpRequest* this_request = &request;
1930 if (i == 1)
1931 this_request = &validate_request;
1932
1933 c->result = c->trans->Start(this_request, c->callback.callback(),
1934 NetLogWithSource());
1935 }
1936
1937 // All requests are waiting for the active entry.
1938 for (auto& context : context_list) {
1939 EXPECT_EQ(LOAD_STATE_WAITING_FOR_CACHE, context->trans->GetLoadState());
1940 }
1941
1942 // Allow all requests to move from the Create queue to the active entry.
1943 base::RunLoop().RunUntilIdle();
1944
1945 // The first request should be a writer at this point, and the second
1946 // request should have passed the validation phase and created a new
1947 // entry. Rest of them should be added to the new entry.
1948 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url));
1949 EXPECT_EQ(3, cache.GetCountDoneHeadersQueue(kSimpleGET_Transaction.url));
1950
1951 EXPECT_EQ(2, cache.network_layer()->transaction_count());
1952 EXPECT_EQ(0, cache.disk_cache()->open_count());
1953 EXPECT_EQ(2, cache.disk_cache()->create_count());
1954
1955 // All requests depend on the writer, and the writer is between Start and
1956 // Read, i.e. idle.
1957 for (auto& context : context_list) {
1958 EXPECT_EQ(LOAD_STATE_IDLE, context->trans->GetLoadState());
1959 }
1960
1961 EXPECT_EQ(1, cache.disk_cache()->doomed_count());
1962
1963 for (size_t i = 0; i < context_list.size(); i++) {
1964 if (context_list[i]->result == ERR_IO_PENDING)
1965 context_list[i]->result = context_list[i]->callback.WaitForResult();
1966
1967 ReadAndVerifyTransaction(context_list[i]->trans.get(),
1968 kSimpleGET_Transaction);
1969 }
1970
1971 EXPECT_EQ(2, cache.network_layer()->transaction_count());
1972 EXPECT_EQ(0, cache.disk_cache()->open_count());
1973 EXPECT_EQ(2, cache.disk_cache()->create_count());
1911 } 1974 }
1912 1975
1913 // Tests that a GET followed by a DELETE results in DELETE immediately starting 1976 // Tests that a GET followed by a DELETE results in DELETE immediately starting
1914 // the headers phase and the entry is doomed. 1977 // the headers phase and the entry is doomed.
1915 TEST(HttpCache, SimpleGET_ParallelValidationDelete) { 1978 TEST(HttpCache, SimpleGET_ParallelValidationDelete) {
1916 MockHttpCache cache; 1979 MockHttpCache cache;
1917 1980
1918 MockHttpRequest request(kSimpleGET_Transaction); 1981 MockHttpRequest request(kSimpleGET_Transaction);
1919 request.load_flags |= LOAD_VALIDATE_CACHE; 1982 request.load_flags |= LOAD_VALIDATE_CACHE;
1920 1983
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
2149 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url)); 2212 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url));
2150 2213
2151 // Resume network start for headers_transaction. It will doom the entry as it 2214 // Resume network start for headers_transaction. It will doom the entry as it
2152 // will be a 200 and will go to network for the response body. 2215 // will be a 200 and will go to network for the response body.
2153 auto& context = context_list[3]; 2216 auto& context = context_list[3];
2154 context->trans->ResumeNetworkStart(); 2217 context->trans->ResumeNetworkStart();
2155 2218
2156 // The pending transactions will be added to a new entry. 2219 // The pending transactions will be added to a new entry.
2157 base::RunLoop().RunUntilIdle(); 2220 base::RunLoop().RunUntilIdle();
2158 2221
2159 EXPECT_EQ(1, cache.GetCountDoneHeadersQueue(kSimpleGET_Transaction.url)); 2222 EXPECT_EQ(2, cache.GetCountDoneHeadersQueue(kSimpleGET_Transaction.url));
2160 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url)); 2223 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url));
2161 2224
2162 // Complete the rest of the transactions. 2225 // Complete the rest of the transactions.
2163 for (int i = 2; i < kNumTransactions; ++i) { 2226 for (int i = 2; i < kNumTransactions; ++i) {
2164 auto& c = context_list[i]; 2227 auto& c = context_list[i];
2165 ReadAndVerifyTransaction(c->trans.get(), kSimpleGET_Transaction); 2228 ReadAndVerifyTransaction(c->trans.get(), kSimpleGET_Transaction);
2166 } 2229 }
2167 2230
2168 EXPECT_EQ(3, cache.network_layer()->transaction_count()); 2231 EXPECT_EQ(2, cache.network_layer()->transaction_count());
2169 EXPECT_EQ(0, cache.disk_cache()->open_count()); 2232 EXPECT_EQ(0, cache.disk_cache()->open_count());
2170 EXPECT_EQ(2, cache.disk_cache()->create_count()); 2233 EXPECT_EQ(2, cache.disk_cache()->create_count());
2171 } 2234 }
2172 2235
2173 // Tests that a transaction is in validated queue and writer is destroyed 2236 // Tests that a transaction is in validated queue and writer is destroyed
2174 // leading to restarting the validated transaction. 2237 // leading to restarting the validated transaction.
2175 TEST(HttpCache, SimpleGET_ParallelValidationCancelWriter) { 2238 TEST(HttpCache, SimpleGET_ParallelValidationCancelWriter) {
2176 MockHttpCache cache; 2239 MockHttpCache cache;
2177 2240
2178 MockHttpRequest request(kSimpleGET_Transaction); 2241 MockHttpRequest request(kSimpleGET_Transaction);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2223 2286
2224 base::RunLoop().RunUntilIdle(); 2287 base::RunLoop().RunUntilIdle();
2225 2288
2226 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url)); 2289 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url));
2227 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url)); 2290 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url));
2228 2291
2229 // Resume network start for the transaction the second time. 2292 // Resume network start for the transaction the second time.
2230 c->trans->ResumeNetworkStart(); 2293 c->trans->ResumeNetworkStart();
2231 base::RunLoop().RunUntilIdle(); 2294 base::RunLoop().RunUntilIdle();
2232 2295
2233 // Headers transaction would have doomed the new entry created.
2234 EXPECT_TRUE(
2235 cache.disk_cache()->IsDiskEntryDoomed(kSimpleGET_Transaction.url));
2236
2237 // Complete the rest of the transactions. 2296 // Complete the rest of the transactions.
2238 for (auto& context : context_list) { 2297 for (auto& context : context_list) {
2239 if (!context) 2298 if (!context)
2240 continue; 2299 continue;
2241 ReadAndVerifyTransaction(context->trans.get(), kSimpleGET_Transaction); 2300 ReadAndVerifyTransaction(context->trans.get(), kSimpleGET_Transaction);
2242 } 2301 }
2243 2302
2244 EXPECT_EQ(4, cache.network_layer()->transaction_count()); 2303 EXPECT_EQ(4, cache.network_layer()->transaction_count());
2245 EXPECT_EQ(0, cache.disk_cache()->open_count()); 2304 EXPECT_EQ(0, cache.disk_cache()->open_count());
2246 EXPECT_EQ(2, cache.disk_cache()->create_count()); 2305 EXPECT_EQ(3, cache.disk_cache()->create_count());
2247 } 2306 }
2248 2307
2249 // Tests when a writer is destroyed mid-read and entry is marked as truncated, 2308 // Tests when a writer is destroyed mid-read and entry is marked as truncated,
2250 // it should lead to restarting the dependent transactions. 2309 // it should lead to restarting the dependent transactions.
2251 TEST(HttpCache, SimpleGET_ParallelValidationCancelWriterTruncateEntry) { 2310 TEST(HttpCache, SimpleGET_ParallelValidationCancelWriterTruncateEntry) {
2252 MockHttpCache cache; 2311 MockHttpCache cache;
2253 2312
2254 ScopedMockTransaction transaction(kSimpleGET_Transaction); 2313 ScopedMockTransaction transaction(kSimpleGET_Transaction);
2255 transaction.response_headers = 2314 transaction.response_headers =
2256 "Last-Modified: Wed, 28 Nov 2007 00:40:09 GMT\n" 2315 "Last-Modified: Wed, 28 Nov 2007 00:40:09 GMT\n"
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
2365 2424
2366 base::RunLoop().RunUntilIdle(); 2425 base::RunLoop().RunUntilIdle();
2367 2426
2368 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url)); 2427 EXPECT_TRUE(cache.IsWriterPresent(kSimpleGET_Transaction.url));
2369 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url)); 2428 EXPECT_TRUE(cache.IsHeadersTransactionPresent(kSimpleGET_Transaction.url));
2370 2429
2371 // Resume network start for the transaction the second time. 2430 // Resume network start for the transaction the second time.
2372 c->trans->ResumeNetworkStart(); 2431 c->trans->ResumeNetworkStart();
2373 base::RunLoop().RunUntilIdle(); 2432 base::RunLoop().RunUntilIdle();
2374 2433
2375 // Headers transaction would have doomed the new entry created.
2376 EXPECT_TRUE(
2377 cache.disk_cache()->IsDiskEntryDoomed(kSimpleGET_Transaction.url));
2378
2379 // Complete the rest of the transactions. 2434 // Complete the rest of the transactions.
2380 for (auto& context : context_list) { 2435 for (auto& context : context_list) {
2381 if (!context) 2436 if (!context)
2382 continue; 2437 continue;
2383 ReadAndVerifyTransaction(context->trans.get(), kSimpleGET_Transaction); 2438 ReadAndVerifyTransaction(context->trans.get(), kSimpleGET_Transaction);
2384 } 2439 }
2385 2440
2386 EXPECT_EQ(4, cache.network_layer()->transaction_count()); 2441 EXPECT_EQ(4, cache.network_layer()->transaction_count());
2387 EXPECT_EQ(0, cache.disk_cache()->open_count()); 2442 EXPECT_EQ(0, cache.disk_cache()->open_count());
2388 EXPECT_EQ(2, cache.disk_cache()->create_count()); 2443 EXPECT_EQ(3, cache.disk_cache()->create_count());
2389 } 2444 }
2390 2445
2391 // Tests that a transaction is currently in headers phase and is destroyed 2446 // Tests that a transaction is currently in headers phase and is destroyed
2392 // leading to destroying the entry. 2447 // leading to destroying the entry.
2393 TEST(HttpCache, SimpleGET_ParallelValidationCancelHeaders) { 2448 TEST(HttpCache, SimpleGET_ParallelValidationCancelHeaders) {
2394 MockHttpCache cache; 2449 MockHttpCache cache;
2395 2450
2396 MockHttpRequest request(kSimpleGET_Transaction); 2451 MockHttpRequest request(kSimpleGET_Transaction);
2397 2452
2398 const int kNumTransactions = 2; 2453 const int kNumTransactions = 2;
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
2672 2727
2673 // Allow all requests to move from the Create queue to the active entry. 2728 // Allow all requests to move from the Create queue to the active entry.
2674 base::RunLoop().RunUntilIdle(); 2729 base::RunLoop().RunUntilIdle();
2675 2730
2676 // The first request should be a writer at this point, and the subsequent 2731 // The first request should be a writer at this point, and the subsequent
2677 // requests should have completed validation. Since the validation does not 2732 // requests should have completed validation. Since the validation does not
2678 // result in a match, a new entry would be created. 2733 // result in a match, a new entry would be created.
2679 2734
2680 EXPECT_EQ(3, cache.network_layer()->transaction_count()); 2735 EXPECT_EQ(3, cache.network_layer()->transaction_count());
2681 EXPECT_EQ(0, cache.disk_cache()->open_count()); 2736 EXPECT_EQ(0, cache.disk_cache()->open_count());
2682 EXPECT_EQ(2, cache.disk_cache()->create_count()); 2737 EXPECT_EQ(3, cache.disk_cache()->create_count());
2683 2738
2684 // Now, make sure that the second request asks for the entry not to be stored. 2739 // Now, make sure that the second request asks for the entry not to be stored.
2685 request_handler.set_no_store(true); 2740 request_handler.set_no_store(true);
2686 2741
2687 for (int i = 0; i < kNumTransactions; ++i) { 2742 for (int i = 0; i < kNumTransactions; ++i) {
2688 Context* c = context_list[i].get(); 2743 Context* c = context_list[i].get();
2689 if (c->result == ERR_IO_PENDING) 2744 if (c->result == ERR_IO_PENDING)
2690 c->result = c->callback.WaitForResult(); 2745 c->result = c->callback.WaitForResult();
2691 ReadAndVerifyTransaction(c->trans.get(), kFastNoStoreGET_Transaction); 2746 ReadAndVerifyTransaction(c->trans.get(), kFastNoStoreGET_Transaction);
2692 context_list[i].reset(); 2747 context_list[i].reset();
2693 } 2748 }
2694 2749
2695 EXPECT_EQ(3, cache.network_layer()->transaction_count()); 2750 EXPECT_EQ(3, cache.network_layer()->transaction_count());
2696 EXPECT_EQ(0, cache.disk_cache()->open_count()); 2751 EXPECT_EQ(0, cache.disk_cache()->open_count());
2697 EXPECT_EQ(2, cache.disk_cache()->create_count()); 2752 EXPECT_EQ(3, cache.disk_cache()->create_count());
2698 2753
2699 RemoveMockTransaction(&kFastNoStoreGET_Transaction); 2754 RemoveMockTransaction(&kFastNoStoreGET_Transaction);
2700 } 2755 }
2701 2756
2702 TEST(HttpCache, SimpleGET_ManyWriters_CancelFirst) { 2757 TEST(HttpCache, SimpleGET_ManyWriters_CancelFirst) {
2703 MockHttpCache cache; 2758 MockHttpCache cache;
2704 2759
2705 MockHttpRequest request(kSimpleGET_Transaction); 2760 MockHttpRequest request(kSimpleGET_Transaction);
2706 2761
2707 std::vector<std::unique_ptr<Context>> context_list; 2762 std::vector<std::unique_ptr<Context>> context_list;
(...skipping 1743 matching lines...) Expand 10 before | Expand all | Expand 10 after
4451 MockTransaction transaction(kSimpleGET_Transaction); 4506 MockTransaction transaction(kSimpleGET_Transaction);
4452 AddMockTransaction(&transaction); 4507 AddMockTransaction(&transaction);
4453 4508
4454 // Populate the cache. 4509 // Populate the cache.
4455 RunTransactionTest(cache.http_cache(), transaction); 4510 RunTransactionTest(cache.http_cache(), transaction);
4456 4511
4457 // Load from cache. 4512 // Load from cache.
4458 transaction.method = "HEAD"; 4513 transaction.method = "HEAD";
4459 transaction.request_headers = "Range: bytes = 0-4\r\n"; 4514 transaction.request_headers = "Range: bytes = 0-4\r\n";
4460 transaction.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; 4515 transaction.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION;
4461 transaction.return_code = ERR_CACHE_MISS; 4516 transaction.start_return_code = ERR_CACHE_MISS;
4462 RunTransactionTest(cache.http_cache(), transaction); 4517 RunTransactionTest(cache.http_cache(), transaction);
4463 4518
4464 EXPECT_EQ(0, cache.disk_cache()->open_count()); 4519 EXPECT_EQ(0, cache.disk_cache()->open_count());
4465 EXPECT_EQ(1, cache.disk_cache()->create_count()); 4520 EXPECT_EQ(1, cache.disk_cache()->create_count());
4466 RemoveMockTransaction(&transaction); 4521 RemoveMockTransaction(&transaction);
4467 } 4522 }
4468 4523
4469 // Tests that a HEAD request can be served from a partialy cached resource. 4524 // Tests that a HEAD request can be served from a partialy cached resource.
4470 TEST(HttpCache, SimpleHEAD_WithCachedRanges) { 4525 TEST(HttpCache, SimpleHEAD_WithCachedRanges) {
4471 MockHttpCache cache; 4526 MockHttpCache cache;
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
4617 4672
4618 // Update the cache. 4673 // Update the cache.
4619 transaction.method = "HEAD"; 4674 transaction.method = "HEAD";
4620 transaction.data = ""; 4675 transaction.data = "";
4621 RunTransactionTest(cache.http_cache(), transaction); 4676 RunTransactionTest(cache.http_cache(), transaction);
4622 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 4677 EXPECT_EQ(2, cache.network_layer()->transaction_count());
4623 4678
4624 // Load from the cache. 4679 // Load from the cache.
4625 transaction.method = "GET"; 4680 transaction.method = "GET";
4626 transaction.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; 4681 transaction.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION;
4627 transaction.return_code = ERR_CACHE_MISS; 4682 transaction.start_return_code = ERR_CACHE_MISS;
4628 RunTransactionTest(cache.http_cache(), transaction); 4683 RunTransactionTest(cache.http_cache(), transaction);
4629 4684
4630 RemoveMockTransaction(&transaction); 4685 RemoveMockTransaction(&transaction);
4631 } 4686 }
4632 4687
4633 // Tests that we do not cache the response of a PUT. 4688 // Tests that we do not cache the response of a PUT.
4634 TEST(HttpCache, SimplePUT_Miss) { 4689 TEST(HttpCache, SimplePUT_Miss) {
4635 MockHttpCache cache; 4690 MockHttpCache cache;
4636 4691
4637 MockTransaction transaction(kSimplePOST_Transaction); 4692 MockTransaction transaction(kSimplePOST_Transaction);
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
4894 // Tests that we don't invalidate entries after a failed network transaction. 4949 // Tests that we don't invalidate entries after a failed network transaction.
4895 TEST(HttpCache, SimpleGET_DontInvalidateOnFailure) { 4950 TEST(HttpCache, SimpleGET_DontInvalidateOnFailure) {
4896 MockHttpCache cache; 4951 MockHttpCache cache;
4897 4952
4898 // Populate the cache. 4953 // Populate the cache.
4899 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction); 4954 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction);
4900 EXPECT_EQ(1, cache.network_layer()->transaction_count()); 4955 EXPECT_EQ(1, cache.network_layer()->transaction_count());
4901 4956
4902 // Fail the network request. 4957 // Fail the network request.
4903 MockTransaction transaction(kSimpleGET_Transaction); 4958 MockTransaction transaction(kSimpleGET_Transaction);
4904 transaction.return_code = ERR_FAILED; 4959 transaction.start_return_code = ERR_FAILED;
4905 transaction.load_flags |= LOAD_VALIDATE_CACHE; 4960 transaction.load_flags |= LOAD_VALIDATE_CACHE;
4906 4961
4907 AddMockTransaction(&transaction); 4962 AddMockTransaction(&transaction);
4908 RunTransactionTest(cache.http_cache(), transaction); 4963 RunTransactionTest(cache.http_cache(), transaction);
4909 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 4964 EXPECT_EQ(2, cache.network_layer()->transaction_count());
4910 RemoveMockTransaction(&transaction); 4965 RemoveMockTransaction(&transaction);
4911 4966
4912 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; 4967 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION;
4913 transaction.return_code = OK; 4968 transaction.start_return_code = OK;
4914 AddMockTransaction(&transaction); 4969 AddMockTransaction(&transaction);
4915 RunTransactionTest(cache.http_cache(), transaction); 4970 RunTransactionTest(cache.http_cache(), transaction);
4916 4971
4917 // Make sure the transaction didn't reach the network. 4972 // Make sure the transaction didn't reach the network.
4918 EXPECT_EQ(2, cache.network_layer()->transaction_count()); 4973 EXPECT_EQ(2, cache.network_layer()->transaction_count());
4919 RemoveMockTransaction(&transaction); 4974 RemoveMockTransaction(&transaction);
4920 } 4975 }
4921 4976
4922 TEST(HttpCache, RangeGET_SkipsCache) { 4977 TEST(HttpCache, RangeGET_SkipsCache) {
4923 MockHttpCache cache; 4978 MockHttpCache cache;
(...skipping 3054 matching lines...) Expand 10 before | Expand all | Expand 10 after
7978 transaction.request_headers = "accept-encoding: gzip\r\n"; 8033 transaction.request_headers = "accept-encoding: gzip\r\n";
7979 transaction.response_headers = 8034 transaction.response_headers =
7980 "Vary: accept-encoding\n" 8035 "Vary: accept-encoding\n"
7981 "Cache-Control: max-age=10000\n"; 8036 "Cache-Control: max-age=10000\n";
7982 RunTransactionTest(cache.http_cache(), transaction); 8037 RunTransactionTest(cache.http_cache(), transaction);
7983 8038
7984 // Change the request headers so that the request doesn't match due to vary. 8039 // Change the request headers so that the request doesn't match due to vary.
7985 // The request should fail. 8040 // The request should fail.
7986 transaction.load_flags = LOAD_ONLY_FROM_CACHE; 8041 transaction.load_flags = LOAD_ONLY_FROM_CACHE;
7987 transaction.request_headers = "accept-encoding: foo\r\n"; 8042 transaction.request_headers = "accept-encoding: foo\r\n";
7988 transaction.return_code = ERR_CACHE_MISS; 8043 transaction.start_return_code = ERR_CACHE_MISS;
7989 RunTransactionTest(cache.http_cache(), transaction); 8044 RunTransactionTest(cache.http_cache(), transaction);
7990 8045
7991 // Change the load flags to ignore vary checks, the request should now hit. 8046 // Change the load flags to ignore vary checks, the request should now hit.
7992 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_VARY_CHECK; 8047 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_VARY_CHECK;
7993 transaction.return_code = OK; 8048 transaction.start_return_code = OK;
7994 RunTransactionTest(cache.http_cache(), transaction); 8049 RunTransactionTest(cache.http_cache(), transaction);
7995 } 8050 }
7996 8051
7997 // Tests that we only return valid entries with LOAD_ONLY_FROM_CACHE 8052 // Tests that we only return valid entries with LOAD_ONLY_FROM_CACHE
7998 // transactions unless LOAD_SKIP_CACHE_VALIDATION is set. 8053 // transactions unless LOAD_SKIP_CACHE_VALIDATION is set.
7999 TEST(HttpCache, ValidLoadOnlyFromCache) { 8054 TEST(HttpCache, ValidLoadOnlyFromCache) {
8000 MockHttpCache cache; 8055 MockHttpCache cache;
8001 base::SimpleTestClock* clock = new base::SimpleTestClock(); 8056 base::SimpleTestClock* clock = new base::SimpleTestClock();
8002 cache.http_cache()->SetClockForTesting(base::WrapUnique(clock)); 8057 cache.http_cache()->SetClockForTesting(base::WrapUnique(clock));
8003 cache.network_layer()->SetClock(clock); 8058 cache.network_layer()->SetClock(clock);
8004 8059
8005 // Write a resource that will expire in 100 seconds. 8060 // Write a resource that will expire in 100 seconds.
8006 ScopedMockTransaction transaction(kSimpleGET_Transaction); 8061 ScopedMockTransaction transaction(kSimpleGET_Transaction);
8007 transaction.response_headers = "Cache-Control: max-age=100\n"; 8062 transaction.response_headers = "Cache-Control: max-age=100\n";
8008 RunTransactionTest(cache.http_cache(), transaction); 8063 RunTransactionTest(cache.http_cache(), transaction);
8009 8064
8010 // Move forward in time such that the cached response is no longer valid. 8065 // Move forward in time such that the cached response is no longer valid.
8011 clock->Advance(base::TimeDelta::FromSeconds(101)); 8066 clock->Advance(base::TimeDelta::FromSeconds(101));
8012 8067
8013 // Skipping cache validation should still return a response. 8068 // Skipping cache validation should still return a response.
8014 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; 8069 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION;
8015 RunTransactionTest(cache.http_cache(), transaction); 8070 RunTransactionTest(cache.http_cache(), transaction);
8016 8071
8017 // If the cache entry is checked for validitiy, it should fail. 8072 // If the cache entry is checked for validitiy, it should fail.
8018 transaction.load_flags = LOAD_ONLY_FROM_CACHE; 8073 transaction.load_flags = LOAD_ONLY_FROM_CACHE;
8019 transaction.return_code = ERR_CACHE_MISS; 8074 transaction.start_return_code = ERR_CACHE_MISS;
8020 RunTransactionTest(cache.http_cache(), transaction); 8075 RunTransactionTest(cache.http_cache(), transaction);
8021 } 8076 }
8022 8077
8023 TEST(HttpCache, InvalidLoadFlagCombination) { 8078 TEST(HttpCache, InvalidLoadFlagCombination) {
8024 MockHttpCache cache; 8079 MockHttpCache cache;
8025 8080
8026 // Put the resource in the cache. 8081 // Put the resource in the cache.
8027 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction); 8082 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction);
8028 8083
8029 // Now try to fetch it again, but with a flag combination disallowing both 8084 // Now try to fetch it again, but with a flag combination disallowing both
8030 // cache and network access. 8085 // cache and network access.
8031 ScopedMockTransaction transaction(kSimpleGET_Transaction); 8086 ScopedMockTransaction transaction(kSimpleGET_Transaction);
8032 // DevTools relies on this combination of flags for "disable cache" mode 8087 // DevTools relies on this combination of flags for "disable cache" mode
8033 // when a resource is only supposed to be loaded from cache. 8088 // when a resource is only supposed to be loaded from cache.
8034 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_BYPASS_CACHE; 8089 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_BYPASS_CACHE;
8035 transaction.return_code = ERR_CACHE_MISS; 8090 transaction.start_return_code = ERR_CACHE_MISS;
8036 RunTransactionTest(cache.http_cache(), transaction); 8091 RunTransactionTest(cache.http_cache(), transaction);
8037 } 8092 }
8038 8093
8039 // Tests that we can read metadata after validating the entry and with READ mode 8094 // Tests that we can read metadata after validating the entry and with READ mode
8040 // transactions. 8095 // transactions.
8041 TEST(HttpCache, ReadMetadata) { 8096 TEST(HttpCache, ReadMetadata) {
8042 MockHttpCache cache; 8097 MockHttpCache cache;
8043 8098
8044 // Write to the cache 8099 // Write to the cache
8045 HttpResponseInfo response; 8100 HttpResponseInfo response;
(...skipping 1258 matching lines...) Expand 10 before | Expand all | Expand 10 after
9304 ASSERT_TRUE(attrs->GetDictionary( 9359 ASSERT_TRUE(attrs->GetDictionary(
9305 base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs)); 9360 base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs));
9306 std::string size; 9361 std::string size;
9307 ASSERT_TRUE(size_attrs->GetString("value", &size)); 9362 ASSERT_TRUE(size_attrs->GetString("value", &size));
9308 int actual_size = 0; 9363 int actual_size = 0;
9309 ASSERT_TRUE(base::HexStringToInt(size, &actual_size)); 9364 ASSERT_TRUE(base::HexStringToInt(size, &actual_size));
9310 ASSERT_LT(0, actual_size); 9365 ASSERT_LT(0, actual_size);
9311 } 9366 }
9312 9367
9313 } // namespace net 9368 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698