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

Side by Side Diff: net/spdy/spdy_session_spdy3_unittest.cc

Issue 12743006: [SPDY] Refactor tests in preparation for a fix for a session flow control bug (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698