Chromium Code Reviews| 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 23 matching lines...) Expand all Loading... | |
| 34 | 34 |
| 35 static const char kTestUrl[] = "http://www.example.org/"; | 35 static const char kTestUrl[] = "http://www.example.org/"; |
| 36 static const char kTestHost[] = "www.example.org"; | 36 static const char kTestHost[] = "www.example.org"; |
| 37 static const int kTestPort = 80; | 37 static const int kTestPort = 80; |
| 38 | 38 |
| 39 static int g_delta_seconds = 0; | 39 static int g_delta_seconds = 0; |
| 40 base::TimeTicks TheNearFuture() { | 40 base::TimeTicks TheNearFuture() { |
| 41 return base::TimeTicks::Now() + base::TimeDelta::FromSeconds(g_delta_seconds); | 41 return base::TimeTicks::Now() + base::TimeDelta::FromSeconds(g_delta_seconds); |
| 42 } | 42 } |
| 43 | 43 |
| 44 // TODO(akalin): Merge with ConstructSpdyGet(). (The sticking point is | |
| 45 // CONTROL_FLAG_NONE vs. CONTROL_FLAG_FIN.) | |
|
Ryan Hamilton
2013/03/14 15:29:45
Curious... Isn't it illegal for a SYN_STREAM whic
akalin
2013/03/15 17:28:56
Okay, converted these tests to use posts and added
| |
| 46 scoped_ptr<SpdyFrame> ConstructSpdyGetRequest(const char* url, | |
| 47 SpdyStreamId id, | |
| 48 RequestPriority priority) { | |
| 49 const SpdyHeaderInfo kSynStartHeader = { | |
| 50 SYN_STREAM, | |
| 51 id, | |
| 52 0, | |
| 53 ConvertRequestPriorityToSpdyPriority(priority, 3), | |
| 54 0, | |
| 55 CONTROL_FLAG_NONE, | |
| 56 false, | |
| 57 RST_STREAM_INVALID, | |
| 58 NULL, | |
| 59 0, | |
| 60 DATA_FLAG_NONE | |
| 61 }; | |
| 62 | |
| 63 return scoped_ptr<SpdyFrame>( | |
| 64 ConstructSpdyPacket(kSynStartHeader, ConstructHeaderBlock(url))); | |
| 65 } | |
| 66 | |
| 44 } // namespace | 67 } // namespace |
| 45 | 68 |
| 46 class SpdySessionSpdy3Test : public PlatformTest { | 69 class SpdySessionSpdy3Test : public PlatformTest { |
| 47 protected: | 70 protected: |
| 48 SpdySessionSpdy3Test() | 71 SpdySessionSpdy3Test() |
| 49 : spdy_session_pool_(NULL), | 72 : spdy_session_pool_(NULL), |
| 50 test_url_(kTestUrl), | 73 test_url_(kTestUrl), |
| 51 test_host_port_pair_(kTestHost, kTestPort), | 74 test_host_port_pair_(kTestHost, kTestPort), |
| 52 pair_(test_host_port_pair_, ProxyServer::Direct()) { | 75 pair_(test_host_port_pair_, ProxyServer::Direct()) { |
| 53 } | 76 } |
| (...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 941 scoped_refptr<SpdyStream> spdy_stream1 = | 964 scoped_refptr<SpdyStream> spdy_stream1 = |
| 942 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); | 965 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); |
| 943 ASSERT_TRUE(spdy_stream1.get() != NULL); | 966 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 944 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 967 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 945 | 968 |
| 946 scoped_refptr<SpdyStream> spdy_stream2 = | 969 scoped_refptr<SpdyStream> spdy_stream2 = |
| 947 CreateStreamSynchronously(session, url, HIGHEST, BoundNetLog()); | 970 CreateStreamSynchronously(session, url, HIGHEST, BoundNetLog()); |
| 948 ASSERT_TRUE(spdy_stream2.get() != NULL); | 971 ASSERT_TRUE(spdy_stream2.get() != NULL); |
| 949 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 972 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
| 950 | 973 |
| 951 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 974 spdy_stream1->set_spdy_headers(ConstructHeaderBlock(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()); | 975 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 962 | 976 |
| 963 spdy_stream2->set_spdy_headers(headers2.Pass()); | 977 spdy_stream2->set_spdy_headers(ConstructHeaderBlock(url.spec())); |
| 964 EXPECT_TRUE(spdy_stream2->HasUrl()); | 978 EXPECT_TRUE(spdy_stream2->HasUrl()); |
| 965 | 979 |
| 966 spdy_stream1->SendRequest(false); | 980 spdy_stream1->SendRequest(false); |
| 967 spdy_stream2->SendRequest(false); | 981 spdy_stream2->SendRequest(false); |
| 968 MessageLoop::current()->RunUntilIdle(); | 982 MessageLoop::current()->RunUntilIdle(); |
| 969 | 983 |
| 970 EXPECT_EQ(3u, spdy_stream1->stream_id()); | 984 EXPECT_EQ(3u, spdy_stream1->stream_id()); |
| 971 EXPECT_EQ(1u, spdy_stream2->stream_id()); | 985 EXPECT_EQ(1u, spdy_stream2->stream_id()); |
| 972 | 986 |
| 973 spdy_stream1->Cancel(); | 987 spdy_stream1->Cancel(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1013 CreateStreamSynchronously(session, url1, HIGHEST, BoundNetLog()); | 1027 CreateStreamSynchronously(session, url1, HIGHEST, BoundNetLog()); |
| 1014 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1028 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1015 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1029 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1016 | 1030 |
| 1017 GURL url2("http://www.google.com"); | 1031 GURL url2("http://www.google.com"); |
| 1018 scoped_refptr<SpdyStream> spdy_stream2 = | 1032 scoped_refptr<SpdyStream> spdy_stream2 = |
| 1019 CreateStreamSynchronously(session, url2, LOWEST, BoundNetLog()); | 1033 CreateStreamSynchronously(session, url2, LOWEST, BoundNetLog()); |
| 1020 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1034 ASSERT_TRUE(spdy_stream2.get() != NULL); |
| 1021 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1035 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
| 1022 | 1036 |
| 1023 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1037 spdy_stream1->set_spdy_headers(ConstructHeaderBlock(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()); | 1038 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1034 | 1039 |
| 1035 spdy_stream2->set_spdy_headers(headers2.Pass()); | 1040 spdy_stream2->set_spdy_headers(ConstructHeaderBlock(url2.spec())); |
| 1036 EXPECT_TRUE(spdy_stream2->HasUrl()); | 1041 EXPECT_TRUE(spdy_stream2->HasUrl()); |
| 1037 | 1042 |
| 1038 spdy_stream1->SendRequest(false); | 1043 spdy_stream1->SendRequest(false); |
| 1039 spdy_stream2->SendRequest(false); | 1044 spdy_stream2->SendRequest(false); |
| 1040 | 1045 |
| 1041 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1046 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1042 | 1047 |
| 1043 spdy_stream1->Cancel(); | 1048 spdy_stream1->Cancel(); |
| 1044 | 1049 |
| 1045 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1050 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()); | 1091 CreateStreamSynchronously(session, url1, HIGHEST, BoundNetLog()); |
| 1087 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1092 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1088 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1093 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1089 | 1094 |
| 1090 GURL url2("http://www.google.com"); | 1095 GURL url2("http://www.google.com"); |
| 1091 scoped_refptr<SpdyStream> spdy_stream2 = | 1096 scoped_refptr<SpdyStream> spdy_stream2 = |
| 1092 CreateStreamSynchronously(session, url2, LOWEST, BoundNetLog()); | 1097 CreateStreamSynchronously(session, url2, LOWEST, BoundNetLog()); |
| 1093 ASSERT_TRUE(spdy_stream2.get() != NULL); | 1098 ASSERT_TRUE(spdy_stream2.get() != NULL); |
| 1094 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1099 EXPECT_EQ(0u, spdy_stream2->stream_id()); |
| 1095 | 1100 |
| 1096 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1101 spdy_stream1->set_spdy_headers(ConstructHeaderBlock(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()); | 1102 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1107 test::ClosingDelegate delegate1(spdy_stream1.get()); | 1103 test::ClosingDelegate delegate1(spdy_stream1.get()); |
| 1108 spdy_stream1->SetDelegate(&delegate1); | 1104 spdy_stream1->SetDelegate(&delegate1); |
| 1109 | 1105 |
| 1110 spdy_stream2->set_spdy_headers(headers2.Pass()); | 1106 spdy_stream2->set_spdy_headers(ConstructHeaderBlock(url2.spec())); |
| 1111 EXPECT_TRUE(spdy_stream2->HasUrl()); | 1107 EXPECT_TRUE(spdy_stream2->HasUrl()); |
| 1112 test::ClosingDelegate delegate2(spdy_stream2.get()); | 1108 test::ClosingDelegate delegate2(spdy_stream2.get()); |
| 1113 spdy_stream2->SetDelegate(&delegate2); | 1109 spdy_stream2->SetDelegate(&delegate2); |
| 1114 | 1110 |
| 1115 spdy_stream1->SendRequest(false); | 1111 spdy_stream1->SendRequest(false); |
| 1116 spdy_stream2->SendRequest(false); | 1112 spdy_stream2->SendRequest(false); |
| 1117 | 1113 |
| 1118 // Ensure that the streams have not yet been activated and assigned an id. | 1114 // Ensure that the streams have not yet been activated and assigned an id. |
| 1119 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1115 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1120 EXPECT_EQ(0u, spdy_stream2->stream_id()); | 1116 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"); | 1339 GURL url3("http://www.google.com"); |
| 1344 SpdyStreamRequest request3; | 1340 SpdyStreamRequest request3; |
| 1345 ASSERT_EQ(ERR_IO_PENDING, | 1341 ASSERT_EQ(ERR_IO_PENDING, |
| 1346 request3.StartRequest(session, url3, LOWEST, | 1342 request3.StartRequest(session, url3, LOWEST, |
| 1347 BoundNetLog(), | 1343 BoundNetLog(), |
| 1348 callback3.callback())); | 1344 callback3.callback())); |
| 1349 | 1345 |
| 1350 EXPECT_EQ(1u, session->num_active_streams() + session->num_created_streams()); | 1346 EXPECT_EQ(1u, session->num_active_streams() + session->num_created_streams()); |
| 1351 EXPECT_EQ(2u, session->pending_create_stream_queues(LOWEST)); | 1347 EXPECT_EQ(2u, session->pending_create_stream_queues(LOWEST)); |
| 1352 | 1348 |
| 1353 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1349 spdy_stream1->set_spdy_headers(ConstructHeaderBlock(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()); | 1350 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1366 spdy_stream1->SendRequest(false); | 1351 spdy_stream1->SendRequest(false); |
| 1367 | 1352 |
| 1368 // Run until 1st stream is closed and 2nd one is opened. | 1353 // Run until 1st stream is closed and 2nd one is opened. |
| 1369 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1354 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1370 data.RunFor(3); | 1355 data.RunFor(3); |
| 1371 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1356 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| 1372 EXPECT_EQ(2u, session->num_active_streams() + session->num_created_streams()); | 1357 EXPECT_EQ(2u, session->num_active_streams() + session->num_created_streams()); |
| 1373 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); | 1358 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); |
| 1374 | 1359 |
| 1375 scoped_refptr<SpdyStream> stream2 = request2.ReleaseStream(); | 1360 scoped_refptr<SpdyStream> stream2 = request2.ReleaseStream(); |
| 1376 stream2->set_spdy_headers(headers2.Pass()); | 1361 stream2->set_spdy_headers(ConstructHeaderBlock(url2.spec())); |
| 1377 EXPECT_TRUE(stream2->HasUrl()); | 1362 EXPECT_TRUE(stream2->HasUrl()); |
| 1378 stream2->SendRequest(false); | 1363 stream2->SendRequest(false); |
| 1379 | 1364 |
| 1380 // Run until 2nd stream is closed. | 1365 // Run until 2nd stream is closed. |
| 1381 EXPECT_EQ(0u, stream2->stream_id()); | 1366 EXPECT_EQ(0u, stream2->stream_id()); |
| 1382 data.RunFor(3); | 1367 data.RunFor(3); |
| 1383 EXPECT_EQ(3u, stream2->stream_id()); | 1368 EXPECT_EQ(3u, stream2->stream_id()); |
| 1384 EXPECT_EQ(1u, session->num_active_streams() + session->num_created_streams()); | 1369 EXPECT_EQ(1u, session->num_active_streams() + session->num_created_streams()); |
| 1385 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); | 1370 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); |
| 1386 | 1371 |
| 1387 scoped_refptr<SpdyStream> stream3 = request3.ReleaseStream(); | 1372 scoped_refptr<SpdyStream> stream3 = request3.ReleaseStream(); |
| 1388 stream3->set_spdy_headers(headers3.Pass()); | 1373 stream3->set_spdy_headers(ConstructHeaderBlock(url3.spec())); |
| 1389 EXPECT_TRUE(stream3->HasUrl()); | 1374 EXPECT_TRUE(stream3->HasUrl()); |
| 1390 stream3->SendRequest(false); | 1375 stream3->SendRequest(false); |
| 1391 | 1376 |
| 1392 EXPECT_EQ(0u, stream3->stream_id()); | 1377 EXPECT_EQ(0u, stream3->stream_id()); |
| 1393 data.RunFor(4); | 1378 data.RunFor(4); |
| 1394 EXPECT_EQ(5u, stream3->stream_id()); | 1379 EXPECT_EQ(5u, stream3->stream_id()); |
| 1395 EXPECT_EQ(0u, session->num_active_streams() + session->num_created_streams()); | 1380 EXPECT_EQ(0u, session->num_active_streams() + session->num_created_streams()); |
| 1396 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); | 1381 EXPECT_EQ(0u, session->pending_create_stream_queues(LOWEST)); |
| 1397 } | 1382 } |
| 1398 | 1383 |
| (...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1695 CreateDeterministicNetworkSession(); | 1680 CreateDeterministicNetworkSession(); |
| 1696 | 1681 |
| 1697 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 1682 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 1698 | 1683 |
| 1699 GURL url1("http://www.google.com"); | 1684 GURL url1("http://www.google.com"); |
| 1700 scoped_refptr<SpdyStream> spdy_stream1 = | 1685 scoped_refptr<SpdyStream> spdy_stream1 = |
| 1701 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 1686 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 1702 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1687 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1703 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1688 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1704 | 1689 |
| 1705 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1690 spdy_stream1->set_spdy_headers(ConstructHeaderBlock(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()); | 1691 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1714 spdy_stream1->SendRequest(false); | 1692 spdy_stream1->SendRequest(false); |
| 1715 | 1693 |
| 1716 // Set up the TaskObserver to verify SpdySession::DoRead doesn't post a task. | 1694 // Set up the TaskObserver to verify SpdySession::DoRead doesn't post a task. |
| 1717 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); | 1695 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); |
| 1718 | 1696 |
| 1719 // Run until 1st read. | 1697 // Run until 1st read. |
| 1720 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1698 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1721 data.RunFor(2); | 1699 data.RunFor(2); |
| 1722 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1700 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1785 CreateDeterministicNetworkSession(); | 1763 CreateDeterministicNetworkSession(); |
| 1786 | 1764 |
| 1787 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 1765 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 1788 | 1766 |
| 1789 GURL url1("http://www.google.com"); | 1767 GURL url1("http://www.google.com"); |
| 1790 scoped_refptr<SpdyStream> spdy_stream1 = | 1768 scoped_refptr<SpdyStream> spdy_stream1 = |
| 1791 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 1769 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 1792 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1770 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1793 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1771 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1794 | 1772 |
| 1795 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1773 spdy_stream1->set_spdy_headers(ConstructHeaderBlock(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()); | 1774 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1804 spdy_stream1->SendRequest(false); | 1775 spdy_stream1->SendRequest(false); |
| 1805 | 1776 |
| 1806 // Set up the TaskObserver to verify SpdySession::DoRead posts a task. | 1777 // Set up the TaskObserver to verify SpdySession::DoRead posts a task. |
| 1807 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); | 1778 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); |
| 1808 | 1779 |
| 1809 // Run until 1st read. | 1780 // Run until 1st read. |
| 1810 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1781 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1811 data.RunFor(2); | 1782 data.RunFor(2); |
| 1812 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1783 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1898 CreateDeterministicNetworkSession(); | 1869 CreateDeterministicNetworkSession(); |
| 1899 | 1870 |
| 1900 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 1871 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 1901 | 1872 |
| 1902 GURL url1("http://www.google.com"); | 1873 GURL url1("http://www.google.com"); |
| 1903 scoped_refptr<SpdyStream> spdy_stream1 = | 1874 scoped_refptr<SpdyStream> spdy_stream1 = |
| 1904 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 1875 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 1905 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1876 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1906 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1877 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1907 | 1878 |
| 1908 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1879 spdy_stream1->set_spdy_headers(ConstructHeaderBlock(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()); | 1880 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1917 spdy_stream1->SendRequest(false); | 1881 spdy_stream1->SendRequest(false); |
| 1918 | 1882 |
| 1919 // Set up the TaskObserver to monitor SpdySession::DoRead posting of tasks. | 1883 // Set up the TaskObserver to monitor SpdySession::DoRead posting of tasks. |
| 1920 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); | 1884 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead"); |
| 1921 | 1885 |
| 1922 // Run until 1st read. | 1886 // Run until 1st read. |
| 1923 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1887 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1924 data.RunFor(2); | 1888 data.RunFor(2); |
| 1925 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1889 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1973 CreateDeterministicNetworkSession(); | 1937 CreateDeterministicNetworkSession(); |
| 1974 | 1938 |
| 1975 scoped_refptr<SpdySession> session = CreateInitializedSession(); | 1939 scoped_refptr<SpdySession> session = CreateInitializedSession(); |
| 1976 | 1940 |
| 1977 GURL url1("http://www.google.com"); | 1941 GURL url1("http://www.google.com"); |
| 1978 scoped_refptr<SpdyStream> spdy_stream1 = | 1942 scoped_refptr<SpdyStream> spdy_stream1 = |
| 1979 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 1943 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 1980 ASSERT_TRUE(spdy_stream1.get() != NULL); | 1944 ASSERT_TRUE(spdy_stream1.get() != NULL); |
| 1981 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1945 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1982 | 1946 |
| 1983 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 1947 spdy_stream1->set_spdy_headers(ConstructHeaderBlock(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()); | 1948 EXPECT_TRUE(spdy_stream1->HasUrl()); |
| 1992 spdy_stream1->SendRequest(false); | 1949 spdy_stream1->SendRequest(false); |
| 1993 | 1950 |
| 1994 // Run until 1st read. | 1951 // Run until 1st read. |
| 1995 EXPECT_EQ(0u, spdy_stream1->stream_id()); | 1952 EXPECT_EQ(0u, spdy_stream1->stream_id()); |
| 1996 data.RunFor(1); | 1953 data.RunFor(1); |
| 1997 EXPECT_EQ(1u, spdy_stream1->stream_id()); | 1954 EXPECT_EQ(1u, spdy_stream1->stream_id()); |
| 1998 | 1955 |
| 1999 // Drop the reference to the session. | 1956 // Drop the reference to the session. |
| 2000 session = NULL; | 1957 session = NULL; |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2334 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); | 2291 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog()); |
| 2335 ASSERT_TRUE(stream.get() != NULL); | 2292 ASSERT_TRUE(stream.get() != NULL); |
| 2336 EXPECT_EQ(0u, stream->stream_id()); | 2293 EXPECT_EQ(0u, stream->stream_id()); |
| 2337 | 2294 |
| 2338 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(msg_data_size)); | 2295 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(msg_data_size)); |
| 2339 memcpy(buf->data(), msg_data.data(), msg_data_size); | 2296 memcpy(buf->data(), msg_data.data(), msg_data_size); |
| 2340 test::StreamDelegateSendImmediate delegate( | 2297 test::StreamDelegateSendImmediate delegate( |
| 2341 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); | 2298 stream.get(), scoped_ptr<SpdyHeaderBlock>(), buf.get()); |
| 2342 stream->SetDelegate(&delegate); | 2299 stream->SetDelegate(&delegate); |
| 2343 | 2300 |
| 2344 scoped_ptr<SpdyHeaderBlock> headers(new SpdyHeaderBlock); | 2301 stream->set_spdy_headers(ConstructHeaderBlock(url1.spec())); |
| 2345 (*headers)[":method"] = "GET"; | |
| 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()); | 2302 EXPECT_TRUE(stream->HasUrl()); |
| 2353 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | 2303 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); |
| 2354 | 2304 |
| 2355 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 2305 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); |
| 2356 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2306 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); |
| 2357 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); | 2307 EXPECT_EQ(0, session->session_unacked_recv_window_bytes_); |
| 2358 | 2308 |
| 2359 data.RunFor(2); | 2309 data.RunFor(2); |
| 2360 | 2310 |
| 2361 EXPECT_EQ(kSpdySessionInitialWindowSize, session->session_send_window_size_); | 2311 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); | 2348 session->IncreaseRecvWindowSize(msg_data_size); |
| 2399 | 2349 |
| 2400 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); | 2350 EXPECT_EQ(kDefaultInitialRecvWindowSize, session->session_recv_window_size_); |
| 2401 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); | 2351 EXPECT_EQ(msg_data_size, session->session_unacked_recv_window_bytes_); |
| 2402 | 2352 |
| 2403 stream->Close(); | 2353 stream->Close(); |
| 2404 | 2354 |
| 2405 EXPECT_EQ(OK, delegate.WaitForClose()); | 2355 EXPECT_EQ(OK, delegate.WaitForClose()); |
| 2406 } | 2356 } |
| 2407 | 2357 |
| 2358 // TODO(akalin): Re-enable the tests below when we fix the unstall bug | |
| 2359 // mentioned in crbug.com/178943. | |
| 2360 | |
| 2361 // Cause a stall by reducing the flow control send window to 0. The | |
| 2362 // stream should resume when that window is then increased. | |
| 2363 TEST_F(SpdySessionSpdy3Test, DISABLED_ResumeAfterSendWindowSizeIncrease31) { | |
| 2364 const char kStreamUrl[] = "http://www.google.com/"; | |
| 2365 GURL url(kStreamUrl); | |
| 2366 | |
| 2367 session_deps_.enable_spdy_31 = true; | |
| 2368 session_deps_.host_resolver->set_synchronous_mode(true); | |
| 2369 | |
| 2370 scoped_ptr<SpdyFrame> initial_window_update( | |
| 2371 ConstructSpdyWindowUpdate( | |
| 2372 kSessionFlowControlStreamId, | |
| 2373 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 2374 const char kBodyData[] = "Body data"; | |
| 2375 const size_t kBodyDataSize = arraysize(kBodyData); | |
| 2376 scoped_ptr<SpdyFrame> req = ConstructSpdyGetRequest(kStreamUrl, 1, LOWEST); | |
| 2377 scoped_ptr<SpdyFrame> msg( | |
| 2378 ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | |
| 2379 MockWrite writes[] = { | |
| 2380 CreateMockWrite(*initial_window_update, 0), | |
| 2381 CreateMockWrite(*req, 1), | |
| 2382 CreateMockWrite(*msg, 3), | |
| 2383 }; | |
| 2384 | |
| 2385 scoped_ptr<SpdyFrame> resp(ConstructSpdyGetSynReply(NULL, 0, 1)); | |
| 2386 scoped_ptr<SpdyFrame> echo( | |
| 2387 ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | |
| 2388 MockRead reads[] = { | |
| 2389 CreateMockRead(*resp, 2), | |
| 2390 CreateMockRead(*echo, 4), | |
| 2391 MockRead(ASYNC, 0, 0, 5), // EOF | |
| 2392 }; | |
| 2393 | |
| 2394 DeterministicSocketData data(reads, arraysize(reads), | |
| 2395 writes, arraysize(writes)); | |
| 2396 MockConnect connect_data(SYNCHRONOUS, OK); | |
| 2397 data.set_connect_data(connect_data); | |
| 2398 | |
| 2399 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | |
| 2400 | |
| 2401 CreateDeterministicNetworkSession(); | |
| 2402 scoped_refptr<SpdySession> session = GetSession(pair_); | |
| 2403 InitializeSession( | |
| 2404 http_session_.get(), session.get(), test_host_port_pair_); | |
| 2405 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | |
| 2406 session->flow_control_state()); | |
| 2407 | |
| 2408 scoped_refptr<SpdyStream> stream = | |
| 2409 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); | |
| 2410 ASSERT_TRUE(stream.get() != NULL); | |
| 2411 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize)); | |
| 2412 memcpy(buf->data(), kBodyData, kBodyDataSize); | |
| 2413 | |
| 2414 test::StreamDelegateWithBody delegate(stream.get(), buf); | |
| 2415 stream->SetDelegate(&delegate); | |
| 2416 | |
| 2417 EXPECT_FALSE(stream->HasUrl()); | |
| 2418 | |
| 2419 stream->set_spdy_headers(ConstructHeaderBlock(kStreamUrl)); | |
| 2420 EXPECT_TRUE(stream->HasUrl()); | |
| 2421 EXPECT_EQ(kStreamUrl, stream->GetUrl().spec()); | |
| 2422 | |
| 2423 EXPECT_EQ(ERR_IO_PENDING, stream->SendRequest(true)); | |
| 2424 | |
| 2425 data.RunFor(3); | |
| 2426 | |
| 2427 EXPECT_FALSE(stream->stalled_by_flow_control()); | |
| 2428 | |
| 2429 // Reduce the send window size to 0 to stall. | |
| 2430 while (session->session_send_window_size_ > 0) { | |
| 2431 session->DecreaseSendWindowSize( | |
| 2432 std::min(kMaxSpdyFrameChunkSize, session->session_send_window_size_)); | |
| 2433 } | |
| 2434 | |
| 2435 stream->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE); | |
| 2436 | |
| 2437 EXPECT_TRUE(stream->stalled_by_flow_control()); | |
| 2438 | |
| 2439 session->IncreaseSendWindowSize(kBodyDataSize); | |
| 2440 | |
| 2441 EXPECT_FALSE(stream->stalled_by_flow_control()); | |
| 2442 | |
| 2443 data.RunFor(3); | |
| 2444 | |
| 2445 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate.WaitForClose()); | |
| 2446 | |
| 2447 EXPECT_TRUE(delegate.send_headers_completed()); | |
| 2448 EXPECT_EQ("200", delegate.GetResponseHeaderValue(":status")); | |
| 2449 EXPECT_EQ("HTTP/1.1", delegate.GetResponseHeaderValue(":version")); | |
| 2450 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate.received_data()); | |
| 2451 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate.body_data_sent()); | |
| 2452 } | |
| 2453 | |
| 2454 // Cause a stall by reducing the flow control recv window to 0. The | |
| 2455 // stream should resume when that window is then increased. | |
| 2456 TEST_F(SpdySessionSpdy3Test, | |
| 2457 DISABLED_ResumeByPriorityAfterSendWindowSizeIncrease31) { | |
| 2458 const char kStreamUrl[] = "http://www.google.com/"; | |
| 2459 GURL url(kStreamUrl); | |
| 2460 | |
| 2461 session_deps_.enable_spdy_31 = true; | |
| 2462 session_deps_.host_resolver->set_synchronous_mode(true); | |
| 2463 | |
| 2464 const char kBodyData[] = "Body data"; | |
| 2465 const size_t kBodyDataSize = arraysize(kBodyData); | |
| 2466 scoped_ptr<SpdyFrame> initial_window_update( | |
| 2467 ConstructSpdyWindowUpdate( | |
| 2468 kSessionFlowControlStreamId, | |
| 2469 kDefaultInitialRecvWindowSize - kSpdySessionInitialWindowSize)); | |
| 2470 scoped_ptr<SpdyFrame> req1 = ConstructSpdyGetRequest(kStreamUrl, 1, LOWEST); | |
| 2471 scoped_ptr<SpdyFrame> req2 = ConstructSpdyGetRequest(kStreamUrl, 3, MEDIUM); | |
| 2472 scoped_ptr<SpdyFrame> msg1( | |
| 2473 ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | |
| 2474 scoped_ptr<SpdyFrame> msg2( | |
| 2475 ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | |
| 2476 MockWrite writes[] = { | |
| 2477 CreateMockWrite(*initial_window_update, 0), | |
| 2478 CreateMockWrite(*req1, 1), | |
| 2479 CreateMockWrite(*req2, 3), | |
| 2480 CreateMockWrite(*msg1, 5), | |
| 2481 CreateMockWrite(*msg2, 7), | |
| 2482 }; | |
| 2483 | |
| 2484 scoped_ptr<SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1)); | |
| 2485 scoped_ptr<SpdyFrame> resp2(ConstructSpdyGetSynReply(NULL, 0, 3)); | |
| 2486 scoped_ptr<SpdyFrame> echo1( | |
| 2487 ConstructSpdyBodyFrame(3, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | |
| 2488 scoped_ptr<SpdyFrame> echo2( | |
| 2489 ConstructSpdyBodyFrame(1, kBodyData, kBodyDataSize, DATA_FLAG_NONE)); | |
| 2490 MockRead reads[] = { | |
| 2491 CreateMockRead(*resp1, 2), | |
| 2492 CreateMockRead(*resp2, 4), | |
| 2493 CreateMockRead(*echo1, 6), | |
| 2494 CreateMockRead(*echo2, 8), | |
| 2495 MockRead(ASYNC, 0, 0, 9), // EOF | |
| 2496 }; | |
| 2497 | |
| 2498 DeterministicSocketData data(reads, arraysize(reads), | |
| 2499 writes, arraysize(writes)); | |
| 2500 MockConnect connect_data(SYNCHRONOUS, OK); | |
| 2501 data.set_connect_data(connect_data); | |
| 2502 | |
| 2503 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data); | |
| 2504 | |
| 2505 CreateDeterministicNetworkSession(); | |
| 2506 scoped_refptr<SpdySession> session = GetSession(pair_); | |
| 2507 InitializeSession( | |
| 2508 http_session_.get(), session.get(), test_host_port_pair_); | |
| 2509 EXPECT_EQ(SpdySession::FLOW_CONTROL_STREAM_AND_SESSION, | |
| 2510 session->flow_control_state()); | |
| 2511 | |
| 2512 scoped_refptr<SpdyStream> stream1 = | |
| 2513 CreateStreamSynchronously(session, url, LOWEST, BoundNetLog()); | |
| 2514 ASSERT_TRUE(stream1.get() != NULL); | |
| 2515 scoped_refptr<IOBufferWithSize> buf(new IOBufferWithSize(kBodyDataSize)); | |
| 2516 memcpy(buf->data(), kBodyData, kBodyDataSize); | |
| 2517 | |
| 2518 test::StreamDelegateWithBody delegate1(stream1.get(), buf); | |
| 2519 stream1->SetDelegate(&delegate1); | |
| 2520 | |
| 2521 EXPECT_FALSE(stream1->HasUrl()); | |
| 2522 | |
| 2523 stream1->set_spdy_headers(ConstructHeaderBlock(kStreamUrl)); | |
| 2524 EXPECT_TRUE(stream1->HasUrl()); | |
| 2525 EXPECT_EQ(kStreamUrl, stream1->GetUrl().spec()); | |
| 2526 | |
| 2527 EXPECT_EQ(ERR_IO_PENDING, stream1->SendRequest(true)); | |
| 2528 | |
| 2529 data.RunFor(3); | |
| 2530 EXPECT_EQ(1u, stream1->stream_id()); | |
| 2531 | |
| 2532 scoped_refptr<SpdyStream> stream2 = | |
| 2533 CreateStreamSynchronously(session, url, MEDIUM, BoundNetLog()); | |
| 2534 ASSERT_TRUE(stream2.get() != NULL); | |
| 2535 scoped_refptr<IOBufferWithSize> buf2(new IOBufferWithSize(kBodyDataSize)); | |
| 2536 memcpy(buf2->data(), kBodyData, kBodyDataSize); | |
| 2537 | |
| 2538 test::StreamDelegateWithBody delegate2(stream2.get(), buf2); | |
| 2539 stream2->SetDelegate(&delegate2); | |
| 2540 | |
| 2541 EXPECT_FALSE(stream2->HasUrl()); | |
| 2542 | |
| 2543 stream2->set_spdy_headers(ConstructHeaderBlock(kStreamUrl)); | |
| 2544 EXPECT_TRUE(stream2->HasUrl()); | |
| 2545 EXPECT_EQ(kStreamUrl, stream2->GetUrl().spec()); | |
| 2546 | |
| 2547 EXPECT_EQ(ERR_IO_PENDING, stream2->SendRequest(true)); | |
| 2548 | |
| 2549 data.RunFor(2); | |
| 2550 EXPECT_EQ(3u, stream2->stream_id()); | |
| 2551 | |
| 2552 EXPECT_FALSE(stream1->stalled_by_flow_control()); | |
| 2553 EXPECT_FALSE(stream2->stalled_by_flow_control()); | |
| 2554 | |
| 2555 // Reduce the send window size to 0 to stall. | |
| 2556 while (session->session_send_window_size_ > 0) { | |
| 2557 session->DecreaseSendWindowSize( | |
| 2558 std::min(kMaxSpdyFrameChunkSize, session->session_send_window_size_)); | |
| 2559 } | |
| 2560 | |
| 2561 stream1->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE); | |
| 2562 stream2->QueueStreamData(buf.get(), buf->size(), DATA_FLAG_NONE); | |
| 2563 | |
| 2564 EXPECT_TRUE(stream1->stalled_by_flow_control()); | |
| 2565 EXPECT_TRUE(stream2->stalled_by_flow_control()); | |
| 2566 | |
| 2567 // This should unstall only stream2. | |
| 2568 session->IncreaseSendWindowSize(kBodyDataSize); | |
| 2569 | |
| 2570 EXPECT_TRUE(stream1->stalled_by_flow_control()); | |
| 2571 EXPECT_FALSE(stream2->stalled_by_flow_control()); | |
| 2572 | |
| 2573 data.RunFor(2); | |
| 2574 | |
| 2575 EXPECT_TRUE(stream1->stalled_by_flow_control()); | |
| 2576 EXPECT_FALSE(stream2->stalled_by_flow_control()); | |
| 2577 | |
| 2578 // This should then unstall stream1. | |
| 2579 session->IncreaseSendWindowSize(kBodyDataSize); | |
| 2580 | |
| 2581 EXPECT_FALSE(stream1->stalled_by_flow_control()); | |
| 2582 EXPECT_FALSE(stream2->stalled_by_flow_control()); | |
| 2583 | |
| 2584 data.RunFor(3); | |
| 2585 | |
| 2586 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate1.WaitForClose()); | |
| 2587 EXPECT_EQ(ERR_CONNECTION_CLOSED, delegate2.WaitForClose()); | |
| 2588 | |
| 2589 EXPECT_TRUE(delegate1.send_headers_completed()); | |
| 2590 EXPECT_EQ("200", delegate1.GetResponseHeaderValue(":status")); | |
| 2591 EXPECT_EQ("HTTP/1.1", delegate1.GetResponseHeaderValue(":version")); | |
| 2592 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate1.received_data()); | |
| 2593 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate1.body_data_sent()); | |
| 2594 | |
| 2595 EXPECT_TRUE(delegate2.send_headers_completed()); | |
| 2596 EXPECT_EQ("200", delegate2.GetResponseHeaderValue(":status")); | |
| 2597 EXPECT_EQ("HTTP/1.1", delegate2.GetResponseHeaderValue(":version")); | |
| 2598 EXPECT_EQ(std::string(kBodyData, kBodyDataSize), delegate2.received_data()); | |
| 2599 EXPECT_EQ(static_cast<int>(kBodyDataSize), delegate2.body_data_sent()); | |
| 2600 } | |
| 2601 | |
| 2408 } // namespace net | 2602 } // namespace net |
| OLD | NEW |