get_stream_engine.cc 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. // Copyright 2016 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include <memory>
  5. #include <utility>
  6. #include "components/grpc_support/test/get_stream_engine.h"
  7. #include "base/lazy_instance.h"
  8. #include "base/memory/ref_counted.h"
  9. #include "base/message_loop/message_pump_type.h"
  10. #include "base/strings/string_number_conversions.h"
  11. #include "base/strings/stringprintf.h"
  12. #include "base/task/single_thread_task_runner.h"
  13. #include "base/threading/thread.h"
  14. #include "base/time/time.h"
  15. #include "components/grpc_support/include/bidirectional_stream_c.h"
  16. #include "net/base/host_port_pair.h"
  17. #include "net/base/network_isolation_key.h"
  18. #include "net/cert/mock_cert_verifier.h"
  19. #include "net/dns/mapped_host_resolver.h"
  20. #include "net/dns/mock_host_resolver.h"
  21. #include "net/http/http_network_session.h"
  22. #include "net/http/http_server_properties.h"
  23. #include "net/test/cert_test_util.h"
  24. #include "net/test/quic_simple_test_server.h"
  25. #include "net/test/test_data_directory.h"
  26. #include "net/url_request/url_request_context.h"
  27. #include "net/url_request/url_request_context_builder.h"
  28. #include "net/url_request/url_request_test_util.h"
  29. namespace grpc_support {
  30. namespace {
  31. // URLRequestContextGetter for BidirectionalStreamTest. This is used instead of
  32. // net::TestURLRequestContextGetter because the URLRequestContext needs to be
  33. // created on the test_io_thread_ for the test, and TestURLRequestContextGetter
  34. // does not allow for lazy instantiation of the URLRequestContext if additional
  35. // setup is required.
  36. class BidirectionalStreamTestURLRequestContextGetter
  37. : public net::URLRequestContextGetter {
  38. public:
  39. BidirectionalStreamTestURLRequestContextGetter(
  40. const scoped_refptr<base::SingleThreadTaskRunner>& task_runner)
  41. : task_runner_(task_runner) {}
  42. BidirectionalStreamTestURLRequestContextGetter(
  43. const BidirectionalStreamTestURLRequestContextGetter&) = delete;
  44. BidirectionalStreamTestURLRequestContextGetter& operator=(
  45. const BidirectionalStreamTestURLRequestContextGetter&) = delete;
  46. net::URLRequestContext* GetURLRequestContext() override {
  47. if (!request_context_) {
  48. auto context_builder = net::CreateTestURLRequestContextBuilder();
  49. auto mock_host_resolver = std::make_unique<net::MockHostResolver>();
  50. auto host_resolver = std::make_unique<net::MappedHostResolver>(
  51. std::move(mock_host_resolver));
  52. auto test_cert = net::ImportCertFromFile(net::GetTestCertsDirectory(),
  53. "quic-chain.pem");
  54. auto mock_cert_verifier = std::make_unique<net::MockCertVerifier>();
  55. net::CertVerifyResult verify_result;
  56. verify_result.verified_cert = test_cert;
  57. verify_result.is_issued_by_known_root = true;
  58. mock_cert_verifier->AddResultForCert(test_cert, verify_result, net::OK);
  59. net::HttpNetworkSessionParams params;
  60. params.enable_quic = true;
  61. params.enable_http2 = true;
  62. context_builder->SetCertVerifier(std::move(mock_cert_verifier));
  63. context_builder->set_host_resolver(std::move(host_resolver));
  64. context_builder->set_http_network_session_params(params);
  65. request_context_ = context_builder->Build();
  66. UpdateHostResolverRules();
  67. // Need to enable QUIC for the test server.
  68. net::AlternativeService alternative_service(net::kProtoQUIC, "", 443);
  69. url::SchemeHostPort quic_hint_server(
  70. "https", net::QuicSimpleTestServer::GetHost(), 443);
  71. request_context_->http_server_properties()->SetQuicAlternativeService(
  72. quic_hint_server, net::NetworkIsolationKey(), alternative_service,
  73. base::Time::Max(), quic::ParsedQuicVersionVector());
  74. }
  75. return request_context_.get();
  76. }
  77. net::MappedHostResolver* host_resolver() {
  78. if (!request_context_) {
  79. return nullptr;
  80. }
  81. // This is safe because we set a MappedHostResolver in
  82. // GetURLRequestContext().
  83. return static_cast<net::MappedHostResolver*>(
  84. request_context_->host_resolver());
  85. }
  86. scoped_refptr<base::SingleThreadTaskRunner> GetNetworkTaskRunner()
  87. const override {
  88. return task_runner_;
  89. }
  90. void SetTestServerPort(int port) {
  91. test_server_port_ = port;
  92. UpdateHostResolverRules();
  93. }
  94. private:
  95. void UpdateHostResolverRules() {
  96. if (!host_resolver())
  97. return;
  98. host_resolver()->SetRulesFromString(
  99. base::StringPrintf("MAP notfound.example.com ~NOTFOUND,"
  100. "MAP test.example.com 127.0.0.1:%d",
  101. test_server_port_));
  102. }
  103. ~BidirectionalStreamTestURLRequestContextGetter() override {}
  104. int test_server_port_;
  105. std::unique_ptr<net::URLRequestContext> request_context_;
  106. scoped_refptr<base::SingleThreadTaskRunner> task_runner_;
  107. };
  108. base::LazyInstance<
  109. scoped_refptr<BidirectionalStreamTestURLRequestContextGetter>>
  110. ::Leaky g_request_context_getter_ = LAZY_INSTANCE_INITIALIZER;
  111. bool g_initialized_ = false;
  112. } // namespace
  113. void CreateRequestContextGetterIfNecessary() {
  114. if (!g_initialized_) {
  115. g_initialized_ = true;
  116. static base::Thread* test_io_thread_ =
  117. new base::Thread("grpc_support_test_io_thread");
  118. base::Thread::Options options;
  119. options.message_pump_type = base::MessagePumpType::IO;
  120. bool started = test_io_thread_->StartWithOptions(std::move(options));
  121. DCHECK(started);
  122. g_request_context_getter_.Get() =
  123. new BidirectionalStreamTestURLRequestContextGetter(
  124. test_io_thread_->task_runner());
  125. }
  126. }
  127. stream_engine* GetTestStreamEngine(int port) {
  128. CreateRequestContextGetterIfNecessary();
  129. g_request_context_getter_.Get()->SetTestServerPort(port);
  130. static stream_engine engine;
  131. engine.obj = g_request_context_getter_.Get().get();
  132. return &engine;
  133. }
  134. void StartTestStreamEngine(int port) {}
  135. void ShutdownTestStreamEngine() {}
  136. } // namespace grpc_support