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

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

Issue 403393003: HTTP retry support. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixed according to comments. Created 6 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 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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_network_transaction.h" 5 #include "net/http/http_network_transaction.h"
6 6
7 #include <math.h> // ceil 7 #include <math.h> // ceil
8 #include <stdarg.h> 8 #include <stdarg.h>
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 "\r\n\r\n"; 275 "\r\n\r\n";
276 } 276 }
277 277
278 // Either |write_failure| specifies a write failure or |read_failure| 278 // Either |write_failure| specifies a write failure or |read_failure|
279 // specifies a read failure when using a reused socket. In either case, the 279 // specifies a read failure when using a reused socket. In either case, the
280 // failure should cause the network transaction to resend the request, and the 280 // failure should cause the network transaction to resend the request, and the
281 // other argument should be NULL. 281 // other argument should be NULL.
282 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure, 282 void KeepAliveConnectionResendRequestTest(const MockWrite* write_failure,
283 const MockRead* read_failure); 283 const MockRead* read_failure);
284 284
285 // Test behaviour of retries when a request can be retried automatically.
286 void PartialDataRetryTest(int expected_status,
287 const char* expected_response_data,
288 MockRead read1[],
289 size_t read1_count,
290 MockRead read2[],
291 size_t read2_count,
292 MockRead read3[] = NULL,
293 size_t read3_count = 0,
294 MockRead read4[] = NULL,
295 size_t read4_count = 0,
296 MockRead read5[] = NULL,
297 size_t read5_count = 0);
mmenke 2014/07/23 20:17:43 While the Google style guide does technically allo
298
285 // Either |write_failure| specifies a write failure or |read_failure| 299 // Either |write_failure| specifies a write failure or |read_failure|
286 // specifies a read failure when using a reused socket. In either case, the 300 // specifies a read failure when using a reused socket. In either case, the
287 // failure should cause the network transaction to resend the request, and the 301 // failure should cause the network transaction to resend the request, and the
288 // other argument should be NULL. 302 // other argument should be NULL.
289 void PreconnectErrorResendRequestTest(const MockWrite* write_failure, 303 void PreconnectErrorResendRequestTest(const MockWrite* write_failure,
290 const MockRead* read_failure, 304 const MockRead* read_failure,
291 bool use_spdy); 305 bool use_spdy);
292 306
293 SimpleGetHelperResult SimpleGetHelperForData(StaticSocketDataProvider* data[], 307 SimpleGetHelperResult SimpleGetHelperForData(StaticSocketDataProvider* data[],
294 size_t data_count) { 308 size_t data_count) {
(...skipping 1035 matching lines...) Expand 10 before | Expand all | Expand 10 after
1330 EXPECT_TRUE(response->headers.get() != NULL); 1344 EXPECT_TRUE(response->headers.get() != NULL);
1331 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); 1345 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1332 1346
1333 std::string response_data; 1347 std::string response_data;
1334 rv = ReadTransaction(trans.get(), &response_data); 1348 rv = ReadTransaction(trans.get(), &response_data);
1335 EXPECT_EQ(OK, rv); 1349 EXPECT_EQ(OK, rv);
1336 EXPECT_EQ(kExpectedResponseData[i], response_data); 1350 EXPECT_EQ(kExpectedResponseData[i], response_data);
1337 } 1351 }
1338 } 1352 }
1339 1353
1354 void HttpNetworkTransactionTest::PartialDataRetryTest(
1355 int expected_status,
1356 const char* expected_response_data,
1357 MockRead read1[],
1358 size_t read1_count,
1359 MockRead read2[],
1360 size_t read2_count,
1361 MockRead read3[],
1362 size_t read3_count,
1363 MockRead read4[],
1364 size_t read4_count,
1365 MockRead read5[],
1366 size_t read5_count) {
1367 HttpRequestInfo request;
1368 request.method = "GET";
1369 request.url = GURL("http://www.foo.com/");
1370 request.load_flags = 0;
1371
1372 CapturingNetLog net_log;
1373 session_deps_.net_log = &net_log;
mmenke 2014/07/23 20:17:42 nit: Don't need these two lines (A lot of tests s
jonnyr 2014/07/25 13:42:00 Done, but meant that I also had to remove TestLoad
1374 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
1375
1376 // Written data for successfully sending both requests.
1377 MockWrite data1_writes[] = {
1378 MockWrite("GET / HTTP/1.1\r\n"
1379 "Host: www.foo.com\r\n"
1380 "Connection: keep-alive\r\n\r\n")
1381 };
1382
1383 StaticSocketDataProvider data1(read1, read1_count,
1384 data1_writes, arraysize(data1_writes));
1385 session_deps_.socket_factory->AddSocketDataProvider(&data1);
1386
1387 StaticSocketDataProvider data2(read2, read2_count, NULL, 0);
mmenke 2014/07/23 20:17:43 Hrm...Only checking the write of the first request
jonnyr 2014/07/25 13:42:00 Yes, I need to see if I can verify that the retry
1388 if (read2)
1389 session_deps_.socket_factory->AddSocketDataProvider(&data2);
1390
1391 StaticSocketDataProvider data3(read3, read3_count, NULL, 0);
1392 if (read3)
1393 session_deps_.socket_factory->AddSocketDataProvider(&data3);
1394
1395 StaticSocketDataProvider data4(read4, read4_count, NULL, 0);
1396 if (read4)
1397 session_deps_.socket_factory->AddSocketDataProvider(&data4);
1398
1399 StaticSocketDataProvider data5(read5, read5_count, NULL, 0);
1400 if (read5)
1401 session_deps_.socket_factory->AddSocketDataProvider(&data5);
1402
1403 uint32 first_socket_log_id = NetLog::Source::kInvalidId;
1404 for (int i = 0; i < 1; ++i) {
mmenke 2014/07/23 20:17:43 This loop isn't needed.
jonnyr 2014/07/25 13:41:59 Done.
1405 TestCompletionCallback callback;
1406
1407 scoped_ptr<HttpTransaction> trans(
1408 new HttpNetworkTransaction(DEFAULT_PRIORITY, session.get()));
1409
1410 int rv = trans->Start(&request, callback.callback(), BoundNetLog());
1411 EXPECT_EQ(ERR_IO_PENDING, rv);
1412
1413 rv = callback.WaitForResult();
1414 EXPECT_EQ(OK, rv);
1415
1416 LoadTimingInfo load_timing_info;
1417 EXPECT_TRUE(trans->GetLoadTimingInfo(&load_timing_info));
1418 TestLoadTimingNotReused(load_timing_info, CONNECT_TIMING_HAS_DNS_TIMES);
1419 if (i == 0) {
1420 first_socket_log_id = load_timing_info.socket_log_id;
1421 } else {
1422 // The second request should be using a new socket.
1423 EXPECT_NE(first_socket_log_id, load_timing_info.socket_log_id);
1424 }
1425
1426 const HttpResponseInfo* response = trans->GetResponseInfo();
1427 ASSERT_TRUE(response != NULL);
1428
1429 EXPECT_TRUE(response->headers.get() != NULL);
1430 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine());
1431
1432 std::string response_data;
1433 rv = ReadTransaction(trans.get(), &response_data);
1434 EXPECT_EQ(expected_status, rv);
1435 EXPECT_EQ(expected_response_data, response_data);
1436 }
1437 }
1438
1340 void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest( 1439 void HttpNetworkTransactionTest::PreconnectErrorResendRequestTest(
1341 const MockWrite* write_failure, 1440 const MockWrite* write_failure,
1342 const MockRead* read_failure, 1441 const MockRead* read_failure,
1343 bool use_spdy) { 1442 bool use_spdy) {
1344 HttpRequestInfo request; 1443 HttpRequestInfo request;
1345 request.method = "GET"; 1444 request.method = "GET";
1346 request.url = GURL("https://www.foo.com/"); 1445 request.url = GURL("https://www.foo.com/");
1347 request.load_flags = 0; 1446 request.load_flags = 0;
1348 1447
1349 CapturingNetLog net_log; 1448 CapturingNetLog net_log;
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) { 1630 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorEOF) {
1532 MockRead read_failure(SYNCHRONOUS, OK); // EOF 1631 MockRead read_failure(SYNCHRONOUS, OK); // EOF
1533 PreconnectErrorResendRequestTest(NULL, &read_failure, true); 1632 PreconnectErrorResendRequestTest(NULL, &read_failure, true);
1534 } 1633 }
1535 1634
1536 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorAsyncEOF) { 1635 TEST_P(HttpNetworkTransactionTest, SpdyPreconnectErrorAsyncEOF) {
1537 MockRead read_failure(ASYNC, OK); // EOF 1636 MockRead read_failure(ASYNC, OK); // EOF
1538 PreconnectErrorResendRequestTest(NULL, &read_failure, true); 1637 PreconnectErrorResendRequestTest(NULL, &read_failure, true);
1539 } 1638 }
1540 1639
1640 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInHeader) {
1641 MockRead data_reads1[] = {
1642 MockRead("HTTP/1.1 200 OK\r\n"),
1643 MockRead("Content-Lengt"),
1644 MockRead(ASYNC, ERR_CONNECTION_RESET),
1645 };
1646
1647 MockRead data_reads2[] = {
1648 MockRead("HTTP/1.1 200 OK\r\n"),
1649 MockRead("Content-Length: 2\r\n\r\n"),
1650 MockRead("AA"),
1651 MockRead(ASYNC, OK),
1652 };
1653
1654 PartialDataRetryTest(OK, "AA", data_reads1, arraysize(data_reads1),
1655 data_reads2, arraysize(data_reads2));
1656 }
1657
1658 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodySingleRead) {
1659 MockRead data_reads1[] = {
1660 MockRead("HTTP/1.1 200 OK\r\n"),
1661 MockRead("Cache-Control: max-age=100\r\n"),
1662 MockRead("Content-Length: 2\r\n\r\n"),
1663 MockRead(ASYNC, ERR_CONNECTION_RESET),
1664 };
1665
1666 MockRead data_reads2[] = {
1667 MockRead("HTTP/1.1 200 OK\r\n"),
1668 MockRead("Cache-Control: max-age=100\r\n"),
mmenke 2014/07/23 20:17:43 I don't believe this test should have the max age
jonnyr 2014/07/25 13:41:59 This test checks full header without any body data
1669 MockRead("Content-Length: 2\r\n\r\nAB"),
1670 MockRead(ASYNC, OK),
1671 };
1672
1673 PartialDataRetryTest(OK, "AB", data_reads1, arraysize(data_reads1),
1674 data_reads2, arraysize(data_reads2));
1675 }
1676
1677 TEST_P(HttpNetworkTransactionTest, PartialDataRetryMaxAgeSuccess) {
1678 MockRead data_reads1[] = {
1679 MockRead("HTTP/1.1 200 OK\r\n"),
1680 MockRead("Cache-Control: max-age=100\r\n"),
1681 MockRead("Content-Length: 2\r\n\r\nA"),
1682 MockRead(ASYNC, ERR_CONNECTION_RESET),
1683 };
1684
1685 MockRead data_reads2[] = {
1686 MockRead("HTTP/1.1 200 OK\r\n"),
1687 MockRead("Cache-Control: max-age=100\r\n"),
1688 MockRead("Content-Length: 2\r\n\r\nAC"),
1689 MockRead(ASYNC, OK),
1690 };
1691
1692 PartialDataRetryTest(OK, "AC", data_reads1, arraysize(data_reads1),
1693 data_reads2, arraysize(data_reads2));
1694 }
1695
1696 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodyPragmaNoCache) {
1697 MockRead data_reads1[] = {
1698 MockRead("HTTP/1.1 200 OK\r\n"\
1699 "Pragma: no-cache\r\n"\
mmenke 2014/07/23 20:17:43 Backslashes aren't needed at the end of these line
jonnyr 2014/07/25 13:42:00 Done.
1700 "Content-Length: 2\r\n\r\n"),
1701 MockRead("A"),
1702 MockRead(ASYNC, ERR_CONNECTION_RESET),
1703 };
1704
1705 MockRead data_reads2[] = {
1706 MockRead("HTTP/1.1 200 OK\r\nPragma: no-cache\r\n"),
mmenke 2014/07/23 20:17:43 Pragma: no-cache should be on its own line (Or did
jonnyr 2014/07/25 13:42:00 Done.
1707 MockRead("Content-Length: 2\r\n\r\n"),
1708 MockRead("AD"),
1709 MockRead(ASYNC, OK),
1710 };
1711
1712 PartialDataRetryTest(ERR_CONNECTION_RESET, "", data_reads1,
1713 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
1714 }
1715
1716 TEST_P(HttpNetworkTransactionTest, PartialDataRetryCacheControlNoCache) {
mmenke 2014/07/23 20:17:43 How's this different from the previous test?
jonnyr 2014/07/25 13:42:00 It is not different anymore. Earlier it went throu
1717 MockRead data_reads1[] = {
1718 MockRead("HTTP/1.1 200 OK\r\n"\
1719 "Cache-Control: no-cache\r\n"),
1720 MockRead("Content-Length: 2\r\n\r\nO"),
1721 MockRead(ASYNC, ERR_CONNECTION_RESET),
1722 };
1723
1724 MockRead data_reads2[] = {
1725 MockRead("HTTP/1.1 200 OK\r\n"\
1726 "Cache-Control: no-cache\r\n"),
1727 MockRead("Content-Length: 2\r\n\r\nOK"),
1728 MockRead(ASYNC, OK),
1729 };
1730
1731 PartialDataRetryTest(ERR_CONNECTION_RESET, "", data_reads1,
1732 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
1733 }
1734
1735 TEST_P(HttpNetworkTransactionTest, PartialDataRetryMaxAgeFail) {
1736 MockRead data_reads1[] = {
1737 MockRead("HTTP/1.1 200 OK\r\n"\
1738 "Cache-Control: max-age=-1\r\n"),
1739 MockRead("Content-Length: 2\r\n\r\n"),
1740 MockRead(ASYNC, ERR_CONNECTION_RESET),
1741 };
1742
1743 MockRead data_reads2[] = {
mmenke 2014/07/23 20:17:43 Again, shouldn't be a second read when we don't us
jonnyr 2014/07/25 13:42:00 Done.
1744 MockRead("HTTP/1.1 200 OK\r\n"\
1745 "Cache-Control: max-age=-1\r\n"),
1746 MockRead("Content-Length: 2\r\n\r\nAE"),
1747 MockRead(ASYNC, OK),
1748 };
1749
1750 PartialDataRetryTest(ERR_CONNECTION_RESET, "", data_reads1,
1751 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
1752 }
1753
1754 TEST_P(HttpNetworkTransactionTest, PartialDataRetryAlmostExpired) {
1755 MockRead data_reads1[] = {
1756 MockRead("HTTP/1.1 200 OK\r\n"\
1757 "Date: Wed,14 Dec 2011 15:50:00 GMT\r\n"),
1758 MockRead("Expires: Wed,14 Dec 2011 15:50:59 GMT\r\n"),
1759 MockRead("Content-Length: 2\r\n\r\nA"),
1760 MockRead(ASYNC, ERR_CONNECTION_RESET),
1761 };
1762
1763 MockRead data_reads2[] = {
1764 MockRead("HTTP/1.1 200 OK\r\n"\
1765 "Date: Wed,14 Dec 2011 15:50:00 GMT\r\n"),
1766 MockRead("Expires: Wed,14 Dec 2011 15:50:59 GMT\r\n"),
1767 MockRead("Content-Length: 2\r\n\r\nAF"),
1768 MockRead(ASYNC, OK),
1769 };
1770
1771 PartialDataRetryTest(ERR_CONNECTION_RESET, "", data_reads1,
1772 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
1773 }
1774
1775 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodyMultipleReads) {
1776 MockRead data_reads1[] = {
1777 MockRead("HTTP/1.1 200 OK\r\n"\
1778 "Content-Length: 2\r\n"),
1779 MockRead("Cache-Control: max-age=100\r\n\r\nA"),
1780 MockRead(ASYNC, ERR_CONNECTION_RESET),
1781 };
1782
1783 MockRead data_reads2[] = {
1784 MockRead("HTTP/1.1 200 OK\r\n"\
1785 "Content-Length: 2\r\n"),
1786 MockRead("Cache-Control: max-age=100\r\n\r\nA"),
1787 MockRead("G"),
1788 MockRead(ASYNC, OK),
1789 };
1790
1791 PartialDataRetryTest(OK, "AG", data_reads1, arraysize(data_reads1),
1792 data_reads2, arraysize(data_reads2));
1793 }
1794
1795 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInLargeBody) {
1796 MockRead data_reads1[] = {
1797 MockRead("HTTP/1.1 200 OK\r\n"\
1798 "Cache-Control: max-age=100\r\n"\
1799 "Content-Length: 400\r\n\r\n"\
1800 "012345678901234567890123456789012345678901234567890123456789"\
1801 "012345678901234567890123456789012345678901234567890123456789"\
1802 "012345678901234567890123456789012345678901234567890123456789"\
1803 "012345678901234567890123456789012345678901234567890123456789"\
mmenke 2014/07/23 20:17:43 All these backslashes aren't needed.
jonnyr 2014/07/25 13:42:00 Done.
1804 "0123456789012345678901234567890123456789012345678901234567890"),
mmenke 2014/07/23 20:17:43 Suggest splitting this up into multiple reads, in
jonnyr 2014/07/25 13:41:59 Done.
1805 MockRead(ASYNC, ERR_CONNECTION_RESET),
1806 };
1807
1808 MockRead data_reads2[] = {
1809 MockRead("HTTP/1.1 200 OK\r\n"\
1810 "Cache-Control: max-age=100\r\n"\
1811 "Content-Length: 400\r\n\r\n"\
1812 "012345678901234567890123456789012345678901234567890123456789"\
1813 "012345678901234567890123456789012345678901234567890123456789"\
1814 "012345678901234567890123456789012345678901234567890123456789"\
1815 "012345678901234567890123456789012345678901234567890123456789"\
1816 "012345678901234567890123456789012345678901234567890123456789"\
1817 "012345678901234567890123456789012345678901234567890123456789"\
1818 "0123456789012345678901234567890123456789"),
1819 MockRead(ASYNC, OK),
1820 };
1821
1822 PartialDataRetryTest(OK,
1823 "0123456789012345678901234567890123456789012345678901234567890123456789"\
1824 "0123456789012345678901234567890123456789012345678901234567890123456789"\
1825 "0123456789012345678901234567890123456789012345678901234567890123456789"\
1826 "0123456789012345678901234567890123456789012345678901234567890123456789"\
1827 "0123456789012345678901234567890123456789012345678901234567890123456789"\
1828 "01234567890123456789012345678901234567890123456789",
mmenke 2014/07/23 20:17:42 For sanity, should use the same number of characte
jonnyr 2014/07/25 13:42:00 Done.
1829 data_reads1, arraysize(data_reads1),
1830 data_reads2, arraysize(data_reads2));
1831 }
1832
1833 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodyRangeMultipleReads) {
1834 MockRead data_reads1[] = {
1835 MockRead("HTTP/1.1 200 OK\r\n"\
1836 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\
1837 "Date: Tue, 15 Nov 1994 08:12:31 GMT\r\n"\
1838 "Expires: Tue, 15 Nov 1994 09:12:31 GMT\r\n"\
1839 "Last-Modified: Wed, 14 Dec 2011 15:50:59 GMT\r\n"\
1840 "Accept-Ranges: bytes\r\n"\
1841 "Content-Length: 3\r\n\r\nA"),
1842 MockRead(ASYNC, ERR_CONNECTION_RESET),
1843 };
1844
1845 MockRead data_reads2[] = {
1846 MockRead("HTTP/1.1 206 Partial Content\r\n"\
1847 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\
1848 "Date: Tue, 15 Nov 1994 08:12:31 GMT\r\n"\
1849 "Expires: Tue, 15 Nov 1994 09:12:31 GMT\r\n"\
1850 "Last-Modified: Wed, 14 Dec 2011 15:50:59 GMT\r\n"\
1851 "Content-Length: 2\r\n"\
1852 "Content-Range: bytes 1-2/3\r\n\r\n"),
mmenke 2014/07/23 20:17:43 Should definitely check the second set of request
jonnyr 2014/07/25 13:42:00 Agreed.
1853 MockRead("HA"),
1854 MockRead(ASYNC, OK),
1855 };
1856
1857 PartialDataRetryTest(OK, "AHA", data_reads1, arraysize(data_reads1),
1858 data_reads2, arraysize(data_reads2));
1859 }
1860
1861 TEST_P(HttpNetworkTransactionTest, PartialDataRetryInBodyRangeSingleRead) {
1862 MockRead data_reads1[] = {
1863 MockRead("HTTP/1.1 200 OK\r\n"\
1864 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\
1865 "Date: Tue, 15 Nov 1994 08:12:31 GMT\r\n"\
1866 "Expires: Tue, 15 Nov 1994 09:12:31 GMT\r\n"\
1867 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\
1868 "Accept-Ranges: bytes\r\n"\
1869 "Content-Length: 3\r\n\r\nA"),
1870 MockRead(ASYNC, ERR_CONNECTION_RESET),
1871 };
1872
1873 MockRead data_reads2[] = {
1874 MockRead("HTTP/1.1 206 Partial Content\r\n"\
1875 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\
1876 "Date: Tue, 15 Nov 1994 08:12:31 GMT\r\n"\
1877 "Expires: Tue, 15 Nov 1994 09:12:31 GMT\r\n"\
1878 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\
1879 "Accept-Ranges: bytes\r\n"\
1880 "Content-Length: 2\r\n"\
1881 "Content-Range: bytes 1-2/3\r\n\r\nIA"),
1882 MockRead(ASYNC, OK),
1883 };
1884
1885 PartialDataRetryTest(OK, "AIA", data_reads1, arraysize(data_reads1),
1886 data_reads2, arraysize(data_reads2));
1887 }
1888
1889 TEST_P(HttpNetworkTransactionTest, PartialDataRetryChunked) {
1890 MockRead data_reads1[] = {
1891 MockRead("HTTP/1.1 200 OK\r\n"\
1892 "Transfer-Encoding: chunked\r\n"\
1893 "Cache-Control: max-age=100\r\n\r\n"),
1894 MockRead("2\r\n"),
1895 MockRead("A"),
1896 MockRead(ASYNC, ERR_CONNECTION_RESET),
1897 };
1898
1899 MockRead data_reads2[] = {
1900 MockRead("HTTP/1.1 200 OK\r\n"\
1901 "Transfer-Encoding: chunked\r\n"\
1902 "Cache-Control: max-age=100\r\n\r\n"),
1903 MockRead("2\r\n"),
1904 MockRead("AJ\r\n"),
1905 MockRead("2\r\n"),
1906 MockRead("AJ\r\n"),
1907 MockRead("0\r\n\r\n"),
1908 MockRead(ASYNC, OK),
1909 };
1910
1911 PartialDataRetryTest(OK, "AJAJ", data_reads1, arraysize(data_reads1),
1912 data_reads2, arraysize(data_reads2));
1913 }
1914
1915 TEST_P(HttpNetworkTransactionTest, PartialDataRetryChangedContentNormal) {
1916 MockRead data_reads1[] = {
1917 MockRead("HTTP/1.1 200 OK\r\n"\
1918 "Cache-Control: max-age=100\r\n"\
1919 "Content-Length: 2\r\n\r\nA"),
1920 MockRead(ASYNC, ERR_CONNECTION_RESET),
1921 };
1922
1923 MockRead data_reads2[] = {
1924 MockRead("HTTP/1.1 200 OK\r\n"\
1925 "Cache-Control: max-age=100\r\n"\
1926 "Content-Length: 2\r\n\r\nOC"),
1927 MockRead(ASYNC, OK),
1928 };
1929
1930 PartialDataRetryTest(ERR_RETRY_HASH_MISMATCH, "", data_reads1,
1931 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
1932 }
1933
1934 TEST_P(HttpNetworkTransactionTest, PartialDataRetryChangedContentChunked) {
1935 MockRead data_reads1[] = {
1936 MockRead("HTTP/1.1 200 OK\r\n"\
1937 "Transfer-Encoding: chunked\r\n"\
1938 "Cache-Control: max-age=100\r\n\r\n"),
1939 MockRead("1\r\n"),
1940 MockRead("A\r\n"),
1941 MockRead(ASYNC, ERR_CONNECTION_RESET),
1942 };
1943
1944 MockRead data_reads2[] = {
1945 MockRead("HTTP/1.1 200 OK\r\n"\
1946 "Transfer-Encoding: chunked\r\n"\
1947 "Cache-Control: max-age=100\r\n\r\n"),
1948 MockRead("1\r\n"),
1949 MockRead("B\r\n"),
1950 MockRead("1\r\nJ\r\n"),
1951 MockRead("0\r\n\r\n"),
1952 MockRead(ASYNC, OK),
1953 };
1954
1955 PartialDataRetryTest(ERR_RETRY_HASH_MISMATCH, "", data_reads1,
1956 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
1957 }
1958
1959 TEST_P(HttpNetworkTransactionTest, PartialDataRetryTwoTimes) {
1960 MockRead data_reads1[] = {
1961 MockRead("HTTP/1.1 200 OK\r\n"\
1962 "Cache-Control: max-age=100\r\n"\
1963 "Content-Length: 3\r\n\r\nA"),
1964 MockRead(ASYNC, ERR_CONNECTION_RESET),
1965 };
1966
1967 MockRead data_reads2[] = {
1968 MockRead("HTTP/1.1 200 OK\r\n"\
1969 "Cache-Control: max-age=100\r\n"\
1970 "Content-Length: 3\r\n\r\nAB"),
1971 MockRead(ASYNC, ERR_CONNECTION_RESET),
1972 };
1973
1974 MockRead data_reads3[] = {
1975 MockRead("HTTP/1.1 200 OK\r\n"\
1976 "Cache-Control: max-age=100\r\n"\
1977 "Content-Length: 3\r\n\r\nABC"),
1978 MockRead(ASYNC, OK),
1979 };
1980
1981 PartialDataRetryTest(OK, "ABC", data_reads1, arraysize(data_reads1),
1982 data_reads2, arraysize(data_reads2), data_reads3, arraysize(data_reads3));
1983 }
1984
1985 TEST_P(HttpNetworkTransactionTest, PartialDataRetryFourTimes) {
1986 MockRead data_reads1[] = {
1987 MockRead("HTTP/1.1 200 OK\r\n"\
1988 "Cache-Control: max-age=100\r\n"\
1989 "Content-Length: 5\r\n\r\nA"),
1990 MockRead(ASYNC, ERR_CONNECTION_RESET),
1991 };
1992
1993 MockRead data_reads2[] = {
1994 MockRead("HTTP/1.1 200 OK\r\n"\
1995 "Cache-Control: max-age=100\r\n"\
1996 "Content-Length: 5\r\n\r\nAB"),
1997 MockRead(ASYNC, ERR_CONNECTION_RESET),
1998 };
1999
2000 MockRead data_reads3[] = {
2001 MockRead("HTTP/1.1 200 OK\r\n"\
2002 "Cache-Control: max-age=100\r\n"\
2003 "Content-Length: 5\r\n\r\nABC"),
2004 MockRead(ASYNC, ERR_CONNECTION_RESET),
2005 };
2006
2007 MockRead data_reads4[] = {
2008 MockRead("HTTP/1.1 200 OK\r\n"\
2009 "Cache-Control: max-age=100\r\n"\
2010 "Content-Length: 5\r\n\r\nABCD"),
2011 MockRead(ASYNC, ERR_CONNECTION_RESET),
2012 };
2013
2014 MockRead data_reads5[] = {
2015 MockRead("HTTP/1.1 200 OK\r\n"\
2016 "Cache-Control: max-age=100\r\n"\
2017 "Content-Length: 5\r\n\r\nABCDE"),
2018 MockRead(ASYNC, OK),
2019 };
2020
2021 PartialDataRetryTest(OK, "ABCDE", data_reads1, arraysize(data_reads1),
2022 data_reads2, arraysize(data_reads2), data_reads3, arraysize(data_reads3),
2023 data_reads4, arraysize(data_reads4), data_reads5, arraysize(data_reads5));
2024 }
2025
2026 TEST_P(HttpNetworkTransactionTest, PartialDataRetrySmallerContent) {
2027 MockRead data_reads1[] = {
2028 MockRead("HTTP/1.1 200 OK\r\n"\
2029 "Cache-Control: max-age=100\r\n"\
2030 "Content-Length: 5\r\n\r\nAB"),
2031 MockRead(ASYNC, ERR_CONNECTION_RESET),
2032 };
2033
2034 MockRead data_reads2[] = {
2035 MockRead("HTTP/1.1 200 OK\r\n"\
2036 "Cache-Control: max-age=100\r\n"\
2037 "Content-Len"),
2038 MockRead(ASYNC, ERR_CONNECTION_RESET),
2039 };
2040
2041 MockRead data_reads3[] = {
2042 MockRead("HTTP/1.1 200 OK\r\n"\
2043 "Cache-Control: max-age=100\r\n"\
2044 "Content-Length: 5\r\n\r\nABCDE"),
2045 MockRead(ASYNC, OK),
2046 };
2047
2048 PartialDataRetryTest(OK, "ABCDE", data_reads1, arraysize(data_reads1),
2049 data_reads2, arraysize(data_reads2), data_reads3, arraysize(data_reads3));
2050 }
2051
2052 TEST_P(HttpNetworkTransactionTest, PartialDataRetryContentLengthChange) {
2053 MockRead data_reads1[] = {
2054 MockRead("HTTP/1.1 200 OK\r\n"\
2055 "Cache-Control: max-age=100\r\n"\
2056 "Content-Length: 2\r\n\r\nA"),
2057 MockRead(ASYNC, ERR_CONNECTION_RESET),
2058 };
2059
2060 MockRead data_reads2[] = {
2061 MockRead("HTTP/1.1 200 OK\r\n"\
2062 "Cache-Control: max-age=100\r\n"\
2063 "Content-Length: 3\r\n\r\nABC"),
2064 MockRead(ASYNC, OK),
2065 };
2066 PartialDataRetryTest(ERR_RETRY_CONTENT_UPDATED, "", data_reads1,
2067 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
2068 }
2069
2070 TEST_P(HttpNetworkTransactionTest, PartialDataRetryEtagOK) {
2071 MockRead data_reads1[] = {
2072 MockRead("HTTP/1.1 200 OK\r\n"\
2073 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\
2074 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\
2075 "Content-Length: 2\r\n\r\nA"),
2076 MockRead(ASYNC, ERR_CONNECTION_RESET),
2077 };
2078
2079 MockRead data_reads2[] = {
2080 MockRead("HTTP/1.1 200 OK\r\n"\
2081 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\
2082 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\
2083 "Content-Length: 2\r\n\r\nA1"),
2084 MockRead(ASYNC, OK),
2085 };
2086
2087 PartialDataRetryTest(OK, "A1", data_reads1, arraysize(data_reads1),
2088 data_reads2, arraysize(data_reads2));
2089 }
2090
2091 TEST_P(HttpNetworkTransactionTest, PartialDataRetryLastModifiedChanged) {
2092 MockRead data_reads1[] = {
2093 MockRead("HTTP/1.1 200 OK\r\n"\
2094 "Last-Modified: Wed,14 Dec 2011 15:50:50 GMT\r\n"\
2095 "Content-Length: 2\r\n\r\nA"),
2096 MockRead(ASYNC, ERR_CONNECTION_RESET),
2097 };
2098
2099 MockRead data_reads2[] = {
2100 MockRead("HTTP/1.1 200 OK\r\n"\
2101 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\
2102 "Content-Length: 2\r\n\r\nA1"),
2103 MockRead(ASYNC, OK),
2104 };
2105
2106 PartialDataRetryTest(ERR_RETRY_CONTENT_UPDATED, "", data_reads1,
2107 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
2108 }
2109
2110 TEST_P(HttpNetworkTransactionTest, PartialDataRetryEtagChange) {
2111 MockRead data_reads1[] = {
2112 MockRead("HTTP/1.1 200 OK\r\n"\
2113 "ETag: A023EF02BD589BC472A2D6774EAE3C58\r\n"\
2114 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\
2115 "Content-Length: 2\r\n\r\nA"),
2116 MockRead(ASYNC, ERR_CONNECTION_RESET),
2117 };
2118
2119 MockRead data_reads2[] = {
2120 MockRead("HTTP/1.1 200 OK\r\n"\
2121 "ETag: A023EF02BD589BC472A2D6774EAE3C59\r\n"\
2122 "Last-Modified: Wed,14 Dec 2011 15:50:59 GMT\r\n"\
2123 "Content-Length: 2\r\n\r\nA1"),
2124 MockRead(ASYNC, OK),
2125 };
2126
2127 PartialDataRetryTest(ERR_RETRY_CONTENT_UPDATED, "", data_reads1,
2128 arraysize(data_reads1), data_reads2, arraysize(data_reads2));
2129 }
2130
1541 TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { 2131 TEST_P(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) {
1542 HttpRequestInfo request; 2132 HttpRequestInfo request;
1543 request.method = "GET"; 2133 request.method = "GET";
1544 request.url = GURL("http://www.google.com/"); 2134 request.url = GURL("http://www.google.com/");
1545 request.load_flags = 0; 2135 request.load_flags = 0;
1546 2136
1547 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_)); 2137 scoped_refptr<HttpNetworkSession> session(CreateSession(&session_deps_));
1548 scoped_ptr<HttpTransaction> trans( 2138 scoped_ptr<HttpTransaction> trans(
1549 new HttpNetworkTransaction(DEFAULT_PRIORITY, session)); 2139 new HttpNetworkTransaction(DEFAULT_PRIORITY, session));
1550 2140
(...skipping 10704 matching lines...) Expand 10 before | Expand all | Expand 10 after
12255 virtual bool IsConnectionReusable() const OVERRIDE { 12845 virtual bool IsConnectionReusable() const OVERRIDE {
12256 ADD_FAILURE(); 12846 ADD_FAILURE();
12257 return false; 12847 return false;
12258 } 12848 }
12259 12849
12260 virtual int64 GetTotalReceivedBytes() const OVERRIDE { 12850 virtual int64 GetTotalReceivedBytes() const OVERRIDE {
12261 ADD_FAILURE(); 12851 ADD_FAILURE();
12262 return 0; 12852 return 0;
12263 } 12853 }
12264 12854
12855 virtual int64 GetReceivedBodyLength() const OVERRIDE {
12856 ADD_FAILURE();
12857 return 0;
12858 }
12859
12265 virtual bool GetLoadTimingInfo( 12860 virtual bool GetLoadTimingInfo(
12266 LoadTimingInfo* load_timing_info) const OVERRIDE { 12861 LoadTimingInfo* load_timing_info) const OVERRIDE {
12267 ADD_FAILURE(); 12862 ADD_FAILURE();
12268 return false; 12863 return false;
12269 } 12864 }
12270 12865
12271 virtual void GetSSLInfo(SSLInfo* ssl_info) OVERRIDE { 12866 virtual void GetSSLInfo(SSLInfo* ssl_info) OVERRIDE {
12272 ADD_FAILURE(); 12867 ADD_FAILURE();
12273 } 12868 }
12274 12869
12275 virtual void GetSSLCertRequestInfo( 12870 virtual void GetSSLCertRequestInfo(
12276 SSLCertRequestInfo* cert_request_info) OVERRIDE { 12871 SSLCertRequestInfo* cert_request_info) OVERRIDE {
12277 ADD_FAILURE(); 12872 ADD_FAILURE();
12278 } 12873 }
12279 12874
12280 virtual bool IsSpdyHttpStream() const OVERRIDE { 12875 virtual bool IsSpdyHttpStream() const OVERRIDE {
12281 ADD_FAILURE(); 12876 ADD_FAILURE();
12282 return false; 12877 return false;
12283 } 12878 }
12284 12879
12285 virtual void Drain(HttpNetworkSession* session) OVERRIDE { 12880 virtual void Drain(HttpNetworkSession* session) OVERRIDE {
12286 ADD_FAILURE(); 12881 ADD_FAILURE();
12287 } 12882 }
12288 12883
12289 virtual void SetPriority(RequestPriority priority) OVERRIDE { 12884 virtual void SetPriority(RequestPriority priority) OVERRIDE {
12290 priority_ = priority; 12885 priority_ = priority;
12291 } 12886 }
12292 12887
12888 virtual void SetRestartInfo(int64 read_offset, const void* hash,
12889 size_t hash_length) {
12890 ADD_FAILURE();
12891 }
12892
12893 virtual void GetHash(void* output, size_t len) {
12894 ADD_FAILURE();
12895 }
12896
12293 private: 12897 private:
12294 RequestPriority priority_; 12898 RequestPriority priority_;
12295 12899
12296 DISALLOW_COPY_AND_ASSIGN(FakeStream); 12900 DISALLOW_COPY_AND_ASSIGN(FakeStream);
12297 }; 12901 };
12298 12902
12299 // Fake HttpStreamRequest that simply records calls to SetPriority() 12903 // Fake HttpStreamRequest that simply records calls to SetPriority()
12300 // and vends FakeStreams with its current priority. 12904 // and vends FakeStreams with its current priority.
12301 class FakeStreamRequest : public HttpStreamRequest, 12905 class FakeStreamRequest : public HttpStreamRequest,
12302 public base::SupportsWeakPtr<FakeStreamRequest> { 12906 public base::SupportsWeakPtr<FakeStreamRequest> {
(...skipping 900 matching lines...) Expand 10 before | Expand all | Expand 10 after
13203 EXPECT_EQ(ERR_IO_PENDING, rv); 13807 EXPECT_EQ(ERR_IO_PENDING, rv);
13204 13808
13205 rv = callback.WaitForResult(); 13809 rv = callback.WaitForResult();
13206 EXPECT_EQ(ERR_CONNECTION_RESET, rv); 13810 EXPECT_EQ(ERR_CONNECTION_RESET, rv);
13207 13811
13208 const HttpResponseInfo* response = trans->GetResponseInfo(); 13812 const HttpResponseInfo* response = trans->GetResponseInfo();
13209 EXPECT_TRUE(response == NULL); 13813 EXPECT_TRUE(response == NULL);
13210 } 13814 }
13211 13815
13212 } // namespace net 13816 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698