Chromium Code Reviews| Index: net/http/http_cache_unittest.cc |
| diff --git a/net/http/http_cache_unittest.cc b/net/http/http_cache_unittest.cc |
| index 01909ae3c505828c566cde302498e07e4c7e4410..070163a390eb9d571769956d625724c8b986696c 100644 |
| --- a/net/http/http_cache_unittest.cc |
| +++ b/net/http/http_cache_unittest.cc |
| @@ -501,6 +501,33 @@ const MockTransaction kRangeGET_TransactionOK = { |
| net::OK |
| }; |
| +// The cache should return no response, so data is empty, but the |
| +// network will return data. (For redirects, DoneReading() is used to |
| +// discard the response.) |
| +void DiscardedResponseHandler(const net::HttpRequestInfo* request, |
| + std::string* response_status, |
| + std::string* response_headers, |
| + std::string* response_data) { |
| + *response_data = "hello"; |
| +} |
| + |
| +const MockTransaction kDiscardedResponse_Transaction = { |
|
rvargas (doing something else)
2013/09/18 18:37:10
If we keep this transaction, move it to right befo
davidben
2013/09/18 19:35:43
(Removed it)
|
| + "http://www.google.com/", |
| + "GET", |
| + base::Time(), |
| + "", |
| + net::LOAD_NORMAL, |
| + "HTTP/1.1 302 Found", |
| + "Cache-Control: max-age=10000\n" |
| + "Location: http://www.google.com/destination\n", |
| + base::Time(), |
| + "", |
| + TEST_MODE_NORMAL, |
| + DiscardedResponseHandler, |
|
rvargas (doing something else)
2013/09/18 18:37:10
From the point of view of the test, or the contrac
davidben
2013/09/18 19:35:43
(Removed it)
|
| + 0, |
| + net::OK |
| +}; |
| + |
| // Verifies the response headers (|response|) match a partial content |
| // response for the range starting at |start| and ending at |end|. |
| void Verify206Response(std::string response, int start, int end) { |
| @@ -5333,7 +5360,7 @@ TEST(HttpCache, CachedRedirect) { |
| MockHttpRequest request(kTestTransaction); |
| net::TestCompletionCallback callback; |
| - // write to the cache |
| + // Write to the cache. |
| { |
| scoped_ptr<net::HttpTransaction> trans; |
| int rv = cache.http_cache()->CreateTransaction( |
| @@ -5355,6 +5382,9 @@ TEST(HttpCache, CachedRedirect) { |
| info->headers->EnumerateHeader(NULL, "Location", &location); |
| EXPECT_EQ(location, "http://www.bar.com/"); |
| + // Mark the transaction as completed so it is cached. |
| + trans->DoneReading(); |
|
rvargas (doing something else)
2013/09/18 18:37:10
This would not be needed.
davidben
2013/09/18 19:35:43
(Left this in here for now pending discussion abou
|
| + |
| // Destroy transaction when going out of scope. We have not actually |
| // read the response body -- want to test that it is still getting cached. |
| } |
| @@ -5362,7 +5392,12 @@ TEST(HttpCache, CachedRedirect) { |
| EXPECT_EQ(0, cache.disk_cache()->open_count()); |
| EXPECT_EQ(1, cache.disk_cache()->create_count()); |
| - // read from the cache |
| + // Active entries in the cache are not retired synchronously. Make |
| + // sure the next run hits the MockHttpCache and open_count is |
| + // correct. |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + |
| + // Read from the cache. |
| { |
| scoped_ptr<net::HttpTransaction> trans; |
| int rv = cache.http_cache()->CreateTransaction( |
| @@ -5384,6 +5419,9 @@ TEST(HttpCache, CachedRedirect) { |
| info->headers->EnumerateHeader(NULL, "Location", &location); |
| EXPECT_EQ(location, "http://www.bar.com/"); |
| + // Mark the transaction as completed so it is cached. |
| + trans->DoneReading(); |
| + |
| // Destroy transaction when going out of scope. We have not actually |
| // read the response body -- want to test that it is still getting cached. |
| } |
| @@ -5838,6 +5876,36 @@ TEST(HttpCache, FilterCompletion) { |
| EXPECT_EQ(1, cache.disk_cache()->create_count()); |
| } |
| +// Tests that we don't mark entries as truncated and release the cache |
| +// entry when DoneReading() is called before any Read() calls, such as |
| +// for a redirect. |
| +TEST(HttpCache, DiscardedResponse) { |
|
rvargas (doing something else)
2013/09/18 18:37:10
nit: DiscardedResponse -> DoneReading ?
davidben
2013/09/18 19:35:43
Done.
|
| + MockHttpCache cache; |
| + net::TestCompletionCallback callback; |
| + |
| + scoped_ptr<net::HttpTransaction> trans; |
| + int rv = cache.http_cache()->CreateTransaction( |
| + net::DEFAULT_PRIORITY, &trans, NULL); |
| + EXPECT_EQ(net::OK, rv); |
| + |
| + MockHttpRequest request(kDiscardedResponse_Transaction); |
|
rvargas (doing something else)
2013/09/18 18:37:10
I would prefer using kSimpleGET_Transaction and a
davidben
2013/09/18 19:35:43
Done.
|
| + rv = trans->Start(&request, callback.callback(), net::BoundNetLog()); |
| + EXPECT_EQ(net::OK, callback.GetResult(rv)); |
| + |
| + trans->DoneReading(); |
| + // Leave the transaction around. |
| + |
| + // Make sure that the ActiveEntry is gone. |
| + base::MessageLoop::current()->RunUntilIdle(); |
| + |
| + // Read from the cache. This should not deadlock. |
| + RunTransactionTest(cache.http_cache(), kDiscardedResponse_Transaction); |
| + |
| + EXPECT_EQ(1, cache.network_layer()->transaction_count()); |
| + EXPECT_EQ(1, cache.disk_cache()->open_count()); |
| + EXPECT_EQ(1, cache.disk_cache()->create_count()); |
| +} |
| + |
| // Tests that we stop caching when told. |
| TEST(HttpCache, StopCachingDeletesEntry) { |
| MockHttpCache cache; |