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

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

Issue 13608003: Revert 181390 "SPDY - implement greedy approach to read all the ..." (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 7 years, 8 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_spdy2_unittest.cc ('k') | net/spdy/spdy_session_test_util.h » ('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"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/memory/scoped_vector.h"
10 #include "base/pending_task.h"
11 #include "base/string_piece.h"
12 #include "base/string_util.h"
13 #include "net/base/host_cache.h" 7 #include "net/base/host_cache.h"
14 #include "net/base/io_buffer.h"
15 #include "net/base/ip_endpoint.h" 8 #include "net/base/ip_endpoint.h"
16 #include "net/base/net_log_unittest.h" 9 #include "net/base/net_log_unittest.h"
17 #include "net/base/request_priority.h" 10 #include "net/base/request_priority.h"
18 #include "net/base/test_data_directory.h" 11 #include "net/base/test_data_directory.h"
19 #include "net/base/test_data_stream.h"
20 #include "net/spdy/spdy_http_utils.h" 12 #include "net/spdy/spdy_http_utils.h"
21 #include "net/spdy/spdy_io_buffer.h" 13 #include "net/spdy/spdy_io_buffer.h"
22 #include "net/spdy/spdy_session_pool.h" 14 #include "net/spdy/spdy_session_pool.h"
23 #include "net/spdy/spdy_session_test_util.h"
24 #include "net/spdy/spdy_stream.h" 15 #include "net/spdy/spdy_stream.h"
25 #include "net/spdy/spdy_stream_test_util.h" 16 #include "net/spdy/spdy_stream_test_util.h"
26 #include "net/spdy/spdy_test_util_common.h" 17 #include "net/spdy/spdy_test_util_common.h"
27 #include "net/spdy/spdy_test_util_spdy3.h" 18 #include "net/spdy/spdy_test_util_spdy3.h"
28 #include "net/test/cert_test_util.h" 19 #include "net/test/cert_test_util.h"
29 #include "testing/platform_test.h" 20 #include "testing/platform_test.h"
30 21
31 using namespace net::test_spdy3; 22 using namespace net::test_spdy3;
32 23
33 namespace net { 24 namespace net {
(...skipping 1653 matching lines...) Expand 10 before | Expand all | Expand 10 after
1687 spdy_stream1 = NULL; 1678 spdy_stream1 = NULL;
1688 1679
1689 scoped_refptr<SpdyStream> spdy_stream2 = 1680 scoped_refptr<SpdyStream> spdy_stream2 =
1690 CreateStreamSynchronously(session, test_url_, MEDIUM, BoundNetLog()); 1681 CreateStreamSynchronously(session, test_url_, MEDIUM, BoundNetLog());
1691 ASSERT_TRUE(spdy_stream2.get() != NULL); 1682 ASSERT_TRUE(spdy_stream2.get() != NULL);
1692 EXPECT_EQ(spdy_stream2->send_window_size(), window_size); 1683 EXPECT_EQ(spdy_stream2->send_window_size(), window_size);
1693 spdy_stream2->Cancel(); 1684 spdy_stream2->Cancel();
1694 spdy_stream2 = NULL; 1685 spdy_stream2 = NULL;
1695 } 1686 }
1696 1687
1697 // Test that SpdySession::DoRead reads data from the socket without yielding.
1698 // This test makes 32k - 1 bytes of data available on the socket for reading. It
1699 // then verifies that it has read all the available data without yielding.
1700 TEST_F(SpdySessionSpdy3Test, ReadDataWithoutYielding) {
1701 MockConnect connect_data(SYNCHRONOUS, OK);
1702 BufferedSpdyFramer framer(3, false);
1703
1704 scoped_ptr<SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, MEDIUM));
1705 MockWrite writes[] = {
1706 CreateMockWrite(*req1, 0),
1707 };
1708
1709 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size).
1710 ASSERT_EQ(32 * 1024, kMaxReadBytes);
1711 const int kPayloadSize =
1712 kMaxReadBytes / 4 - framer.GetControlFrameHeaderSize();
1713 TestDataStream test_stream;
1714 scoped_refptr<net::IOBuffer> payload(new net::IOBuffer(kPayloadSize));
1715 char* payload_data = payload->data();
1716 test_stream.GetBytes(payload_data, kPayloadSize);
1717
1718 scoped_ptr<SpdyFrame> partial_data_frame(
1719 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_NONE));
1720 scoped_ptr<SpdyFrame> finish_data_frame(
1721 framer.CreateDataFrame(1, payload_data, kPayloadSize - 1, DATA_FLAG_FIN));
1722
1723 scoped_ptr<SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1));
1724
1725 // Write 1 byte less than kMaxReadBytes to check that DoRead reads up to 32k
1726 // bytes.
1727 MockRead reads[] = {
1728 CreateMockRead(*resp1, 1),
1729 CreateMockRead(*partial_data_frame, 2),
1730 CreateMockRead(*partial_data_frame, 3, SYNCHRONOUS),
1731 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS),
1732 CreateMockRead(*finish_data_frame, 5, SYNCHRONOUS),
1733 MockRead(ASYNC, 0, 6) // EOF
1734 };
1735
1736 // Create SpdySession and SpdyStream and send the request.
1737 DeterministicSocketData data(reads, arraysize(reads),
1738 writes, arraysize(writes));
1739 data.set_connect_data(connect_data);
1740 session_deps_.host_resolver->set_synchronous_mode(true);
1741 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
1742
1743 SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
1744 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl);
1745
1746 CreateDeterministicNetworkSession();
1747
1748 scoped_refptr<SpdySession> session = CreateInitializedSession();
1749
1750 GURL url1("http://www.google.com");
1751 scoped_refptr<SpdyStream> spdy_stream1 =
1752 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog());
1753 ASSERT_TRUE(spdy_stream1.get() != NULL);
1754 EXPECT_EQ(0u, spdy_stream1->stream_id());
1755
1756 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec()));
1757 EXPECT_TRUE(spdy_stream1->HasUrl());
1758 spdy_stream1->SendRequest(false);
1759
1760 // Set up the TaskObserver to verify SpdySession::DoRead doesn't post a task.
1761 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead");
1762
1763 // Run until 1st read.
1764 EXPECT_EQ(0u, spdy_stream1->stream_id());
1765 data.RunFor(2);
1766 EXPECT_EQ(1u, spdy_stream1->stream_id());
1767 EXPECT_EQ(0u, observer.executed_count());
1768
1769 // Read all the data and verify SpdySession::DoRead has not posted a task.
1770 data.RunFor(4);
1771
1772 // Verify task observer's executed_count is zero, which indicates DoRead read
1773 // all the available data.
1774 EXPECT_EQ(0u, observer.executed_count());
1775 EXPECT_TRUE(data.at_write_eof());
1776 EXPECT_TRUE(data.at_read_eof());
1777 }
1778
1779 // Test that SpdySession::DoRead yields while reading the data. This test makes
1780 // 32k + 1 bytes of data available on the socket for reading. It then verifies
1781 // that DoRead has yielded even though there is data available for it to read
1782 // (i.e, socket()->Read didn't return ERR_IO_PENDING during socket reads).
1783 TEST_F(SpdySessionSpdy3Test, TestYieldingDuringReadData) {
1784 MockConnect connect_data(SYNCHRONOUS, OK);
1785 BufferedSpdyFramer framer(3, false);
1786
1787 scoped_ptr<SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, MEDIUM));
1788 MockWrite writes[] = {
1789 CreateMockWrite(*req1, 0),
1790 };
1791
1792 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size).
1793 ASSERT_EQ(32 * 1024, kMaxReadBytes);
1794 const int kPayloadSize =
1795 kMaxReadBytes / 4 - framer.GetControlFrameHeaderSize();
1796 TestDataStream test_stream;
1797 scoped_refptr<net::IOBuffer> payload(new net::IOBuffer(kPayloadSize));
1798 char* payload_data = payload->data();
1799 test_stream.GetBytes(payload_data, kPayloadSize);
1800
1801 scoped_ptr<SpdyFrame> partial_data_frame(
1802 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_NONE));
1803 scoped_ptr<SpdyFrame> finish_data_frame(
1804 framer.CreateDataFrame(1, "h", 1, DATA_FLAG_FIN));
1805
1806 scoped_ptr<SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1));
1807
1808 // Write 1 byte more than kMaxReadBytes to check that DoRead yields.
1809 MockRead reads[] = {
1810 CreateMockRead(*resp1, 1),
1811 CreateMockRead(*partial_data_frame, 2),
1812 CreateMockRead(*partial_data_frame, 3, SYNCHRONOUS),
1813 CreateMockRead(*partial_data_frame, 4, SYNCHRONOUS),
1814 CreateMockRead(*partial_data_frame, 5, SYNCHRONOUS),
1815 CreateMockRead(*finish_data_frame, 6, SYNCHRONOUS),
1816 MockRead(ASYNC, 0, 7) // EOF
1817 };
1818
1819 // Create SpdySession and SpdyStream and send the request.
1820 DeterministicSocketData data(reads, arraysize(reads),
1821 writes, arraysize(writes));
1822 data.set_connect_data(connect_data);
1823 session_deps_.host_resolver->set_synchronous_mode(true);
1824 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
1825
1826 SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
1827 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl);
1828
1829 CreateDeterministicNetworkSession();
1830
1831 scoped_refptr<SpdySession> session = CreateInitializedSession();
1832
1833 GURL url1("http://www.google.com");
1834 scoped_refptr<SpdyStream> spdy_stream1 =
1835 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog());
1836 ASSERT_TRUE(spdy_stream1.get() != NULL);
1837 EXPECT_EQ(0u, spdy_stream1->stream_id());
1838
1839 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec()));
1840 EXPECT_TRUE(spdy_stream1->HasUrl());
1841 spdy_stream1->SendRequest(false);
1842
1843 // Set up the TaskObserver to verify SpdySession::DoRead posts a task.
1844 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead");
1845
1846 // Run until 1st read.
1847 EXPECT_EQ(0u, spdy_stream1->stream_id());
1848 data.RunFor(2);
1849 EXPECT_EQ(1u, spdy_stream1->stream_id());
1850 EXPECT_EQ(0u, observer.executed_count());
1851
1852 // Read all the data and verify SpdySession::DoRead has posted a task.
1853 data.RunFor(6);
1854
1855 // Verify task observer's executed_count is 1, which indicates DoRead has
1856 // posted only one task and thus yielded though there is data available for it
1857 // to read.
1858 EXPECT_EQ(1u, observer.executed_count());
1859 EXPECT_TRUE(data.at_write_eof());
1860 EXPECT_TRUE(data.at_read_eof());
1861 }
1862
1863 // Test that SpdySession::DoRead() tests interactions of yielding + async,
1864 // by doing the following MockReads.
1865 //
1866 // MockRead of SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 2K
1867 // ASYNC 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 8K, SYNCHRONOUS 2K.
1868 //
1869 // The above reads 26K synchronously. Since that is less that 32K, we will
1870 // attempt to read again. However, that DoRead() will return ERR_IO_PENDING
1871 // (because of async read), so DoRead() will yield. When we come back, DoRead()
1872 // will read the results from the async read, and rest of the data
1873 // synchronously.
1874 TEST_F(SpdySessionSpdy3Test, TestYieldingDuringAsyncReadData) {
1875 MockConnect connect_data(SYNCHRONOUS, OK);
1876 BufferedSpdyFramer framer(3, false);
1877
1878 scoped_ptr<SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, MEDIUM));
1879 MockWrite writes[] = {
1880 CreateMockWrite(*req1, 0),
1881 };
1882
1883 // Build buffer of size kMaxReadBytes / 4 (-spdy_data_frame_size).
1884 ASSERT_EQ(32 * 1024, kMaxReadBytes);
1885 TestDataStream test_stream;
1886 const int kEightKPayloadSize =
1887 kMaxReadBytes / 4 - framer.GetControlFrameHeaderSize();
1888 scoped_refptr<net::IOBuffer> eightk_payload(
1889 new net::IOBuffer(kEightKPayloadSize));
1890 char* eightk_payload_data = eightk_payload->data();
1891 test_stream.GetBytes(eightk_payload_data, kEightKPayloadSize);
1892
1893 // Build buffer of 2k size.
1894 TestDataStream test_stream2;
1895 const int kTwoKPayloadSize = kEightKPayloadSize - 6 * 1024;
1896 scoped_refptr<net::IOBuffer> twok_payload(
1897 new net::IOBuffer(kTwoKPayloadSize));
1898 char* twok_payload_data = twok_payload->data();
1899 test_stream2.GetBytes(twok_payload_data, kTwoKPayloadSize);
1900
1901 scoped_ptr<SpdyFrame> eightk_data_frame(framer.CreateDataFrame(
1902 1, eightk_payload_data, kEightKPayloadSize, DATA_FLAG_NONE));
1903 scoped_ptr<SpdyFrame> twok_data_frame(framer.CreateDataFrame(
1904 1, twok_payload_data, kTwoKPayloadSize, DATA_FLAG_NONE));
1905 scoped_ptr<SpdyFrame> finish_data_frame(framer.CreateDataFrame(
1906 1, "h", 1, DATA_FLAG_FIN));
1907
1908 scoped_ptr<SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1));
1909
1910 MockRead reads[] = {
1911 CreateMockRead(*resp1, 1),
1912 CreateMockRead(*eightk_data_frame, 2),
1913 CreateMockRead(*eightk_data_frame, 3, SYNCHRONOUS),
1914 CreateMockRead(*eightk_data_frame, 4, SYNCHRONOUS),
1915 CreateMockRead(*twok_data_frame, 5, SYNCHRONOUS),
1916 CreateMockRead(*eightk_data_frame, 6, ASYNC),
1917 CreateMockRead(*eightk_data_frame, 7, SYNCHRONOUS),
1918 CreateMockRead(*eightk_data_frame, 8, SYNCHRONOUS),
1919 CreateMockRead(*eightk_data_frame, 9, SYNCHRONOUS),
1920 CreateMockRead(*twok_data_frame, 10, SYNCHRONOUS),
1921 CreateMockRead(*finish_data_frame, 11, SYNCHRONOUS),
1922 MockRead(ASYNC, 0, 12) // EOF
1923 };
1924
1925 // Create SpdySession and SpdyStream and send the request.
1926 DeterministicSocketData data(reads, arraysize(reads),
1927 writes, arraysize(writes));
1928 data.set_connect_data(connect_data);
1929 session_deps_.host_resolver->set_synchronous_mode(true);
1930 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
1931
1932 SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
1933 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl);
1934
1935 CreateDeterministicNetworkSession();
1936
1937 scoped_refptr<SpdySession> session = CreateInitializedSession();
1938
1939 GURL url1("http://www.google.com");
1940 scoped_refptr<SpdyStream> spdy_stream1 =
1941 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog());
1942 ASSERT_TRUE(spdy_stream1.get() != NULL);
1943 EXPECT_EQ(0u, spdy_stream1->stream_id());
1944
1945 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec()));
1946 EXPECT_TRUE(spdy_stream1->HasUrl());
1947 spdy_stream1->SendRequest(false);
1948
1949 // Set up the TaskObserver to monitor SpdySession::DoRead posting of tasks.
1950 SpdySessionTestTaskObserver observer("spdy_session.cc", "DoRead");
1951
1952 // Run until 1st read.
1953 EXPECT_EQ(0u, spdy_stream1->stream_id());
1954 data.RunFor(2);
1955 EXPECT_EQ(1u, spdy_stream1->stream_id());
1956 EXPECT_EQ(0u, observer.executed_count());
1957
1958 // Read all the data and verify SpdySession::DoRead has posted a task.
1959 data.RunFor(12);
1960
1961 // Verify task observer's executed_count is 1, which indicates DoRead has
1962 // posted only one task and thus yielded though there is data available for
1963 // it to read.
1964 EXPECT_EQ(1u, observer.executed_count());
1965 EXPECT_TRUE(data.at_write_eof());
1966 EXPECT_TRUE(data.at_read_eof());
1967 }
1968
1969 // Send a GoAway frame when SpdySession is in DoLoop. If scoped_refptr to
1970 // <SpdySession> is deleted from SpdySession::DoLoop(), we get a crash because
1971 // GoAway could delete the SpdySession from the SpdySessionPool and the last
1972 // reference to SpdySession.
1973 TEST_F(SpdySessionSpdy3Test, GoAwayWhileInDoLoop) {
1974 MockConnect connect_data(SYNCHRONOUS, OK);
1975 BufferedSpdyFramer framer(3, false);
1976
1977 scoped_ptr<SpdyFrame> req1(ConstructSpdyGet(NULL, 0, false, 1, MEDIUM));
1978 MockWrite writes[] = {
1979 CreateMockWrite(*req1, 0),
1980 };
1981
1982 scoped_ptr<SpdyFrame> resp1(ConstructSpdyGetSynReply(NULL, 0, 1));
1983 scoped_ptr<SpdyFrame> body1(ConstructSpdyBodyFrame(1, true));
1984 scoped_ptr<SpdyFrame> goaway(ConstructSpdyGoAway());
1985
1986 MockRead reads[] = {
1987 CreateMockRead(*resp1, 1),
1988 CreateMockRead(*body1, 2),
1989 CreateMockRead(*goaway, 3),
1990 MockRead(ASYNC, 0, 4) // EOF
1991 };
1992
1993 // Create SpdySession and SpdyStream and send the request.
1994 DeterministicSocketData data(reads, arraysize(reads),
1995 writes, arraysize(writes));
1996 data.set_connect_data(connect_data);
1997 session_deps_.host_resolver->set_synchronous_mode(true);
1998 session_deps_.deterministic_socket_factory->AddSocketDataProvider(&data);
1999
2000 SSLSocketDataProvider ssl(SYNCHRONOUS, OK);
2001 session_deps_.deterministic_socket_factory->AddSSLSocketDataProvider(&ssl);
2002
2003 CreateDeterministicNetworkSession();
2004
2005 scoped_refptr<SpdySession> session = CreateInitializedSession();
2006
2007 GURL url1("http://www.google.com");
2008 scoped_refptr<SpdyStream> spdy_stream1 =
2009 CreateStreamSynchronously(session, url1, MEDIUM, BoundNetLog());
2010 ASSERT_TRUE(spdy_stream1.get() != NULL);
2011 EXPECT_EQ(0u, spdy_stream1->stream_id());
2012
2013 spdy_stream1->set_spdy_headers(ConstructGetHeaderBlock(url1.spec()));
2014 EXPECT_TRUE(spdy_stream1->HasUrl());
2015 spdy_stream1->SendRequest(false);
2016
2017 // Run until 1st read.
2018 EXPECT_EQ(0u, spdy_stream1->stream_id());
2019 data.RunFor(1);
2020 EXPECT_EQ(1u, spdy_stream1->stream_id());
2021
2022 // Drop the reference to the session.
2023 session = NULL;
2024
2025 // Run until GoAway.
2026 data.RunFor(2);
2027
2028 // Drop the reference to the stream which deletes its reference to the
2029 // SpdySession. Only references to SpdySession are held by DoLoop and
2030 // SpdySessionPool. If DoLoop doesn't hold the reference, we get a crash if
2031 // SpdySession is deleted from the SpdySessionPool.
2032 spdy_stream1 = NULL;
2033
2034 data.RunFor(2);
2035 EXPECT_TRUE(data.at_write_eof());
2036 EXPECT_TRUE(data.at_read_eof());
2037 }
2038
2039 // Within this framework, a SpdySession should be initialized with 1688 // Within this framework, a SpdySession should be initialized with
2040 // flow control enabled only for streams and with protocol version 3 1689 // flow control enabled only for streams and with protocol version 3
2041 // by default. 1690 // by default.
2042 TEST_F(SpdySessionSpdy3Test, ProtocolNegotiation) { 1691 TEST_F(SpdySessionSpdy3Test, ProtocolNegotiation) {
2043 session_deps_.host_resolver->set_synchronous_mode(true); 1692 session_deps_.host_resolver->set_synchronous_mode(true);
2044 1693
2045 MockConnect connect_data(SYNCHRONOUS, OK); 1694 MockConnect connect_data(SYNCHRONOUS, OK);
2046 MockRead reads[] = { 1695 MockRead reads[] = {
2047 MockRead(SYNCHRONOUS, 0, 0) // EOF 1696 MockRead(SYNCHRONOUS, 0, 0) // EOF
2048 }; 1697 };
(...skipping 925 matching lines...) Expand 10 before | Expand all | Expand 10 after
2974 EXPECT_EQ(0, delegate1.body_data_sent()); 2623 EXPECT_EQ(0, delegate1.body_data_sent());
2975 2624
2976 EXPECT_TRUE(delegate2.send_headers_completed()); 2625 EXPECT_TRUE(delegate2.send_headers_completed());
2977 EXPECT_EQ("200", delegate2.GetResponseHeaderValue(":status")); 2626 EXPECT_EQ("200", delegate2.GetResponseHeaderValue(":status"));
2978 EXPECT_EQ("HTTP/1.1", delegate2.GetResponseHeaderValue(":version")); 2627 EXPECT_EQ("HTTP/1.1", delegate2.GetResponseHeaderValue(":version"));
2979 EXPECT_EQ("", delegate2.received_data()); 2628 EXPECT_EQ("", delegate2.received_data());
2980 EXPECT_EQ(0, delegate2.body_data_sent()); 2629 EXPECT_EQ(0, delegate2.body_data_sent());
2981 } 2630 }
2982 2631
2983 } // namespace net 2632 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_session_spdy2_unittest.cc ('k') | net/spdy/spdy_session_test_util.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698