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

Unified Diff: net/http/http_cache_unittest.cc

Issue 164304: Http cache: Extend support for byte range requests.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/http/http_cache.cc ('k') | net/http/http_response_headers.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/http/http_cache_unittest.cc
===================================================================
--- net/http/http_cache_unittest.cc (revision 22968)
+++ net/http/http_cache_unittest.cc (working copy)
@@ -485,8 +485,10 @@
std::string* response_status,
std::string* response_headers,
std::string* response_data) {
- if (request->extra_headers.empty())
+ if (request->extra_headers.empty()) {
+ response_status->assign("HTTP/1.1 416 Requested Range Not Satisfiable");
return;
+ }
std::vector<net::HttpByteRange> ranges;
if (!net::HttpUtil::ParseRanges(request->extra_headers, &ranges) ||
@@ -505,9 +507,20 @@
response_headers->append(content_range);
if (request->extra_headers.find("If-None-Match") == std::string::npos) {
- EXPECT_EQ(9, end - start);
- std::string data = StringPrintf("rg: %02d-%02d ", start, end);
+ EXPECT_EQ(9, (end - start) % 10);
+ std::string data;
+ for (int block_start = start; block_start < end; block_start += 10)
+ StringAppendF(&data, "rg: %02d-%02d ", block_start, block_start + 9);
*response_data = data;
+
+ if (end - start != 9) {
+ // We also have to fix content-length.
+ int len = end - start + 1;
+ EXPECT_EQ(0, len % 10);
+ std::string content_length = StringPrintf("Content-Length: %d\n", len);
+ response_headers->replace(response_headers->find("Content-Length:"),
+ content_length.size(), content_length);
+ }
} else {
response_status->assign("HTTP/1.1 304 Not Modified");
response_data->clear();
@@ -1634,13 +1647,14 @@
TEST(HttpCache, GET_Crazy206) {
MockHttpCache cache;
- AddMockTransaction(&kRangeGET_TransactionOK);
// Test that receiving 206 for a regular request is handled correctly.
// Write to the cache.
MockTransaction transaction(kRangeGET_TransactionOK);
+ AddMockTransaction(&transaction);
transaction.request_headers = "";
+ transaction.handler = NULL;
RunTransactionTest(cache.http_cache(), transaction);
EXPECT_EQ(1, cache.network_layer()->transaction_count());
@@ -1653,7 +1667,7 @@
EXPECT_EQ(2, cache.network_layer()->transaction_count());
EXPECT_EQ(1, cache.disk_cache()->open_count());
EXPECT_EQ(1, cache.disk_cache()->create_count());
- RemoveMockTransaction(&kRangeGET_TransactionOK);
+ RemoveMockTransaction(&transaction);
}
TEST(HttpCache, DISABLED_RangeGET_OK) {
@@ -1706,7 +1720,7 @@
RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
EXPECT_TRUE(Verify206Response(headers, 20, 59));
- EXPECT_EQ(6, cache.network_layer()->transaction_count());
+ EXPECT_EQ(5, cache.network_layer()->transaction_count());
EXPECT_EQ(3, cache.disk_cache()->open_count());
EXPECT_EQ(1, cache.disk_cache()->create_count());
@@ -1742,7 +1756,7 @@
RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
EXPECT_TRUE(Verify206Response(headers, 60, 79));
- EXPECT_EQ(3, cache.network_layer()->transaction_count());
+ EXPECT_EQ(2, cache.network_layer()->transaction_count());
EXPECT_EQ(1, cache.disk_cache()->open_count());
EXPECT_EQ(1, cache.disk_cache()->create_count());
@@ -1751,15 +1765,19 @@
TEST(HttpCache, DISABLED_UnknownRangeGET_2) {
MockHttpCache cache;
- AddMockTransaction(&kRangeGET_TransactionOK);
// Test that we can cache range requests when the start or end is unknown.
// We start with one request from a given point, followed by a suffix request.
+ // We'll also verify that synchronous cache responses work as intended.
std::string headers;
+ MockTransaction transaction(kRangeGET_TransactionOK);
+ transaction.test_mode = TEST_MODE_SYNC_CACHE_START |
+ TEST_MODE_SYNC_CACHE_READ;
+ AddMockTransaction(&transaction);
+
// Write to the cache (70-79).
- MockTransaction transaction(kRangeGET_TransactionOK);
transaction.request_headers = "Range: bytes = 70-\r\n";
transaction.data = "rg: 70-79 ";
RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
@@ -1778,6 +1796,38 @@
RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
EXPECT_TRUE(Verify206Response(headers, 60, 79));
+ EXPECT_EQ(2, cache.network_layer()->transaction_count());
+ EXPECT_EQ(1, cache.disk_cache()->open_count());
+ EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ RemoveMockTransaction(&transaction);
+}
+
+TEST(HttpCache, DISABLED_GET_Previous206) {
+ MockHttpCache cache;
+ AddMockTransaction(&kRangeGET_TransactionOK);
+
+ // Test that we can handle non-range requests when we have cached a range.
+
+ std::string headers;
+
+ // Write to the cache (40-49).
+ RunTransactionTestWithResponse(cache.http_cache(), kRangeGET_TransactionOK,
+ &headers);
+
+ EXPECT_TRUE(Verify206Response(headers, 40, 49));
+ EXPECT_EQ(1, cache.network_layer()->transaction_count());
+ EXPECT_EQ(0, cache.disk_cache()->open_count());
+ EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ // Write and read from the cache (0-79), when not asked for a range.
+ MockTransaction transaction(kRangeGET_TransactionOK);
+ transaction.request_headers = "";
+ transaction.data = "rg: 00-09 rg: 10-19 rg: 20-29 rg: 30-39 rg: 40-49 "
+ "rg: 50-59 rg: 60-69 rg: 70-79 ";
+ RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
+
+ EXPECT_EQ(0U, headers.find("HTTP/1.1 200 OK\n"));
EXPECT_EQ(3, cache.network_layer()->transaction_count());
EXPECT_EQ(1, cache.disk_cache()->open_count());
EXPECT_EQ(1, cache.disk_cache()->create_count());
@@ -1785,6 +1835,130 @@
RemoveMockTransaction(&kRangeGET_TransactionOK);
}
+TEST(HttpCache, DISABLED_GET_Previous206_NotSparse) {
+ MockHttpCache cache;
+
+ // Test that we can handle cached 206 responses that are not sparse.
+
+ // Create a disk cache entry that stores 206 headers while not being sparse.
+ disk_cache::Entry* entry;
+ ASSERT_TRUE(cache.disk_cache()->CreateEntry(kSimpleGET_Transaction.url,
+ &entry));
+
+ std::string raw_headers(kRangeGET_TransactionOK.status);
+ raw_headers.append("\n");
+ raw_headers.append(kRangeGET_TransactionOK.response_headers);
+ raw_headers = net::HttpUtil::AssembleRawHeaders(raw_headers.data(),
+ raw_headers.size());
+
+ net::HttpResponseInfo response;
+ response.headers = new net::HttpResponseHeaders(raw_headers);
+ net::HttpCache::WriteResponseInfo(entry, &response, true);
+
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(500));
+ int len = static_cast<int>(base::strlcpy(buf->data(),
+ kRangeGET_TransactionOK.data, 500));
+ EXPECT_EQ(len, entry->WriteData(1, 0, buf, len, NULL, true));
+ entry->Close();
+
+ // Now see that we don't use the stored entry.
+ std::string headers;
+ RunTransactionTestWithResponse(cache.http_cache(), kSimpleGET_Transaction,
+ &headers);
+
+ // We are expecting a 200.
+ std::string expected_headers(kSimpleGET_Transaction.status);
+ expected_headers.append("\n");
+ expected_headers.append(kSimpleGET_Transaction.response_headers);
+ EXPECT_EQ(expected_headers, headers);
+ EXPECT_EQ(1, cache.network_layer()->transaction_count());
+ EXPECT_EQ(1, cache.disk_cache()->open_count());
+ EXPECT_EQ(2, cache.disk_cache()->create_count());
+}
+
+TEST(HttpCache, DISABLED_GET_Previous206_NotSparse_2) {
+ MockHttpCache cache;
+ AddMockTransaction(&kRangeGET_TransactionOK);
+
+ // Test that we can handle cached 206 responses that are not sparse. This time
+ // we issue a range request and expect to receive a range.
+
+ // Create a disk cache entry that stores 206 headers while not being sparse.
+ disk_cache::Entry* entry;
+ ASSERT_TRUE(cache.disk_cache()->CreateEntry(kRangeGET_TransactionOK.url,
+ &entry));
+
+ std::string raw_headers(kRangeGET_TransactionOK.status);
+ raw_headers.append("\n");
+ raw_headers.append(kRangeGET_TransactionOK.response_headers);
+ raw_headers = net::HttpUtil::AssembleRawHeaders(raw_headers.data(),
+ raw_headers.size());
+
+ net::HttpResponseInfo response;
+ response.headers = new net::HttpResponseHeaders(raw_headers);
+ net::HttpCache::WriteResponseInfo(entry, &response, true);
+
+ scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(500));
+ int len = static_cast<int>(base::strlcpy(buf->data(),
+ kRangeGET_TransactionOK.data, 500));
+ EXPECT_EQ(len, entry->WriteData(1, 0, buf, len, NULL, true));
+ entry->Close();
+
+ // Now see that we don't use the stored entry.
+ std::string headers;
+ RunTransactionTestWithResponse(cache.http_cache(), kRangeGET_TransactionOK,
+ &headers);
+
+ // We are expecting a 206.
+ EXPECT_TRUE(Verify206Response(headers, 40, 49));
+ EXPECT_EQ(1, cache.network_layer()->transaction_count());
+ EXPECT_EQ(1, cache.disk_cache()->open_count());
+ EXPECT_EQ(2, cache.disk_cache()->create_count());
+
+ RemoveMockTransaction(&kRangeGET_TransactionOK);
+}
+
+TEST(HttpCache, DISABLED_RangeRequestResultsIn200) {
+ MockHttpCache cache;
+ AddMockTransaction(&kRangeGET_TransactionOK);
+
+ // Test that we can handle a 200 response when dealing with sparse entries.
+
+ std::string headers;
+
+ // Write to the cache (70-79).
+ MockTransaction transaction(kRangeGET_TransactionOK);
+ transaction.request_headers = "Range: bytes = -10\r\n";
+ transaction.data = "rg: 70-79 ";
+ RunTransactionTestWithResponse(cache.http_cache(), transaction, &headers);
+
+ EXPECT_TRUE(Verify206Response(headers, 70, 79));
+ EXPECT_EQ(1, cache.network_layer()->transaction_count());
+ EXPECT_EQ(0, cache.disk_cache()->open_count());
+ EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ // Now we'll issue a request that results in a plain 200 response, but to
+ // the to the same URL that we used to store sparse data, and making sure
+ // that we ask for a range.
+ RemoveMockTransaction(&kRangeGET_TransactionOK);
+ MockTransaction transaction2(kSimpleGET_Transaction);
+ transaction2.url = kRangeGET_TransactionOK.url;
+ transaction2.request_headers = kRangeGET_TransactionOK.request_headers;
+ AddMockTransaction(&transaction2);
+
+ RunTransactionTestWithResponse(cache.http_cache(), transaction2, &headers);
+
+ std::string expected_headers(kSimpleGET_Transaction.status);
+ expected_headers.append("\n");
+ expected_headers.append(kSimpleGET_Transaction.response_headers);
+ EXPECT_EQ(expected_headers, headers);
+ EXPECT_EQ(2, cache.network_layer()->transaction_count());
+ EXPECT_EQ(1, cache.disk_cache()->open_count());
+ EXPECT_EQ(1, cache.disk_cache()->create_count());
+
+ RemoveMockTransaction(&transaction2);
+}
+
TEST(HttpCache, SyncRead) {
MockHttpCache cache;
« no previous file with comments | « net/http/http_cache.cc ('k') | net/http/http_response_headers.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698