| 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 |