| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 3416 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4506 MockTransaction transaction(kSimpleGET_Transaction); | 4506 MockTransaction transaction(kSimpleGET_Transaction); |
| 4507 AddMockTransaction(&transaction); | 4507 AddMockTransaction(&transaction); |
| 4508 | 4508 |
| 4509 // Populate the cache. | 4509 // Populate the cache. |
| 4510 RunTransactionTest(cache.http_cache(), transaction); | 4510 RunTransactionTest(cache.http_cache(), transaction); |
| 4511 | 4511 |
| 4512 // Load from cache. | 4512 // Load from cache. |
| 4513 transaction.method = "HEAD"; | 4513 transaction.method = "HEAD"; |
| 4514 transaction.request_headers = "Range: bytes = 0-4\r\n"; | 4514 transaction.request_headers = "Range: bytes = 0-4\r\n"; |
| 4515 transaction.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; | 4515 transaction.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; |
| 4516 transaction.return_code = ERR_CACHE_MISS; | 4516 transaction.start_return_code = ERR_CACHE_MISS; |
| 4517 RunTransactionTest(cache.http_cache(), transaction); | 4517 RunTransactionTest(cache.http_cache(), transaction); |
| 4518 | 4518 |
| 4519 EXPECT_EQ(0, cache.disk_cache()->open_count()); | 4519 EXPECT_EQ(0, cache.disk_cache()->open_count()); |
| 4520 EXPECT_EQ(1, cache.disk_cache()->create_count()); | 4520 EXPECT_EQ(1, cache.disk_cache()->create_count()); |
| 4521 RemoveMockTransaction(&transaction); | 4521 RemoveMockTransaction(&transaction); |
| 4522 } | 4522 } |
| 4523 | 4523 |
| 4524 // 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. |
| 4525 TEST(HttpCache, SimpleHEAD_WithCachedRanges) { | 4525 TEST(HttpCache, SimpleHEAD_WithCachedRanges) { |
| 4526 MockHttpCache cache; | 4526 MockHttpCache cache; |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4672 | 4672 |
| 4673 // Update the cache. | 4673 // Update the cache. |
| 4674 transaction.method = "HEAD"; | 4674 transaction.method = "HEAD"; |
| 4675 transaction.data = ""; | 4675 transaction.data = ""; |
| 4676 RunTransactionTest(cache.http_cache(), transaction); | 4676 RunTransactionTest(cache.http_cache(), transaction); |
| 4677 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 4677 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
| 4678 | 4678 |
| 4679 // Load from the cache. | 4679 // Load from the cache. |
| 4680 transaction.method = "GET"; | 4680 transaction.method = "GET"; |
| 4681 transaction.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; | 4681 transaction.load_flags |= LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; |
| 4682 transaction.return_code = ERR_CACHE_MISS; | 4682 transaction.start_return_code = ERR_CACHE_MISS; |
| 4683 RunTransactionTest(cache.http_cache(), transaction); | 4683 RunTransactionTest(cache.http_cache(), transaction); |
| 4684 | 4684 |
| 4685 RemoveMockTransaction(&transaction); | 4685 RemoveMockTransaction(&transaction); |
| 4686 } | 4686 } |
| 4687 | 4687 |
| 4688 // Tests that we do not cache the response of a PUT. | 4688 // Tests that we do not cache the response of a PUT. |
| 4689 TEST(HttpCache, SimplePUT_Miss) { | 4689 TEST(HttpCache, SimplePUT_Miss) { |
| 4690 MockHttpCache cache; | 4690 MockHttpCache cache; |
| 4691 | 4691 |
| 4692 MockTransaction transaction(kSimplePOST_Transaction); | 4692 MockTransaction transaction(kSimplePOST_Transaction); |
| (...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4949 // 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. |
| 4950 TEST(HttpCache, SimpleGET_DontInvalidateOnFailure) { | 4950 TEST(HttpCache, SimpleGET_DontInvalidateOnFailure) { |
| 4951 MockHttpCache cache; | 4951 MockHttpCache cache; |
| 4952 | 4952 |
| 4953 // Populate the cache. | 4953 // Populate the cache. |
| 4954 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction); | 4954 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction); |
| 4955 EXPECT_EQ(1, cache.network_layer()->transaction_count()); | 4955 EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
| 4956 | 4956 |
| 4957 // Fail the network request. | 4957 // Fail the network request. |
| 4958 MockTransaction transaction(kSimpleGET_Transaction); | 4958 MockTransaction transaction(kSimpleGET_Transaction); |
| 4959 transaction.return_code = ERR_FAILED; | 4959 transaction.start_return_code = ERR_FAILED; |
| 4960 transaction.load_flags |= LOAD_VALIDATE_CACHE; | 4960 transaction.load_flags |= LOAD_VALIDATE_CACHE; |
| 4961 | 4961 |
| 4962 AddMockTransaction(&transaction); | 4962 AddMockTransaction(&transaction); |
| 4963 RunTransactionTest(cache.http_cache(), transaction); | 4963 RunTransactionTest(cache.http_cache(), transaction); |
| 4964 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 4964 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
| 4965 RemoveMockTransaction(&transaction); | 4965 RemoveMockTransaction(&transaction); |
| 4966 | 4966 |
| 4967 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; | 4967 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; |
| 4968 transaction.return_code = OK; | 4968 transaction.start_return_code = OK; |
| 4969 AddMockTransaction(&transaction); | 4969 AddMockTransaction(&transaction); |
| 4970 RunTransactionTest(cache.http_cache(), transaction); | 4970 RunTransactionTest(cache.http_cache(), transaction); |
| 4971 | 4971 |
| 4972 // Make sure the transaction didn't reach the network. | 4972 // Make sure the transaction didn't reach the network. |
| 4973 EXPECT_EQ(2, cache.network_layer()->transaction_count()); | 4973 EXPECT_EQ(2, cache.network_layer()->transaction_count()); |
| 4974 RemoveMockTransaction(&transaction); | 4974 RemoveMockTransaction(&transaction); |
| 4975 } | 4975 } |
| 4976 | 4976 |
| 4977 TEST(HttpCache, RangeGET_SkipsCache) { | 4977 TEST(HttpCache, RangeGET_SkipsCache) { |
| 4978 MockHttpCache cache; | 4978 MockHttpCache cache; |
| (...skipping 3054 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8033 transaction.request_headers = "accept-encoding: gzip\r\n"; | 8033 transaction.request_headers = "accept-encoding: gzip\r\n"; |
| 8034 transaction.response_headers = | 8034 transaction.response_headers = |
| 8035 "Vary: accept-encoding\n" | 8035 "Vary: accept-encoding\n" |
| 8036 "Cache-Control: max-age=10000\n"; | 8036 "Cache-Control: max-age=10000\n"; |
| 8037 RunTransactionTest(cache.http_cache(), transaction); | 8037 RunTransactionTest(cache.http_cache(), transaction); |
| 8038 | 8038 |
| 8039 // 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. |
| 8040 // The request should fail. | 8040 // The request should fail. |
| 8041 transaction.load_flags = LOAD_ONLY_FROM_CACHE; | 8041 transaction.load_flags = LOAD_ONLY_FROM_CACHE; |
| 8042 transaction.request_headers = "accept-encoding: foo\r\n"; | 8042 transaction.request_headers = "accept-encoding: foo\r\n"; |
| 8043 transaction.return_code = ERR_CACHE_MISS; | 8043 transaction.start_return_code = ERR_CACHE_MISS; |
| 8044 RunTransactionTest(cache.http_cache(), transaction); | 8044 RunTransactionTest(cache.http_cache(), transaction); |
| 8045 | 8045 |
| 8046 // 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. |
| 8047 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_VARY_CHECK; | 8047 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_VARY_CHECK; |
| 8048 transaction.return_code = OK; | 8048 transaction.start_return_code = OK; |
| 8049 RunTransactionTest(cache.http_cache(), transaction); | 8049 RunTransactionTest(cache.http_cache(), transaction); |
| 8050 } | 8050 } |
| 8051 | 8051 |
| 8052 // 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 |
| 8053 // transactions unless LOAD_SKIP_CACHE_VALIDATION is set. | 8053 // transactions unless LOAD_SKIP_CACHE_VALIDATION is set. |
| 8054 TEST(HttpCache, ValidLoadOnlyFromCache) { | 8054 TEST(HttpCache, ValidLoadOnlyFromCache) { |
| 8055 MockHttpCache cache; | 8055 MockHttpCache cache; |
| 8056 base::SimpleTestClock* clock = new base::SimpleTestClock(); | 8056 base::SimpleTestClock* clock = new base::SimpleTestClock(); |
| 8057 cache.http_cache()->SetClockForTesting(base::WrapUnique(clock)); | 8057 cache.http_cache()->SetClockForTesting(base::WrapUnique(clock)); |
| 8058 cache.network_layer()->SetClock(clock); | 8058 cache.network_layer()->SetClock(clock); |
| 8059 | 8059 |
| 8060 // Write a resource that will expire in 100 seconds. | 8060 // Write a resource that will expire in 100 seconds. |
| 8061 ScopedMockTransaction transaction(kSimpleGET_Transaction); | 8061 ScopedMockTransaction transaction(kSimpleGET_Transaction); |
| 8062 transaction.response_headers = "Cache-Control: max-age=100\n"; | 8062 transaction.response_headers = "Cache-Control: max-age=100\n"; |
| 8063 RunTransactionTest(cache.http_cache(), transaction); | 8063 RunTransactionTest(cache.http_cache(), transaction); |
| 8064 | 8064 |
| 8065 // 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. |
| 8066 clock->Advance(base::TimeDelta::FromSeconds(101)); | 8066 clock->Advance(base::TimeDelta::FromSeconds(101)); |
| 8067 | 8067 |
| 8068 // Skipping cache validation should still return a response. | 8068 // Skipping cache validation should still return a response. |
| 8069 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; | 8069 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_SKIP_CACHE_VALIDATION; |
| 8070 RunTransactionTest(cache.http_cache(), transaction); | 8070 RunTransactionTest(cache.http_cache(), transaction); |
| 8071 | 8071 |
| 8072 // If the cache entry is checked for validitiy, it should fail. | 8072 // If the cache entry is checked for validitiy, it should fail. |
| 8073 transaction.load_flags = LOAD_ONLY_FROM_CACHE; | 8073 transaction.load_flags = LOAD_ONLY_FROM_CACHE; |
| 8074 transaction.return_code = ERR_CACHE_MISS; | 8074 transaction.start_return_code = ERR_CACHE_MISS; |
| 8075 RunTransactionTest(cache.http_cache(), transaction); | 8075 RunTransactionTest(cache.http_cache(), transaction); |
| 8076 } | 8076 } |
| 8077 | 8077 |
| 8078 TEST(HttpCache, InvalidLoadFlagCombination) { | 8078 TEST(HttpCache, InvalidLoadFlagCombination) { |
| 8079 MockHttpCache cache; | 8079 MockHttpCache cache; |
| 8080 | 8080 |
| 8081 // Put the resource in the cache. | 8081 // Put the resource in the cache. |
| 8082 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction); | 8082 RunTransactionTest(cache.http_cache(), kSimpleGET_Transaction); |
| 8083 | 8083 |
| 8084 // 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 |
| 8085 // cache and network access. | 8085 // cache and network access. |
| 8086 ScopedMockTransaction transaction(kSimpleGET_Transaction); | 8086 ScopedMockTransaction transaction(kSimpleGET_Transaction); |
| 8087 // DevTools relies on this combination of flags for "disable cache" mode | 8087 // DevTools relies on this combination of flags for "disable cache" mode |
| 8088 // when a resource is only supposed to be loaded from cache. | 8088 // when a resource is only supposed to be loaded from cache. |
| 8089 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_BYPASS_CACHE; | 8089 transaction.load_flags = LOAD_ONLY_FROM_CACHE | LOAD_BYPASS_CACHE; |
| 8090 transaction.return_code = ERR_CACHE_MISS; | 8090 transaction.start_return_code = ERR_CACHE_MISS; |
| 8091 RunTransactionTest(cache.http_cache(), transaction); | 8091 RunTransactionTest(cache.http_cache(), transaction); |
| 8092 } | 8092 } |
| 8093 | 8093 |
| 8094 // 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 |
| 8095 // transactions. | 8095 // transactions. |
| 8096 TEST(HttpCache, ReadMetadata) { | 8096 TEST(HttpCache, ReadMetadata) { |
| 8097 MockHttpCache cache; | 8097 MockHttpCache cache; |
| 8098 | 8098 |
| 8099 // Write to the cache | 8099 // Write to the cache |
| 8100 HttpResponseInfo response; | 8100 HttpResponseInfo response; |
| (...skipping 1258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9359 ASSERT_TRUE(attrs->GetDictionary( | 9359 ASSERT_TRUE(attrs->GetDictionary( |
| 9360 base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs)); | 9360 base::trace_event::MemoryAllocatorDump::kNameSize, &size_attrs)); |
| 9361 std::string size; | 9361 std::string size; |
| 9362 ASSERT_TRUE(size_attrs->GetString("value", &size)); | 9362 ASSERT_TRUE(size_attrs->GetString("value", &size)); |
| 9363 int actual_size = 0; | 9363 int actual_size = 0; |
| 9364 ASSERT_TRUE(base::HexStringToInt(size, &actual_size)); | 9364 ASSERT_TRUE(base::HexStringToInt(size, &actual_size)); |
| 9365 ASSERT_LT(0, actual_size); | 9365 ASSERT_LT(0, actual_size); |
| 9366 } | 9366 } |
| 9367 | 9367 |
| 9368 } // namespace net | 9368 } // namespace net |
| OLD | NEW |