| 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/chromium/quic_chromium_client_session.h" | 5 #include "net/quic/chromium/quic_chromium_client_session.h" |
| 6 | 6 |
| 7 #include "base/base64.h" | 7 #include "base/base64.h" |
| 8 #include "base/files/file_path.h" | 8 #include "base/files/file_path.h" |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/rand_util.h" | 10 #include "base/rand_util.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 class QuicChromiumClientSessionTest | 82 class QuicChromiumClientSessionTest |
| 83 : public ::testing::TestWithParam<QuicVersion> { | 83 : public ::testing::TestWithParam<QuicVersion> { |
| 84 protected: | 84 protected: |
| 85 QuicChromiumClientSessionTest() | 85 QuicChromiumClientSessionTest() |
| 86 : crypto_config_(crypto_test_utils::ProofVerifierForTesting()), | 86 : crypto_config_(crypto_test_utils::ProofVerifierForTesting()), |
| 87 default_read_(new MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)), | 87 default_read_(new MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)), |
| 88 socket_data_( | 88 socket_data_( |
| 89 new SequencedSocketData(default_read_.get(), 1, nullptr, 0)), | 89 new SequencedSocketData(default_read_.get(), 1, nullptr, 0)), |
| 90 random_(0), | 90 random_(0), |
| 91 helper_(&clock_, &random_), | 91 helper_(&clock_, &random_), |
| 92 server_id_(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), |
| 92 client_maker_(GetParam(), | 93 client_maker_(GetParam(), |
| 93 0, | 94 0, |
| 94 &clock_, | 95 &clock_, |
| 95 kServerHostname, | 96 kServerHostname, |
| 96 Perspective::IS_CLIENT), | 97 Perspective::IS_CLIENT), |
| 97 server_maker_(GetParam(), | 98 server_maker_(GetParam(), |
| 98 0, | 99 0, |
| 99 &clock_, | 100 &clock_, |
| 100 kServerHostname, | 101 kServerHostname, |
| 101 Perspective::IS_SERVER) { | 102 Perspective::IS_SERVER) { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 114 QuicChromiumPacketWriter* writer = | 115 QuicChromiumPacketWriter* writer = |
| 115 new net::QuicChromiumPacketWriter(socket.get()); | 116 new net::QuicChromiumPacketWriter(socket.get()); |
| 116 QuicConnection* connection = new QuicConnection( | 117 QuicConnection* connection = new QuicConnection( |
| 117 0, QuicSocketAddress(QuicSocketAddressImpl(kIpEndPoint)), &helper_, | 118 0, QuicSocketAddress(QuicSocketAddressImpl(kIpEndPoint)), &helper_, |
| 118 &alarm_factory_, writer, true, Perspective::IS_CLIENT, | 119 &alarm_factory_, writer, true, Perspective::IS_CLIENT, |
| 119 SupportedVersions(GetParam())); | 120 SupportedVersions(GetParam())); |
| 120 session_.reset(new QuicChromiumClientSession( | 121 session_.reset(new QuicChromiumClientSession( |
| 121 connection, std::move(socket), | 122 connection, std::move(socket), |
| 122 /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_, | 123 /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_, |
| 123 &transport_security_state_, | 124 &transport_security_state_, |
| 124 base::WrapUnique(static_cast<QuicServerInfo*>(nullptr)), | 125 base::WrapUnique(static_cast<QuicServerInfo*>(nullptr)), server_id_, |
| 125 QuicServerId(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), | |
| 126 /*require_confirmation=*/false, kQuicYieldAfterPacketsRead, | 126 /*require_confirmation=*/false, kQuicYieldAfterPacketsRead, |
| 127 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds), | 127 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds), |
| 128 /*cert_verify_flags=*/0, DefaultQuicConfig(), &crypto_config_, | 128 /*cert_verify_flags=*/0, DefaultQuicConfig(), &crypto_config_, |
| 129 "CONNECTION_UNKNOWN", base::TimeTicks::Now(), base::TimeTicks::Now(), | 129 "CONNECTION_UNKNOWN", base::TimeTicks::Now(), base::TimeTicks::Now(), |
| 130 &push_promise_index_, &test_push_delegate_, | 130 &push_promise_index_, &test_push_delegate_, |
| 131 base::ThreadTaskRunnerHandle::Get().get(), | 131 base::ThreadTaskRunnerHandle::Get().get(), |
| 132 /*socket_performance_watcher=*/nullptr, &net_log_)); | 132 /*socket_performance_watcher=*/nullptr, &net_log_)); |
| 133 | 133 |
| 134 scoped_refptr<X509Certificate> cert( | 134 scoped_refptr<X509Certificate> cert( |
| 135 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); | 135 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem")); |
| 136 verify_details_.cert_verify_result.verified_cert = cert; | 136 verify_details_.cert_verify_result.verified_cert = cert; |
| 137 verify_details_.cert_verify_result.is_issued_by_known_root = true; | 137 verify_details_.cert_verify_result.is_issued_by_known_root = true; |
| 138 session_->Initialize(); | 138 session_->Initialize(); |
| 139 session_->StartReading(); | 139 session_->StartReading(); |
| 140 writer->set_delegate(session_.get()); | 140 writer->set_delegate(session_.get()); |
| 141 } | 141 } |
| 142 | 142 |
| 143 void TearDown() override { | 143 void TearDown() override { |
| 144 session_->CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR); | 144 if (session_) |
| 145 session_->CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR); |
| 145 } | 146 } |
| 146 | 147 |
| 147 void CompleteCryptoHandshake() { | 148 void CompleteCryptoHandshake() { |
| 148 ASSERT_THAT(session_->CryptoConnect(callback_.callback()), IsOk()); | 149 ASSERT_THAT(session_->CryptoConnect(callback_.callback()), IsOk()); |
| 149 } | 150 } |
| 150 | 151 |
| 151 QuicChromiumPacketWriter* CreateQuicChromiumPacketWriter( | 152 QuicChromiumPacketWriter* CreateQuicChromiumPacketWriter( |
| 152 DatagramClientSocket* socket, | 153 DatagramClientSocket* socket, |
| 153 QuicChromiumClientSession* session) const { | 154 QuicChromiumClientSession* session) const { |
| 154 std::unique_ptr<QuicChromiumPacketWriter> writer( | 155 std::unique_ptr<QuicChromiumPacketWriter> writer( |
| 155 new QuicChromiumPacketWriter(socket)); | 156 new QuicChromiumPacketWriter(socket)); |
| 156 writer->set_delegate(session); | 157 writer->set_delegate(session); |
| 157 return writer.release(); | 158 return writer.release(); |
| 158 } | 159 } |
| 159 | 160 |
| 160 QuicCryptoClientConfig crypto_config_; | 161 QuicCryptoClientConfig crypto_config_; |
| 161 TestNetLog net_log_; | 162 TestNetLog net_log_; |
| 162 BoundTestNetLog bound_test_net_log_; | 163 BoundTestNetLog bound_test_net_log_; |
| 163 MockClientSocketFactory socket_factory_; | 164 MockClientSocketFactory socket_factory_; |
| 164 std::unique_ptr<MockRead> default_read_; | 165 std::unique_ptr<MockRead> default_read_; |
| 165 std::unique_ptr<SequencedSocketData> socket_data_; | 166 std::unique_ptr<SequencedSocketData> socket_data_; |
| 166 MockClock clock_; | 167 MockClock clock_; |
| 167 MockRandom random_; | 168 MockRandom random_; |
| 168 QuicChromiumConnectionHelper helper_; | 169 QuicChromiumConnectionHelper helper_; |
| 169 MockAlarmFactory alarm_factory_; | 170 MockAlarmFactory alarm_factory_; |
| 170 TransportSecurityState transport_security_state_; | 171 TransportSecurityState transport_security_state_; |
| 171 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 172 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
| 172 QuicClientPushPromiseIndex push_promise_index_; | 173 QuicClientPushPromiseIndex push_promise_index_; |
| 174 QuicServerId server_id_; |
| 173 std::unique_ptr<QuicChromiumClientSession> session_; | 175 std::unique_ptr<QuicChromiumClientSession> session_; |
| 174 TestServerPushDelegate test_push_delegate_; | 176 TestServerPushDelegate test_push_delegate_; |
| 175 QuicConnectionVisitorInterface* visitor_; | 177 QuicConnectionVisitorInterface* visitor_; |
| 176 TestCompletionCallback callback_; | 178 TestCompletionCallback callback_; |
| 177 QuicTestPacketMaker client_maker_; | 179 QuicTestPacketMaker client_maker_; |
| 178 QuicTestPacketMaker server_maker_; | 180 QuicTestPacketMaker server_maker_; |
| 179 ProofVerifyDetailsChromium verify_details_; | 181 ProofVerifyDetailsChromium verify_details_; |
| 180 }; | 182 }; |
| 181 | 183 |
| 182 INSTANTIATE_TEST_CASE_P(Tests, | 184 INSTANTIATE_TEST_CASE_P(Tests, |
| 183 QuicChromiumClientSessionTest, | 185 QuicChromiumClientSessionTest, |
| 184 ::testing::ValuesIn(AllSupportedVersions())); | 186 ::testing::ValuesIn(AllSupportedVersions())); |
| 185 | 187 |
| 186 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { | 188 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { |
| 187 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 189 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
| 188 std::unique_ptr<QuicEncryptedPacket> settings_packet( | 190 std::unique_ptr<QuicEncryptedPacket> settings_packet( |
| 189 client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 191 client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 190 MockWrite writes[] = { | 192 MockWrite writes[] = { |
| 191 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; | 193 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; |
| 192 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, | 194 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
| 193 arraysize(writes))); | 195 arraysize(writes))); |
| 194 Initialize(); | 196 Initialize(); |
| 195 CompleteCryptoHandshake(); | 197 CompleteCryptoHandshake(); |
| 196 } | 198 } |
| 197 | 199 |
| 200 TEST_P(QuicChromiumClientSessionTest, GetHandle) { |
| 201 MockQuicData quic_data; |
| 202 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 203 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 204 quic_data.AddRead(ASYNC, OK); // EOF |
| 205 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 206 |
| 207 Initialize(); |
| 208 |
| 209 NetLogWithSource session_net_log = session_->net_log(); |
| 210 EXPECT_EQ(NetLogSourceType::QUIC_SESSION, session_net_log.source().type); |
| 211 EXPECT_EQ(&net_log_, session_net_log.net_log()); |
| 212 |
| 213 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 214 EXPECT_TRUE(handle.IsConnected()); |
| 215 EXPECT_FALSE(handle.IsCryptoHandshakeConfirmed()); |
| 216 EXPECT_EQ(GetParam(), handle.GetQuicVersion()); |
| 217 EXPECT_EQ(server_id_, handle.server_id()); |
| 218 EXPECT_EQ(session_net_log.source().type, handle.net_log().source().type); |
| 219 EXPECT_EQ(session_net_log.source().id, handle.net_log().source().id); |
| 220 EXPECT_EQ(session_net_log.net_log(), handle.net_log().net_log()); |
| 221 IPEndPoint address; |
| 222 EXPECT_EQ(OK, handle.GetPeerAddress(&address)); |
| 223 EXPECT_EQ(kIpEndPoint, address); |
| 224 EXPECT_TRUE(handle.CreatePacketBundler(QuicConnection::NO_ACK).get() != |
| 225 nullptr); |
| 226 { |
| 227 // Verify that the copy constructor works as expected. |
| 228 QuicChromiumClientSession::Handle handle2(handle); |
| 229 EXPECT_TRUE(handle2.IsConnected()); |
| 230 EXPECT_FALSE(handle2.IsCryptoHandshakeConfirmed()); |
| 231 } |
| 232 |
| 233 CompleteCryptoHandshake(); |
| 234 |
| 235 EXPECT_TRUE(handle.IsCryptoHandshakeConfirmed()); |
| 236 |
| 237 // Request a stream and verify that a stream was created. |
| 238 auto stream_request = |
| 239 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 240 TestCompletionCallback callback; |
| 241 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 242 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 243 |
| 244 quic_data.Resume(); |
| 245 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 246 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 247 |
| 248 // Veirfy that the handle works correctly after the session is closed. |
| 249 EXPECT_FALSE(handle.IsConnected()); |
| 250 EXPECT_TRUE(handle.IsCryptoHandshakeConfirmed()); |
| 251 EXPECT_EQ(GetParam(), handle.GetQuicVersion()); |
| 252 EXPECT_EQ(server_id_, handle.server_id()); |
| 253 EXPECT_EQ(session_net_log.source().type, handle.net_log().source().type); |
| 254 EXPECT_EQ(session_net_log.source().id, handle.net_log().source().id); |
| 255 EXPECT_EQ(session_net_log.net_log(), handle.net_log().net_log()); |
| 256 EXPECT_EQ(ERR_CONNECTION_CLOSED, handle.GetPeerAddress(&address)); |
| 257 EXPECT_TRUE(handle.CreatePacketBundler(QuicConnection::NO_ACK).get() == |
| 258 nullptr); |
| 259 { |
| 260 // Verify that the copy constructor works as expected, even after the |
| 261 // session is closed. |
| 262 QuicChromiumClientSession::Handle handle2(handle); |
| 263 EXPECT_FALSE(handle2.IsConnected()); |
| 264 EXPECT_TRUE(handle2.IsCryptoHandshakeConfirmed()); |
| 265 } |
| 266 |
| 267 { |
| 268 // Verify that GetHandle() works even after the session is closed. |
| 269 QuicChromiumClientSession::Handle handle2 = session_->GetHandle(); |
| 270 EXPECT_FALSE(handle2.IsConnected()); |
| 271 EXPECT_TRUE(handle2.IsCryptoHandshakeConfirmed()); |
| 272 } |
| 273 |
| 274 auto stream_request2 = |
| 275 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 276 ASSERT_EQ(ERR_CONNECTION_CLOSED, |
| 277 stream_request->StartRequest(callback.callback())); |
| 278 |
| 279 session_.reset(); |
| 280 |
| 281 // Veirfy that the handle works correctly after the session is delete. |
| 282 EXPECT_FALSE(handle.IsConnected()); |
| 283 EXPECT_TRUE(handle.IsCryptoHandshakeConfirmed()); |
| 284 EXPECT_EQ(GetParam(), handle.GetQuicVersion()); |
| 285 EXPECT_EQ(server_id_, handle.server_id()); |
| 286 EXPECT_EQ(session_net_log.source().type, handle.net_log().source().type); |
| 287 EXPECT_EQ(session_net_log.source().id, handle.net_log().source().id); |
| 288 EXPECT_EQ(session_net_log.net_log(), handle.net_log().net_log()); |
| 289 EXPECT_EQ(ERR_CONNECTION_CLOSED, handle.GetPeerAddress(&address)); |
| 290 EXPECT_TRUE(handle.CreatePacketBundler(QuicConnection::NO_ACK).get() == |
| 291 nullptr); |
| 292 auto stream_request3 = |
| 293 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 294 ASSERT_EQ(ERR_CONNECTION_CLOSED, |
| 295 stream_request->StartRequest(callback.callback())); |
| 296 { |
| 297 // Verify that the copy constructor works as expected, even after the |
| 298 // session is deleted. |
| 299 QuicChromiumClientSession::Handle handle2(handle); |
| 300 EXPECT_FALSE(handle2.IsConnected()); |
| 301 EXPECT_TRUE(handle2.IsCryptoHandshakeConfirmed()); |
| 302 } |
| 303 } |
| 304 |
| 198 TEST_P(QuicChromiumClientSessionTest, StreamRequest) { | 305 TEST_P(QuicChromiumClientSessionTest, StreamRequest) { |
| 199 MockQuicData quic_data; | 306 MockQuicData quic_data; |
| 200 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 307 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 201 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 308 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 202 quic_data.AddRead(ASYNC, OK); // EOF | 309 quic_data.AddRead(ASYNC, OK); // EOF |
| 203 quic_data.AddSocketDataToFactory(&socket_factory_); | 310 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 204 | 311 |
| 205 Initialize(); | 312 Initialize(); |
| 206 CompleteCryptoHandshake(); | 313 CompleteCryptoHandshake(); |
| 207 | 314 |
| 208 // Request a stream and verify that a stream was created. | 315 // Request a stream and verify that a stream was created. |
| 316 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 209 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 317 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 210 session_->CreateStreamRequest(/*requires_confirmation=*/false); | 318 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 211 TestCompletionCallback callback; | 319 TestCompletionCallback callback; |
| 212 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); | 320 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 213 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); | 321 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 214 | 322 |
| 215 quic_data.Resume(); | 323 quic_data.Resume(); |
| 216 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 324 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 217 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 325 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 218 } | 326 } |
| 219 | 327 |
| 220 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { | 328 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { |
| 221 MockQuicData quic_data; | 329 MockQuicData quic_data; |
| 222 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 330 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 223 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 331 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 224 quic_data.AddRead(ASYNC, OK); // EOF | 332 quic_data.AddRead(ASYNC, OK); // EOF |
| 225 quic_data.AddSocketDataToFactory(&socket_factory_); | 333 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 226 | 334 |
| 227 Initialize(); | 335 Initialize(); |
| 228 CompleteCryptoHandshake(); | 336 CompleteCryptoHandshake(); |
| 229 | 337 |
| 230 // Request a stream and verify that a stream was created. | 338 // Request a stream and verify that a stream was created. |
| 339 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 231 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 340 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 232 session_->CreateStreamRequest(/*requires_confirmation=*/true); | 341 handle.CreateStreamRequest(/*requires_confirmation=*/true); |
| 233 TestCompletionCallback callback; | 342 TestCompletionCallback callback; |
| 234 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); | 343 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 235 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); | 344 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 236 | 345 |
| 237 quic_data.Resume(); | 346 quic_data.Resume(); |
| 238 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 347 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 239 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 348 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 240 } | 349 } |
| 241 | 350 |
| 242 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { | 351 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { |
| 243 MockQuicData quic_data; | 352 MockQuicData quic_data; |
| 244 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 353 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 245 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 354 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 246 quic_data.AddRead(ASYNC, OK); // EOF | 355 quic_data.AddRead(ASYNC, OK); // EOF |
| 247 quic_data.AddSocketDataToFactory(&socket_factory_); | 356 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 248 | 357 |
| 249 Initialize(); | 358 Initialize(); |
| 250 | 359 |
| 251 // Request a stream and verify that a stream was created. | 360 // Request a stream and verify that a stream was created. |
| 361 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 252 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 362 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 253 session_->CreateStreamRequest(/*requires_confirmation=*/true); | 363 handle.CreateStreamRequest(/*requires_confirmation=*/true); |
| 254 TestCompletionCallback callback; | 364 TestCompletionCallback callback; |
| 255 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 365 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 256 | 366 |
| 257 CompleteCryptoHandshake(); | 367 CompleteCryptoHandshake(); |
| 258 | 368 |
| 259 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 369 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 260 | 370 |
| 261 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); | 371 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 262 | 372 |
| 263 quic_data.Resume(); | 373 quic_data.Resume(); |
| 264 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 374 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 265 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 375 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 266 } | 376 } |
| 267 | 377 |
| 268 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { | 378 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { |
| 269 MockQuicData quic_data; | 379 MockQuicData quic_data; |
| 270 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 380 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 271 quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1, | 381 quic_data.AddWrite(client_maker_.MakeRstPacket(2, true, kClientDataStreamId1, |
| 272 QUIC_STREAM_CANCELLED)); | 382 QUIC_STREAM_CANCELLED)); |
| 273 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 383 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 274 quic_data.AddRead(ASYNC, OK); // EOF | 384 quic_data.AddRead(ASYNC, OK); // EOF |
| 275 quic_data.AddSocketDataToFactory(&socket_factory_); | 385 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 276 | 386 |
| 277 Initialize(); | 387 Initialize(); |
| 278 CompleteCryptoHandshake(); | 388 CompleteCryptoHandshake(); |
| 279 | 389 |
| 280 // Request a stream and cancel it without releasing the stream. | 390 // Request a stream and cancel it without releasing the stream. |
| 391 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 281 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 392 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 282 session_->CreateStreamRequest(/*requires_confirmation=*/false); | 393 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 283 TestCompletionCallback callback; | 394 TestCompletionCallback callback; |
| 284 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); | 395 ASSERT_EQ(OK, stream_request->StartRequest(callback.callback())); |
| 285 stream_request.reset(); | 396 stream_request.reset(); |
| 286 | 397 |
| 287 quic_data.Resume(); | 398 quic_data.Resume(); |
| 288 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 399 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 289 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 400 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 290 } | 401 } |
| 291 | 402 |
| 292 TEST_P(QuicChromiumClientSessionTest, AsyncStreamRequest) { | 403 TEST_P(QuicChromiumClientSessionTest, AsyncStreamRequest) { |
| (...skipping 10 matching lines...) Expand all Loading... |
| 303 | 414 |
| 304 // Open the maximum number of streams so that a subsequent request | 415 // Open the maximum number of streams so that a subsequent request |
| 305 // can not proceed immediately. | 416 // can not proceed immediately. |
| 306 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); | 417 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 307 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 418 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 308 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 419 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 309 } | 420 } |
| 310 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); | 421 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
| 311 | 422 |
| 312 // Request a stream and verify that it's pending. | 423 // Request a stream and verify that it's pending. |
| 424 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 313 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 425 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 314 session_->CreateStreamRequest(/*requires_confirmation=*/false); | 426 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 315 TestCompletionCallback callback; | 427 TestCompletionCallback callback; |
| 316 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 428 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 317 | 429 |
| 318 // Close a stream and ensure the stream request completes. | 430 // Close a stream and ensure the stream request completes. |
| 319 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); | 431 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); |
| 320 session_->OnRstStream(rst); | 432 session_->OnRstStream(rst); |
| 321 ASSERT_TRUE(callback.have_result()); | 433 ASSERT_TRUE(callback.have_result()); |
| 322 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 434 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 323 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); | 435 EXPECT_TRUE(stream_request->ReleaseStream() != nullptr); |
| 324 | 436 |
| (...skipping 16 matching lines...) Expand all Loading... |
| 341 | 453 |
| 342 // Open the maximum number of streams so that a subsequent request | 454 // Open the maximum number of streams so that a subsequent request |
| 343 // can not proceed immediately. | 455 // can not proceed immediately. |
| 344 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); | 456 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 345 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 457 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 346 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 458 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 347 } | 459 } |
| 348 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); | 460 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
| 349 | 461 |
| 350 // Request a stream and verify that it's pending. | 462 // Request a stream and verify that it's pending. |
| 463 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 351 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 464 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 352 session_->CreateStreamRequest(/*requires_confirmation=*/false); | 465 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 353 TestCompletionCallback callback; | 466 TestCompletionCallback callback; |
| 354 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 467 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 355 | 468 |
| 356 // Cancel the pending stream request. | 469 // Cancel the pending stream request. |
| 357 stream_request.reset(); | 470 stream_request.reset(); |
| 358 | 471 |
| 359 // Close a stream and ensure that no new stream is created. | 472 // Close a stream and ensure that no new stream is created. |
| 360 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); | 473 QuicRstStreamFrame rst(kClientDataStreamId1, QUIC_STREAM_CANCELLED, 0); |
| 361 session_->OnRstStream(rst); | 474 session_->OnRstStream(rst); |
| 362 EXPECT_EQ(kMaxOpenStreams - 1, session_->GetNumOpenOutgoingStreams()); | 475 EXPECT_EQ(kMaxOpenStreams - 1, session_->GetNumOpenOutgoingStreams()); |
| 363 | 476 |
| 364 quic_data.Resume(); | 477 quic_data.Resume(); |
| 365 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 478 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 366 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 479 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 367 } | 480 } |
| 368 | 481 |
| 369 TEST_P(QuicChromiumClientSessionTest, ConnectionCloseBeforeStreamRequest) { | 482 TEST_P(QuicChromiumClientSessionTest, ConnectionCloseBeforeStreamRequest) { |
| 370 MockQuicData quic_data; | 483 MockQuicData quic_data; |
| 371 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 484 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
| 372 quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); | 485 quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); |
| 373 quic_data.AddSocketDataToFactory(&socket_factory_); | 486 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 374 | 487 |
| 375 Initialize(); | 488 Initialize(); |
| 376 CompleteCryptoHandshake(); | 489 CompleteCryptoHandshake(); |
| 377 | 490 |
| 378 // Pump the message loop to read the connection close packet. | 491 // Pump the message loop to read the connection close packet. |
| 379 base::RunLoop().RunUntilIdle(); | 492 base::RunLoop().RunUntilIdle(); |
| 380 | 493 |
| 381 // Request a stream and verify that it failed. | 494 // Request a stream and verify that it failed. |
| 495 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 382 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 496 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 383 session_->CreateStreamRequest(/*requires_confirmation=*/false); | 497 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 384 TestCompletionCallback callback; | 498 TestCompletionCallback callback; |
| 385 ASSERT_EQ(ERR_CONNECTION_CLOSED, | 499 ASSERT_EQ(ERR_CONNECTION_CLOSED, |
| 386 stream_request->StartRequest(callback.callback())); | 500 stream_request->StartRequest(callback.callback())); |
| 387 | 501 |
| 388 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 502 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
| 389 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 503 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
| 390 } | 504 } |
| 391 | 505 |
| 392 TEST_P(QuicChromiumClientSessionTest, ConnectionCloseBeforeHandshakeConfirmed) { | 506 TEST_P(QuicChromiumClientSessionTest, ConnectionCloseBeforeHandshakeConfirmed) { |
| 393 MockQuicData quic_data; | 507 MockQuicData quic_data; |
| 394 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 508 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
| 395 quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); | 509 quic_data.AddRead(server_maker_.MakeConnectionClosePacket(1)); |
| 396 quic_data.AddSocketDataToFactory(&socket_factory_); | 510 quic_data.AddSocketDataToFactory(&socket_factory_); |
| 397 | 511 |
| 398 Initialize(); | 512 Initialize(); |
| 399 | 513 |
| 400 // Request a stream and verify that it's pending. | 514 // Request a stream and verify that it's pending. |
| 515 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 401 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 516 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 402 session_->CreateStreamRequest(/*requires_confirmation=*/true); | 517 handle.CreateStreamRequest(/*requires_confirmation=*/true); |
| 403 TestCompletionCallback callback; | 518 TestCompletionCallback callback; |
| 404 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 519 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 405 | 520 |
| 406 // Close the connection and verify that the StreamRequest completes with | 521 // Close the connection and verify that the StreamRequest completes with |
| 407 // an error. | 522 // an error. |
| 408 quic_data.Resume(); | 523 quic_data.Resume(); |
| 409 base::RunLoop().RunUntilIdle(); | 524 base::RunLoop().RunUntilIdle(); |
| 410 | 525 |
| 411 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); | 526 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
| 412 | 527 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 426 | 541 |
| 427 // Open the maximum number of streams so that a subsequent request | 542 // Open the maximum number of streams so that a subsequent request |
| 428 // can not proceed immediately. | 543 // can not proceed immediately. |
| 429 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); | 544 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 430 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 545 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 431 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 546 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 432 } | 547 } |
| 433 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); | 548 EXPECT_EQ(kMaxOpenStreams, session_->GetNumOpenOutgoingStreams()); |
| 434 | 549 |
| 435 // Request a stream and verify that it's pending. | 550 // Request a stream and verify that it's pending. |
| 551 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 436 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 552 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 437 session_->CreateStreamRequest(/*requires_confirmation=*/false); | 553 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 438 TestCompletionCallback callback; | 554 TestCompletionCallback callback; |
| 439 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 555 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 440 | 556 |
| 441 // Close the connection and verify that the StreamRequest completes with | 557 // Close the connection and verify that the StreamRequest completes with |
| 442 // an error. | 558 // an error. |
| 443 quic_data.Resume(); | 559 quic_data.Resume(); |
| 444 base::RunLoop().RunUntilIdle(); | 560 base::RunLoop().RunUntilIdle(); |
| 445 | 561 |
| 446 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); | 562 EXPECT_THAT(callback.WaitForResult(), IsError(ERR_CONNECTION_CLOSED)); |
| 447 | 563 |
| (...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 793 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); | 909 const size_t kMaxOpenStreams = session_->max_open_outgoing_streams(); |
| 794 | 910 |
| 795 std::vector<QuicChromiumClientStream*> streams; | 911 std::vector<QuicChromiumClientStream*> streams; |
| 796 for (size_t i = 0; i < kMaxOpenStreams; i++) { | 912 for (size_t i = 0; i < kMaxOpenStreams; i++) { |
| 797 QuicChromiumClientStream* stream = | 913 QuicChromiumClientStream* stream = |
| 798 session_->CreateOutgoingDynamicStream(kDefaultPriority); | 914 session_->CreateOutgoingDynamicStream(kDefaultPriority); |
| 799 EXPECT_TRUE(stream); | 915 EXPECT_TRUE(stream); |
| 800 streams.push_back(stream); | 916 streams.push_back(stream); |
| 801 } | 917 } |
| 802 | 918 |
| 919 QuicChromiumClientSession::Handle handle = session_->GetHandle(); |
| 803 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = | 920 std::unique_ptr<QuicChromiumClientSession::StreamRequest> stream_request = |
| 804 session_->CreateStreamRequest(/*requires_confirmation=*/false); | 921 handle.CreateStreamRequest(/*requires_confirmation=*/false); |
| 805 TestCompletionCallback callback; | 922 TestCompletionCallback callback; |
| 806 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); | 923 ASSERT_EQ(ERR_IO_PENDING, stream_request->StartRequest(callback.callback())); |
| 807 | 924 |
| 808 // Close a stream and ensure I can now open a new one. | 925 // Close a stream and ensure I can now open a new one. |
| 809 QuicStreamId stream_id = streams[0]->id(); | 926 QuicStreamId stream_id = streams[0]->id(); |
| 810 session_->CloseStream(stream_id); | 927 session_->CloseStream(stream_id); |
| 811 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); | 928 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); |
| 812 session_->OnRstStream(rst1); | 929 session_->OnRstStream(rst1); |
| 813 ASSERT_TRUE(callback.have_result()); | 930 ASSERT_TRUE(callback.have_result()); |
| 814 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 931 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1145 | 1262 |
| 1146 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); | 1263 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); |
| 1147 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); | 1264 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); |
| 1148 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); | 1265 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); |
| 1149 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); | 1266 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); |
| 1150 } | 1267 } |
| 1151 | 1268 |
| 1152 } // namespace | 1269 } // namespace |
| 1153 } // namespace test | 1270 } // namespace test |
| 1154 } // namespace net | 1271 } // namespace net |
| OLD | NEW |