| 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/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
| 6 | 6 |
| 7 #include "base/location.h" | 7 #include "base/location.h" |
| 8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
| 9 #include "base/memory/scoped_vector.h" | 9 #include "base/memory/scoped_vector.h" |
| 10 #include "base/pending_task.h" | 10 #include "base/pending_task.h" |
| (...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 941 scoped_refptr<SpdyStream> spdy_stream1 = | 941 scoped_refptr<SpdyStream> spdy_stream1 = |
| 942 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); | 942 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); |
| 943 ASSERT_TRUE(spdy_stream1.get() != NULL); | 943 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 944 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 944 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 945 | 945 |
| 946 scoped_refptr<SpdyStream> spdy_stream2 = | 946 scoped_refptr<SpdyStream> spdy_stream2 = |
| 947 CreateStreamSynchronously(session, url, HIGHEST, BoundNetLog()); | 947 CreateStreamSynchronously(session, url, HIGHEST, BoundNetLog()); |
| 948 ASSERT_TRUE(spdy_stream2.get() != NULL); | 948 ASSERT_TRUE(spdy_stream2.get() != NULL); |
| 949 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 949 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
| 950 | 950 |
| 951 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 951 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url.spec())); |
| 952 (*headers)[":method"] = "GET"; | |
| 953 (*headers)[":scheme"] = url.scheme(); | |
| 954 (*headers)[":host"] = url.host(); | |
| 955 (*headers)[":path"] = url.path(); | |
| 956 (*headers)[":version"] = "HTTP/1.1"; | |
| 957 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock); | |
| 958 *headers2 = *headers; | |
| 959 | |
| 960 spdy_stream1->set_spdy_headers(headers.Pass()); | |
| 961 EXPECT_TRUE(spdy_stream1->HasUrl()); | 952 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 962 | 953 |
| 963 spdy_stream2->set_spdy_headers(headers2.Pass()); | 954 spdy_stream2->set_spdy_headers(ConstructGetHeaderBlock(url.spec())); |
| 964 EXPECT_TRUE(spdy_stream2->HasUrl()); | 955 EXPECT_TRUE(spdy_stream2->HasUrl()); |
| 965 | 956 |
| 966 spdy_stream1->SendRequest(false); | 957 spdy_stream1->SendRequest(false); |
| 967 spdy_stream2->SendRequest(false); | 958 spdy_stream2->SendRequest(false); |
| 968 MessageLoop::current()->RunUntilIdle(); | 959 MessageLoop::current()->RunUntilIdle(); |
| 969 | 960 |
| 970 EXPECT_EQ(3u, spdy_stream1->stream_id()); | 961 EXPECT_EQ(3u, spdy_stream1->stream_id()); |
| 971 EXPECT_EQ(1u, spdy_stream2->stream_id()); | 962 EXPECT_EQ(1u, spdy_stream2->stream_id()); |
| 972 | 963 |
| 973 spdy_stream1->Cancel(); | 964 spdy_stream1->Cancel(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1013 CreateStreamSynchronously(session, url1, HIGHEST, BoundNetLog()); | 1004 CreateStreamSynchronously(session, url1, HIGHEST, BoundNetLog()); |
| 1014 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1005 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1015 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1006 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1016 | 1007 |
| 1017 GURL url2("http://www.google.com"); | 1008 GURL url2("http://www.google.com"); |
| 1018 scoped_refptr<SpdyStream> spdy_stream2 = | 1009 scoped_refptr<SpdyStream> spdy_stream2 = |
| 1019 CreateStreamSynchronously(session, url2, LOWEST, BoundNetLog()); | 1010 CreateStreamSynchronously(session, url2, LOWEST, BoundNetLog()); |
| 1020 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1011 ASSERT_TRUE(spdy_stream2.get() != NULL); |
| 1021 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1012 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
| 1022 | 1013 |
| 1023 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1014 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec())); |
| 1024 (*headers)[":method"] = "GET"; | |
| 1025 (*headers)[":scheme"] = url1.scheme(); | |
| 1026 (*headers)[":host"] = url1.host(); | |
| 1027 (*headers)[":path"] = url1.path(); | |
| 1028 (*headers)[":version"] = "HTTP/1.1"; | |
| 1029 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock); | |
| 1030 *headers2 = *headers; | |
| 1031 | |
| 1032 spdy_stream1->set_spdy_headers(headers.Pass()); | |
| 1033 EXPECT_TRUE(spdy_stream1->HasUrl()); | 1015 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1034 | 1016 |
| 1035 spdy_stream2->set_spdy_headers(headers2.Pass()); | 1017 spdy_stream2->set_spdy_headers(ConstructGetHeaderBlock(url2.spec())); |
| 1036 EXPECT_TRUE(spdy_stream2->HasUrl()); | 1018 EXPECT_TRUE(spdy_stream2->HasUrl()); |
| 1037 | 1019 |
| 1038 spdy_stream1->SendRequest(false); | 1020 spdy_stream1->SendRequest(false); |
| 1039 spdy_stream2->SendRequest(false); | 1021 spdy_stream2->SendRequest(false); |
| 1040 | 1022 |
| 1041 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1023 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1042 | 1024 |
| 1043 spdy_stream1->Cancel(); | 1025 spdy_stream1->Cancel(); |
| 1044 | 1026 |
| 1045 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1027 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1086 CreateStreamSynchronously(session, url1, HIGHEST, BoundNetLog()); | 1068 CreateStreamSynchronously(session, url1, HIGHEST, BoundNetLog()); |
| 1087 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1069 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1088 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1070 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1089 | 1071 |
| 1090 GURL url2("http://www.google.com"); | 1072 GURL url2("http://www.google.com"); |
| 1091 scoped_refptr<SpdyStream> spdy_stream2 = | 1073 scoped_refptr<SpdyStream> spdy_stream2 = |
| 1092 CreateStreamSynchronously(session, url2, LOWEST, BoundNetLog()); | 1074 CreateStreamSynchronously(session, url2, LOWEST, BoundNetLog()); |
| 1093 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1075 ASSERT_TRUE(spdy_stream2.get() != NULL); |
| 1094 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1076 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
| 1095 | 1077 |
| 1096 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1078 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec())); |
| 1097 (*headers)["method"] = "GET"; | |
| 1098 (*headers)["scheme"] = url1.scheme(); | |
| 1099 (*headers)["host"] = url1.host(); | |
| 1100 (*headers)["url"] = url1.path(); | |
| 1101 (*headers)["version"] = "HTTP/1.1"; | |
| 1102 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock); | |
| 1103 *headers2 = *headers; | |
| 1104 | |
| 1105 spdy_stream1->set_spdy_headers(headers.Pass()); | |
| 1106 EXPECT_TRUE(spdy_stream1->HasUrl()); | 1079 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1107 test::ClosingDelegate delegate1(spdy_stream1.get()); | 1080 test::ClosingDelegate delegate1(spdy_stream1.get()); |
| 1108 spdy_stream1->SetDelegate(&delegate1); | 1081 spdy_stream1->SetDelegate(&delegate1); |
| 1109 | 1082 |
| 1110 spdy_stream2->set_spdy_headers(headers2.Pass()); | 1083 spdy_stream2->set_spdy_headers(ConstructGetHeaderBlock(url2.spec())); |
| 1111 EXPECT_TRUE(spdy_stream2->HasUrl()); | 1084 EXPECT_TRUE(spdy_stream2->HasUrl()); |
| 1112 test::ClosingDelegate delegate2(spdy_stream2.get()); | 1085 test::ClosingDelegate delegate2(spdy_stream2.get()); |
| 1113 spdy_stream2->SetDelegate(&delegate2); | 1086 spdy_stream2->SetDelegate(&delegate2); |
| 1114 | 1087 |
| 1115 spdy_stream1->SendRequest(false); | 1088 spdy_stream1->SendRequest(false); |
| 1116 spdy_stream2->SendRequest(false); | 1089 spdy_stream2->SendRequest(false); |
| 1117 | 1090 |
| 1118 // Ensure that the streams have not yet been activated and assigned an id. | 1091 // Ensure that the streams have not yet been activated and assigned an id. |
| 1119 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1092 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1120 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1093 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
| (...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1343 GURL url3("http://www.google.com"); | 1316 GURL url3("http://www.google.com"); |
| 1344 SpdyStreamRequest request3; | 1317 SpdyStreamRequest request3; |
| 1345 ASSERT_EQ(ERR_IO_PENDING, | 1318 ASSERT_EQ(ERR_IO_PENDING, |
| 1346 request3.StartRequest(session, url3, LOWEST, | 1319 request3.StartRequest(session, url3, LOWEST, |
| 1347 BoundNetLog(), | 1320 BoundNetLog(), |
| 1348 callback3.callback())); | 1321 callback3.callback())); |
| 1349 | 1322 |
| 1350 EXPECT_EQ(1u, session->num_active_streams() + session->num_created_streams()); | 1323 EXPECT_EQ(1u, session->num_active_streams() + session->num_created_streams()); |
| 1351 EXPECT_EQ(2u, session->pending_create_stream_queues(LOWEST)); | 1324 EXPECT_EQ(2u, session->pending_create_stream_queues(LOWEST)); |
| 1352 | 1325 |
| 1353 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1326 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec())); |
| 1354 (*headers)[":method"] = "GET"; | |
| 1355 (*headers)[":scheme"] = url1.scheme(); | |
| 1356 (*headers)[":host"] = url1.host(); | |
| 1357 (*headers)[":path"] = url1.path(); | |
| 1358 (*headers)[":version"] = "HTTP/1.1"; | |
| 1359 scoped_ptr<SpdyHeaderBlock> headers2(new SpdyHeaderBlock); | |
| 1360 *headers2 = *headers; | |
| 1361 scoped_ptr<SpdyHeaderBlock> headers3(new SpdyHeaderBlock); | |
| 1362 *headers3 = *headers; | |
| 1363 | |
| 1364 spdy_stream1->set_spdy_headers(headers.Pass()); | |
| 1365 EXPECT_TRUE(spdy_stream1->HasUrl()); | 1327 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1366 spdy_stream1->SendRequest(false); | 1328 spdy_stream1->SendRequest(false); |
| 1367 | 1329 |
| 1368 // Run until 1st stream is closed and 2nd one is opened. | 1330 // Run until 1st stream is closed and 2nd one is opened. |
| 1369 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1331 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1370 data.RunFor(3); | 1332 data.RunFor(3); |
| 1371 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1333 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| 1372 EXPECT_EQ(2u, session->num_active_streams() + session->num_created_streams()); | 1334 EXPECT_EQ(2u, session->num_active_streams() + session->num_created_streams()); |
| 1373 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); | 1335 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); |
| 1374 | 1336 |
| 1375 scoped_refptr<SpdyStream> stream2 = request2.ReleaseStream(); | 1337 scoped_refptr<SpdyStream> stream2 = request2.ReleaseStream(); |
| 1376 stream2->set_spdy_headers(headers2.Pass()); | 1338 stream2->set_spdy_headers(ConstructGetHeaderBlock(url2.spec())); |
| 1377 EXPECT_TRUE(stream2->HasUrl()); | 1339 EXPECT_TRUE(stream2->HasUrl()); |
| 1378 stream2->SendRequest(false); | 1340 stream2->SendRequest(false); |
| 1379 | 1341 |
| 1380 // Run until 2nd stream is closed. | 1342 // Run until 2nd stream is closed. |
| 1381 EXPECT_EQ(0u, stream2->stream_id()); | 1343 EXPECT_EQ(0u, stream2->stream_id()); |
| 1382 data.RunFor(3); | 1344 data.RunFor(3); |
| 1383 EXPECT_EQ(3u, stream2->stream_id()); | 1345 EXPECT_EQ(3u, stream2->stream_id()); |
| 1384 EXPECT_EQ(1u, session->num_active_streams() + session->num_created_streams()); | 1346 EXPECT_EQ(1u, session->num_active_streams() + session->num_created_streams()); |
| 1385 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); | 1347 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); |
| 1386 | 1348 |
| 1387 scoped_refptr<SpdyStream> stream3 = request3.ReleaseStream(); | 1349 scoped_refptr<SpdyStream> stream3 = request3.ReleaseStream(); |
| 1388 stream3->set_spdy_headers(headers3.Pass()); | 1350 stream3->set_spdy_headers(ConstructGetHeaderBlock(url3.spec())); |
| 1389 EXPECT_TRUE(stream3->HasUrl()); | 1351 EXPECT_TRUE(stream3->HasUrl()); |
| 1390 stream3->SendRequest(false); | 1352 stream3->SendRequest(false); |
| 1391 | 1353 |
| 1392 EXPECT_EQ(0u, stream3->stream_id()); | 1354 EXPECT_EQ(0u, stream3->stream_id()); |
| 1393 data.RunFor(4); | 1355 data.RunFor(4); |
| 1394 EXPECT_EQ(5u, stream3->stream_id()); | 1356 EXPECT_EQ(5u, stream3->stream_id()); |
| 1395 EXPECT_EQ(0u, session->num_active_streams() + session->num_created_streams()); | 1357 EXPECT_EQ(0u, session->num_active_streams() + session->num_created_streams()); |
| 1396 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); | 1358 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); |
| 1397 } | 1359 } |
| 1398 | 1360 |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1695 CreateDeterministicNetworkSession(); | 1657 CreateDeterministicNetworkSession(); |
| 1696 | 1658 |
| 1697 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 1659 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 1698 | 1660 |
| 1699 GURL url1("http://www.google.com"); | 1661 GURL url1("http://www.google.com"); |
| 1700 scoped_refptr<SpdyStream> spdy_stream1 = | 1662 scoped_refptr<SpdyStream> spdy_stream1 = |
| 1701 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 1663 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 1702 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1664 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1703 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1665 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1704 | 1666 |
| 1705 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1667 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec())); |
| 1706 (*headers)[":method"] = "GET"; | |
| 1707 (*headers)[":scheme"] = url1.scheme(); | |
| 1708 (*headers)[":host"] = url1.host(); | |
| 1709 (*headers)[":path"] = url1.path(); | |
| 1710 (*headers)[":version"] = "HTTP/1.1"; | |
| 1711 | |
| 1712 spdy_stream1->set_spdy_headers(headers.Pass()); | |
| 1713 EXPECT_TRUE(spdy_stream1->HasUrl()); | 1668 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1714 spdy_stream1->SendRequest(false); | 1669 spdy_stream1->SendRequest(false); |
| 1715 | 1670 |
| 1716 // Set up the TaskObserver to verify SpdySession::DoRead doesn't post a task. | 1671 // Set up the TaskObserver to verify SpdySession::DoRead doesn't post a task. |
| 1717 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); | 1672 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); |
| 1718 | 1673 |
| 1719 // Run until 1st read. | 1674 // Run until 1st read. |
| 1720 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1675 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1721 data.RunFor(2); | 1676 data.RunFor(2); |
| 1722 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1677 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1785 CreateDeterministicNetworkSession(); | 1740 CreateDeterministicNetworkSession(); |
| 1786 | 1741 |
| 1787 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 1742 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 1788 | 1743 |
| 1789 GURL url1("http://www.google.com"); | 1744 GURL url1("http://www.google.com"); |
| 1790 scoped_refptr<SpdyStream> spdy_stream1 = | 1745 scoped_refptr<SpdyStream> spdy_stream1 = |
| 1791 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 1746 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 1792 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1747 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1793 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1748 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1794 | 1749 |
| 1795 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1750 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec())); |
| 1796 (*headers)[":method"] = "GET"; | |
| 1797 (*headers)[":scheme"] = url1.scheme(); | |
| 1798 (*headers)[":host"] = url1.host(); | |
| 1799 (*headers)[":path"] = url1.path(); | |
| 1800 (*headers)[":version"] = "HTTP/1.1"; | |
| 1801 | |
| 1802 spdy_stream1->set_spdy_headers(headers.Pass()); | |
| 1803 EXPECT_TRUE(spdy_stream1->HasUrl()); | 1751 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1804 spdy_stream1->SendRequest(false); | 1752 spdy_stream1->SendRequest(false); |
| 1805 | 1753 |
| 1806 // Set up the TaskObserver to verify SpdySession::DoRead posts a task. | 1754 // Set up the TaskObserver to verify SpdySession::DoRead posts a task. |
| 1807 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); | 1755 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); |
| 1808 | 1756 |
| 1809 // Run until 1st read. | 1757 // Run until 1st read. |
| 1810 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1758 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1811 data.RunFor(2); | 1759 data.RunFor(2); |
| 1812 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1760 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1898 CreateDeterministicNetworkSession(); | 1846 CreateDeterministicNetworkSession(); |
| 1899 | 1847 |
| 1900 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 1848 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 1901 | 1849 |
| 1902 GURL url1("http://www.google.com"); | 1850 GURL url1("http://www.google.com"); |
| 1903 scoped_refptr<SpdyStream> spdy_stream1 = | 1851 scoped_refptr<SpdyStream> spdy_stream1 = |
| 1904 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 1852 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 1905 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1853 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1906 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1854 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1907 | 1855 |
| 1908 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1856 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec())); |
| 1909 (*headers)[":method"] = "GET"; | |
| 1910 (*headers)[":scheme"] = url1.scheme(); | |
| 1911 (*headers)[":host"] = url1.host(); | |
| 1912 (*headers)[":path"] = url1.path(); | |
| 1913 (*headers)[":version"] = "HTTP/1.1"; | |
| 1914 | |
| 1915 spdy_stream1->set_spdy_headers(headers.Pass()); | |
| 1916 EXPECT_TRUE(spdy_stream1->HasUrl()); | 1857 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1917 spdy_stream1->SendRequest(false); | 1858 spdy_stream1->SendRequest(false); |
| 1918 | 1859 |
| 1919 // Set up the TaskObserver to monitor SpdySession::DoRead posting of tasks. | 1860 // Set up the TaskObserver to monitor SpdySession::DoRead posting of tasks. |
| 1920 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); | 1861 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); |
| 1921 | 1862 |
| 1922 // Run until 1st read. | 1863 // Run until 1st read. |
| 1923 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1864 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1924 data.RunFor(2); | 1865 data.RunFor(2); |
| 1925 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1866 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1973 CreateDeterministicNetworkSession(); | 1914 CreateDeterministicNetworkSession(); |
| 1974 | 1915 |
| 1975 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 1916 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 1976 | 1917 |
| 1977 GURL url1("http://www.google.com"); | 1918 GURL url1("http://www.google.com"); |
| 1978 scoped_refptr<SpdyStream> spdy_stream1 = | 1919 scoped_refptr<SpdyStream> spdy_stream1 = |
| 1979 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 1920 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 1980 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1921 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1981 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1922 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1982 | 1923 |
| 1983 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1924 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec())); |
| 1984 (*headers)[":method"] = "GET"; | |
| 1985 (*headers)[":scheme"] = url1.scheme(); | |
| 1986 (*headers)[":host"] = url1.host(); | |
| 1987 (*headers)[":path"] = url1.path(); | |
| 1988 (*headers)[":version"] = "HTTP/1.1"; | |
| 1989 | |
| 1990 spdy_stream1->set_spdy_headers(headers.Pass()); | |
| 1991 EXPECT_TRUE(spdy_stream1->HasUrl()); | 1925 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1992 spdy_stream1->SendRequest(false); | 1926 spdy_stream1->SendRequest(false); |
| 1993 | 1927 |
| 1994 // Run until 1st read. | 1928 // Run until 1st read. |
| 1995 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1929 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1996 data.RunFor(1); | 1930 data.RunFor(1); |
| 1997 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1931 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| 1998 | 1932 |
| 1999 // Drop the reference to the session. | 1933 // Drop the reference to the session. |
| 2000 session = NULL; | 1934 session = NULL; |
| (...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2248 | 2182 |
| 2249 data.RunFor(3); | 2183 data.RunFor(3); |
| 2250 | 2184 |
| 2251 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2185 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); |
| 2252 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2186 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2253 } | 2187 } |
| 2254 | 2188 |
| 2255 // Send data back and forth; the send and receive windows should | 2189 // Send data back and forth; the send and receive windows should |
| 2256 // change appropriately. | 2190 // change appropriately. |
| 2257 TEST_F(SpdySessionSpdy3Test, SessionFlowControlEndToEnd31) { | 2191 TEST_F(SpdySessionSpdy3Test, SessionFlowControlEndToEnd31) { |
| 2192 const char kStreamUrl[] = "http://www.google.com/"; |
| 2193 |
| 2258 session_deps_.enable_spdy_31 = true; | 2194 session_deps_.enable_spdy_31 = true; |
| 2259 | 2195 |
| 2260 const int32 msg_data_size = 100; | 2196 const int32 msg_data_size = 100; |
| 2261 const std::string msg_data(msg_data_size, 'a'); | 2197 const std::string msg_data(msg_data_size, 'a'); |
| 2262 | 2198 |
| 2263 MockConnect connect_data(SYNCHRONOUS, OK); | 2199 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2264 | 2200 |
| 2265 const SpdyHeaderInfo kSynStartHeader = { | |
| 2266 SYN_STREAM, | |
| 2267 1, | |
| 2268 0, | |
| 2269 ConvertRequestPriorityToSpdyPriority(MEDIUM, 3), | |
| 2270 0, | |
| 2271 CONTROL_FLAG_NONE, | |
| 2272 false, | |
| 2273 RST_STREAM_INVALID, | |
| 2274 NULL, | |
| 2275 0, | |
| 2276 DATA_FLAG_NONE | |
| 2277 }; | |
| 2278 static const char* const kGetHeaders[] = { | |
| 2279 ":method", | |
| 2280 "GET", | |
| 2281 ":scheme", | |
| 2282 "http", | |
| 2283 ":host", | |
| 2284 "www.google.com", | |
| 2285 ":path", | |
| 2286 "/", | |
| 2287 ":version", | |
| 2288 "HTTP/1.1", | |
| 2289 }; | |
| 2290 scoped_ptr<SpdyFrame> initial_window_update( | 2201 scoped_ptr<SpdyFrame> initial_window_update( |
| 2291 ConstructSpdyWindowUpdate( | 2202 ConstructSpdyWindowUpdate( |
| 2292 kSessionFlowControlStreamId, | 2203 kSessionFlowControlStreamId, |
| 2293 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | 2204 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); |
| 2294 scoped_ptr<SpdyFrame> req( | 2205 scoped_ptr<SpdyFrame> req( |
| 2295 ConstructSpdyPacket( | 2206 ConstructSpdyPost(kStreamUrl, 1, msg_data_size, MEDIUM, NULL, 0)); |
| 2296 kSynStartHeader, NULL, 0, kGetHeaders, arraysize(kGetHeaders) / 2)); | |
| 2297 scoped_ptr<SpdyFrame> msg( | 2207 scoped_ptr<SpdyFrame> msg( |
| 2298 ConstructSpdyBodyFrame(1, msg_data.data(), msg_data_size, false)); | 2208 ConstructSpdyBodyFrame(1, msg_data.data(), msg_data_size, false)); |
| 2299 MockWrite writes[] = { | 2209 MockWrite writes[] = { |
| 2300 CreateMockWrite(*initial_window_update, 0), | 2210 CreateMockWrite(*initial_window_update, 0), |
| 2301 CreateMockWrite(*req, 1), | 2211 CreateMockWrite(*req, 1), |
| 2302 CreateMockWrite(*msg, 3), | 2212 CreateMockWrite(*msg, 3), |
| 2303 }; | 2213 }; |
| 2304 | 2214 |
| 2305 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | 2215 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 2306 scoped_ptr<SpdyFrame> echo( | 2216 scoped_ptr<SpdyFrame> echo( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 2322 session_deps_.host_resolver->set_synchronous_mode(true); | 2232 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2323 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | 2233 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 2324 | 2234 |
| 2325 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); | 2235 SSLSocketDataProvider ssl(SYNCHRONOUS, OK); |
| 2326 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); | 2236 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl); |
| 2327 | 2237 |
| 2328 CreateDeterministicNetworkSession(); | 2238 CreateDeterministicNetworkSession(); |
| 2329 | 2239 |
| 2330 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 2240 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 2331 | 2241 |
| 2332 GURL url1("http://www.google.com"); | 2242 GURL url(kStreamUrl); |
| 2333 scoped_refptr<SpdyStream> stream = | 2243 scoped_refptr<SpdyStream> stream = |
| 2334 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 2244 CreateStreamSynchronously(session, url, MEDIUM, BoundNetLog()); |
| 2335 ASSERT_TRUE(stream.get() != NULL); | 2245 ASSERT_TRUE(stream.get() != NULL); |
| 2336 EXPECT_EQ(0u, stream->stream_id()); | 2246 EXPECT_EQ(0u, stream->stream_id()); |
| 2337 | 2247 |
| 2338 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(msg_data_size)); | 2248 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(msg_data_size)); |
| 2339 memcpy(buf->data(), msg_data.data(), msg_data_size); | 2249 memcpy(buf->data(), msg_data.data(), msg_data_size); |
| 2340 test::StreamDelegateSendImmediate delegate( | 2250 test::StreamDelegateSendImmediate delegate( |
| 2341 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); | 2251 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); |
| 2342 stream->SetDelegate(&delegate); | 2252 stream->SetDelegate(&delegate); |
| 2343 | 2253 |
| 2344 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 2254 stream->set_spdy_headers( |
| 2345 (*headers)[":method"] = "GET"; | 2255 ConstructPostHeaderBlock(url.spec(), msg_data_size)); |
| 2346 (*headers)[":scheme"] = url1.scheme(); | |
| 2347 (*headers)[":host"] = url1.host(); | |
| 2348 (*headers)[":path"] = url1.path(); | |
| 2349 (*headers)[":version"] = "HTTP/1.1"; | |
| 2350 | |
| 2351 stream->set_spdy_headers(headers.Pass()); | |
| 2352 EXPECT_TRUE(stream->HasUrl()); | 2256 EXPECT_TRUE(stream->HasUrl()); |
| 2353 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | 2257 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
| 2354 | 2258 |
| 2355 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 2259 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 2356 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2260 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); |
| 2357 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2261 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2358 | 2262 |
| 2359 data.RunFor(2); | 2263 data.RunFor(2); |
| 2360 | 2264 |
| 2361 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 2265 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2398 session->IncreaseRecvWindowSize(msg_data_size); | 2302 session->IncreaseRecvWindowSize(msg_data_size); |
| 2399 | 2303 |
| 2400 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2304 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); |
| 2401 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 2305 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 2402 | 2306 |
| 2403 stream->Close(); | 2307 stream->Close(); |
| 2404 | 2308 |
| 2405 EXPECT_EQ(OK, delegate.WaitForClose()); | 2309 EXPECT_EQ(OK, delegate.WaitForClose()); |
| 2406 } | 2310 } |
| 2407 | 2311 |
| 2312 // TODO(akalin): Re-enable the tests below when we fix the unstall bug |
| 2313 // mentioned in crbug.com/178943. |
| 2314 |
| 2315 // Cause a stall by reducing the flow control send window to 0. The |
| 2316 // stream should resume when that window is then increased. |
| 2317 TEST_F(SpdySessionSpdy3Test, DISABLED_ResumeAfterSendWindowSizeIncrease31) { |
| 2318 const char kStreamUrl[] = "http://www.google.com/"; |
| 2319 GURL url(kStreamUrl); |
| 2320 |
| 2321 session_deps_.enable_spdy_31 = true; |
| 2322 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2323 |
| 2324 scoped_ptr<SpdyFrame> initial_window_update( |
| 2325 ConstructSpdyWindowUpdate( |
| 2326 kSessionFlowControlStreamId, |
| 2327 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); |
| 2328 const char kBodyData[] = "Body data"; |
| 2329 const size_t kBodyDataSize = arraysize(kBodyData); |
| 2330 scoped_ptr<SpdyFrame> req( |
| 2331 ConstructSpdyPost(kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
| 2332 scoped_ptr<SpdyFrame> msg( |
| 2333 ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); |
| 2334 MockWrite writes[] = { |
| 2335 CreateMockWrite(*initial_window_update, 0), |
| 2336 CreateMockWrite(*req, 1), |
| 2337 CreateMockWrite(*msg, 3), |
| 2338 }; |
| 2339 |
| 2340 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 2341 scoped_ptr<SpdyFrame> echo( |
| 2342 ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); |
| 2343 MockRead reads[] = { |
| 2344 CreateMockRead(*resp, 2), |
| 2345 CreateMockRead(*echo, 4), |
| 2346 MockRead(ASYNC, 0, 0, 5), // EOF |
| 2347 }; |
| 2348 |
| 2349 DeterministicSocketData data(reads, arraysize(reads), |
| 2350 writes, arraysize(writes)); |
| 2351 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2352 data.set_connect_data(connect_data); |
| 2353 |
| 2354 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 2355 |
| 2356 CreateDeterministicNetworkSession(); |
| 2357 scoped_refptr<SpdySession> session = GetSession(pair_); |
| 2358 InitializeSession( |
| 2359 http_session_.get(), session.get(), test_host_port_pair_); |
| 2360 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 2361 session->flow_control_state()); |
| 2362 |
| 2363 scoped_refptr<SpdyStream> stream = |
| 2364 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); |
| 2365 ASSERT_TRUE(stream.get() != NULL); |
| 2366 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize)); |
| 2367 memcpy(buf->data(), kBodyData, kBodyDataSize); |
| 2368 |
| 2369 test::StreamDelegateWithBody delegate(stream.get(), buf); |
| 2370 stream->SetDelegate(&delegate); |
| 2371 |
| 2372 EXPECT_FALSE(stream->HasUrl()); |
| 2373 |
| 2374 stream->set_spdy_headers( |
| 2375 ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 2376 EXPECT_TRUE(stream->HasUrl()); |
| 2377 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); |
| 2378 |
| 2379 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
| 2380 |
| 2381 data.RunFor(3); |
| 2382 |
| 2383 EXPECT_FALSE(stream->stalled_by_flow_control()); |
| 2384 |
| 2385 // Reduce the send window size to 0 to stall. |
| 2386 while (session->session_send_window_size_ > 0) { |
| 2387 session->DecreaseSendWindowSize( |
| 2388 std::min(kMaxSpdyFrameChunkSize, session->session_send_window_size_)); |
| 2389 } |
| 2390 |
| 2391 stream->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE); |
| 2392 |
| 2393 EXPECT_TRUE(stream->stalled_by_flow_control()); |
| 2394 |
| 2395 session->IncreaseSendWindowSize(kBodyDataSize); |
| 2396 |
| 2397 EXPECT_FALSE(stream->stalled_by_flow_control()); |
| 2398 |
| 2399 data.RunFor(3); |
| 2400 |
| 2401 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); |
| 2402 |
| 2403 EXPECT_TRUE(delegate.send_headers_completed()); |
| 2404 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); |
| 2405 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); |
| 2406 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate.received_data()); |
| 2407 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent()); |
| 2408 } |
| 2409 |
| 2410 // Cause a stall by reducing the flow control send window to 0. The |
| 2411 // stream should resume when that window is then increased. |
| 2412 TEST_F(SpdySessionSpdy3Test, |
| 2413 DISABLED_ResumeByPriorityAfterSendWindowSizeIncrease31) { |
| 2414 const char kStreamUrl[] = "http://www.google.com/"; |
| 2415 GURL url(kStreamUrl); |
| 2416 |
| 2417 session_deps_.enable_spdy_31 = true; |
| 2418 session_deps_.host_resolver->set_synchronous_mode(true); |
| 2419 |
| 2420 const char kBodyData[] = "Body data"; |
| 2421 const size_t kBodyDataSize = arraysize(kBodyData); |
| 2422 scoped_ptr<SpdyFrame> initial_window_update( |
| 2423 ConstructSpdyWindowUpdate( |
| 2424 kSessionFlowControlStreamId, |
| 2425 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); |
| 2426 scoped_ptr<SpdyFrame> req1( |
| 2427 ConstructSpdyPost(kStreamUrl, 1, kBodyDataSize, LOWEST, NULL, 0)); |
| 2428 scoped_ptr<SpdyFrame> req2( |
| 2429 ConstructSpdyPost(kStreamUrl, 3, kBodyDataSize, MEDIUM, NULL, 0)); |
| 2430 scoped_ptr<SpdyFrame> msg1( |
| 2431 ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, false)); |
| 2432 scoped_ptr<SpdyFrame> msg2( |
| 2433 ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); |
| 2434 MockWrite writes[] = { |
| 2435 CreateMockWrite(*initial_window_update, 0), |
| 2436 CreateMockWrite(*req1, 1), |
| 2437 CreateMockWrite(*req2, 3), |
| 2438 CreateMockWrite(*msg1, 5), |
| 2439 CreateMockWrite(*msg2, 7), |
| 2440 }; |
| 2441 |
| 2442 scoped_ptr<SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1)); |
| 2443 scoped_ptr<SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); |
| 2444 scoped_ptr<SpdyFrame> echo1( |
| 2445 ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, false)); |
| 2446 scoped_ptr<SpdyFrame> echo2( |
| 2447 ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, false)); |
| 2448 MockRead reads[] = { |
| 2449 CreateMockRead(*resp1, 2), |
| 2450 CreateMockRead(*resp2, 4), |
| 2451 CreateMockRead(*echo1, 6), |
| 2452 CreateMockRead(*echo2, 8), |
| 2453 MockRead(ASYNC, 0, 0, 9), // EOF |
| 2454 }; |
| 2455 |
| 2456 DeterministicSocketData data(reads, arraysize(reads), |
| 2457 writes, arraysize(writes)); |
| 2458 MockConnect connect_data(SYNCHRONOUS, OK); |
| 2459 data.set_connect_data(connect_data); |
| 2460 |
| 2461 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); |
| 2462 |
| 2463 CreateDeterministicNetworkSession(); |
| 2464 scoped_refptr<SpdySession> session = GetSession(pair_); |
| 2465 InitializeSession( |
| 2466 http_session_.get(), session.get(), test_host_port_pair_); |
| 2467 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, |
| 2468 session->flow_control_state()); |
| 2469 |
| 2470 scoped_refptr<SpdyStream> stream1 = |
| 2471 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); |
| 2472 ASSERT_TRUE(stream1.get() != NULL); |
| 2473 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize)); |
| 2474 memcpy(buf->data(), kBodyData, kBodyDataSize); |
| 2475 |
| 2476 test::StreamDelegateWithBody delegate1(stream1.get(), buf); |
| 2477 stream1->SetDelegate(&delegate1); |
| 2478 |
| 2479 EXPECT_FALSE(stream1->HasUrl()); |
| 2480 |
| 2481 stream1->set_spdy_headers( |
| 2482 ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 2483 EXPECT_TRUE(stream1->HasUrl()); |
| 2484 EXPECT_EQ(kStreamUrl, stream1->GetUrl().spec()); |
| 2485 |
| 2486 EXPECT_EQ(ERR_IO_PENDING, stream1->SendRequest(true)); |
| 2487 |
| 2488 data.RunFor(3); |
| 2489 EXPECT_EQ(1u, stream1->stream_id()); |
| 2490 |
| 2491 scoped_refptr<SpdyStream> stream2 = |
| 2492 CreateStreamSynchronously(session, url, MEDIUM, BoundNetLog()); |
| 2493 ASSERT_TRUE(stream2.get() != NULL); |
| 2494 scoped_refptr<IOBufferWithSize> buf2(new IOBufferWithSize(kBodyDataSize)); |
| 2495 memcpy(buf2->data(), kBodyData, kBodyDataSize); |
| 2496 |
| 2497 test::StreamDelegateWithBody delegate2(stream2.get(), buf2); |
| 2498 stream2->SetDelegate(&delegate2); |
| 2499 |
| 2500 EXPECT_FALSE(stream2->HasUrl()); |
| 2501 |
| 2502 stream2->set_spdy_headers( |
| 2503 ConstructPostHeaderBlock(kStreamUrl, kBodyDataSize)); |
| 2504 EXPECT_TRUE(stream2->HasUrl()); |
| 2505 EXPECT_EQ(kStreamUrl, stream2->GetUrl().spec()); |
| 2506 |
| 2507 EXPECT_EQ(ERR_IO_PENDING, stream2->SendRequest(true)); |
| 2508 |
| 2509 data.RunFor(2); |
| 2510 EXPECT_EQ(3u, stream2->stream_id()); |
| 2511 |
| 2512 EXPECT_FALSE(stream1->stalled_by_flow_control()); |
| 2513 EXPECT_FALSE(stream2->stalled_by_flow_control()); |
| 2514 |
| 2515 // Reduce the send window size to 0 to stall. |
| 2516 while (session->session_send_window_size_ > 0) { |
| 2517 session->DecreaseSendWindowSize( |
| 2518 std::min(kMaxSpdyFrameChunkSize, session->session_send_window_size_)); |
| 2519 } |
| 2520 |
| 2521 stream1->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE); |
| 2522 stream2->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE); |
| 2523 |
| 2524 EXPECT_TRUE(stream1->stalled_by_flow_control()); |
| 2525 EXPECT_TRUE(stream2->stalled_by_flow_control()); |
| 2526 |
| 2527 // This should unstall only stream2. |
| 2528 session->IncreaseSendWindowSize(kBodyDataSize); |
| 2529 |
| 2530 EXPECT_TRUE(stream1->stalled_by_flow_control()); |
| 2531 EXPECT_FALSE(stream2->stalled_by_flow_control()); |
| 2532 |
| 2533 data.RunFor(2); |
| 2534 |
| 2535 EXPECT_TRUE(stream1->stalled_by_flow_control()); |
| 2536 EXPECT_FALSE(stream2->stalled_by_flow_control()); |
| 2537 |
| 2538 // This should then unstall stream1. |
| 2539 session->IncreaseSendWindowSize(kBodyDataSize); |
| 2540 |
| 2541 EXPECT_FALSE(stream1->stalled_by_flow_control()); |
| 2542 EXPECT_FALSE(stream2->stalled_by_flow_control()); |
| 2543 |
| 2544 data.RunFor(3); |
| 2545 |
| 2546 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate1.WaitForClose()); |
| 2547 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate2.WaitForClose()); |
| 2548 |
| 2549 EXPECT_TRUE(delegate1.send_headers_completed()); |
| 2550 EXPECT_EQ("200", delegate1.GetResponseHeaderValue(":status")); |
| 2551 EXPECT_EQ("HTTP/1.1", delegate1.GetResponseHeaderValue(":version")); |
| 2552 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate1.received_data()); |
| 2553 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate1.body_data_sent()); |
| 2554 |
| 2555 EXPECT_TRUE(delegate2.send_headers_completed()); |
| 2556 EXPECT_EQ("200", delegate2.GetResponseHeaderValue(":status")); |
| 2557 EXPECT_EQ("HTTP/1.1", delegate2.GetResponseHeaderValue(":version")); |
| 2558 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate2.received_data()); |
| 2559 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate2.body_data_sent()); |
| 2560 } |
| 2561 |
| 2408 } // namespace net | 2562 } // namespace net |
| OLD | NEW |