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/quic/quic_client_session.h" | 5 #include "net/quic/quic_client_session.h" |
6 | 6 |
7 #include <vector> | 7 #include <vector> |
8 | 8 |
9 #include "base/rand_util.h" | 9 #include "base/rand_util.h" |
10 #include "net/base/capturing_net_log.h" | 10 #include "net/base/capturing_net_log.h" |
(...skipping 15 matching lines...) Expand all Loading... |
26 | 26 |
27 namespace net { | 27 namespace net { |
28 namespace test { | 28 namespace test { |
29 namespace { | 29 namespace { |
30 | 30 |
31 const char kServerHostname[] = "www.example.com"; | 31 const char kServerHostname[] = "www.example.com"; |
32 const uint16 kServerPort = 80; | 32 const uint16 kServerPort = 80; |
33 | 33 |
34 class TestPacketWriter : public QuicDefaultPacketWriter { | 34 class TestPacketWriter : public QuicDefaultPacketWriter { |
35 public: | 35 public: |
36 TestPacketWriter(QuicVersion version) : version_(version) { | 36 TestPacketWriter(QuicVersion version) : version_(version) {} |
37 } | |
38 | 37 |
39 // QuicPacketWriter | 38 // QuicPacketWriter |
40 virtual WriteResult WritePacket( | 39 virtual WriteResult WritePacket(const char* buffer, |
41 const char* buffer, size_t buf_len, | 40 size_t buf_len, |
42 const IPAddressNumber& self_address, | 41 const IPAddressNumber& self_address, |
43 const IPEndPoint& peer_address) OVERRIDE { | 42 const IPEndPoint& peer_address) OVERRIDE { |
44 SimpleQuicFramer framer(SupportedVersions(version_)); | 43 SimpleQuicFramer framer(SupportedVersions(version_)); |
45 QuicEncryptedPacket packet(buffer, buf_len); | 44 QuicEncryptedPacket packet(buffer, buf_len); |
46 EXPECT_TRUE(framer.ProcessPacket(packet)); | 45 EXPECT_TRUE(framer.ProcessPacket(packet)); |
47 header_ = framer.header(); | 46 header_ = framer.header(); |
48 return WriteResult(WRITE_STATUS_OK, packet.length()); | 47 return WriteResult(WRITE_STATUS_OK, packet.length()); |
49 } | 48 } |
50 | 49 |
51 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { | 50 virtual bool IsWriteBlockedDataBuffered() const OVERRIDE { |
52 // Chrome sockets' Write() methods buffer the data until the Write is | 51 // Chrome sockets' Write() methods buffer the data until the Write is |
53 // permitted. | 52 // permitted. |
54 return true; | 53 return true; |
55 } | 54 } |
56 | 55 |
57 // Returns the header from the last packet written. | 56 // Returns the header from the last packet written. |
58 const QuicPacketHeader& header() { return header_; } | 57 const QuicPacketHeader& header() { return header_; } |
59 | 58 |
60 private: | 59 private: |
61 QuicVersion version_; | 60 QuicVersion version_; |
62 QuicPacketHeader header_; | 61 QuicPacketHeader header_; |
63 }; | 62 }; |
64 | 63 |
65 class QuicClientSessionTest : public ::testing::TestWithParam<QuicVersion> { | 64 class QuicClientSessionTest : public ::testing::TestWithParam<QuicVersion> { |
66 protected: | 65 protected: |
67 QuicClientSessionTest() | 66 QuicClientSessionTest() |
68 : writer_(new TestPacketWriter(GetParam())), | 67 : writer_(new TestPacketWriter(GetParam())), |
69 connection_( | 68 connection_( |
70 new PacketSavingConnection(false, SupportedVersions(GetParam()))), | 69 new PacketSavingConnection(false, SupportedVersions(GetParam()))), |
71 session_(connection_, GetSocket().Pass(), writer_.Pass(), NULL, NULL, | 70 session_(connection_, |
| 71 GetSocket().Pass(), |
| 72 writer_.Pass(), |
| 73 NULL, |
| 74 NULL, |
72 make_scoped_ptr((QuicServerInfo*)NULL), | 75 make_scoped_ptr((QuicServerInfo*)NULL), |
73 QuicServerId(kServerHostname, kServerPort, false, | 76 QuicServerId(kServerHostname, |
| 77 kServerPort, |
| 78 false, |
74 PRIVACY_MODE_DISABLED), | 79 PRIVACY_MODE_DISABLED), |
75 DefaultQuicConfig(), &crypto_config_, &net_log_) { | 80 DefaultQuicConfig(), |
| 81 &crypto_config_, |
| 82 &net_log_) { |
76 session_.config()->SetDefaults(); | 83 session_.config()->SetDefaults(); |
77 crypto_config_.SetDefaults(); | 84 crypto_config_.SetDefaults(); |
78 } | 85 } |
79 | 86 |
80 virtual void TearDown() OVERRIDE { | 87 virtual void TearDown() OVERRIDE { |
81 session_.CloseSessionOnError(ERR_ABORTED); | 88 session_.CloseSessionOnError(ERR_ABORTED); |
82 } | 89 } |
83 | 90 |
84 scoped_ptr<DatagramClientSocket> GetSocket() { | 91 scoped_ptr<DatagramClientSocket> GetSocket() { |
85 socket_factory_.AddSocketDataProvider(&socket_data_); | 92 socket_factory_.AddSocketDataProvider(&socket_data_); |
86 return socket_factory_.CreateDatagramClientSocket( | 93 return socket_factory_.CreateDatagramClientSocket( |
87 DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt), | 94 DatagramSocket::DEFAULT_BIND, |
88 &net_log_, NetLog::Source()); | 95 base::Bind(&base::RandInt), |
| 96 &net_log_, |
| 97 NetLog::Source()); |
89 } | 98 } |
90 | 99 |
91 void CompleteCryptoHandshake() { | 100 void CompleteCryptoHandshake() { |
92 ASSERT_EQ(ERR_IO_PENDING, | 101 ASSERT_EQ(ERR_IO_PENDING, |
93 session_.CryptoConnect(false, callback_.callback())); | 102 session_.CryptoConnect(false, callback_.callback())); |
94 CryptoTestUtils::HandshakeWithFakeServer( | 103 CryptoTestUtils::HandshakeWithFakeServer(connection_, |
95 connection_, session_.GetCryptoStream()); | 104 session_.GetCryptoStream()); |
96 ASSERT_EQ(OK, callback_.WaitForResult()); | 105 ASSERT_EQ(OK, callback_.WaitForResult()); |
97 } | 106 } |
98 | 107 |
99 scoped_ptr<QuicDefaultPacketWriter> writer_; | 108 scoped_ptr<QuicDefaultPacketWriter> writer_; |
100 PacketSavingConnection* connection_; | 109 PacketSavingConnection* connection_; |
101 CapturingNetLog net_log_; | 110 CapturingNetLog net_log_; |
102 MockClientSocketFactory socket_factory_; | 111 MockClientSocketFactory socket_factory_; |
103 StaticSocketDataProvider socket_data_; | 112 StaticSocketDataProvider socket_data_; |
104 QuicClientSession session_; | 113 QuicClientSession session_; |
105 MockClock clock_; | 114 MockClock clock_; |
106 MockRandom random_; | 115 MockRandom random_; |
107 QuicConnectionVisitorInterface* visitor_; | 116 QuicConnectionVisitorInterface* visitor_; |
108 TestCompletionCallback callback_; | 117 TestCompletionCallback callback_; |
109 QuicCryptoClientConfig crypto_config_; | 118 QuicCryptoClientConfig crypto_config_; |
110 }; | 119 }; |
111 | 120 |
112 INSTANTIATE_TEST_CASE_P(Tests, QuicClientSessionTest, | 121 INSTANTIATE_TEST_CASE_P(Tests, |
| 122 QuicClientSessionTest, |
113 ::testing::ValuesIn(QuicSupportedVersions())); | 123 ::testing::ValuesIn(QuicSupportedVersions())); |
114 | 124 |
115 TEST_P(QuicClientSessionTest, CryptoConnect) { | 125 TEST_P(QuicClientSessionTest, CryptoConnect) { |
116 CompleteCryptoHandshake(); | 126 CompleteCryptoHandshake(); |
117 } | 127 } |
118 | 128 |
119 TEST_P(QuicClientSessionTest, MaxNumStreams) { | 129 TEST_P(QuicClientSessionTest, MaxNumStreams) { |
120 CompleteCryptoHandshake(); | 130 CompleteCryptoHandshake(); |
121 | 131 |
122 std::vector<QuicReliableClientStream*> streams; | 132 std::vector<QuicReliableClientStream*> streams; |
(...skipping 16 matching lines...) Expand all Loading... |
139 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { | 149 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { |
140 QuicReliableClientStream* stream = session_.CreateOutgoingDataStream(); | 150 QuicReliableClientStream* stream = session_.CreateOutgoingDataStream(); |
141 EXPECT_TRUE(stream); | 151 EXPECT_TRUE(stream); |
142 streams.push_back(stream); | 152 streams.push_back(stream); |
143 } | 153 } |
144 | 154 |
145 QuicReliableClientStream* stream; | 155 QuicReliableClientStream* stream; |
146 QuicClientSession::StreamRequest stream_request; | 156 QuicClientSession::StreamRequest stream_request; |
147 TestCompletionCallback callback; | 157 TestCompletionCallback callback; |
148 ASSERT_EQ(ERR_IO_PENDING, | 158 ASSERT_EQ(ERR_IO_PENDING, |
149 stream_request.StartRequest(session_.GetWeakPtr(), &stream, | 159 stream_request.StartRequest( |
150 callback.callback())); | 160 session_.GetWeakPtr(), &stream, callback.callback())); |
151 | 161 |
152 // Close a stream and ensure I can now open a new one. | 162 // Close a stream and ensure I can now open a new one. |
153 session_.CloseStream(streams[0]->id()); | 163 session_.CloseStream(streams[0]->id()); |
154 ASSERT_TRUE(callback.have_result()); | 164 ASSERT_TRUE(callback.have_result()); |
155 EXPECT_EQ(OK, callback.WaitForResult()); | 165 EXPECT_EQ(OK, callback.WaitForResult()); |
156 EXPECT_TRUE(stream != NULL); | 166 EXPECT_TRUE(stream != NULL); |
157 } | 167 } |
158 | 168 |
159 TEST_P(QuicClientSessionTest, GoAwayReceived) { | 169 TEST_P(QuicClientSessionTest, GoAwayReceived) { |
160 CompleteCryptoHandshake(); | 170 CompleteCryptoHandshake(); |
161 | 171 |
162 // After receiving a GoAway, I should no longer be able to create outgoing | 172 // After receiving a GoAway, I should no longer be able to create outgoing |
163 // streams. | 173 // streams. |
164 session_.OnGoAway(QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away.")); | 174 session_.OnGoAway(QuicGoAwayFrame(QUIC_PEER_GOING_AWAY, 1u, "Going away.")); |
165 EXPECT_EQ(NULL, session_.CreateOutgoingDataStream()); | 175 EXPECT_EQ(NULL, session_.CreateOutgoingDataStream()); |
166 } | 176 } |
167 | 177 |
168 } // namespace | 178 } // namespace |
169 } // namespace test | 179 } // namespace test |
170 } // namespace net | 180 } // namespace net |
OLD | NEW |