1 // Copyright 2015 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "net/quic/quic_session_pool_peer.h"
6
7 #include <string>
8 #include <vector>
9
10 #include "base/task/sequenced_task_runner.h"
11 #include "net/base/network_anonymization_key.h"
12 #include "net/base/privacy_mode.h"
13 #include "net/base/proxy_chain.h"
14 #include "net/base/session_usage.h"
15 #include "net/cert/x509_certificate.h"
16 #include "net/cert/x509_util.h"
17 #include "net/dns/public/secure_dns_policy.h"
18 #include "net/quic/platform/impl/quic_chromium_clock.h"
19 #include "net/quic/quic_chromium_client_session.h"
20 #include "net/quic/quic_http_stream.h"
21 #include "net/quic/quic_session_key.h"
22 #include "net/quic/quic_session_pool.h"
23 #include "net/socket/socket_tag.h"
24 #include "net/test/cert_test_util.h"
25 #include "net/test/test_data_directory.h"
26 #include "net/third_party/quiche/src/quiche/quic/core/crypto/quic_crypto_client_config.h"
27 #include "net/third_party/quiche/src/quiche/quic/core/quic_server_id.h"
28 #include "url/scheme_host_port.h"
29
30 using std::string;
31
32 namespace net::test {
33
GetConfig(QuicSessionPool * factory)34 const quic::QuicConfig* QuicSessionPoolPeer::GetConfig(
35 QuicSessionPool* factory) {
36 return &factory->config_;
37 }
38
39 std::unique_ptr<QuicCryptoClientConfigHandle>
GetCryptoConfig(QuicSessionPool * factory,const NetworkAnonymizationKey & network_anonymization_key)40 QuicSessionPoolPeer::GetCryptoConfig(
41 QuicSessionPool* factory,
42 const NetworkAnonymizationKey& network_anonymization_key) {
43 return factory->GetCryptoConfigForTesting(network_anonymization_key);
44 }
45
HasActiveSession(QuicSessionPool * factory,const quic::QuicServerId & server_id,const NetworkAnonymizationKey & network_anonymization_key,const ProxyChain & proxy_chain,SessionUsage session_usage,bool require_dns_https_alpn)46 bool QuicSessionPoolPeer::HasActiveSession(
47 QuicSessionPool* factory,
48 const quic::QuicServerId& server_id,
49 const NetworkAnonymizationKey& network_anonymization_key,
50 const ProxyChain& proxy_chain,
51 SessionUsage session_usage,
52 bool require_dns_https_alpn) {
53 return factory->HasActiveSession(
54 QuicSessionKey(server_id, proxy_chain, session_usage, SocketTag(),
55 network_anonymization_key, SecureDnsPolicy::kAllow,
56 require_dns_https_alpn));
57 }
58
HasActiveJob(QuicSessionPool * factory,const quic::QuicServerId & server_id,bool require_dns_https_alpn)59 bool QuicSessionPoolPeer::HasActiveJob(QuicSessionPool* factory,
60 const quic::QuicServerId& server_id,
61 bool require_dns_https_alpn) {
62 return factory->HasActiveJob(QuicSessionKey(
63 server_id, ProxyChain::Direct(), SessionUsage::kDestination, SocketTag(),
64 NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
65 require_dns_https_alpn));
66 }
67
68 // static
GetPendingSession(QuicSessionPool * factory,const quic::QuicServerId & server_id,url::SchemeHostPort destination)69 QuicChromiumClientSession* QuicSessionPoolPeer::GetPendingSession(
70 QuicSessionPool* factory,
71 const quic::QuicServerId& server_id,
72 url::SchemeHostPort destination) {
73 QuicSessionKey session_key(server_id, ProxyChain::Direct(),
74 SessionUsage::kDestination, SocketTag(),
75 NetworkAnonymizationKey(), SecureDnsPolicy::kAllow,
76 /*require_dns_https_alpn=*/false);
77 QuicSessionPool::QuicSessionAliasKey key(std::move(destination), session_key);
78 DCHECK(factory->HasActiveJob(session_key));
79 DCHECK_EQ(factory->all_sessions_.size(), 1u);
80 DCHECK(key == factory->all_sessions_.begin()->second);
81 return factory->all_sessions_.begin()->first;
82 }
83
GetActiveSession(QuicSessionPool * factory,const quic::QuicServerId & server_id,const NetworkAnonymizationKey & network_anonymization_key,const ProxyChain & proxy_chain,SessionUsage session_usage,bool require_dns_https_alpn)84 QuicChromiumClientSession* QuicSessionPoolPeer::GetActiveSession(
85 QuicSessionPool* factory,
86 const quic::QuicServerId& server_id,
87 const NetworkAnonymizationKey& network_anonymization_key,
88 const ProxyChain& proxy_chain,
89 SessionUsage session_usage,
90 bool require_dns_https_alpn) {
91 QuicSessionKey session_key(server_id, proxy_chain, session_usage, SocketTag(),
92 network_anonymization_key, SecureDnsPolicy::kAllow,
93 require_dns_https_alpn);
94 DCHECK(factory->HasActiveSession(session_key));
95 return factory->active_sessions_[session_key];
96 }
97
IsLiveSession(QuicSessionPool * factory,QuicChromiumClientSession * session)98 bool QuicSessionPoolPeer::IsLiveSession(QuicSessionPool* factory,
99 QuicChromiumClientSession* session) {
100 for (const auto& it : factory->all_sessions_) {
101 if (it.first == session) {
102 return true;
103 }
104 }
105 return false;
106 }
107
SetTaskRunner(QuicSessionPool * factory,base::SequencedTaskRunner * task_runner)108 void QuicSessionPoolPeer::SetTaskRunner(
109 QuicSessionPool* factory,
110 base::SequencedTaskRunner* task_runner) {
111 factory->task_runner_ = task_runner;
112 }
113
SetTickClock(QuicSessionPool * factory,const base::TickClock * tick_clock)114 void QuicSessionPoolPeer::SetTickClock(QuicSessionPool* factory,
115 const base::TickClock* tick_clock) {
116 factory->tick_clock_ = tick_clock;
117 }
118
GetPingTimeout(QuicSessionPool * factory)119 quic::QuicTime::Delta QuicSessionPoolPeer::GetPingTimeout(
120 QuicSessionPool* factory) {
121 return factory->ping_timeout_;
122 }
123
SetYieldAfterPackets(QuicSessionPool * factory,int yield_after_packets)124 void QuicSessionPoolPeer::SetYieldAfterPackets(QuicSessionPool* factory,
125 int yield_after_packets) {
126 factory->yield_after_packets_ = yield_after_packets;
127 }
128
SetYieldAfterDuration(QuicSessionPool * factory,quic::QuicTime::Delta yield_after_duration)129 void QuicSessionPoolPeer::SetYieldAfterDuration(
130 QuicSessionPool* factory,
131 quic::QuicTime::Delta yield_after_duration) {
132 factory->yield_after_duration_ = yield_after_duration;
133 }
134
CryptoConfigCacheIsEmpty(QuicSessionPool * factory,const quic::QuicServerId & quic_server_id,const NetworkAnonymizationKey & network_anonymization_key)135 bool QuicSessionPoolPeer::CryptoConfigCacheIsEmpty(
136 QuicSessionPool* factory,
137 const quic::QuicServerId& quic_server_id,
138 const NetworkAnonymizationKey& network_anonymization_key) {
139 return factory->CryptoConfigCacheIsEmptyForTesting(quic_server_id,
140 network_anonymization_key);
141 }
142
GetNumDegradingSessions(QuicSessionPool * factory)143 size_t QuicSessionPoolPeer::GetNumDegradingSessions(QuicSessionPool* factory) {
144 return factory->connectivity_monitor_.GetNumDegradingSessions();
145 }
146
SetAlarmFactory(QuicSessionPool * factory,std::unique_ptr<quic::QuicAlarmFactory> alarm_factory)147 void QuicSessionPoolPeer::SetAlarmFactory(
148 QuicSessionPool* factory,
149 std::unique_ptr<quic::QuicAlarmFactory> alarm_factory) {
150 factory->alarm_factory_ = std::move(alarm_factory);
151 }
152
153 } // namespace net::test
154