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