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_stream_factory.h" | 5 #include "net/quic/quic_stream_factory.h" |
6 | 6 |
7 #include "base/run_loop.h" | 7 #include "base/run_loop.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "net/dns/mock_host_resolver.h" | 9 #include "net/dns/mock_host_resolver.h" |
10 #include "net/http/http_response_headers.h" | 10 #include "net/http/http_response_headers.h" |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 BoundNetLog net_log_; | 122 BoundNetLog net_log_; |
123 TestCompletionCallback callback_; | 123 TestCompletionCallback callback_; |
124 }; | 124 }; |
125 | 125 |
126 TEST_F(QuicStreamFactoryTest, CreateIfSessionExists) { | 126 TEST_F(QuicStreamFactoryTest, CreateIfSessionExists) { |
127 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(host_port_proxy_pair_, | 127 EXPECT_EQ(NULL, factory_.CreateIfSessionExists(host_port_proxy_pair_, |
128 net_log_).get()); | 128 net_log_).get()); |
129 } | 129 } |
130 | 130 |
131 TEST_F(QuicStreamFactoryTest, Create) { | 131 TEST_F(QuicStreamFactoryTest, Create) { |
| 132 scoped_ptr<QuicEncryptedPacket> rst3(ConstructRstPacket(1, 3)); |
| 133 scoped_ptr<QuicEncryptedPacket> rst5(ConstructRstPacket(2, 5)); |
| 134 scoped_ptr<QuicEncryptedPacket> rst7(ConstructRstPacket(3, 7)); |
| 135 MockWrite writes[] = { |
| 136 MockWrite(SYNCHRONOUS, rst3->data(), rst3->length(), 0), |
| 137 MockWrite(SYNCHRONOUS, rst5->data(), rst5->length(), 1), |
| 138 MockWrite(SYNCHRONOUS, rst7->data(), rst7->length(), 2), |
| 139 }; |
132 MockRead reads[] = { | 140 MockRead reads[] = { |
133 MockRead(ASYNC, OK, 0) // EOF | 141 MockRead(ASYNC, OK, 3) // EOF |
134 }; | 142 }; |
135 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); | 143 DeterministicSocketData socket_data(reads, arraysize(reads), |
| 144 writes, arraysize(writes)); |
136 socket_factory_.AddSocketDataProvider(&socket_data); | 145 socket_factory_.AddSocketDataProvider(&socket_data); |
137 socket_data.StopAfter(1); | 146 socket_data.StopAfter(3); |
138 | 147 |
139 QuicStreamRequest request(&factory_); | 148 QuicStreamRequest request(&factory_); |
140 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, | 149 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, |
141 callback_.callback())); | 150 callback_.callback())); |
142 | 151 |
143 EXPECT_EQ(OK, callback_.WaitForResult()); | 152 EXPECT_EQ(OK, callback_.WaitForResult()); |
144 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 153 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
145 EXPECT_TRUE(stream.get()); | 154 EXPECT_TRUE(stream.get()); |
146 | 155 |
147 // Will reset stream 3. | 156 // Will reset stream 3. |
148 stream = factory_.CreateIfSessionExists(host_port_proxy_pair_, net_log_); | 157 stream = factory_.CreateIfSessionExists(host_port_proxy_pair_, net_log_); |
149 EXPECT_TRUE(stream.get()); | 158 EXPECT_TRUE(stream.get()); |
150 | 159 |
151 QuicStreamRequest request2(&factory_); | 160 QuicStreamRequest request2(&factory_); |
152 EXPECT_EQ(OK, request2.Request(host_port_proxy_pair_, net_log_, | 161 EXPECT_EQ(OK, request2.Request(host_port_proxy_pair_, net_log_, |
153 callback_.callback())); | 162 callback_.callback())); |
154 stream = request2.ReleaseStream(); // Will reset stream 5. | 163 stream = request2.ReleaseStream(); // Will reset stream 5. |
155 stream.reset(); // Will reset stream 7. | 164 stream.reset(); // Will reset stream 7. |
156 | 165 |
| 166 socket_data.RunFor(1); |
| 167 |
157 EXPECT_TRUE(socket_data.at_read_eof()); | 168 EXPECT_TRUE(socket_data.at_read_eof()); |
158 EXPECT_TRUE(socket_data.at_write_eof()); | 169 EXPECT_TRUE(socket_data.at_write_eof()); |
159 } | 170 } |
160 | 171 |
161 TEST_F(QuicStreamFactoryTest, CreateError) { | 172 TEST_F(QuicStreamFactoryTest, CreateError) { |
162 DeterministicSocketData socket_data(NULL, 0, NULL, 0); | 173 DeterministicSocketData socket_data(NULL, 0, NULL, 0); |
163 socket_factory_.AddSocketDataProvider(&socket_data); | 174 socket_factory_.AddSocketDataProvider(&socket_data); |
164 | 175 |
165 host_resolver_.rules()->AddSimulatedFailure("www.google.com"); | 176 host_resolver_.rules()->AddSimulatedFailure("www.google.com"); |
166 | 177 |
167 QuicStreamRequest request(&factory_); | 178 QuicStreamRequest request(&factory_); |
168 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, | 179 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, |
169 callback_.callback())); | 180 callback_.callback())); |
170 | 181 |
171 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); | 182 EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback_.WaitForResult()); |
172 | 183 |
173 EXPECT_TRUE(socket_data.at_read_eof()); | 184 EXPECT_TRUE(socket_data.at_read_eof()); |
174 EXPECT_TRUE(socket_data.at_write_eof()); | 185 EXPECT_TRUE(socket_data.at_write_eof()); |
175 } | 186 } |
176 | 187 |
177 TEST_F(QuicStreamFactoryTest, CancelCreate) { | 188 TEST_F(QuicStreamFactoryTest, CancelCreate) { |
| 189 scoped_ptr<QuicEncryptedPacket> rst3(ConstructRstPacket(1, 3)); |
| 190 |
| 191 MockWrite writes[] = { |
| 192 MockWrite(SYNCHRONOUS, rst3->data(), rst3->length(), 0), |
| 193 }; |
178 MockRead reads[] = { | 194 MockRead reads[] = { |
179 MockRead(ASYNC, OK, 0) // EOF | 195 MockRead(ASYNC, OK, 1) // EOF |
180 }; | 196 }; |
181 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); | 197 DeterministicSocketData socket_data(reads, arraysize(reads), |
| 198 writes, arraysize(writes)); |
182 socket_factory_.AddSocketDataProvider(&socket_data); | 199 socket_factory_.AddSocketDataProvider(&socket_data); |
183 { | 200 { |
184 QuicStreamRequest request(&factory_); | 201 QuicStreamRequest request(&factory_); |
185 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, | 202 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, |
186 callback_.callback())); | 203 callback_.callback())); |
187 } | 204 } |
188 | 205 |
189 socket_data.StopAfter(1); | 206 socket_data.StopAfter(2); |
190 base::RunLoop run_loop; | 207 base::RunLoop run_loop; |
191 run_loop.RunUntilIdle(); | 208 run_loop.RunUntilIdle(); |
192 | 209 |
193 scoped_ptr<QuicHttpStream> stream( | 210 scoped_ptr<QuicHttpStream> stream( |
194 factory_.CreateIfSessionExists(host_port_proxy_pair_, net_log_)); | 211 factory_.CreateIfSessionExists(host_port_proxy_pair_, net_log_)); |
195 EXPECT_TRUE(stream.get()); | 212 EXPECT_TRUE(stream.get()); |
196 stream.reset(); | 213 stream.reset(); |
197 | 214 |
| 215 socket_data.RunFor(1); |
| 216 |
198 EXPECT_TRUE(socket_data.at_read_eof()); | 217 EXPECT_TRUE(socket_data.at_read_eof()); |
199 EXPECT_TRUE(socket_data.at_write_eof()); | 218 EXPECT_TRUE(socket_data.at_write_eof()); |
200 } | 219 } |
201 | 220 |
202 TEST_F(QuicStreamFactoryTest, CloseAllSessions) { | 221 TEST_F(QuicStreamFactoryTest, CloseAllSessions) { |
| 222 scoped_ptr<QuicEncryptedPacket> rst3(ConstructRstPacket(1, 3)); |
203 MockRead reads[] = { | 223 MockRead reads[] = { |
204 MockRead(ASYNC, 0, 0) // EOF | 224 MockRead(ASYNC, 0, 0) // EOF |
205 }; | 225 }; |
206 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); | 226 DeterministicSocketData socket_data(reads, arraysize(reads), |
| 227 NULL, 0); |
207 socket_factory_.AddSocketDataProvider(&socket_data); | 228 socket_factory_.AddSocketDataProvider(&socket_data); |
208 socket_data.StopAfter(1); | 229 socket_data.StopAfter(1); |
209 | 230 |
| 231 MockWrite writes2[] = { |
| 232 MockWrite(SYNCHRONOUS, rst3->data(), rst3->length(), 0), |
| 233 }; |
210 MockRead reads2[] = { | 234 MockRead reads2[] = { |
211 MockRead(ASYNC, 0, 0) // EOF | 235 MockRead(ASYNC, 0, 1) // EOF |
212 }; | 236 }; |
213 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); | 237 DeterministicSocketData socket_data2(reads2, arraysize(reads2), |
| 238 writes2, arraysize(writes2)); |
214 socket_factory_.AddSocketDataProvider(&socket_data2); | 239 socket_factory_.AddSocketDataProvider(&socket_data2); |
215 socket_data2.StopAfter(1); | 240 socket_data2.StopAfter(1); |
216 | 241 |
217 QuicStreamRequest request(&factory_); | 242 QuicStreamRequest request(&factory_); |
218 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, | 243 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, |
219 callback_.callback())); | 244 callback_.callback())); |
220 | 245 |
221 EXPECT_EQ(OK, callback_.WaitForResult()); | 246 EXPECT_EQ(OK, callback_.WaitForResult()); |
222 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 247 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
223 | 248 |
224 // Close the session and verify that stream saw the error. | 249 // Close the session and verify that stream saw the error. |
225 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED); | 250 factory_.CloseAllSessions(ERR_INTERNET_DISCONNECTED); |
226 EXPECT_EQ(ERR_INTERNET_DISCONNECTED, | 251 EXPECT_EQ(ERR_INTERNET_DISCONNECTED, |
227 stream->ReadResponseHeaders(callback_.callback())); | 252 stream->ReadResponseHeaders(callback_.callback())); |
228 | 253 |
229 // Now attempting to request a stream to the same origin should create | 254 // Now attempting to request a stream to the same origin should create |
230 // a new session. | 255 // a new session. |
231 | 256 |
232 QuicStreamRequest request2(&factory_); | 257 QuicStreamRequest request2(&factory_); |
233 EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, net_log_, | 258 EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, net_log_, |
234 callback_.callback())); | 259 callback_.callback())); |
235 | 260 |
236 EXPECT_EQ(OK, callback_.WaitForResult()); | 261 EXPECT_EQ(OK, callback_.WaitForResult()); |
237 stream = request2.ReleaseStream(); | 262 stream = request2.ReleaseStream(); |
238 stream.reset(); // Will reset stream 3. | 263 stream.reset(); // Will reset stream 3. |
239 | 264 |
| 265 socket_data2.RunFor(1); |
| 266 |
240 EXPECT_TRUE(socket_data.at_read_eof()); | 267 EXPECT_TRUE(socket_data.at_read_eof()); |
241 EXPECT_TRUE(socket_data.at_write_eof()); | 268 EXPECT_TRUE(socket_data.at_write_eof()); |
242 EXPECT_TRUE(socket_data2.at_read_eof()); | 269 EXPECT_TRUE(socket_data2.at_read_eof()); |
243 EXPECT_TRUE(socket_data2.at_write_eof()); | 270 EXPECT_TRUE(socket_data2.at_write_eof()); |
244 } | 271 } |
245 | 272 |
246 TEST_F(QuicStreamFactoryTest, OnIPAddressChanged) { | 273 TEST_F(QuicStreamFactoryTest, OnIPAddressChanged) { |
| 274 scoped_ptr<QuicEncryptedPacket> rst3(ConstructRstPacket(1, 3)); |
247 MockRead reads[] = { | 275 MockRead reads[] = { |
248 MockRead(ASYNC, 0, 0) // EOF | 276 MockRead(ASYNC, 0, 0) // EOF |
249 }; | 277 }; |
250 DeterministicSocketData socket_data(reads, arraysize(reads), NULL, 0); | 278 DeterministicSocketData socket_data(reads, arraysize(reads), |
| 279 NULL, 0); |
251 socket_factory_.AddSocketDataProvider(&socket_data); | 280 socket_factory_.AddSocketDataProvider(&socket_data); |
252 socket_data.StopAfter(1); | 281 socket_data.StopAfter(1); |
253 | 282 |
| 283 MockWrite writes2[] = { |
| 284 MockWrite(SYNCHRONOUS, rst3->data(), rst3->length(), 0), |
| 285 }; |
254 MockRead reads2[] = { | 286 MockRead reads2[] = { |
255 MockRead(ASYNC, 0, 0) // EOF | 287 MockRead(ASYNC, 0, 1) // EOF |
256 }; | 288 }; |
257 DeterministicSocketData socket_data2(reads2, arraysize(reads2), NULL, 0); | 289 DeterministicSocketData socket_data2(reads2, arraysize(reads2), |
| 290 writes2, arraysize(writes2)); |
258 socket_factory_.AddSocketDataProvider(&socket_data2); | 291 socket_factory_.AddSocketDataProvider(&socket_data2); |
259 socket_data2.StopAfter(1); | 292 socket_data2.StopAfter(1); |
260 | 293 |
261 QuicStreamRequest request(&factory_); | 294 QuicStreamRequest request(&factory_); |
262 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, | 295 EXPECT_EQ(ERR_IO_PENDING, request.Request(host_port_proxy_pair_, net_log_, |
263 callback_.callback())); | 296 callback_.callback())); |
264 | 297 |
265 EXPECT_EQ(OK, callback_.WaitForResult()); | 298 EXPECT_EQ(OK, callback_.WaitForResult()); |
266 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); | 299 scoped_ptr<QuicHttpStream> stream = request.ReleaseStream(); |
267 | 300 |
268 // Change the IP address and verify that stream saw the error. | 301 // Change the IP address and verify that stream saw the error. |
269 factory_.OnIPAddressChanged(); | 302 factory_.OnIPAddressChanged(); |
270 EXPECT_EQ(ERR_NETWORK_CHANGED, | 303 EXPECT_EQ(ERR_NETWORK_CHANGED, |
271 stream->ReadResponseHeaders(callback_.callback())); | 304 stream->ReadResponseHeaders(callback_.callback())); |
272 | 305 |
273 // Now attempting to request a stream to the same origin should create | 306 // Now attempting to request a stream to the same origin should create |
274 // a new session. | 307 // a new session. |
275 | 308 |
276 QuicStreamRequest request2(&factory_); | 309 QuicStreamRequest request2(&factory_); |
277 EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, net_log_, | 310 EXPECT_EQ(ERR_IO_PENDING, request2.Request(host_port_proxy_pair_, net_log_, |
278 callback_.callback())); | 311 callback_.callback())); |
279 | 312 |
280 EXPECT_EQ(OK, callback_.WaitForResult()); | 313 EXPECT_EQ(OK, callback_.WaitForResult()); |
281 stream = request2.ReleaseStream(); | 314 stream = request2.ReleaseStream(); |
282 stream.reset(); // Will reset stream 3. | 315 stream.reset(); // Will reset stream 3. |
283 | 316 |
| 317 socket_data2.RunFor(1); |
| 318 |
284 EXPECT_TRUE(socket_data.at_read_eof()); | 319 EXPECT_TRUE(socket_data.at_read_eof()); |
285 EXPECT_TRUE(socket_data.at_write_eof()); | 320 EXPECT_TRUE(socket_data.at_write_eof()); |
286 EXPECT_TRUE(socket_data2.at_read_eof()); | 321 EXPECT_TRUE(socket_data2.at_read_eof()); |
287 EXPECT_TRUE(socket_data2.at_write_eof()); | 322 EXPECT_TRUE(socket_data2.at_write_eof()); |
288 } | 323 } |
289 | 324 |
290 } // namespace test | 325 } // namespace test |
291 } // namespace net | 326 } // namespace net |
OLD | NEW |