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

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: Address comments 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
« no previous file with comments | « net/spdy/spdy_session.h ('k') | net/spdy/spdy_stream_spdy2_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 930 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/spdy/spdy_session.h ('k') | net/spdy/spdy_stream_spdy2_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698