Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: net/http/bidirectional_stream_unittest.cc

Issue 2227083002: Remove net::BidirectionalStream::Cancel (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: fix typo Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/http/bidirectional_stream.h" 5 #include "net/http/bidirectional_stream.h"
6 6
7 #include <memory> 7 #include <memory>
8 #include <utility> 8 #include <utility>
9 9
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
52 read_buf_len, 52 read_buf_len,
53 base::WrapUnique(new base::Timer(false, false))) {} 53 base::WrapUnique(new base::Timer(false, false))) {}
54 54
55 TestDelegateBase(IOBuffer* read_buf, 55 TestDelegateBase(IOBuffer* read_buf,
56 int read_buf_len, 56 int read_buf_len,
57 std::unique_ptr<base::Timer> timer) 57 std::unique_ptr<base::Timer> timer)
58 : read_buf_(read_buf), 58 : read_buf_(read_buf),
59 read_buf_len_(read_buf_len), 59 read_buf_len_(read_buf_len),
60 timer_(std::move(timer)), 60 timer_(std::move(timer)),
61 loop_(nullptr), 61 loop_(nullptr),
62 received_bytes_(0),
63 sent_bytes_(0),
62 error_(OK), 64 error_(OK),
63 on_data_read_count_(0), 65 on_data_read_count_(0),
64 on_data_sent_count_(0), 66 on_data_sent_count_(0),
65 do_not_start_read_(false), 67 do_not_start_read_(false),
66 run_until_completion_(false), 68 run_until_completion_(false),
67 not_expect_callback_(false) {} 69 not_expect_callback_(false) {}
68 70
69 ~TestDelegateBase() override {} 71 ~TestDelegateBase() override {}
70 72
71 void OnStreamReady(bool request_headers_sent) override { 73 void OnStreamReady(bool request_headers_sent) override {
72 // Request headers should always be sent in H2's case, because the 74 // Request headers should always be sent in H2's case, because the
73 // functionality to combine header frame with data frames is not 75 // functionality to combine header frame with data frames is not
74 // implemented. 76 // implemented.
75 EXPECT_TRUE(request_headers_sent); 77 EXPECT_TRUE(request_headers_sent);
76 if (callback_.is_null()) 78 if (callback_.is_null())
77 return; 79 return;
78 callback_.Run(OK); 80 callback_.Run(OK);
79 } 81 }
80 82
81 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { 83 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override {
82 CHECK(!not_expect_callback_); 84 CHECK(!not_expect_callback_);
83 85
84 response_headers_ = response_headers.Clone(); 86 response_headers_ = response_headers.Clone();
87
85 if (!do_not_start_read_) 88 if (!do_not_start_read_)
86 StartOrContinueReading(); 89 StartOrContinueReading();
87 } 90 }
88 91
89 void OnDataRead(int bytes_read) override { 92 void OnDataRead(int bytes_read) override {
90 CHECK(!not_expect_callback_); 93 CHECK(!not_expect_callback_);
91 94
92 ++on_data_read_count_; 95 ++on_data_read_count_;
93 CHECK_GE(bytes_read, OK); 96 CHECK_GE(bytes_read, OK);
94 data_received_.append(read_buf_->data(), bytes_read); 97 data_received_.append(read_buf_->data(), bytes_read);
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 // Calls ReadData on the |stream_| and updates internal states. 171 // Calls ReadData on the |stream_| and updates internal states.
169 int ReadData() { 172 int ReadData() {
170 not_expect_callback_ = true; 173 not_expect_callback_ = true;
171 int rv = stream_->ReadData(read_buf_.get(), read_buf_len_); 174 int rv = stream_->ReadData(read_buf_.get(), read_buf_len_);
172 not_expect_callback_ = false; 175 not_expect_callback_ = false;
173 if (rv > 0) 176 if (rv > 0)
174 data_received_.append(read_buf_->data(), rv); 177 data_received_.append(read_buf_->data(), rv);
175 return rv; 178 return rv;
176 } 179 }
177 180
178 // Cancels |stream_|. 181 // Deletes |stream_|.
179 void CancelStream() { stream_->Cancel(); } 182 void DeleteStream() {
183 next_proto_ = stream_->GetProtocol();
184 received_bytes_ = stream_->GetTotalReceivedBytes();
185 sent_bytes_ = stream_->GetTotalSentBytes();
186 stream_.reset();
187 }
180 188
181 // Deletes |stream_|. 189 NextProto GetProtocol() const {
182 void DeleteStream() { stream_.reset(); } 190 if (stream_)
183 191 return stream_->GetProtocol();
184 NextProto GetProtocol() const { return stream_->GetProtocol(); } 192 return next_proto_;
193 }
185 194
186 int64_t GetTotalReceivedBytes() const { 195 int64_t GetTotalReceivedBytes() const {
187 return stream_->GetTotalReceivedBytes(); 196 if (stream_)
197 return stream_->GetTotalReceivedBytes();
198 return received_bytes_;
188 } 199 }
189 200
190 int64_t GetTotalSentBytes() const { return stream_->GetTotalSentBytes(); } 201 int64_t GetTotalSentBytes() const {
202 if (stream_)
203 return stream_->GetTotalSentBytes();
204 return sent_bytes_;
205 }
191 206
192 // Const getters for internal states. 207 // Const getters for internal states.
193 const std::string& data_received() const { return data_received_; } 208 const std::string& data_received() const { return data_received_; }
194 int error() const { return error_; } 209 int error() const { return error_; }
195 const SpdyHeaderBlock& response_headers() const { return response_headers_; } 210 const SpdyHeaderBlock& response_headers() const { return response_headers_; }
196 const SpdyHeaderBlock& trailers() const { return trailers_; } 211 const SpdyHeaderBlock& trailers() const { return trailers_; }
197 int on_data_read_count() const { return on_data_read_count_; } 212 int on_data_read_count() const { return on_data_read_count_; }
198 int on_data_sent_count() const { return on_data_sent_count_; } 213 int on_data_sent_count() const { return on_data_sent_count_; }
199 214
200 // Sets whether the delegate should automatically start reading. 215 // Sets whether the delegate should automatically start reading.
(...skipping 12 matching lines...) Expand all
213 228
214 private: 229 private:
215 std::unique_ptr<BidirectionalStream> stream_; 230 std::unique_ptr<BidirectionalStream> stream_;
216 scoped_refptr<IOBuffer> read_buf_; 231 scoped_refptr<IOBuffer> read_buf_;
217 int read_buf_len_; 232 int read_buf_len_;
218 std::unique_ptr<base::Timer> timer_; 233 std::unique_ptr<base::Timer> timer_;
219 std::string data_received_; 234 std::string data_received_;
220 std::unique_ptr<base::RunLoop> loop_; 235 std::unique_ptr<base::RunLoop> loop_;
221 SpdyHeaderBlock response_headers_; 236 SpdyHeaderBlock response_headers_;
222 SpdyHeaderBlock trailers_; 237 SpdyHeaderBlock trailers_;
238 NextProto next_proto_;
239 int64_t received_bytes_;
240 int64_t sent_bytes_;
223 int error_; 241 int error_;
224 int on_data_read_count_; 242 int on_data_read_count_;
225 int on_data_sent_count_; 243 int on_data_sent_count_;
226 bool do_not_start_read_; 244 bool do_not_start_read_;
227 bool run_until_completion_; 245 bool run_until_completion_;
228 // This is to ensure that delegate callback is not invoked synchronously when 246 // This is to ensure that delegate callback is not invoked synchronously when
229 // calling into |stream_|. 247 // calling into |stream_|.
230 bool not_expect_callback_; 248 bool not_expect_callback_;
231 249
232 CompletionCallback callback_; 250 CompletionCallback callback_;
233 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase); 251 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase);
234 }; 252 };
235 253
236 // A delegate that deletes the stream in a particular callback. 254 // A delegate that deletes the stream in a particular callback.
237 class CancelOrDeleteStreamDelegate : public TestDelegateBase { 255 class DeleteStreamDelegate : public TestDelegateBase {
238 public: 256 public:
239 // Specifies in which callback the stream can be deleted. 257 // Specifies in which callback the stream can be deleted.
240 enum Phase { 258 enum Phase {
241 ON_HEADERS_RECEIVED, 259 ON_HEADERS_RECEIVED,
242 ON_DATA_READ, 260 ON_DATA_READ,
243 ON_TRAILERS_RECEIVED, 261 ON_TRAILERS_RECEIVED,
244 ON_FAILED, 262 ON_FAILED,
245 }; 263 };
246 264
247 CancelOrDeleteStreamDelegate(IOBuffer* buf, 265 DeleteStreamDelegate(IOBuffer* buf, int buf_len, Phase phase)
248 int buf_len, 266 : TestDelegateBase(buf, buf_len), phase_(phase) {}
249 Phase phase, 267 ~DeleteStreamDelegate() override {}
250 bool do_cancel)
251 : TestDelegateBase(buf, buf_len), phase_(phase), do_cancel_(do_cancel) {}
252 ~CancelOrDeleteStreamDelegate() override {}
253 268
254 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override { 269 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override {
255 TestDelegateBase::OnHeadersReceived(response_headers); 270 TestDelegateBase::OnHeadersReceived(response_headers);
256 if (phase_ == ON_HEADERS_RECEIVED) { 271 if (phase_ == ON_HEADERS_RECEIVED) {
257 CancelOrDelete(); 272 DeleteStream();
258 QuitLoop(); 273 QuitLoop();
259 } 274 }
260 } 275 }
261 276
262 void OnDataSent() override { NOTREACHED(); } 277 void OnDataSent() override { NOTREACHED(); }
263 278
264 void OnDataRead(int bytes_read) override { 279 void OnDataRead(int bytes_read) override {
265 if (phase_ == ON_HEADERS_RECEIVED) { 280 if (phase_ == ON_HEADERS_RECEIVED) {
266 NOTREACHED(); 281 NOTREACHED();
267 return; 282 return;
268 } 283 }
269 TestDelegateBase::OnDataRead(bytes_read); 284 TestDelegateBase::OnDataRead(bytes_read);
270 if (phase_ == ON_DATA_READ) { 285 if (phase_ == ON_DATA_READ) {
271 CancelOrDelete(); 286 DeleteStream();
272 QuitLoop(); 287 QuitLoop();
273 } 288 }
274 } 289 }
275 290
276 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override { 291 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override {
277 if (phase_ == ON_HEADERS_RECEIVED || phase_ == ON_DATA_READ) { 292 if (phase_ == ON_HEADERS_RECEIVED || phase_ == ON_DATA_READ) {
278 NOTREACHED(); 293 NOTREACHED();
279 return; 294 return;
280 } 295 }
281 TestDelegateBase::OnTrailersReceived(trailers); 296 TestDelegateBase::OnTrailersReceived(trailers);
282 if (phase_ == ON_TRAILERS_RECEIVED) { 297 if (phase_ == ON_TRAILERS_RECEIVED) {
283 CancelOrDelete(); 298 DeleteStream();
284 QuitLoop(); 299 QuitLoop();
285 } 300 }
286 } 301 }
287 302
288 void OnFailed(int error) override { 303 void OnFailed(int error) override {
289 if (phase_ != ON_FAILED) { 304 if (phase_ != ON_FAILED) {
290 NOTREACHED(); 305 NOTREACHED();
291 return; 306 return;
292 } 307 }
293 TestDelegateBase::OnFailed(error); 308 TestDelegateBase::OnFailed(error);
294 CancelOrDelete(); 309 DeleteStream();
295 QuitLoop(); 310 QuitLoop();
296 } 311 }
297 312
298 private: 313 private:
299 void CancelOrDelete() {
300 if (do_cancel_) {
301 CancelStream();
302 } else {
303 DeleteStream();
304 }
305 }
306
307 // Indicates in which callback the delegate should cancel or delete the 314 // Indicates in which callback the delegate should cancel or delete the
308 // stream. 315 // stream.
309 Phase phase_; 316 Phase phase_;
310 // Indicates whether to cancel or delete the stream.
311 bool do_cancel_;
312 317
313 DISALLOW_COPY_AND_ASSIGN(CancelOrDeleteStreamDelegate); 318 DISALLOW_COPY_AND_ASSIGN(DeleteStreamDelegate);
314 }; 319 };
315 320
316 // A Timer that does not start a delayed task unless the timer is fired. 321 // A Timer that does not start a delayed task unless the timer is fired.
317 class MockTimer : public base::MockTimer { 322 class MockTimer : public base::MockTimer {
318 public: 323 public:
319 MockTimer() : base::MockTimer(false, false) {} 324 MockTimer() : base::MockTimer(false, false) {}
320 ~MockTimer() override {} 325 ~MockTimer() override {}
321 326
322 void Start(const tracked_objects::Location& posted_from, 327 void Start(const tracked_objects::Location& posted_from,
323 base::TimeDelta delay, 328 base::TimeDelta delay,
(...skipping 733 matching lines...) Expand 10 before | Expand all | Expand 10 after
1057 EXPECT_EQ("header-value", response_headers.find("header-name")->second); 1062 EXPECT_EQ("header-value", response_headers.find("header-name")->second);
1058 EXPECT_EQ("bar", delegate->trailers().find("foo")->second); 1063 EXPECT_EQ("bar", delegate->trailers().find("foo")->second);
1059 EXPECT_EQ(0, delegate->on_data_sent_count()); 1064 EXPECT_EQ(0, delegate->on_data_sent_count());
1060 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); 1065 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1061 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)), 1066 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes)),
1062 delegate->GetTotalSentBytes()); 1067 delegate->GetTotalSentBytes());
1063 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)), 1068 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)),
1064 delegate->GetTotalReceivedBytes()); 1069 delegate->GetTotalReceivedBytes());
1065 } 1070 }
1066 1071
1067 TEST_F(BidirectionalStreamTest, CancelStreamAfterSendData) { 1072 TEST_F(BidirectionalStreamTest, DeleteStreamAfterSendData) {
1068 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1073 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1069 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); 1074 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0));
1070 SpdySerializedFrame data_frame(spdy_util_.ConstructSpdyDataFrame( 1075 SpdySerializedFrame data_frame(spdy_util_.ConstructSpdyDataFrame(
1071 1, kBodyData, kBodyDataSize, /*fin=*/false)); 1076 1, kBodyData, kBodyDataSize, /*fin=*/false));
1072 SpdySerializedFrame rst( 1077 SpdySerializedFrame rst(
1073 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1078 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1074 1079
1075 MockWrite writes[] = { 1080 MockWrite writes[] = {
1076 CreateMockWrite(req, 0), CreateMockWrite(data_frame, 3), 1081 CreateMockWrite(req, 0), CreateMockWrite(data_frame, 3),
1077 CreateMockWrite(rst, 5), 1082 CreateMockWrite(rst, 5),
(...skipping 28 matching lines...) Expand all
1106 // Send the request and receive response headers. 1111 // Send the request and receive response headers.
1107 sequenced_data_->RunUntilPaused(); 1112 sequenced_data_->RunUntilPaused();
1108 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); 1113 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1109 1114
1110 // Send a DATA frame. 1115 // Send a DATA frame.
1111 scoped_refptr<StringIOBuffer> buf( 1116 scoped_refptr<StringIOBuffer> buf(
1112 new StringIOBuffer(std::string(kBodyData, kBodyDataSize))); 1117 new StringIOBuffer(std::string(kBodyData, kBodyDataSize)));
1113 delegate->SendData(buf, buf->size(), false); 1118 delegate->SendData(buf, buf->size(), false);
1114 sequenced_data_->Resume(); 1119 sequenced_data_->Resume();
1115 base::RunLoop().RunUntilIdle(); 1120 base::RunLoop().RunUntilIdle();
1116 // Cancel the stream. 1121
1117 delegate->CancelStream(); 1122 delegate->DeleteStream();
1118 sequenced_data_->Resume(); 1123 sequenced_data_->Resume();
1119 base::RunLoop().RunUntilIdle(); 1124 base::RunLoop().RunUntilIdle();
1120 1125
1121 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); 1126 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
1122 EXPECT_EQ(0, delegate->on_data_read_count()); 1127 EXPECT_EQ(0, delegate->on_data_read_count());
1123 // EXPECT_EQ(1, delegate->on_data_send_count());
1124 // OnDataSent may or may not have been invoked. 1128 // OnDataSent may or may not have been invoked.
1125 // Calling after stream is canceled gives kProtoUnknown. 1129 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1126 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); 1130 // Bytes sent excludes the RST frame.
1127 EXPECT_EQ(0, delegate->GetTotalSentBytes()); 1131 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1),
1128 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); 1132 delegate->GetTotalSentBytes());
1133 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)),
1134 delegate->GetTotalReceivedBytes());
1129 } 1135 }
1130 1136
1131 TEST_F(BidirectionalStreamTest, CancelStreamDuringReadData) { 1137 TEST_F(BidirectionalStreamTest, DeleteStreamDuringReadData) {
1132 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1138 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1133 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0)); 1139 kDefaultUrl, 1, kBodyDataSize * 3, LOWEST, nullptr, 0));
1134 SpdySerializedFrame rst( 1140 SpdySerializedFrame rst(
1135 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1141 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1136 1142
1137 MockWrite writes[] = { 1143 MockWrite writes[] = {
1138 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), 1144 CreateMockWrite(req, 0), CreateMockWrite(rst, 4),
1139 }; 1145 };
1140 1146
1141 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1)); 1147 SpdySerializedFrame resp(spdy_util_.ConstructSpdyGetReply(nullptr, 0, 1));
(...skipping 18 matching lines...) Expand all
1160 1166
1161 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); 1167 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
1162 std::unique_ptr<TestDelegateBase> delegate( 1168 std::unique_ptr<TestDelegateBase> delegate(
1163 new TestDelegateBase(read_buffer.get(), kReadBufferSize)); 1169 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
1164 delegate->set_do_not_start_read(true); 1170 delegate->set_do_not_start_read(true);
1165 delegate->Start(std::move(request_info), http_session_.get()); 1171 delegate->Start(std::move(request_info), http_session_.get());
1166 // Send the request and receive response headers. 1172 // Send the request and receive response headers.
1167 base::RunLoop().RunUntilIdle(); 1173 base::RunLoop().RunUntilIdle();
1168 1174
1169 EXPECT_EQ("200", delegate->response_headers().find(":status")->second); 1175 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
1170 // Cancel the stream after ReadData returns ERR_IO_PENDING. 1176 // Delete the stream after ReadData returns ERR_IO_PENDING.
1171 int rv = delegate->ReadData(); 1177 int rv = delegate->ReadData();
1172 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol()); 1178 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1173 EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); 1179 EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
1174 delegate->CancelStream(); 1180 delegate->DeleteStream();
1175 sequenced_data_->Resume(); 1181 sequenced_data_->Resume();
1176 base::RunLoop().RunUntilIdle(); 1182 base::RunLoop().RunUntilIdle();
1177 1183
1178 EXPECT_EQ(0, delegate->on_data_read_count()); 1184 EXPECT_EQ(0, delegate->on_data_read_count());
1179 EXPECT_EQ(0, delegate->on_data_sent_count()); 1185 EXPECT_EQ(0, delegate->on_data_sent_count());
1180 // Calling after stream is canceled gives kProtoUnknown. 1186 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1181 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); 1187 // Bytes sent excludes the RST frame.
1182 EXPECT_EQ(0, delegate->GetTotalSentBytes()); 1188 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1),
1183 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); 1189 delegate->GetTotalSentBytes());
1190 // Response body frame isn't read becase stream is deleted once read returns
1191 // ERR_IO_PENDING.
1192 EXPECT_EQ(CountReadBytes(reads, arraysize(reads) - 2),
1193 delegate->GetTotalReceivedBytes());
1184 } 1194 }
1185 1195
1186 // Receiving a header with uppercase ASCII will result in a protocol error, 1196 // Receiving a header with uppercase ASCII will result in a protocol error,
1187 // which should be propagated via Delegate::OnFailed. 1197 // which should be propagated via Delegate::OnFailed.
1188 TEST_F(BidirectionalStreamTest, PropagateProtocolError) { 1198 TEST_F(BidirectionalStreamTest, PropagateProtocolError) {
1189 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost( 1199 SpdySerializedFrame req(spdy_util_.ConstructSpdyPost(
1190 kDefaultUrl, 1, kBodyDataSize * 3, LOW, nullptr, 0)); 1200 kDefaultUrl, 1, kBodyDataSize * 3, LOW, nullptr, 0));
1191 SpdySerializedFrame rst( 1201 SpdySerializedFrame rst(
1192 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 1202 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
1193 1203
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1244 1254
1245 index = ExpectLogContainsSomewhere(entries, index, 1255 index = ExpectLogContainsSomewhere(entries, index,
1246 NetLog::TYPE_BIDIRECTIONAL_STREAM_FAILED, 1256 NetLog::TYPE_BIDIRECTIONAL_STREAM_FAILED,
1247 NetLog::PHASE_NONE); 1257 NetLog::PHASE_NONE);
1248 entry = entries[index]; 1258 entry = entries[index];
1249 int net_error = OK; 1259 int net_error = OK;
1250 EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error)); 1260 EXPECT_TRUE(entry.params->GetInteger("net_error", &net_error));
1251 EXPECT_THAT(net_error, IsError(ERR_SPDY_PROTOCOL_ERROR)); 1261 EXPECT_THAT(net_error, IsError(ERR_SPDY_PROTOCOL_ERROR));
1252 } 1262 }
1253 1263
1254 INSTANTIATE_TEST_CASE_P(CancelOrDeleteTests, 1264 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnHeadersReceived) {
1255 BidirectionalStreamTest,
1256 ::testing::Values(true, false));
1257
1258 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnHeadersReceived) {
1259 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); 1265 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST));
1260 1266
1261 SpdySerializedFrame rst( 1267 SpdySerializedFrame rst(
1262 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1268 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1263 MockWrite writes[] = { 1269 MockWrite writes[] = {
1264 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), 1270 CreateMockWrite(req, 0), CreateMockWrite(rst, 2),
1265 }; 1271 };
1266 1272
1267 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; 1273 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"};
1268 1274
1269 SpdySerializedFrame resp( 1275 SpdySerializedFrame resp(
1270 spdy_util_.ConstructSpdyGetReply(kExtraResponseHeaders, 1, 1)); 1276 spdy_util_.ConstructSpdyGetReply(kExtraResponseHeaders, 1, 1));
1271 1277
1272 MockRead reads[] = { 1278 MockRead reads[] = {
1273 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), 1279 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3),
1274 }; 1280 };
1275 1281
1276 InitSession(reads, arraysize(reads), writes, arraysize(writes)); 1282 InitSession(reads, arraysize(reads), writes, arraysize(writes));
1277 1283
1278 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( 1284 std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
1279 new BidirectionalStreamRequestInfo); 1285 new BidirectionalStreamRequestInfo);
1280 request_info->method = "GET"; 1286 request_info->method = "GET";
1281 request_info->url = default_url_; 1287 request_info->url = default_url_;
1282 request_info->priority = LOWEST; 1288 request_info->priority = LOWEST;
1283 request_info->end_stream_on_headers = true; 1289 request_info->end_stream_on_headers = true;
1284 1290
1285 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); 1291 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
1286 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( 1292 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
1287 new CancelOrDeleteStreamDelegate( 1293 read_buffer.get(), kReadBufferSize,
1288 read_buffer.get(), kReadBufferSize, 1294 DeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED));
1289 CancelOrDeleteStreamDelegate::Phase::ON_HEADERS_RECEIVED,
1290 GetParam()));
1291 delegate->SetRunUntilCompletion(true); 1295 delegate->SetRunUntilCompletion(true);
1292 delegate->Start(std::move(request_info), http_session_.get()); 1296 delegate->Start(std::move(request_info), http_session_.get());
1293 // Makes sure delegate does not get called. 1297 // Makes sure delegate does not get called.
1294 base::RunLoop().RunUntilIdle(); 1298 base::RunLoop().RunUntilIdle();
1295 const SpdyHeaderBlock& response_headers = delegate->response_headers(); 1299 const SpdyHeaderBlock& response_headers = delegate->response_headers();
1296 EXPECT_EQ("200", response_headers.find(":status")->second); 1300 EXPECT_EQ("200", response_headers.find(":status")->second);
1297 EXPECT_EQ("header-value", response_headers.find("header-name")->second); 1301 EXPECT_EQ("header-value", response_headers.find("header-name")->second);
1298 EXPECT_EQ(0u, delegate->data_received().size()); 1302 EXPECT_EQ(0u, delegate->data_received().size());
1299 EXPECT_EQ(0, delegate->on_data_sent_count()); 1303 EXPECT_EQ(0, delegate->on_data_sent_count());
1300 EXPECT_EQ(0, delegate->on_data_read_count()); 1304 EXPECT_EQ(0, delegate->on_data_read_count());
1301 1305
1302 // If stream is destroyed, do not call into stream. 1306 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1303 if (!GetParam()) 1307 // Bytes sent excludes the RST frame.
1304 return; 1308 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1),
1305 EXPECT_EQ(0, delegate->GetTotalSentBytes()); 1309 delegate->GetTotalSentBytes());
1306 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); 1310 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)),
1307 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); 1311 delegate->GetTotalReceivedBytes());
1308 } 1312 }
1309 1313
1310 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnDataRead) { 1314 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnDataRead) {
1311 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); 1315 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST));
1312 1316
1313 SpdySerializedFrame rst( 1317 SpdySerializedFrame rst(
1314 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1318 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1315 MockWrite writes[] = { 1319 MockWrite writes[] = {
1316 CreateMockWrite(req, 0), CreateMockWrite(rst, 3), 1320 CreateMockWrite(req, 0), CreateMockWrite(rst, 3),
1317 }; 1321 };
1318 1322
1319 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; 1323 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"};
1320 1324
(...skipping 11 matching lines...) Expand all
1332 InitSession(reads, arraysize(reads), writes, arraysize(writes)); 1336 InitSession(reads, arraysize(reads), writes, arraysize(writes));
1333 1337
1334 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( 1338 std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
1335 new BidirectionalStreamRequestInfo); 1339 new BidirectionalStreamRequestInfo);
1336 request_info->method = "GET"; 1340 request_info->method = "GET";
1337 request_info->url = default_url_; 1341 request_info->url = default_url_;
1338 request_info->priority = LOWEST; 1342 request_info->priority = LOWEST;
1339 request_info->end_stream_on_headers = true; 1343 request_info->end_stream_on_headers = true;
1340 1344
1341 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); 1345 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
1342 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( 1346 std::unique_ptr<DeleteStreamDelegate> delegate(
1343 new CancelOrDeleteStreamDelegate( 1347 new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize,
1344 read_buffer.get(), kReadBufferSize, 1348 DeleteStreamDelegate::Phase::ON_DATA_READ));
1345 CancelOrDeleteStreamDelegate::Phase::ON_DATA_READ, GetParam()));
1346 delegate->SetRunUntilCompletion(true); 1349 delegate->SetRunUntilCompletion(true);
1347 delegate->Start(std::move(request_info), http_session_.get()); 1350 delegate->Start(std::move(request_info), http_session_.get());
1348 // Makes sure delegate does not get called. 1351 // Makes sure delegate does not get called.
1349 base::RunLoop().RunUntilIdle(); 1352 base::RunLoop().RunUntilIdle();
1350 const SpdyHeaderBlock& response_headers = delegate->response_headers(); 1353 const SpdyHeaderBlock& response_headers = delegate->response_headers();
1351 EXPECT_EQ("200", response_headers.find(":status")->second); 1354 EXPECT_EQ("200", response_headers.find(":status")->second);
1352 EXPECT_EQ("header-value", response_headers.find("header-name")->second); 1355 EXPECT_EQ("header-value", response_headers.find("header-name")->second);
1353 EXPECT_EQ(kUploadDataSize * 1, 1356 EXPECT_EQ(kUploadDataSize * 1,
1354 static_cast<int>(delegate->data_received().size())); 1357 static_cast<int>(delegate->data_received().size()));
1355 EXPECT_EQ(0, delegate->on_data_sent_count()); 1358 EXPECT_EQ(0, delegate->on_data_sent_count());
1356 1359
1357 // If stream is destroyed, do not call into stream. 1360 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1358 if (!GetParam()) 1361 // Bytes sent excludes the RST frame.
1359 return; 1362 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1),
1360 EXPECT_EQ(0, delegate->GetTotalSentBytes()); 1363 delegate->GetTotalSentBytes());
1361 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); 1364 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)),
1362 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); 1365 delegate->GetTotalReceivedBytes());
1363 } 1366 }
1364 1367
1365 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnTrailersReceived) { 1368 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnTrailersReceived) {
1366 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); 1369 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST));
1367 1370
1368 SpdySerializedFrame rst( 1371 SpdySerializedFrame rst(
1369 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL)); 1372 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_CANCEL));
1370 MockWrite writes[] = { 1373 MockWrite writes[] = {
1371 CreateMockWrite(req, 0), CreateMockWrite(rst, 4), 1374 CreateMockWrite(req, 0), CreateMockWrite(rst, 4),
1372 }; 1375 };
1373 1376
1374 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"}; 1377 const char* const kExtraResponseHeaders[] = {"header-name", "header-value"};
1375 1378
(...skipping 16 matching lines...) Expand all
1392 InitSession(reads, arraysize(reads), writes, arraysize(writes)); 1395 InitSession(reads, arraysize(reads), writes, arraysize(writes));
1393 1396
1394 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( 1397 std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
1395 new BidirectionalStreamRequestInfo); 1398 new BidirectionalStreamRequestInfo);
1396 request_info->method = "GET"; 1399 request_info->method = "GET";
1397 request_info->url = default_url_; 1400 request_info->url = default_url_;
1398 request_info->priority = LOWEST; 1401 request_info->priority = LOWEST;
1399 request_info->end_stream_on_headers = true; 1402 request_info->end_stream_on_headers = true;
1400 1403
1401 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); 1404 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
1402 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( 1405 std::unique_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
1403 new CancelOrDeleteStreamDelegate( 1406 read_buffer.get(), kReadBufferSize,
1404 read_buffer.get(), kReadBufferSize, 1407 DeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED));
1405 CancelOrDeleteStreamDelegate::Phase::ON_TRAILERS_RECEIVED,
1406 GetParam()));
1407 delegate->SetRunUntilCompletion(true); 1408 delegate->SetRunUntilCompletion(true);
1408 delegate->Start(std::move(request_info), http_session_.get()); 1409 delegate->Start(std::move(request_info), http_session_.get());
1409 // Makes sure delegate does not get called. 1410 // Makes sure delegate does not get called.
1410 base::RunLoop().RunUntilIdle(); 1411 base::RunLoop().RunUntilIdle();
1411 const SpdyHeaderBlock& response_headers = delegate->response_headers(); 1412 const SpdyHeaderBlock& response_headers = delegate->response_headers();
1412 EXPECT_EQ("200", response_headers.find(":status")->second); 1413 EXPECT_EQ("200", response_headers.find(":status")->second);
1413 EXPECT_EQ("header-value", response_headers.find("header-name")->second); 1414 EXPECT_EQ("header-value", response_headers.find("header-name")->second);
1414 EXPECT_EQ("bar", delegate->trailers().find("foo")->second); 1415 EXPECT_EQ("bar", delegate->trailers().find("foo")->second);
1415 EXPECT_EQ(0, delegate->on_data_sent_count()); 1416 EXPECT_EQ(0, delegate->on_data_sent_count());
1416 // OnDataRead may or may not have been fired before the stream is 1417 // OnDataRead may or may not have been fired before the stream is
1417 // canceled/deleted. 1418 // deleted.
1418 1419 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1419 // If stream is destroyed, do not call into stream. 1420 // Bytes sent excludes the RST frame.
1420 if (!GetParam()) 1421 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1),
1421 return; 1422 delegate->GetTotalSentBytes());
1422 EXPECT_EQ(0, delegate->GetTotalSentBytes()); 1423 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)),
1423 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); 1424 delegate->GetTotalReceivedBytes());
1424 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol());
1425 } 1425 }
1426 1426
1427 TEST_P(BidirectionalStreamTest, CancelOrDeleteStreamDuringOnFailed) { 1427 TEST_F(BidirectionalStreamTest, DeleteStreamDuringOnFailed) {
1428 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); 1428 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST));
1429 1429
1430 SpdySerializedFrame rst( 1430 SpdySerializedFrame rst(
1431 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR)); 1431 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_PROTOCOL_ERROR));
1432 1432
1433 MockWrite writes[] = { 1433 MockWrite writes[] = {
1434 CreateMockWrite(req, 0), CreateMockWrite(rst, 2), 1434 CreateMockWrite(req, 0), CreateMockWrite(rst, 2),
1435 }; 1435 };
1436 1436
1437 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"}; 1437 const char* const kExtraHeaders[] = {"X-UpperCase", "yes"};
1438 SpdySerializedFrame resp( 1438 SpdySerializedFrame resp(
1439 spdy_util_.ConstructSpdyGetReply(kExtraHeaders, 1, 1)); 1439 spdy_util_.ConstructSpdyGetReply(kExtraHeaders, 1, 1));
1440 1440
1441 MockRead reads[] = { 1441 MockRead reads[] = {
1442 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3), 1442 CreateMockRead(resp, 1), MockRead(ASYNC, 0, 3),
1443 }; 1443 };
1444 1444
1445 InitSession(reads, arraysize(reads), writes, arraysize(writes)); 1445 InitSession(reads, arraysize(reads), writes, arraysize(writes));
1446 1446
1447 std::unique_ptr<BidirectionalStreamRequestInfo> request_info( 1447 std::unique_ptr<BidirectionalStreamRequestInfo> request_info(
1448 new BidirectionalStreamRequestInfo); 1448 new BidirectionalStreamRequestInfo);
1449 request_info->method = "GET"; 1449 request_info->method = "GET";
1450 request_info->url = default_url_; 1450 request_info->url = default_url_;
1451 request_info->priority = LOWEST; 1451 request_info->priority = LOWEST;
1452 request_info->end_stream_on_headers = true; 1452 request_info->end_stream_on_headers = true;
1453 1453
1454 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize)); 1454 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
1455 std::unique_ptr<CancelOrDeleteStreamDelegate> delegate( 1455 std::unique_ptr<DeleteStreamDelegate> delegate(
1456 new CancelOrDeleteStreamDelegate( 1456 new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize,
1457 read_buffer.get(), kReadBufferSize, 1457 DeleteStreamDelegate::Phase::ON_FAILED));
1458 CancelOrDeleteStreamDelegate::Phase::ON_FAILED, GetParam()));
1459 delegate->SetRunUntilCompletion(true); 1458 delegate->SetRunUntilCompletion(true);
1460 delegate->Start(std::move(request_info), http_session_.get()); 1459 delegate->Start(std::move(request_info), http_session_.get());
1461 // Makes sure delegate does not get called. 1460 // Makes sure delegate does not get called.
1462 base::RunLoop().RunUntilIdle(); 1461 base::RunLoop().RunUntilIdle();
1463 EXPECT_EQ(delegate->response_headers().end(), 1462 EXPECT_EQ(delegate->response_headers().end(),
1464 delegate->response_headers().find(":status")); 1463 delegate->response_headers().find(":status"));
1465 EXPECT_EQ(0, delegate->on_data_sent_count()); 1464 EXPECT_EQ(0, delegate->on_data_sent_count());
1466 EXPECT_EQ(0, delegate->on_data_read_count()); 1465 EXPECT_EQ(0, delegate->on_data_read_count());
1467 EXPECT_THAT(delegate->error(), IsError(ERR_SPDY_PROTOCOL_ERROR)); 1466 EXPECT_THAT(delegate->error(), IsError(ERR_SPDY_PROTOCOL_ERROR));
1468 1467
1469 // If stream is destroyed, do not call into stream. 1468 EXPECT_EQ(kProtoHTTP2, delegate->GetProtocol());
1470 if (!GetParam()) 1469 // Bytes sent excludes the RST frame.
1471 return; 1470 EXPECT_EQ(CountWriteBytes(writes, arraysize(writes) - 1),
1472 EXPECT_EQ(0, delegate->GetTotalSentBytes()); 1471 delegate->GetTotalSentBytes());
1473 EXPECT_EQ(0, delegate->GetTotalReceivedBytes()); 1472 EXPECT_EQ(CountReadBytes(reads, arraysize(reads)),
1474 EXPECT_EQ(kProtoUnknown, delegate->GetProtocol()); 1473 delegate->GetTotalReceivedBytes());
1475 } 1474 }
1476 1475
1477 TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) { 1476 TEST_F(BidirectionalStreamTest, TestHonorAlternativeServiceHeader) {
1478 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST)); 1477 SpdySerializedFrame req(spdy_util_.ConstructSpdyGet(kDefaultUrl, 1, LOWEST));
1479 // Empty DATA frame with an END_STREAM flag. 1478 // Empty DATA frame with an END_STREAM flag.
1480 SpdySerializedFrame end_stream( 1479 SpdySerializedFrame end_stream(
1481 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true)); 1480 spdy_util_.ConstructSpdyDataFrame(1, nullptr, 0, true));
1482 1481
1483 MockWrite writes[] = {CreateMockWrite(req, 0)}; 1482 MockWrite writes[] = {CreateMockWrite(req, 0)};
1484 1483
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 http_session_->http_server_properties()->GetAlternativeServices( 1529 http_session_->http_server_properties()->GetAlternativeServices(
1531 url::SchemeHostPort(default_url_)); 1530 url::SchemeHostPort(default_url_));
1532 ASSERT_EQ(1u, alternative_service_vector.size()); 1531 ASSERT_EQ(1u, alternative_service_vector.size());
1533 EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3), 1532 EXPECT_EQ(AlternateProtocolFromNextProto(kProtoQUIC1SPDY3),
1534 alternative_service_vector[0].protocol); 1533 alternative_service_vector[0].protocol);
1535 EXPECT_EQ("www.example.org", alternative_service_vector[0].host); 1534 EXPECT_EQ("www.example.org", alternative_service_vector[0].host);
1536 EXPECT_EQ(443, alternative_service_vector[0].port); 1535 EXPECT_EQ(443, alternative_service_vector[0].port);
1537 } 1536 }
1538 1537
1539 } // namespace net 1538 } // namespace net
OLDNEW
« no previous file with comments | « net/http/bidirectional_stream_impl.h ('k') | net/quic/chromium/bidirectional_stream_quic_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698