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