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