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
3 // found in the LICENSE file.
4
5 #include "quiche/quic/test_tools/quic_session_peer.h"
6
7 #include "absl/container/flat_hash_map.h"
8 #include "quiche/quic/core/quic_session.h"
9 #include "quiche/quic/core/quic_stream.h"
10 #include "quiche/quic/core/quic_utils.h"
11
12 namespace quic {
13 namespace test {
14
15 // static
GetNextOutgoingBidirectionalStreamId(QuicSession * session)16 QuicStreamId QuicSessionPeer::GetNextOutgoingBidirectionalStreamId(
17 QuicSession* session) {
18 return session->GetNextOutgoingBidirectionalStreamId();
19 }
20
21 // static
GetNextOutgoingUnidirectionalStreamId(QuicSession * session)22 QuicStreamId QuicSessionPeer::GetNextOutgoingUnidirectionalStreamId(
23 QuicSession* session) {
24 return session->GetNextOutgoingUnidirectionalStreamId();
25 }
26
27 // static
SetNextOutgoingBidirectionalStreamId(QuicSession * session,QuicStreamId id)28 void QuicSessionPeer::SetNextOutgoingBidirectionalStreamId(QuicSession* session,
29 QuicStreamId id) {
30 if (VersionHasIetfQuicFrames(session->transport_version())) {
31 session->ietf_streamid_manager_.bidirectional_stream_id_manager_
32 .next_outgoing_stream_id_ = id;
33 return;
34 }
35 session->stream_id_manager_.next_outgoing_stream_id_ = id;
36 }
37
38 // static
SetMaxOpenIncomingStreams(QuicSession * session,uint32_t max_streams)39 void QuicSessionPeer::SetMaxOpenIncomingStreams(QuicSession* session,
40 uint32_t max_streams) {
41 if (VersionHasIetfQuicFrames(session->transport_version())) {
42 QUIC_BUG(quic_bug_10193_1)
43 << "SetmaxOpenIncomingStreams deprecated for IETF QUIC";
44 session->ietf_streamid_manager_.SetMaxOpenIncomingUnidirectionalStreams(
45 max_streams);
46 session->ietf_streamid_manager_.SetMaxOpenIncomingBidirectionalStreams(
47 max_streams);
48 return;
49 }
50 session->stream_id_manager_.set_max_open_incoming_streams(max_streams);
51 }
52
53 // static
SetMaxOpenIncomingBidirectionalStreams(QuicSession * session,uint32_t max_streams)54 void QuicSessionPeer::SetMaxOpenIncomingBidirectionalStreams(
55 QuicSession* session, uint32_t max_streams) {
56 QUICHE_DCHECK(VersionHasIetfQuicFrames(session->transport_version()))
57 << "SetmaxOpenIncomingBidirectionalStreams not supported for Google "
58 "QUIC";
59 session->ietf_streamid_manager_.SetMaxOpenIncomingBidirectionalStreams(
60 max_streams);
61 }
62 // static
SetMaxOpenIncomingUnidirectionalStreams(QuicSession * session,uint32_t max_streams)63 void QuicSessionPeer::SetMaxOpenIncomingUnidirectionalStreams(
64 QuicSession* session, uint32_t max_streams) {
65 QUICHE_DCHECK(VersionHasIetfQuicFrames(session->transport_version()))
66 << "SetmaxOpenIncomingUnidirectionalStreams not supported for Google "
67 "QUIC";
68 session->ietf_streamid_manager_.SetMaxOpenIncomingUnidirectionalStreams(
69 max_streams);
70 }
71
72 // static
SetMaxOpenOutgoingStreams(QuicSession * session,uint32_t max_streams)73 void QuicSessionPeer::SetMaxOpenOutgoingStreams(QuicSession* session,
74 uint32_t max_streams) {
75 if (VersionHasIetfQuicFrames(session->transport_version())) {
76 QUIC_BUG(quic_bug_10193_2)
77 << "SetmaxOpenOutgoingStreams deprecated for IETF QUIC";
78 return;
79 }
80 session->stream_id_manager_.set_max_open_outgoing_streams(max_streams);
81 }
82
83 // static
SetMaxOpenOutgoingBidirectionalStreams(QuicSession * session,uint32_t max_streams)84 void QuicSessionPeer::SetMaxOpenOutgoingBidirectionalStreams(
85 QuicSession* session, uint32_t max_streams) {
86 QUICHE_DCHECK(VersionHasIetfQuicFrames(session->transport_version()))
87 << "SetmaxOpenOutgoingBidirectionalStreams not supported for Google "
88 "QUIC";
89 session->ietf_streamid_manager_.MaybeAllowNewOutgoingBidirectionalStreams(
90 max_streams);
91 }
92 // static
SetMaxOpenOutgoingUnidirectionalStreams(QuicSession * session,uint32_t max_streams)93 void QuicSessionPeer::SetMaxOpenOutgoingUnidirectionalStreams(
94 QuicSession* session, uint32_t max_streams) {
95 QUICHE_DCHECK(VersionHasIetfQuicFrames(session->transport_version()))
96 << "SetmaxOpenOutgoingUnidirectionalStreams not supported for Google "
97 "QUIC";
98 session->ietf_streamid_manager_.MaybeAllowNewOutgoingUnidirectionalStreams(
99 max_streams);
100 }
101
102 // static
GetMutableCryptoStream(QuicSession * session)103 QuicCryptoStream* QuicSessionPeer::GetMutableCryptoStream(
104 QuicSession* session) {
105 return session->GetMutableCryptoStream();
106 }
107
108 // static
GetWriteBlockedStreams(QuicSession * session)109 QuicWriteBlockedListInterface* QuicSessionPeer::GetWriteBlockedStreams(
110 QuicSession* session) {
111 return session->write_blocked_streams();
112 }
113
114 // static
GetOrCreateStream(QuicSession * session,QuicStreamId stream_id)115 QuicStream* QuicSessionPeer::GetOrCreateStream(QuicSession* session,
116 QuicStreamId stream_id) {
117 return session->GetOrCreateStream(stream_id);
118 }
119
120 // static
121 absl::flat_hash_map<QuicStreamId, QuicStreamOffset>&
GetLocallyClosedStreamsHighestOffset(QuicSession * session)122 QuicSessionPeer::GetLocallyClosedStreamsHighestOffset(QuicSession* session) {
123 return session->locally_closed_streams_highest_offset_;
124 }
125
126 // static
stream_map(QuicSession * session)127 QuicSession::StreamMap& QuicSessionPeer::stream_map(QuicSession* session) {
128 return session->stream_map_;
129 }
130
131 // static
closed_streams(QuicSession * session)132 const QuicSession::ClosedStreams& QuicSessionPeer::closed_streams(
133 QuicSession* session) {
134 return *session->closed_streams();
135 }
136
137 // static
ActivateStream(QuicSession * session,std::unique_ptr<QuicStream> stream)138 void QuicSessionPeer::ActivateStream(QuicSession* session,
139 std::unique_ptr<QuicStream> stream) {
140 return session->ActivateStream(std::move(stream));
141 }
142
143 // static
IsStreamClosed(QuicSession * session,QuicStreamId id)144 bool QuicSessionPeer::IsStreamClosed(QuicSession* session, QuicStreamId id) {
145 return session->IsClosedStream(id);
146 }
147
148 // static
IsStreamCreated(QuicSession * session,QuicStreamId id)149 bool QuicSessionPeer::IsStreamCreated(QuicSession* session, QuicStreamId id) {
150 return session->stream_map_.contains(id);
151 }
152
153 // static
IsStreamAvailable(QuicSession * session,QuicStreamId id)154 bool QuicSessionPeer::IsStreamAvailable(QuicSession* session, QuicStreamId id) {
155 if (VersionHasIetfQuicFrames(session->transport_version())) {
156 if (id % QuicUtils::StreamIdDelta(session->transport_version()) < 2) {
157 return session->ietf_streamid_manager_.bidirectional_stream_id_manager_
158 .available_streams_.contains(id);
159 }
160 return session->ietf_streamid_manager_.unidirectional_stream_id_manager_
161 .available_streams_.contains(id);
162 }
163 return session->stream_id_manager_.available_streams_.contains(id);
164 }
165
166 // static
GetStream(QuicSession * session,QuicStreamId id)167 QuicStream* QuicSessionPeer::GetStream(QuicSession* session, QuicStreamId id) {
168 return session->GetStream(id);
169 }
170
171 // static
IsStreamWriteBlocked(QuicSession * session,QuicStreamId id)172 bool QuicSessionPeer::IsStreamWriteBlocked(QuicSession* session,
173 QuicStreamId id) {
174 return session->write_blocked_streams()->IsStreamBlocked(id);
175 }
176
177 // static
GetCleanUpClosedStreamsAlarm(QuicSession * session)178 QuicAlarm* QuicSessionPeer::GetCleanUpClosedStreamsAlarm(QuicSession* session) {
179 return session->closed_streams_clean_up_alarm_.get();
180 }
181
182 // static
GetStreamIdManager(QuicSession * session)183 LegacyQuicStreamIdManager* QuicSessionPeer::GetStreamIdManager(
184 QuicSession* session) {
185 return &session->stream_id_manager_;
186 }
187
188 // static
ietf_streamid_manager(QuicSession * session)189 UberQuicStreamIdManager* QuicSessionPeer::ietf_streamid_manager(
190 QuicSession* session) {
191 return &session->ietf_streamid_manager_;
192 }
193
194 // static
ietf_bidirectional_stream_id_manager(QuicSession * session)195 QuicStreamIdManager* QuicSessionPeer::ietf_bidirectional_stream_id_manager(
196 QuicSession* session) {
197 return &session->ietf_streamid_manager_.bidirectional_stream_id_manager_;
198 }
199
200 // static
ietf_unidirectional_stream_id_manager(QuicSession * session)201 QuicStreamIdManager* QuicSessionPeer::ietf_unidirectional_stream_id_manager(
202 QuicSession* session) {
203 return &session->ietf_streamid_manager_.unidirectional_stream_id_manager_;
204 }
205
206 // static
GetPendingStream(QuicSession * session,QuicStreamId stream_id)207 PendingStream* QuicSessionPeer::GetPendingStream(QuicSession* session,
208 QuicStreamId stream_id) {
209 auto it = session->pending_stream_map_.find(stream_id);
210 return it == session->pending_stream_map_.end() ? nullptr : it->second.get();
211 }
212
213 // static
set_is_configured(QuicSession * session,bool value)214 void QuicSessionPeer::set_is_configured(QuicSession* session, bool value) {
215 session->is_configured_ = value;
216 }
217
218 // static
SetPerspective(QuicSession * session,Perspective perspective)219 void QuicSessionPeer::SetPerspective(QuicSession* session,
220 Perspective perspective) {
221 session->perspective_ = perspective;
222 }
223
224 // static
GetNumOpenDynamicStreams(QuicSession * session)225 size_t QuicSessionPeer::GetNumOpenDynamicStreams(QuicSession* session) {
226 size_t result = 0;
227 for (const auto& it : session->stream_map_) {
228 if (!it.second->is_static()) {
229 ++result;
230 }
231 }
232 // Exclude draining streams.
233 result -= session->num_draining_streams_;
234 // Add locally closed streams.
235 result += session->locally_closed_streams_highest_offset_.size();
236
237 return result;
238 }
239
240 // static
GetNumDrainingStreams(QuicSession * session)241 size_t QuicSessionPeer::GetNumDrainingStreams(QuicSession* session) {
242 return session->num_draining_streams_;
243 }
244
245 // static
GetStreamCountResetAlarm(QuicSession * session)246 QuicAlarm* QuicSessionPeer::GetStreamCountResetAlarm(QuicSession* session) {
247 return session->stream_count_reset_alarm_.get();
248 }
249
250 } // namespace test
251 } // namespace quic
252