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