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/tools/quic/test_tools/quic_test_client.h" | 5 #include "net/tools/quic/test_tools/quic_test_client.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 11 matching lines...) Expand all Loading... |
22 #include "net/quic/test_tools/quic_connection_peer.h" | 22 #include "net/quic/test_tools/quic_connection_peer.h" |
23 #include "net/quic/test_tools/quic_spdy_session_peer.h" | 23 #include "net/quic/test_tools/quic_spdy_session_peer.h" |
24 #include "net/quic/test_tools/quic_stream_peer.h" | 24 #include "net/quic/test_tools/quic_stream_peer.h" |
25 #include "net/quic/test_tools/quic_test_utils.h" | 25 #include "net/quic/test_tools/quic_test_utils.h" |
26 #include "net/tools/quic/quic_epoll_connection_helper.h" | 26 #include "net/tools/quic/quic_epoll_connection_helper.h" |
27 #include "net/tools/quic/quic_packet_writer_wrapper.h" | 27 #include "net/tools/quic/quic_packet_writer_wrapper.h" |
28 #include "net/tools/quic/quic_spdy_client_stream.h" | 28 #include "net/tools/quic/quic_spdy_client_stream.h" |
29 #include "net/tools/quic/test_tools/quic_client_peer.h" | 29 #include "net/tools/quic/test_tools/quic_client_peer.h" |
30 #include "third_party/boringssl/src/include/openssl/x509.h" | 30 #include "third_party/boringssl/src/include/openssl/x509.h" |
31 | 31 |
32 using base::StringPiece; | |
33 using std::string; | 32 using std::string; |
34 using testing::_; | 33 using testing::_; |
35 using testing::Invoke; | 34 using testing::Invoke; |
36 | 35 |
37 namespace net { | 36 namespace net { |
38 namespace test { | 37 namespace test { |
39 namespace { | 38 namespace { |
40 | 39 |
41 // RecordingProofVerifier accepts any certificate chain and records the common | 40 // RecordingProofVerifier accepts any certificate chain and records the common |
42 // name of the leaf and then delegates the actual verfication to an actual | 41 // name of the leaf and then delegates the actual verfication to an actual |
43 // verifier. If no optional verifier is provided, then VerifyProof will return | 42 // verifier. If no optional verifier is provided, then VerifyProof will return |
44 // success. | 43 // success. |
45 class RecordingProofVerifier : public ProofVerifier { | 44 class RecordingProofVerifier : public ProofVerifier { |
46 public: | 45 public: |
47 explicit RecordingProofVerifier(std::unique_ptr<ProofVerifier> verifier) | 46 explicit RecordingProofVerifier(std::unique_ptr<ProofVerifier> verifier) |
48 : verifier_(std::move(verifier)) {} | 47 : verifier_(std::move(verifier)) {} |
49 | 48 |
50 // ProofVerifier interface. | 49 // ProofVerifier interface. |
51 QuicAsyncStatus VerifyProof( | 50 QuicAsyncStatus VerifyProof( |
52 const string& hostname, | 51 const string& hostname, |
53 const uint16_t port, | 52 const uint16_t port, |
54 const string& server_config, | 53 const string& server_config, |
55 QuicVersion quic_version, | 54 QuicVersion quic_version, |
56 StringPiece chlo_hash, | 55 QuicStringPiece chlo_hash, |
57 const std::vector<string>& certs, | 56 const std::vector<string>& certs, |
58 const string& cert_sct, | 57 const string& cert_sct, |
59 const string& signature, | 58 const string& signature, |
60 const ProofVerifyContext* context, | 59 const ProofVerifyContext* context, |
61 string* error_details, | 60 string* error_details, |
62 std::unique_ptr<ProofVerifyDetails>* details, | 61 std::unique_ptr<ProofVerifyDetails>* details, |
63 std::unique_ptr<ProofVerifierCallback> callback) override { | 62 std::unique_ptr<ProofVerifierCallback> callback) override { |
64 common_name_.clear(); | 63 common_name_.clear(); |
65 if (certs.empty()) { | 64 if (certs.empty()) { |
66 return QUIC_FAILURE; | 65 return QUIC_FAILURE; |
67 } | 66 } |
68 | 67 |
69 // Convert certs to X509Certificate. | 68 // Convert certs to X509Certificate. |
70 std::vector<StringPiece> cert_pieces(certs.size()); | 69 std::vector<QuicStringPiece> cert_pieces(certs.size()); |
71 for (unsigned i = 0; i < certs.size(); i++) { | 70 for (unsigned i = 0; i < certs.size(); i++) { |
72 cert_pieces[i] = StringPiece(certs[i]); | 71 cert_pieces[i] = QuicStringPiece(certs[i]); |
73 } | 72 } |
74 // TODO(rtenneti): Fix after adding support for real certs. Currently, | 73 // TODO(rtenneti): Fix after adding support for real certs. Currently, |
75 // cert_pieces are "leaf" and "intermediate" and CreateFromDERCertChain | 74 // cert_pieces are "leaf" and "intermediate" and CreateFromDERCertChain |
76 // fails to return cert from these cert_pieces. | 75 // fails to return cert from these cert_pieces. |
77 // bssl::UniquePtr<X509> cert(d2i_X509(nullptr, &data, certs[0].size())); | 76 // bssl::UniquePtr<X509> cert(d2i_X509(nullptr, &data, certs[0].size())); |
78 // if (!cert.get()) { | 77 // if (!cert.get()) { |
79 // return QUIC_FAILURE; | 78 // return QUIC_FAILURE; |
80 // } | 79 // } |
81 // | 80 // |
82 // common_name_ = cert->subject().GetDisplayName(); | 81 // common_name_ = cert->subject().GetDisplayName(); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 for (const string& url : url_list) { | 282 for (const string& url : url_list) { |
284 SendRequest(url); | 283 SendRequest(url); |
285 } | 284 } |
286 while (client()->WaitForEvents()) { | 285 while (client()->WaitForEvents()) { |
287 } | 286 } |
288 return; | 287 return; |
289 } | 288 } |
290 | 289 |
291 ssize_t QuicTestClient::GetOrCreateStreamAndSendRequest( | 290 ssize_t QuicTestClient::GetOrCreateStreamAndSendRequest( |
292 const SpdyHeaderBlock* headers, | 291 const SpdyHeaderBlock* headers, |
293 StringPiece body, | 292 QuicStringPiece body, |
294 bool fin, | 293 bool fin, |
295 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) { | 294 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) { |
296 if (headers) { | 295 if (headers) { |
297 QuicClientPushPromiseIndex::TryHandle* handle; | 296 QuicClientPushPromiseIndex::TryHandle* handle; |
298 QuicAsyncStatus rv = | 297 QuicAsyncStatus rv = |
299 client()->push_promise_index()->Try(*headers, this, &handle); | 298 client()->push_promise_index()->Try(*headers, this, &handle); |
300 if (rv == QUIC_SUCCESS) | 299 if (rv == QUIC_SUCCESS) |
301 return 1; | 300 return 1; |
302 if (rv == QUIC_PENDING) { | 301 if (rv == QUIC_PENDING) { |
303 // May need to retry request if asynchronous rendezvous fails. | 302 // May need to retry request if asynchronous rendezvous fails. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
336 } | 335 } |
337 std::unique_ptr<QuicClientBase::QuicDataToResend> data_to_resend( | 336 std::unique_ptr<QuicClientBase::QuicDataToResend> data_to_resend( |
338 new TestClientDataToResend(std::move(new_headers), body, fin, this, | 337 new TestClientDataToResend(std::move(new_headers), body, fin, this, |
339 ack_listener)); | 338 ack_listener)); |
340 client()->MaybeAddQuicDataToResend(std::move(data_to_resend)); | 339 client()->MaybeAddQuicDataToResend(std::move(data_to_resend)); |
341 } | 340 } |
342 return ret; | 341 return ret; |
343 } | 342 } |
344 | 343 |
345 ssize_t QuicTestClient::SendMessage(const SpdyHeaderBlock& headers, | 344 ssize_t QuicTestClient::SendMessage(const SpdyHeaderBlock& headers, |
346 StringPiece body) { | 345 QuicStringPiece body) { |
347 return SendMessage(headers, body, /*fin=*/true); | 346 return SendMessage(headers, body, /*fin=*/true); |
348 } | 347 } |
349 | 348 |
350 ssize_t QuicTestClient::SendMessage(const SpdyHeaderBlock& headers, | 349 ssize_t QuicTestClient::SendMessage(const SpdyHeaderBlock& headers, |
351 StringPiece body, | 350 QuicStringPiece body, |
352 bool fin) { | 351 bool fin) { |
353 stream_ = nullptr; // Always force creation of a stream for SendMessage. | 352 stream_ = nullptr; // Always force creation of a stream for SendMessage. |
354 // Any response we might have received for a previous request would no longer | 353 // Any response we might have received for a previous request would no longer |
355 // be valid. TODO(jeffpiazza): There's probably additional client state that | 354 // be valid. TODO(jeffpiazza): There's probably additional client state that |
356 // should be reset here, too, if we were being more careful. | 355 // should be reset here, too, if we were being more careful. |
357 response_complete_ = false; | 356 response_complete_ = false; |
358 | 357 |
359 // If we're not connected, try to find an sni hostname. | 358 // If we're not connected, try to find an sni hostname. |
360 if (!connected()) { | 359 if (!connected()) { |
361 QuicUrl url(SpdyUtils::GetUrlFromHeaderBlock(headers)); | 360 QuicUrl url(SpdyUtils::GetUrlFromHeaderBlock(headers)); |
362 if (override_sni_set_) { | 361 if (override_sni_set_) { |
363 client_->set_server_id( | 362 client_->set_server_id( |
364 QuicServerId(override_sni_, url.port(), PRIVACY_MODE_DISABLED)); | 363 QuicServerId(override_sni_, url.port(), PRIVACY_MODE_DISABLED)); |
365 } | 364 } |
366 } | 365 } |
367 | 366 |
368 ssize_t ret = GetOrCreateStreamAndSendRequest(&headers, body, fin, nullptr); | 367 ssize_t ret = GetOrCreateStreamAndSendRequest(&headers, body, fin, nullptr); |
369 WaitForWriteToFlush(); | 368 WaitForWriteToFlush(); |
370 return ret; | 369 return ret; |
371 } | 370 } |
372 | 371 |
373 ssize_t QuicTestClient::SendData(const string& data, bool last_data) { | 372 ssize_t QuicTestClient::SendData(const string& data, bool last_data) { |
374 return SendData(data, last_data, nullptr); | 373 return SendData(data, last_data, nullptr); |
375 } | 374 } |
376 | 375 |
377 ssize_t QuicTestClient::SendData( | 376 ssize_t QuicTestClient::SendData( |
378 const string& data, | 377 const string& data, |
379 bool last_data, | 378 bool last_data, |
380 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) { | 379 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) { |
381 return GetOrCreateStreamAndSendRequest(nullptr, StringPiece(data), last_data, | 380 return GetOrCreateStreamAndSendRequest(nullptr, QuicStringPiece(data), |
382 std::move(ack_listener)); | 381 last_data, std::move(ack_listener)); |
383 } | 382 } |
384 | 383 |
385 bool QuicTestClient::response_complete() const { | 384 bool QuicTestClient::response_complete() const { |
386 return response_complete_; | 385 return response_complete_; |
387 } | 386 } |
388 | 387 |
389 int64_t QuicTestClient::response_body_size() const { | 388 int64_t QuicTestClient::response_body_size() const { |
390 return response_body_size_; | 389 return response_body_size_; |
391 } | 390 } |
392 | 391 |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
676 } | 675 } |
677 | 676 |
678 void QuicTestClient::WaitForWriteToFlush() { | 677 void QuicTestClient::WaitForWriteToFlush() { |
679 while (connected() && client()->session()->HasDataToWrite()) { | 678 while (connected() && client()->session()->HasDataToWrite()) { |
680 client_->WaitForEvents(); | 679 client_->WaitForEvents(); |
681 } | 680 } |
682 } | 681 } |
683 | 682 |
684 QuicTestClient::TestClientDataToResend::TestClientDataToResend( | 683 QuicTestClient::TestClientDataToResend::TestClientDataToResend( |
685 std::unique_ptr<SpdyHeaderBlock> headers, | 684 std::unique_ptr<SpdyHeaderBlock> headers, |
686 base::StringPiece body, | 685 QuicStringPiece body, |
687 bool fin, | 686 bool fin, |
688 QuicTestClient* test_client, | 687 QuicTestClient* test_client, |
689 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) | 688 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener) |
690 : QuicClient::QuicDataToResend(std::move(headers), body, fin), | 689 : QuicClient::QuicDataToResend(std::move(headers), body, fin), |
691 test_client_(test_client), | 690 test_client_(test_client), |
692 ack_listener_(std::move(ack_listener)) {} | 691 ack_listener_(std::move(ack_listener)) {} |
693 | 692 |
694 QuicTestClient::TestClientDataToResend::~TestClientDataToResend() {} | 693 QuicTestClient::TestClientDataToResend::~TestClientDataToResend() {} |
695 | 694 |
696 void QuicTestClient::TestClientDataToResend::Resend() { | 695 void QuicTestClient::TestClientDataToResend::Resend() { |
(...skipping 11 matching lines...) Expand all Loading... |
708 } else if (uri[0] == '/') { | 707 } else if (uri[0] == '/') { |
709 url = "https://" + client_->server_id().host() + uri; | 708 url = "https://" + client_->server_id().host() + uri; |
710 } else { | 709 } else { |
711 url = "https://" + uri; | 710 url = "https://" + uri; |
712 } | 711 } |
713 return SpdyUtils::PopulateHeaderBlockFromUrl(url, headers); | 712 return SpdyUtils::PopulateHeaderBlockFromUrl(url, headers); |
714 } | 713 } |
715 | 714 |
716 } // namespace test | 715 } // namespace test |
717 } // namespace net | 716 } // namespace net |
OLD | NEW |