OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/spdy/spdy_session.h" | 5 #include "net/spdy/spdy_session.h" |
6 | 6 |
7 #include "base/location.h" | |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |