xref: /aosp_15_r20/external/cronet/net/spdy/spdy_stream_test_util.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1 // Copyright 2012 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/spdy/spdy_stream_test_util.h"
6 
7 #include <cstddef>
8 #include <string_view>
9 #include <utility>
10 
11 #include "net/spdy/spdy_stream.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 
14 namespace net::test {
15 
ClosingDelegate(const base::WeakPtr<SpdyStream> & stream)16 ClosingDelegate::ClosingDelegate(
17     const base::WeakPtr<SpdyStream>& stream) : stream_(stream) {
18   DCHECK(stream_);
19 }
20 
21 ClosingDelegate::~ClosingDelegate() = default;
22 
OnHeadersSent()23 void ClosingDelegate::OnHeadersSent() {}
24 
OnEarlyHintsReceived(const spdy::Http2HeaderBlock & headers)25 void ClosingDelegate::OnEarlyHintsReceived(
26     const spdy::Http2HeaderBlock& headers) {}
27 
OnHeadersReceived(const spdy::Http2HeaderBlock & response_headers)28 void ClosingDelegate::OnHeadersReceived(
29     const spdy::Http2HeaderBlock& response_headers) {}
30 
OnDataReceived(std::unique_ptr<SpdyBuffer> buffer)31 void ClosingDelegate::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) {}
32 
OnDataSent()33 void ClosingDelegate::OnDataSent() {}
34 
OnTrailers(const spdy::Http2HeaderBlock & trailers)35 void ClosingDelegate::OnTrailers(const spdy::Http2HeaderBlock& trailers) {}
36 
OnClose(int status)37 void ClosingDelegate::OnClose(int status) {
38   DCHECK(stream_);
39   stream_->Close();
40   // The |stream_| may still be alive (if it is our delegate).
41 }
42 
CanGreaseFrameType() const43 bool ClosingDelegate::CanGreaseFrameType() const {
44   return false;
45 }
46 
source_dependency() const47 NetLogSource ClosingDelegate::source_dependency() const {
48   return NetLogSource();
49 }
50 
StreamDelegateBase(const base::WeakPtr<SpdyStream> & stream)51 StreamDelegateBase::StreamDelegateBase(const base::WeakPtr<SpdyStream>& stream)
52     : stream_(stream) {}
53 
54 StreamDelegateBase::~StreamDelegateBase() = default;
55 
OnHeadersSent()56 void StreamDelegateBase::OnHeadersSent() {
57   stream_id_ = stream_->stream_id();
58   EXPECT_NE(stream_id_, 0u);
59   send_headers_completed_ = true;
60 }
61 
OnEarlyHintsReceived(const spdy::Http2HeaderBlock & headers)62 void StreamDelegateBase::OnEarlyHintsReceived(
63     const spdy::Http2HeaderBlock& headers) {
64   EXPECT_TRUE(send_headers_completed_);
65   early_hints_.push_back(headers.Clone());
66 }
67 
OnHeadersReceived(const spdy::Http2HeaderBlock & response_headers)68 void StreamDelegateBase::OnHeadersReceived(
69     const spdy::Http2HeaderBlock& response_headers) {
70   EXPECT_TRUE(send_headers_completed_);
71   response_headers_ = response_headers.Clone();
72 }
73 
OnDataReceived(std::unique_ptr<SpdyBuffer> buffer)74 void StreamDelegateBase::OnDataReceived(std::unique_ptr<SpdyBuffer> buffer) {
75   if (buffer)
76     received_data_queue_.Enqueue(std::move(buffer));
77 }
78 
OnDataSent()79 void StreamDelegateBase::OnDataSent() {}
80 
OnTrailers(const spdy::Http2HeaderBlock & trailers)81 void StreamDelegateBase::OnTrailers(const spdy::Http2HeaderBlock& trailers) {}
82 
OnClose(int status)83 void StreamDelegateBase::OnClose(int status) {
84   if (!stream_.get())
85     return;
86   stream_id_ = stream_->stream_id();
87   stream_->GetLoadTimingInfo(&load_timing_info_);
88   stream_.reset();
89   callback_.callback().Run(status);
90 }
91 
CanGreaseFrameType() const92 bool StreamDelegateBase::CanGreaseFrameType() const {
93   return false;
94 }
95 
source_dependency() const96 NetLogSource StreamDelegateBase::source_dependency() const {
97   return NetLogSource();
98 }
99 
WaitForClose()100 int StreamDelegateBase::WaitForClose() {
101   int result = callback_.WaitForResult();
102   EXPECT_TRUE(!stream_.get());
103   return result;
104 }
105 
TakeReceivedData()106 std::string StreamDelegateBase::TakeReceivedData() {
107   size_t len = received_data_queue_.GetTotalSize();
108   std::string received_data(len, '\0');
109   if (len > 0) {
110     EXPECT_EQ(len, received_data_queue_.Dequeue(std::data(received_data), len));
111   }
112   return received_data;
113 }
114 
GetResponseHeaderValue(const std::string & name) const115 std::string StreamDelegateBase::GetResponseHeaderValue(
116     const std::string& name) const {
117   spdy::Http2HeaderBlock::const_iterator it = response_headers_.find(name);
118   return (it == response_headers_.end()) ? std::string()
119                                          : std::string(it->second);
120 }
121 
GetLoadTimingInfo()122 const LoadTimingInfo& StreamDelegateBase::GetLoadTimingInfo() {
123   DCHECK(StreamIsClosed());
124   return load_timing_info_;
125 }
126 
StreamDelegateDoNothing(const base::WeakPtr<SpdyStream> & stream)127 StreamDelegateDoNothing::StreamDelegateDoNothing(
128     const base::WeakPtr<SpdyStream>& stream)
129     : StreamDelegateBase(stream) {}
130 
131 StreamDelegateDoNothing::~StreamDelegateDoNothing() = default;
132 
StreamDelegateConsumeData(const base::WeakPtr<SpdyStream> & stream)133 StreamDelegateConsumeData::StreamDelegateConsumeData(
134     const base::WeakPtr<SpdyStream>& stream)
135     : StreamDelegateBase(stream) {}
136 
137 StreamDelegateConsumeData::~StreamDelegateConsumeData() = default;
138 
OnDataReceived(std::unique_ptr<SpdyBuffer> buffer)139 void StreamDelegateConsumeData::OnDataReceived(
140     std::unique_ptr<SpdyBuffer> buffer) {
141   buffer->Consume(buffer->GetRemainingSize());
142 }
143 
StreamDelegateSendImmediate(const base::WeakPtr<SpdyStream> & stream,std::string_view data)144 StreamDelegateSendImmediate::StreamDelegateSendImmediate(
145     const base::WeakPtr<SpdyStream>& stream,
146     std::string_view data)
147     : StreamDelegateBase(stream), data_(data) {}
148 
149 StreamDelegateSendImmediate::~StreamDelegateSendImmediate() = default;
150 
OnHeadersReceived(const spdy::Http2HeaderBlock & response_headers)151 void StreamDelegateSendImmediate::OnHeadersReceived(
152     const spdy::Http2HeaderBlock& response_headers) {
153   StreamDelegateBase::OnHeadersReceived(response_headers);
154   if (data_.data()) {
155     scoped_refptr<StringIOBuffer> buf =
156         base::MakeRefCounted<StringIOBuffer>(std::string(data_));
157     stream()->SendData(buf.get(), buf->size(), MORE_DATA_TO_SEND);
158   }
159 }
160 
StreamDelegateWithBody(const base::WeakPtr<SpdyStream> & stream,std::string_view data)161 StreamDelegateWithBody::StreamDelegateWithBody(
162     const base::WeakPtr<SpdyStream>& stream,
163     std::string_view data)
164     : StreamDelegateBase(stream),
165       buf_(base::MakeRefCounted<StringIOBuffer>(std::string(data))) {}
166 
167 StreamDelegateWithBody::~StreamDelegateWithBody() = default;
168 
OnHeadersSent()169 void StreamDelegateWithBody::OnHeadersSent() {
170   StreamDelegateBase::OnHeadersSent();
171   stream()->SendData(buf_.get(), buf_->size(), NO_MORE_DATA_TO_SEND);
172 }
173 
StreamDelegateCloseOnHeaders(const base::WeakPtr<SpdyStream> & stream)174 StreamDelegateCloseOnHeaders::StreamDelegateCloseOnHeaders(
175     const base::WeakPtr<SpdyStream>& stream)
176     : StreamDelegateBase(stream) {
177 }
178 
179 StreamDelegateCloseOnHeaders::~StreamDelegateCloseOnHeaders() = default;
180 
OnHeadersReceived(const spdy::Http2HeaderBlock & response_headers)181 void StreamDelegateCloseOnHeaders::OnHeadersReceived(
182     const spdy::Http2HeaderBlock& response_headers) {
183   stream()->Cancel(ERR_ABORTED);
184 }
185 
StreamDelegateDetectEOF(const base::WeakPtr<SpdyStream> & stream)186 StreamDelegateDetectEOF::StreamDelegateDetectEOF(
187     const base::WeakPtr<SpdyStream>& stream)
188     : StreamDelegateBase(stream) {}
189 
190 StreamDelegateDetectEOF::~StreamDelegateDetectEOF() = default;
191 
OnDataReceived(std::unique_ptr<SpdyBuffer> buffer)192 void StreamDelegateDetectEOF::OnDataReceived(
193     std::unique_ptr<SpdyBuffer> buffer) {
194   if (!buffer)
195     eof_detected_ = true;
196 }
197 
198 }  // namespace net::test
199