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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 | 51 |
52 namespace net { | 52 namespace net { |
53 namespace test { | 53 namespace test { |
54 namespace { | 54 namespace { |
55 | 55 |
56 const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0); | 56 const IPEndPoint kIpEndPoint = IPEndPoint(IPAddress::IPv4AllZeros(), 0); |
57 const char kServerHostname[] = "test.example.com"; | 57 const char kServerHostname[] = "test.example.com"; |
58 const uint16_t kServerPort = 443; | 58 const uint16_t kServerPort = 443; |
59 const size_t kMaxReadersPerQuicSession = 5; | 59 const size_t kMaxReadersPerQuicSession = 5; |
60 | 60 |
61 class MockStreamDelegate : public QuicChromiumClientStream::Delegate { | |
62 public: | |
63 MockStreamDelegate() {} | |
64 | |
65 MOCK_METHOD0(OnSendData, int()); | |
66 MOCK_METHOD2(OnSendDataComplete, int(int, bool*)); | |
67 MOCK_METHOD2(OnInitialHeadersAvailable, | |
68 void(const SpdyHeaderBlock& headers, size_t frame_len)); | |
69 MOCK_METHOD2(OnTrailingHeadersAvailable, | |
70 void(const SpdyHeaderBlock& headers, size_t frame_len)); | |
71 MOCK_METHOD2(OnDataReceived, int(const char*, int)); | |
72 MOCK_METHOD0(OnDataAvailable, void()); | |
73 MOCK_METHOD0(OnClose, void()); | |
74 MOCK_METHOD1(OnError, void(int)); | |
75 | |
76 private: | |
77 DISALLOW_COPY_AND_ASSIGN(MockStreamDelegate); | |
78 }; | |
79 | |
80 class QuicChromiumClientSessionTest | 61 class QuicChromiumClientSessionTest |
81 : public ::testing::TestWithParam<QuicVersion> { | 62 : public ::testing::TestWithParam<QuicVersion> { |
82 protected: | 63 protected: |
83 QuicChromiumClientSessionTest() | 64 QuicChromiumClientSessionTest() |
84 : crypto_config_(crypto_test_utils::ProofVerifierForTesting()), | 65 : crypto_config_(crypto_test_utils::ProofVerifierForTesting()), |
85 default_read_(new MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)), | 66 default_read_(new MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)), |
86 socket_data_( | 67 socket_data_( |
87 new SequencedSocketData(default_read_.get(), 1, nullptr, 0)), | 68 new SequencedSocketData(default_read_.get(), 1, nullptr, 0)), |
88 random_(0), | 69 random_(0), |
89 helper_(&clock_, &random_), | 70 helper_(&clock_, &random_), |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
171 std::unique_ptr<MockRead> default_read_; | 152 std::unique_ptr<MockRead> default_read_; |
172 std::unique_ptr<SequencedSocketData> socket_data_; | 153 std::unique_ptr<SequencedSocketData> socket_data_; |
173 MockClock clock_; | 154 MockClock clock_; |
174 MockRandom random_; | 155 MockRandom random_; |
175 QuicChromiumConnectionHelper helper_; | 156 QuicChromiumConnectionHelper helper_; |
176 MockAlarmFactory alarm_factory_; | 157 MockAlarmFactory alarm_factory_; |
177 TransportSecurityState transport_security_state_; | 158 TransportSecurityState transport_security_state_; |
178 MockCryptoClientStreamFactory crypto_client_stream_factory_; | 159 MockCryptoClientStreamFactory crypto_client_stream_factory_; |
179 QuicClientPushPromiseIndex push_promise_index_; | 160 QuicClientPushPromiseIndex push_promise_index_; |
180 QuicServerId server_id_; | 161 QuicServerId server_id_; |
181 MockStreamDelegate delegate_; | |
182 std::unique_ptr<QuicChromiumClientSession> session_; | 162 std::unique_ptr<QuicChromiumClientSession> session_; |
183 TestServerPushDelegate test_push_delegate_; | 163 TestServerPushDelegate test_push_delegate_; |
184 QuicConnectionVisitorInterface* visitor_; | 164 QuicConnectionVisitorInterface* visitor_; |
185 TestCompletionCallback callback_; | 165 TestCompletionCallback callback_; |
186 QuicTestPacketMaker client_maker_; | 166 QuicTestPacketMaker client_maker_; |
187 QuicTestPacketMaker server_maker_; | 167 QuicTestPacketMaker server_maker_; |
188 ProofVerifyDetailsChromium verify_details_; | 168 ProofVerifyDetailsChromium verify_details_; |
189 }; | 169 }; |
190 | 170 |
191 INSTANTIATE_TEST_CASE_P(Tests, | 171 INSTANTIATE_TEST_CASE_P(Tests, |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
233 nullptr); | 213 nullptr); |
234 | 214 |
235 CompleteCryptoHandshake(); | 215 CompleteCryptoHandshake(); |
236 | 216 |
237 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); | 217 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); |
238 | 218 |
239 // Request a stream and verify that a stream was created. | 219 // Request a stream and verify that a stream was created. |
240 TestCompletionCallback callback; | 220 TestCompletionCallback callback; |
241 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, | 221 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, |
242 callback.callback())); | 222 callback.callback())); |
243 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 223 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
244 | 224 |
245 quic_data.Resume(); | 225 quic_data.Resume(); |
246 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 226 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
247 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 227 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
248 | 228 |
249 // Veirfy that the handle works correctly after the session is closed. | 229 // Veirfy that the handle works correctly after the session is closed. |
250 EXPECT_FALSE(handle->IsConnected()); | 230 EXPECT_FALSE(handle->IsConnected()); |
251 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); | 231 EXPECT_TRUE(handle->IsCryptoHandshakeConfirmed()); |
252 EXPECT_EQ(GetParam(), handle->GetQuicVersion()); | 232 EXPECT_EQ(GetParam(), handle->GetQuicVersion()); |
253 EXPECT_EQ(server_id_, handle->server_id()); | 233 EXPECT_EQ(server_id_, handle->server_id()); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
295 | 275 |
296 Initialize(); | 276 Initialize(); |
297 CompleteCryptoHandshake(); | 277 CompleteCryptoHandshake(); |
298 | 278 |
299 // Request a stream and verify that a stream was created. | 279 // Request a stream and verify that a stream was created. |
300 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 280 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
301 session_->CreateHandle(); | 281 session_->CreateHandle(); |
302 TestCompletionCallback callback; | 282 TestCompletionCallback callback; |
303 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, | 283 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/false, |
304 callback.callback())); | 284 callback.callback())); |
305 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 285 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
306 | 286 |
307 quic_data.Resume(); | 287 quic_data.Resume(); |
308 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 288 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
309 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 289 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
310 } | 290 } |
311 | 291 |
312 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { | 292 TEST_P(QuicChromiumClientSessionTest, ConfirmationRequiredStreamRequest) { |
313 MockQuicData quic_data; | 293 MockQuicData quic_data; |
314 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 294 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
315 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 295 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
316 quic_data.AddRead(ASYNC, OK); // EOF | 296 quic_data.AddRead(ASYNC, OK); // EOF |
317 quic_data.AddSocketDataToFactory(&socket_factory_); | 297 quic_data.AddSocketDataToFactory(&socket_factory_); |
318 | 298 |
319 Initialize(); | 299 Initialize(); |
320 CompleteCryptoHandshake(); | 300 CompleteCryptoHandshake(); |
321 | 301 |
322 // Request a stream and verify that a stream was created. | 302 // Request a stream and verify that a stream was created. |
323 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 303 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
324 session_->CreateHandle(); | 304 session_->CreateHandle(); |
325 TestCompletionCallback callback; | 305 TestCompletionCallback callback; |
326 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/true, | 306 ASSERT_EQ(OK, handle->RequestStream(/*requires_confirmation=*/true, |
327 callback.callback())); | 307 callback.callback())); |
328 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 308 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
329 | 309 |
330 quic_data.Resume(); | 310 quic_data.Resume(); |
331 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 311 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
332 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 312 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
333 } | 313 } |
334 | 314 |
335 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { | 315 TEST_P(QuicChromiumClientSessionTest, StreamRequestBeforeConfirmation) { |
336 MockQuicData quic_data; | 316 MockQuicData quic_data; |
337 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 317 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
338 quic_data.AddRead(ASYNC, ERR_IO_PENDING); | 318 quic_data.AddRead(ASYNC, ERR_IO_PENDING); |
339 quic_data.AddRead(ASYNC, OK); // EOF | 319 quic_data.AddRead(ASYNC, OK); // EOF |
340 quic_data.AddSocketDataToFactory(&socket_factory_); | 320 quic_data.AddSocketDataToFactory(&socket_factory_); |
341 | 321 |
342 Initialize(); | 322 Initialize(); |
343 | 323 |
344 // Request a stream and verify that a stream was created. | 324 // Request a stream and verify that a stream was created. |
345 std::unique_ptr<QuicChromiumClientSession::Handle> handle = | 325 std::unique_ptr<QuicChromiumClientSession::Handle> handle = |
346 session_->CreateHandle(); | 326 session_->CreateHandle(); |
347 TestCompletionCallback callback; | 327 TestCompletionCallback callback; |
348 ASSERT_EQ(ERR_IO_PENDING, | 328 ASSERT_EQ(ERR_IO_PENDING, |
349 handle->RequestStream(/*requires_confirmation=*/true, | 329 handle->RequestStream(/*requires_confirmation=*/true, |
350 callback.callback())); | 330 callback.callback())); |
351 | 331 |
352 CompleteCryptoHandshake(); | 332 CompleteCryptoHandshake(); |
353 | 333 |
354 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 334 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
355 | 335 |
356 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 336 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
357 | 337 |
358 quic_data.Resume(); | 338 quic_data.Resume(); |
359 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 339 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
360 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 340 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
361 } | 341 } |
362 | 342 |
363 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { | 343 TEST_P(QuicChromiumClientSessionTest, CancelStreamRequestBeforeRelease) { |
364 MockQuicData quic_data; | 344 MockQuicData quic_data; |
365 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 345 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
366 quic_data.AddWrite(client_maker_.MakeRstPacket( | 346 quic_data.AddWrite(client_maker_.MakeRstPacket( |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 ASSERT_EQ(ERR_IO_PENDING, | 392 ASSERT_EQ(ERR_IO_PENDING, |
413 handle->RequestStream(/*requires_confirmation=*/false, | 393 handle->RequestStream(/*requires_confirmation=*/false, |
414 callback.callback())); | 394 callback.callback())); |
415 | 395 |
416 // Close a stream and ensure the stream request completes. | 396 // Close a stream and ensure the stream request completes. |
417 QuicRstStreamFrame rst(GetNthClientInitiatedStreamId(0), | 397 QuicRstStreamFrame rst(GetNthClientInitiatedStreamId(0), |
418 QUIC_STREAM_CANCELLED, 0); | 398 QUIC_STREAM_CANCELLED, 0); |
419 session_->OnRstStream(rst); | 399 session_->OnRstStream(rst); |
420 ASSERT_TRUE(callback.have_result()); | 400 ASSERT_TRUE(callback.have_result()); |
421 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 401 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
422 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 402 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
423 | 403 |
424 quic_data.Resume(); | 404 quic_data.Resume(); |
425 EXPECT_TRUE(quic_data.AllReadDataConsumed()); | 405 EXPECT_TRUE(quic_data.AllReadDataConsumed()); |
426 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); | 406 EXPECT_TRUE(quic_data.AllWriteDataConsumed()); |
427 } | 407 } |
428 | 408 |
429 TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) { | 409 TEST_P(QuicChromiumClientSessionTest, CancelPendingStreamRequest) { |
430 MockQuicData quic_data; | 410 MockQuicData quic_data; |
431 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 411 quic_data.AddWrite(client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
432 quic_data.AddWrite(client_maker_.MakeRstPacket( | 412 quic_data.AddWrite(client_maker_.MakeRstPacket( |
(...skipping 484 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
917 handle->RequestStream(/*requires_confirmation=*/false, | 897 handle->RequestStream(/*requires_confirmation=*/false, |
918 callback.callback())); | 898 callback.callback())); |
919 | 899 |
920 // Close a stream and ensure I can now open a new one. | 900 // Close a stream and ensure I can now open a new one. |
921 QuicStreamId stream_id = streams[0]->id(); | 901 QuicStreamId stream_id = streams[0]->id(); |
922 session_->CloseStream(stream_id); | 902 session_->CloseStream(stream_id); |
923 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); | 903 QuicRstStreamFrame rst1(stream_id, QUIC_STREAM_NO_ERROR, 0); |
924 session_->OnRstStream(rst1); | 904 session_->OnRstStream(rst1); |
925 ASSERT_TRUE(callback.have_result()); | 905 ASSERT_TRUE(callback.have_result()); |
926 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 906 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
927 EXPECT_TRUE(handle->ReleaseStream(&delegate_) != nullptr); | 907 EXPECT_TRUE(handle->ReleaseStream() != nullptr); |
928 } | 908 } |
929 | 909 |
930 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { | 910 TEST_P(QuicChromiumClientSessionTest, GoAwayReceived) { |
931 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; | 911 MockRead reads[] = {MockRead(SYNCHRONOUS, ERR_IO_PENDING, 0)}; |
932 std::unique_ptr<QuicEncryptedPacket> settings_packet( | 912 std::unique_ptr<QuicEncryptedPacket> settings_packet( |
933 client_maker_.MakeInitialSettingsPacket(1, nullptr)); | 913 client_maker_.MakeInitialSettingsPacket(1, nullptr)); |
934 MockWrite writes[] = { | 914 MockWrite writes[] = { |
935 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; | 915 MockWrite(ASYNC, settings_packet->data(), settings_packet->length(), 1)}; |
936 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, | 916 socket_data_.reset(new SequencedSocketData(reads, arraysize(reads), writes, |
937 arraysize(writes))); | 917 arraysize(writes))); |
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1257 | 1237 |
1258 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); | 1238 EXPECT_TRUE(socket_data_->AllReadDataConsumed()); |
1259 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); | 1239 EXPECT_TRUE(socket_data_->AllWriteDataConsumed()); |
1260 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); | 1240 EXPECT_TRUE(new_socket_data.AllReadDataConsumed()); |
1261 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); | 1241 EXPECT_TRUE(new_socket_data.AllWriteDataConsumed()); |
1262 } | 1242 } |
1263 | 1243 |
1264 } // namespace | 1244 } // namespace |
1265 } // namespace test | 1245 } // namespace test |
1266 } // namespace net | 1246 } // namespace net |
OLD | NEW |