Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(130)

Side by Side Diff: net/quic/quic_chromium_client_session_test.cc

Issue 1327923002: Migrates QUIC sessions to a new network when old network is (about to be) disconnected. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@home
Patch Set: Addresses rch's comments. Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_chromium_client_session.h" 5 #include "net/quic/quic_chromium_client_session.h"
6 6
7 #include <vector> 7 #include <vector>
8 8
9 #include "base/base64.h" 9 #include "base/base64.h"
10 #include "base/files/file_path.h" 10 #include "base/files/file_path.h"
11 #include "base/rand_util.h" 11 #include "base/rand_util.h"
12 #include "base/thread_task_runner_handle.h" 12 #include "base/thread_task_runner_handle.h"
13 #include "net/base/socket_performance_watcher.h" 13 #include "net/base/socket_performance_watcher.h"
14 #include "net/base/test_completion_callback.h" 14 #include "net/base/test_completion_callback.h"
15 #include "net/base/test_data_directory.h" 15 #include "net/base/test_data_directory.h"
16 #include "net/cert/cert_verify_result.h" 16 #include "net/cert/cert_verify_result.h"
17 #include "net/http/transport_security_state.h" 17 #include "net/http/transport_security_state.h"
18 #include "net/log/test_net_log.h" 18 #include "net/log/test_net_log.h"
19 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h" 19 #include "net/quic/crypto/aes_128_gcm_12_encrypter.h"
20 #include "net/quic/crypto/crypto_protocol.h" 20 #include "net/quic/crypto/crypto_protocol.h"
21 #include "net/quic/crypto/proof_verifier_chromium.h" 21 #include "net/quic/crypto/proof_verifier_chromium.h"
22 #include "net/quic/crypto/quic_decrypter.h" 22 #include "net/quic/crypto/quic_decrypter.h"
23 #include "net/quic/crypto/quic_encrypter.h" 23 #include "net/quic/crypto/quic_encrypter.h"
24 #include "net/quic/crypto/quic_server_info.h" 24 #include "net/quic/crypto/quic_server_info.h"
25 #include "net/quic/quic_connection_helper.h"
26 #include "net/quic/quic_default_packet_writer.h"
25 #include "net/quic/quic_flags.h" 27 #include "net/quic/quic_flags.h"
28 #include "net/quic/quic_http_utils.h"
26 #include "net/quic/quic_packet_reader.h" 29 #include "net/quic/quic_packet_reader.h"
30 #include "net/quic/quic_packet_writer.h"
27 #include "net/quic/quic_protocol.h" 31 #include "net/quic/quic_protocol.h"
28 #include "net/quic/test_tools/crypto_test_utils.h" 32 #include "net/quic/test_tools/crypto_test_utils.h"
33 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
29 #include "net/quic/test_tools/quic_chromium_client_session_peer.h" 34 #include "net/quic/test_tools/quic_chromium_client_session_peer.h"
30 #include "net/quic/test_tools/quic_spdy_session_peer.h" 35 #include "net/quic/test_tools/quic_spdy_session_peer.h"
36 #include "net/quic/test_tools/quic_test_packet_maker.h"
31 #include "net/quic/test_tools/quic_test_utils.h" 37 #include "net/quic/test_tools/quic_test_utils.h"
32 #include "net/quic/test_tools/simple_quic_framer.h" 38 #include "net/quic/test_tools/simple_quic_framer.h"
33 #include "net/socket/socket_test_util.h" 39 #include "net/socket/socket_test_util.h"
34 #include "net/spdy/spdy_test_utils.h" 40 #include "net/spdy/spdy_test_utils.h"
35 #include "net/test/cert_test_util.h" 41 #include "net/test/cert_test_util.h"
36 #include "net/udp/datagram_client_socket.h" 42 #include "net/udp/datagram_client_socket.h"
37 43
38 using testing::_; 44 using testing::_;
39 45
40 namespace net { 46 namespace net {
41 namespace test { 47 namespace test {
42 namespace { 48 namespace {
43 49
50 const IPEndPoint kIpEndPoint(IPAddressNumber(kIPv4AddressSize, 0), 0);
44 const char kServerHostname[] = "test.example.com"; 51 const char kServerHostname[] = "test.example.com";
45 const uint16_t kServerPort = 443; 52 const uint16_t kServerPort = 443;
53 const size_t kMaxReadersPerQuicSession = 5;
54
55 class DefaultPacketWriterFactory : public QuicConnection::PacketWriterFactory {
56 public:
57 explicit DefaultPacketWriterFactory(DatagramClientSocket* socket)
58 : socket_(socket) {}
59 ~DefaultPacketWriterFactory() override {}
60
61 QuicPacketWriter* Create(QuicConnection* connection) const override {
62 scoped_ptr<net::QuicDefaultPacketWriter> writer(
63 new net::QuicDefaultPacketWriter(socket_));
64 writer->SetConnection(connection);
65 return writer.release();
66 }
67
68 private:
69 DatagramClientSocket* socket_;
70 };
46 71
47 class QuicChromiumClientSessionTest 72 class QuicChromiumClientSessionTest
48 : public ::testing::TestWithParam<QuicVersion> { 73 : public ::testing::TestWithParam<QuicVersion> {
49 protected: 74 protected:
50 QuicChromiumClientSessionTest() 75 QuicChromiumClientSessionTest()
51 : crypto_config_(CryptoTestUtils::ProofVerifierForTesting()), 76 : crypto_config_(CryptoTestUtils::ProofVerifierForTesting()),
52 connection_(new PacketSavingConnection(&helper_, 77 socket_(GetSocket()),
53 Perspective::IS_CLIENT, 78 random_(0),
54 SupportedVersions(GetParam()))), 79 helper_(base::ThreadTaskRunnerHandle::Get().get(), &clock_, &random_),
80 writer_factory_(socket_.get()),
81 connection_(new QuicConnection(0,
82 kIpEndPoint,
83 &helper_,
84 writer_factory_,
85 true,
86 Perspective::IS_CLIENT,
87 SupportedVersions(GetParam()))),
55 session_( 88 session_(
56 connection_, 89 connection_,
57 GetSocket().Pass(), 90 std::move(socket_),
Ryan Hamilton 2016/01/08 05:01:06 I'm a bit confused by this. If you move socket_ in
Jana 2016/01/09 02:06:53 Not really -- it's initialized above and used here
58 /*stream_factory=*/nullptr, 91 /*stream_factory=*/nullptr,
59 /*crypto_client_stream_factory=*/nullptr, 92 &crypto_client_stream_factory_,
60 &clock_, 93 &clock_,
61 &transport_security_state_, 94 &transport_security_state_,
62 make_scoped_ptr((QuicServerInfo*)nullptr), 95 make_scoped_ptr((QuicServerInfo*)nullptr),
63 QuicServerId(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED), 96 QuicServerId(kServerHostname, kServerPort, PRIVACY_MODE_DISABLED),
64 kQuicYieldAfterPacketsRead, 97 kQuicYieldAfterPacketsRead,
65 QuicTime::Delta::FromMilliseconds( 98 QuicTime::Delta::FromMilliseconds(
66 kQuicYieldAfterDurationMilliseconds), 99 kQuicYieldAfterDurationMilliseconds),
67 /*cert_verify_flags=*/0, 100 /*cert_verify_flags=*/0,
68 DefaultQuicConfig(), 101 DefaultQuicConfig(),
69 &crypto_config_, 102 &crypto_config_,
70 "CONNECTION_UNKNOWN", 103 "CONNECTION_UNKNOWN",
71 base::TimeTicks::Now(), 104 base::TimeTicks::Now(),
72 base::ThreadTaskRunnerHandle::Get().get(), 105 base::ThreadTaskRunnerHandle::Get().get(),
73 /*socket_performance_watcher=*/nullptr, 106 /*socket_performance_watcher=*/nullptr,
74 &net_log_) { 107 &net_log_),
108 maker_(GetParam(), 0, &clock_, kServerHostname) {
109 scoped_refptr<X509Certificate> cert(
110 ImportCertFromFile(GetTestCertsDirectory(), "spdy_pooling.pem"));
111 verify_details_.cert_verify_result.verified_cert = cert;
112 verify_details_.cert_verify_result.is_issued_by_known_root = true;
113 crypto_client_stream_factory_.AddProofVerifyDetails(&verify_details_);
114 // Advance the time, because timers do not like uninitialized times.
115 clock_.AdvanceTime(QuicTime::Delta::FromSeconds(1));
75 session_.Initialize(); 116 session_.Initialize();
76 // Advance the time, because timers do not like uninitialized times. 117 session_.StartReading();
77 connection_->AdvanceTime(QuicTime::Delta::FromSeconds(1));
78 } 118 }
79 119
80 void TearDown() override { 120 void TearDown() override {
81 session_.CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR); 121 session_.CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR);
82 } 122 }
83 123
84 scoped_ptr<DatagramClientSocket> GetSocket() { 124 scoped_ptr<DatagramClientSocket> GetSocket() {
85 socket_factory_.AddSocketDataProvider(&socket_data_); 125 reads_[0] = MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0);
86 return socket_factory_.CreateDatagramClientSocket( 126 socket_data_.reset(
87 DatagramSocket::DEFAULT_BIND, base::Bind(&base::RandInt), &net_log_, 127 new StaticSocketDataProvider(reads_, arraysize(reads_), nullptr, 0));
88 NetLog::Source()); 128 socket_factory_.AddSocketDataProvider(socket_data_.get());
129 scoped_ptr<DatagramClientSocket> socket =
130 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
131 base::Bind(&base::RandInt),
132 &net_log_, NetLog::Source());
133 socket->Connect(kIpEndPoint);
134 return socket;
89 } 135 }
90 136
91 void CompleteCryptoHandshake() { 137 void CompleteCryptoHandshake() {
92 ASSERT_EQ(ERR_IO_PENDING, 138 ASSERT_EQ(OK, session_.CryptoConnect(false, callback_.callback()));
93 session_.CryptoConnect(false, callback_.callback()));
94 CryptoTestUtils::FakeServerOptions server_options;
95 CryptoTestUtils::HandshakeWithFakeServer(
96 &helper_, connection_, session_.GetCryptoStream(), server_options);
97 ASSERT_EQ(OK, callback_.WaitForResult());
98 } 139 }
99 140
100 MockConnectionHelper helper_; 141 QuicPacketWriter* CreateQuicPacketWriter(DatagramClientSocket* socket,
142 QuicConnection* connection) const {
143 scoped_ptr<QuicDefaultPacketWriter> writer(
144 new QuicDefaultPacketWriter(socket));
145 writer->SetConnection(connection);
146 return writer.release();
147 }
148
149 scoped_ptr<QuicEncryptedPacket> ConstructGetRequestPacket(
150 QuicPacketNumber packet_number,
151 QuicStreamId stream_id,
152 bool should_include_version,
153 bool fin) {
154 SpdyHeaderBlock headers = maker_.GetRequestHeaders("GET", "https", "/");
155 SpdyPriority priority =
156 ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY);
157 return maker_.MakeRequestHeadersPacket(packet_number, stream_id,
158 should_include_version, fin,
159 priority, headers);
160 }
161
162 scoped_ptr<QuicEncryptedPacket> ConstructOkResponsePacket(
163 QuicPacketNumber packet_number,
164 QuicStreamId stream_id,
165 bool should_include_version,
166 bool fin) {
167 SpdyHeaderBlock headers = maker_.GetResponseHeaders("200 OK");
168 return maker_.MakeResponseHeadersPacket(
169 packet_number, stream_id, should_include_version, fin, headers);
170 }
171
101 QuicCryptoClientConfig crypto_config_; 172 QuicCryptoClientConfig crypto_config_;
102 PacketSavingConnection* connection_;
103 TestNetLog net_log_; 173 TestNetLog net_log_;
174 BoundTestNetLog bound_net_log_;
104 MockClientSocketFactory socket_factory_; 175 MockClientSocketFactory socket_factory_;
105 StaticSocketDataProvider socket_data_; 176 MockRead reads_[1];
Ryan Hamilton 2016/01/08 05:01:06 Does this need to be an array?
Jana 2016/01/09 02:06:53 Good point -- changed to scoped_ptr
106 TransportSecurityState transport_security_state_; 177 scoped_ptr<StaticSocketDataProvider> socket_data_;
107 QuicChromiumClientSession session_; 178 scoped_ptr<DatagramClientSocket> socket_;
108 MockClock clock_; 179 MockClock clock_;
109 MockRandom random_; 180 MockRandom random_;
181 QuicConnectionHelper helper_;
182 DefaultPacketWriterFactory writer_factory_;
183 QuicConnection* connection_;
184 TransportSecurityState transport_security_state_;
185 MockCryptoClientStreamFactory crypto_client_stream_factory_;
186 QuicChromiumClientSession session_;
110 QuicConnectionVisitorInterface* visitor_; 187 QuicConnectionVisitorInterface* visitor_;
111 TestCompletionCallback callback_; 188 TestCompletionCallback callback_;
189 QuicTestPacketMaker maker_;
190 ProofVerifyDetailsChromium verify_details_;
112 }; 191 };
113 192
114 INSTANTIATE_TEST_CASE_P(Tests, 193 INSTANTIATE_TEST_CASE_P(Tests,
115 QuicChromiumClientSessionTest, 194 QuicChromiumClientSessionTest,
116 ::testing::ValuesIn(QuicSupportedVersions())); 195 ::testing::ValuesIn(QuicSupportedVersions()));
117 196
118 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) { 197 TEST_P(QuicChromiumClientSessionTest, CryptoConnect) {
119 CompleteCryptoHandshake(); 198 CompleteCryptoHandshake();
120 } 199 }
121 200
122 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) { 201 TEST_P(QuicChromiumClientSessionTest, MaxNumStreams) {
123 CompleteCryptoHandshake(); 202 CompleteCryptoHandshake();
203 const size_t kMaxOpenStreams = session_.get_max_open_streams();
124 204
125 std::vector<QuicReliableClientStream*> streams; 205 std::vector<QuicReliableClientStream*> streams;
126 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { 206 for (size_t i = 0; i < kMaxOpenStreams; i++) {
127 QuicReliableClientStream* stream = 207 QuicReliableClientStream* stream =
128 session_.CreateOutgoingDynamicStream(kDefaultPriority); 208 session_.CreateOutgoingDynamicStream(kDefaultPriority);
129 EXPECT_TRUE(stream); 209 EXPECT_TRUE(stream);
130 streams.push_back(stream); 210 streams.push_back(stream);
131 } 211 }
132 EXPECT_FALSE(session_.CreateOutgoingDynamicStream(kDefaultPriority)); 212 EXPECT_FALSE(session_.CreateOutgoingDynamicStream(kDefaultPriority));
133 213
134 EXPECT_EQ(kDefaultMaxStreamsPerConnection, 214 EXPECT_EQ(kMaxOpenStreams, session_.GetNumOpenOutgoingStreams());
135 session_.GetNumOpenOutgoingStreams());
136 215
137 // Close a stream and ensure I can now open a new one. 216 // Close a stream and ensure I can now open a new one.
138 QuicStreamId stream_id = streams[0]->id(); 217 QuicStreamId stream_id = streams[0]->id();
139 session_.CloseStream(stream_id); 218 session_.CloseStream(stream_id);
140 219
141 EXPECT_FALSE(session_.CreateOutgoingDynamicStream(kDefaultPriority)); 220 EXPECT_FALSE(session_.CreateOutgoingDynamicStream(kDefaultPriority));
142 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); 221 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0);
143 session_.OnRstStream(rst1); 222 session_.OnRstStream(rst1);
144 EXPECT_EQ(kDefaultMaxStreamsPerConnection - 1, 223 EXPECT_EQ(kMaxOpenStreams - 1, session_.GetNumOpenOutgoingStreams());
145 session_.GetNumOpenOutgoingStreams());
146 EXPECT_TRUE(session_.CreateOutgoingDynamicStream(kDefaultPriority)); 224 EXPECT_TRUE(session_.CreateOutgoingDynamicStream(kDefaultPriority));
147 } 225 }
148 226
149 TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) { 227 TEST_P(QuicChromiumClientSessionTest, MaxNumStreamsViaRequest) {
150 CompleteCryptoHandshake(); 228 CompleteCryptoHandshake();
229 const size_t kMaxOpenStreams = session_.get_max_open_streams();
151 230
152 std::vector<QuicReliableClientStream*> streams; 231 std::vector<QuicReliableClientStream*> streams;
153 for (size_t i = 0; i < kDefaultMaxStreamsPerConnection; i++) { 232 for (size_t i = 0; i < kMaxOpenStreams; i++) {
154 QuicReliableClientStream* stream = 233 QuicReliableClientStream* stream =
155 session_.CreateOutgoingDynamicStream(kDefaultPriority); 234 session_.CreateOutgoingDynamicStream(kDefaultPriority);
156 EXPECT_TRUE(stream); 235 EXPECT_TRUE(stream);
157 streams.push_back(stream); 236 streams.push_back(stream);
158 } 237 }
159 238
160 QuicReliableClientStream* stream; 239 QuicReliableClientStream* stream;
161 QuicChromiumClientSession::StreamRequest stream_request; 240 QuicChromiumClientSession::StreamRequest stream_request;
162 TestCompletionCallback callback; 241 TestCompletionCallback callback;
163 ASSERT_EQ(ERR_IO_PENDING, 242 ASSERT_EQ(ERR_IO_PENDING,
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 ASSERT_TRUE(details.cert_verify_result.verified_cert.get()); 346 ASSERT_TRUE(details.cert_verify_result.verified_cert.get());
268 347
269 CompleteCryptoHandshake(); 348 CompleteCryptoHandshake();
270 session_.OnProofVerifyDetailsAvailable(details); 349 session_.OnProofVerifyDetailsAvailable(details);
271 QuicChromiumClientSessionPeer::SetHostname(&session_, "www.example.org"); 350 QuicChromiumClientSessionPeer::SetHostname(&session_, "www.example.org");
272 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true); 351 QuicChromiumClientSessionPeer::SetChannelIDSent(&session_, true);
273 352
274 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED)); 353 EXPECT_TRUE(session_.CanPool("mail.example.org", PRIVACY_MODE_DISABLED));
275 } 354 }
276 355
356 TEST_P(QuicChromiumClientSessionTest, MigrateToSocket) {
357 CompleteCryptoHandshake();
358
359 char data[] = "ABCD";
360 scoped_ptr<QuicEncryptedPacket> ping_in(
361 maker_.MakePingPacket(1, /*include_version=*/false));
362 scoped_ptr<QuicEncryptedPacket> ping_out(
363 maker_.MakePingPacket(1, /*include_version=*/false));
Ryan Hamilton 2016/01/08 05:01:06 Since this is the same packet as ping_in, you can
Jana 2016/01/09 02:06:53 Ah -- yes, of course. Left over from changing this
364 scoped_ptr<QuicEncryptedPacket> ack_and_data_out(maker_.MakeAckAndDataPacket(
365 2, false, 5, 1, 1, false, 0, StringPiece(data)));
366 MockRead reads[] = {
367 MockRead(SYNCHRONOUS, ping_in->data(), ping_in->length(), 0),
368 MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1)};
369 MockWrite writes[] = {
370 MockWrite(SYNCHRONOUS, ping_out->data(), ping_out->length(), 2),
371 MockWrite(SYNCHRONOUS, ack_and_data_out->data(),
372 ack_and_data_out->length(), 3)};
373 StaticSocketDataProvider socket_data(reads, arraysize(reads), writes,
374 arraysize(writes));
375 socket_factory_.AddSocketDataProvider(&socket_data);
376
377 // Create connected socket.
378 scoped_ptr<DatagramClientSocket> new_socket =
379 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
380 base::Bind(&base::RandInt),
381 &net_log_, NetLog::Source());
382 EXPECT_EQ(OK, new_socket->Connect(kIpEndPoint));
383
384 // Create reader and writer.
385 scoped_ptr<QuicPacketReader> new_reader(new QuicPacketReader(
386 new_socket.get(), &clock_, &session_, kQuicYieldAfterPacketsRead,
387 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds),
388 bound_net_log_.bound()));
389 scoped_ptr<QuicPacketWriter> new_writer(
390 CreateQuicPacketWriter(new_socket.get(), session_.connection()));
391
392 // Migrate session.
393 EXPECT_TRUE(session_.MigrateToSocket(
394 std::move(new_socket), std::move(new_reader), std::move(new_writer)));
395
396 // Write data to session.
397 struct iovec iov[1];
398 iov[0].iov_base = data;
399 iov[0].iov_len = 4;
400 session_.WritevData(5, QuicIOVector(iov, arraysize(iov), 4), 0, false,
401 MAY_FEC_PROTECT, nullptr);
402
403 EXPECT_TRUE(socket_data.AllReadDataConsumed());
404 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
405 }
406
407 TEST_P(QuicChromiumClientSessionTest, MigrateToSocketMaxReaders) {
408 CompleteCryptoHandshake();
409
410 for (size_t i = 0; i < kMaxReadersPerQuicSession; ++i) {
411 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 1)};
412 scoped_ptr<QuicEncryptedPacket> ping_out(
413 maker_.MakePingPacket(i + 1, /*include_version=*/true));
414 MockWrite writes[] = {
415 MockWrite(SYNCHRONOUS, ping_out->data(), ping_out->length(), i + 2)};
416 StaticSocketDataProvider socket_data(reads, arraysize(reads), writes,
417 arraysize(writes));
418 socket_factory_.AddSocketDataProvider(&socket_data);
419
420 // Create connected socket.
421 scoped_ptr<DatagramClientSocket> new_socket =
422 socket_factory_.CreateDatagramClientSocket(DatagramSocket::DEFAULT_BIND,
423 base::Bind(&base::RandInt),
424 &net_log_, NetLog::Source());
425 EXPECT_EQ(OK, new_socket->Connect(kIpEndPoint));
426
427 // Create reader and writer.
428 scoped_ptr<QuicPacketReader> new_reader(new QuicPacketReader(
429 new_socket.get(), &clock_, &session_, kQuicYieldAfterPacketsRead,
430 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds),
431 bound_net_log_.bound()));
432 scoped_ptr<QuicPacketWriter> new_writer(
433 CreateQuicPacketWriter(new_socket.get(), session_.connection()));
434
435 // Migrate session.
436 if (i < kMaxReadersPerQuicSession - 1) {
437 EXPECT_TRUE(session_.MigrateToSocket(
438 std::move(new_socket), std::move(new_reader), std::move(new_writer)));
439 EXPECT_TRUE(socket_data.AllReadDataConsumed());
440 EXPECT_TRUE(socket_data.AllWriteDataConsumed());
441 } else {
442 // Max readers exceeded.
443 EXPECT_FALSE(session_.MigrateToSocket(
444 std::move(new_socket), std::move(new_reader), std::move(new_writer)));
445
446 EXPECT_FALSE(socket_data.AllReadDataConsumed());
447 EXPECT_FALSE(socket_data.AllWriteDataConsumed());
448 }
449 }
450 }
451
277 } // namespace 452 } // namespace
278 } // namespace test 453 } // namespace test
279 } // namespace net 454 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698