• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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