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