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

Side by Side Diff: net/spdy/spdy_http_stream_unittest.cc

Issue 2022053002: Introduce error handling in SpdyHttpStream on UploadDataStream::Read() failure. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 6 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
« no previous file with comments | « net/spdy/spdy_http_stream.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/spdy/spdy_http_stream.h" 5 #include "net/spdy/spdy_http_stream.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <memory> 9 #include <memory>
10 10
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 EXPECT_TRUE(stream.GetLoadTimingInfo(&load_timing_info)); 68 EXPECT_TRUE(stream.GetLoadTimingInfo(&load_timing_info));
69 69
70 EXPECT_FALSE(load_timing_info.socket_reused); 70 EXPECT_FALSE(load_timing_info.socket_reused);
71 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id); 71 EXPECT_NE(NetLog::Source::kInvalidId, load_timing_info.socket_log_id);
72 72
73 ExpectConnectTimingHasTimes(load_timing_info.connect_timing, 73 ExpectConnectTimingHasTimes(load_timing_info.connect_timing,
74 CONNECT_TIMING_HAS_DNS_TIMES); 74 CONNECT_TIMING_HAS_DNS_TIMES);
75 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info); 75 ExpectLoadTimingHasOnlyConnectionTimes(load_timing_info);
76 } 76 }
77 77
78 class ReadErrorUploadDataStream : public UploadDataStream {
79 public:
80 enum class FailureMode { SYNC, ASYNC };
81
82 explicit ReadErrorUploadDataStream(FailureMode mode)
83 : UploadDataStream(true, 0), async_(mode), weak_factory_(this) {}
84
85 private:
86 void CompleteRead() { UploadDataStream::OnReadCompleted(ERR_FAILED); }
87
88 // UploadDataStream implementation:
89 int InitInternal() override { return OK; }
90
91 int ReadInternal(IOBuffer* buf, int buf_len) override {
92 if (async_ == FailureMode::ASYNC) {
93 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
94 FROM_HERE, base::Bind(&ReadErrorUploadDataStream::CompleteRead,
95 weak_factory_.GetWeakPtr()),
96 base::TimeDelta::FromSeconds(1));
Bence 2016/06/10 17:39:17 Is there a way to avoid time delay in tests? In g
maksims (do not use this acc) 2016/06/20 08:14:24 Done.
97 return ERR_IO_PENDING;
98 }
99 return ERR_FAILED;
100 }
101
102 void ResetInternal() override {}
103
104 const FailureMode async_;
105
106 base::WeakPtrFactory<ReadErrorUploadDataStream> weak_factory_;
107
108 DISALLOW_COPY_AND_ASSIGN(ReadErrorUploadDataStream);
109 };
110
78 } // namespace 111 } // namespace
79 112
80 class SpdyHttpStreamTest : public testing::Test, 113 class SpdyHttpStreamTest : public testing::Test,
81 public testing::WithParamInterface<TestCase> { 114 public testing::WithParamInterface<TestCase> {
82 public: 115 public:
83 SpdyHttpStreamTest() 116 SpdyHttpStreamTest()
84 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()), 117 : spdy_util_(GetProtocol(), GetDependenciesFromPriority()),
85 session_deps_(GetProtocol()) { 118 session_deps_(GetProtocol()) {
86 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority(); 119 session_deps_.enable_priority_dependencies = GetDependenciesFromPriority();
87 session_deps_.net_log = &net_log_; 120 session_deps_.net_log = &net_log_;
88 } 121 }
89 122
90 ~SpdyHttpStreamTest() {} 123 ~SpdyHttpStreamTest() {}
91 124
92 protected: 125 protected:
93 NextProto GetProtocol() const { 126 NextProto GetProtocol() const {
94 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2; 127 return GetParam() == kTestCaseSPDY31 ? kProtoSPDY31 : kProtoHTTP2;
95 } 128 }
96 129
97 bool GetDependenciesFromPriority() const { 130 bool GetDependenciesFromPriority() const {
98 return GetParam() == kTestCaseHTTP2PriorityDependencies; 131 return GetParam() == kTestCaseHTTP2PriorityDependencies;
99 } 132 }
100 133
101 void TearDown() override { 134 void TearDown() override {
102 crypto::ECSignatureCreator::SetFactoryForTesting(NULL); 135 crypto::ECSignatureCreator::SetFactoryForTesting(nullptr);
103 base::MessageLoop::current()->RunUntilIdle(); 136 base::MessageLoop::current()->RunUntilIdle();
104 EXPECT_TRUE(sequenced_data_->AllReadDataConsumed()); 137 EXPECT_TRUE(sequenced_data_->AllReadDataConsumed());
105 EXPECT_TRUE(sequenced_data_->AllWriteDataConsumed()); 138 EXPECT_TRUE(sequenced_data_->AllWriteDataConsumed());
106 } 139 }
107 140
108 // Initializes the session using SequencedSocketData. 141 // Initializes the session using SequencedSocketData.
109 void InitSession(MockRead* reads, 142 void InitSession(MockRead* reads,
110 size_t reads_count, 143 size_t reads_count,
111 MockWrite* writes, 144 MockWrite* writes,
112 size_t writes_count, 145 size_t writes_count,
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 // SpdyHttpStream::GetUploadProgress() should still work even before the 177 // SpdyHttpStream::GetUploadProgress() should still work even before the
145 // stream is initialized. 178 // stream is initialized.
146 TEST_P(SpdyHttpStreamTest, GetUploadProgressBeforeInitialization) { 179 TEST_P(SpdyHttpStreamTest, GetUploadProgressBeforeInitialization) {
147 MockRead reads[] = { 180 MockRead reads[] = {
148 MockRead(ASYNC, 0, 0) // EOF 181 MockRead(ASYNC, 0, 0) // EOF
149 }; 182 };
150 183
151 HostPortPair host_port_pair("www.example.org", 80); 184 HostPortPair host_port_pair("www.example.org", 80);
152 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 185 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
153 PRIVACY_MODE_DISABLED); 186 PRIVACY_MODE_DISABLED);
154 InitSession(reads, arraysize(reads), NULL, 0, key); 187 InitSession(reads, arraysize(reads), nullptr, 0, key);
155 188
156 SpdyHttpStream stream(session_, false); 189 SpdyHttpStream stream(session_, false);
157 UploadProgress progress = stream.GetUploadProgress(); 190 UploadProgress progress = stream.GetUploadProgress();
158 EXPECT_EQ(0u, progress.size()); 191 EXPECT_EQ(0u, progress.size());
159 EXPECT_EQ(0u, progress.position()); 192 EXPECT_EQ(0u, progress.position());
160 193
161 // Pump the event loop so |reads| is consumed before the function returns. 194 // Pump the event loop so |reads| is consumed before the function returns.
162 base::RunLoop().RunUntilIdle(); 195 base::RunLoop().RunUntilIdle();
163 } 196 }
164 197
165 TEST_P(SpdyHttpStreamTest, SendRequest) { 198 TEST_P(SpdyHttpStreamTest, SendRequest) {
166 std::unique_ptr<SpdySerializedFrame> req( 199 std::unique_ptr<SpdySerializedFrame> req(
167 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 200 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
168 MockWrite writes[] = { 201 MockWrite writes[] = {
169 CreateMockWrite(*req.get(), 0), 202 CreateMockWrite(*req.get(), 0),
170 }; 203 };
171 std::unique_ptr<SpdySerializedFrame> resp( 204 std::unique_ptr<SpdySerializedFrame> resp(
172 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 205 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
173 MockRead reads[] = { 206 MockRead reads[] = {
174 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF 207 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
175 }; 208 };
176 209
177 HostPortPair host_port_pair("www.example.org", 80); 210 HostPortPair host_port_pair("www.example.org", 80);
178 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 211 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
179 PRIVACY_MODE_DISABLED); 212 PRIVACY_MODE_DISABLED);
180 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); 213 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
181 214
182 HttpRequestInfo request; 215 HttpRequestInfo request;
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
227 TEST_P(SpdyHttpStreamTest, LoadTimingTwoRequests) { 260 TEST_P(SpdyHttpStreamTest, LoadTimingTwoRequests) {
228 std::unique_ptr<SpdySerializedFrame> req1( 261 std::unique_ptr<SpdySerializedFrame> req1(
229 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true)); 262 spdy_util_.ConstructSpdyGet(nullptr, 0, 1, LOWEST, true));
230 std::unique_ptr<SpdySerializedFrame> req2( 263 std::unique_ptr<SpdySerializedFrame> req2(
231 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true)); 264 spdy_util_.ConstructSpdyGet(nullptr, 0, 3, LOWEST, true));
232 MockWrite writes[] = { 265 MockWrite writes[] = {
233 CreateMockWrite(*req1, 0), 266 CreateMockWrite(*req1, 0),
234 CreateMockWrite(*req2, 1), 267 CreateMockWrite(*req2, 1),
235 }; 268 };
236 std::unique_ptr<SpdySerializedFrame> resp1( 269 std::unique_ptr<SpdySerializedFrame> resp1(
237 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 270 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
238 std::unique_ptr<SpdySerializedFrame> body1( 271 std::unique_ptr<SpdySerializedFrame> body1(
239 spdy_util_.ConstructSpdyBodyFrame(1, "", 0, true)); 272 spdy_util_.ConstructSpdyBodyFrame(1, "", 0, true));
240 std::unique_ptr<SpdySerializedFrame> resp2( 273 std::unique_ptr<SpdySerializedFrame> resp2(
241 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 3)); 274 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 3));
242 std::unique_ptr<SpdySerializedFrame> body2( 275 std::unique_ptr<SpdySerializedFrame> body2(
243 spdy_util_.ConstructSpdyBodyFrame(3, "", 0, true)); 276 spdy_util_.ConstructSpdyBodyFrame(3, "", 0, true));
244 MockRead reads[] = { 277 MockRead reads[] = {
245 CreateMockRead(*resp1, 2), 278 CreateMockRead(*resp1, 2),
246 CreateMockRead(*body1, 3), 279 CreateMockRead(*body1, 3),
247 CreateMockRead(*resp2, 4), 280 CreateMockRead(*resp2, 4),
248 CreateMockRead(*body2, 5), 281 CreateMockRead(*body2, 5),
249 MockRead(ASYNC, 0, 6) // EOF 282 MockRead(ASYNC, 0, 6) // EOF
250 }; 283 };
251 284
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 EXPECT_EQ(static_cast<int64_t>(req2->size()), 356 EXPECT_EQ(static_cast<int64_t>(req2->size()),
324 http_stream2->GetTotalSentBytes()); 357 http_stream2->GetTotalSentBytes());
325 EXPECT_EQ(static_cast<int64_t>(resp2->size() + body2->size()), 358 EXPECT_EQ(static_cast<int64_t>(resp2->size() + body2->size()),
326 http_stream2->GetTotalReceivedBytes()); 359 http_stream2->GetTotalReceivedBytes());
327 } 360 }
328 361
329 TEST_P(SpdyHttpStreamTest, SendChunkedPost) { 362 TEST_P(SpdyHttpStreamTest, SendChunkedPost) {
330 BufferedSpdyFramer framer(spdy_util_.spdy_version()); 363 BufferedSpdyFramer framer(spdy_util_.spdy_version());
331 364
332 std::unique_ptr<SpdySerializedFrame> req( 365 std::unique_ptr<SpdySerializedFrame> req(
333 spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 366 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
334 std::unique_ptr<SpdySerializedFrame> body( 367 std::unique_ptr<SpdySerializedFrame> body(
335 framer.CreateDataFrame(1, kUploadData, kUploadDataSize, DATA_FLAG_FIN)); 368 framer.CreateDataFrame(1, kUploadData, kUploadDataSize, DATA_FLAG_FIN));
336 MockWrite writes[] = { 369 MockWrite writes[] = {
337 CreateMockWrite(*req, 0), // request 370 CreateMockWrite(*req, 0), // request
338 CreateMockWrite(*body, 1) // POST upload frame 371 CreateMockWrite(*body, 1) // POST upload frame
339 }; 372 };
340 373
341 std::unique_ptr<SpdySerializedFrame> resp( 374 std::unique_ptr<SpdySerializedFrame> resp(
342 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 375 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
343 MockRead reads[] = { 376 MockRead reads[] = {
344 CreateMockRead(*resp, 2), 377 CreateMockRead(*resp, 2),
345 CreateMockRead(*body, 3), 378 CreateMockRead(*body, 3),
346 MockRead(SYNCHRONOUS, 0, 4) // EOF 379 MockRead(SYNCHRONOUS, 0, 4) // EOF
347 }; 380 };
348 381
349 HostPortPair host_port_pair("www.example.org", 80); 382 HostPortPair host_port_pair("www.example.org", 80);
350 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 383 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
351 PRIVACY_MODE_DISABLED); 384 PRIVACY_MODE_DISABLED);
352 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); 385 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 421
389 // Because the server closed the connection, we there shouldn't be a session 422 // Because the server closed the connection, we there shouldn't be a session
390 // in the pool anymore. 423 // in the pool anymore.
391 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 424 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key));
392 } 425 }
393 426
394 TEST_P(SpdyHttpStreamTest, ConnectionClosedDuringChunkedPost) { 427 TEST_P(SpdyHttpStreamTest, ConnectionClosedDuringChunkedPost) {
395 BufferedSpdyFramer framer(spdy_util_.spdy_version()); 428 BufferedSpdyFramer framer(spdy_util_.spdy_version());
396 429
397 std::unique_ptr<SpdySerializedFrame> req( 430 std::unique_ptr<SpdySerializedFrame> req(
398 spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 431 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
399 std::unique_ptr<SpdySerializedFrame> body( 432 std::unique_ptr<SpdySerializedFrame> body(
400 framer.CreateDataFrame(1, kUploadData, kUploadDataSize, DATA_FLAG_NONE)); 433 framer.CreateDataFrame(1, kUploadData, kUploadDataSize, DATA_FLAG_NONE));
401 MockWrite writes[] = { 434 MockWrite writes[] = {
402 CreateMockWrite(*req, 0), // Request 435 CreateMockWrite(*req, 0), // Request
403 CreateMockWrite(*body, 1) // First POST upload frame 436 CreateMockWrite(*body, 1) // First POST upload frame
404 }; 437 };
405 438
406 std::unique_ptr<SpdySerializedFrame> resp( 439 std::unique_ptr<SpdySerializedFrame> resp(
407 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 440 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
408 MockRead reads[] = { 441 MockRead reads[] = {
409 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2) // Server hangs up early. 442 MockRead(ASYNC, ERR_CONNECTION_CLOSED, 2) // Server hangs up early.
410 }; 443 };
411 444
412 HostPortPair host_port_pair("www.example.org", 80); 445 HostPortPair host_port_pair("www.example.org", 80);
413 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 446 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
414 PRIVACY_MODE_DISABLED); 447 PRIVACY_MODE_DISABLED);
415 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); 448 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
416 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion()); 449 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion());
417 450
(...skipping 13 matching lines...) Expand all
431 HttpRequestHeaders headers; 464 HttpRequestHeaders headers;
432 BoundNetLog net_log; 465 BoundNetLog net_log;
433 SpdyHttpStream http_stream(session_, true); 466 SpdyHttpStream http_stream(session_, true);
434 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY, 467 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY,
435 net_log, CompletionCallback())); 468 net_log, CompletionCallback()));
436 469
437 EXPECT_EQ(ERR_IO_PENDING, 470 EXPECT_EQ(ERR_IO_PENDING,
438 http_stream.SendRequest(headers, &response, callback.callback())); 471 http_stream.SendRequest(headers, &response, callback.callback()));
439 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 472 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key));
440 473
474 // Server closes the connection. Thus, callback now returns
475 // "CONNECTION_CLOSED" error.
441 EXPECT_EQ(OK, callback.WaitForResult()); 476 EXPECT_EQ(OK, callback.WaitForResult());
maksims (do not use this acc) 2016/06/03 11:39:08 As I said this returns OK instead of ERR_CONNECTIO
442 477
443 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), 478 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()),
444 http_stream.GetTotalSentBytes()); 479 http_stream.GetTotalSentBytes());
445 EXPECT_EQ(0, http_stream.GetTotalReceivedBytes()); 480 EXPECT_EQ(0, http_stream.GetTotalReceivedBytes());
446 481
447 // Because the server closed the connection, we there shouldn't be a session 482 // Because the server closed the connection, we there shouldn't be a session
448 // in the pool anymore. 483 // in the pool anymore.
449 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 484 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key));
450 485
451 // Appending a second chunk now should not result in a crash. 486 // Appending a second chunk now should not result in a crash.
452 upload_stream.AppendData(kUploadData, kUploadDataSize, true); 487 upload_stream.AppendData(kUploadData, kUploadDataSize, true);
453 // Appending data is currently done synchronously, but seems best to be 488 // Appending data is currently done synchronously, but seems best to be
454 // paranoid. 489 // paranoid.
455 base::RunLoop().RunUntilIdle(); 490 base::RunLoop().RunUntilIdle();
456 491
457 // The total sent and received bytes should be unchanged. 492 // The total sent and received bytes should be unchanged.
458 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()), 493 EXPECT_EQ(static_cast<int64_t>(req->size() + body->size()),
459 http_stream.GetTotalSentBytes()); 494 http_stream.GetTotalSentBytes());
460 EXPECT_EQ(0, http_stream.GetTotalReceivedBytes()); 495 EXPECT_EQ(0, http_stream.GetTotalReceivedBytes());
461 } 496 }
462 497
463 // Test to ensure the SpdyStream state machine does not get confused when a 498 // Test to ensure the SpdyStream state machine does not get confused when a
464 // chunk becomes available while a write is pending. 499 // chunk becomes available while a write is pending.
465 TEST_P(SpdyHttpStreamTest, DelayedSendChunkedPost) { 500 TEST_P(SpdyHttpStreamTest, DelayedSendChunkedPost) {
466 const char kUploadData1[] = "12345678"; 501 const char kUploadData1[] = "12345678";
467 const int kUploadData1Size = arraysize(kUploadData1)-1; 502 const int kUploadData1Size = arraysize(kUploadData1)-1;
468 std::unique_ptr<SpdySerializedFrame> req( 503 std::unique_ptr<SpdySerializedFrame> req(
469 spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 504 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
470 std::unique_ptr<SpdySerializedFrame> chunk1( 505 std::unique_ptr<SpdySerializedFrame> chunk1(
471 spdy_util_.ConstructSpdyBodyFrame(1, false)); 506 spdy_util_.ConstructSpdyBodyFrame(1, false));
472 std::unique_ptr<SpdySerializedFrame> chunk2(spdy_util_.ConstructSpdyBodyFrame( 507 std::unique_ptr<SpdySerializedFrame> chunk2(spdy_util_.ConstructSpdyBodyFrame(
473 1, kUploadData1, kUploadData1Size, false)); 508 1, kUploadData1, kUploadData1Size, false));
474 std::unique_ptr<SpdySerializedFrame> chunk3( 509 std::unique_ptr<SpdySerializedFrame> chunk3(
475 spdy_util_.ConstructSpdyBodyFrame(1, true)); 510 spdy_util_.ConstructSpdyBodyFrame(1, true));
476 MockWrite writes[] = { 511 MockWrite writes[] = {
477 CreateMockWrite(*req.get(), 0), 512 CreateMockWrite(*req.get(), 0),
478 CreateMockWrite(*chunk1, 1), // POST upload frames 513 CreateMockWrite(*chunk1, 1), // POST upload frames
479 CreateMockWrite(*chunk2, 2), 514 CreateMockWrite(*chunk2, 2),
480 CreateMockWrite(*chunk3, 3), 515 CreateMockWrite(*chunk3, 3),
481 }; 516 };
482 std::unique_ptr<SpdySerializedFrame> resp( 517 std::unique_ptr<SpdySerializedFrame> resp(
483 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 518 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
484 MockRead reads[] = { 519 MockRead reads[] = {
485 CreateMockRead(*resp, 4), 520 CreateMockRead(*resp, 4),
486 CreateMockRead(*chunk1, 5), 521 CreateMockRead(*chunk1, 5),
487 CreateMockRead(*chunk2, 6), 522 CreateMockRead(*chunk2, 6),
488 CreateMockRead(*chunk3, 7), 523 CreateMockRead(*chunk3, 7),
489 MockRead(ASYNC, 0, 8) // EOF 524 MockRead(ASYNC, 0, 8) // EOF
490 }; 525 };
491 526
492 HostPortPair host_port_pair("www.example.org", 80); 527 HostPortPair host_port_pair("www.example.org", 80);
493 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 528 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
563 EXPECT_EQ(kUploadData, std::string(buf3->data(), kUploadDataSize)); 598 EXPECT_EQ(kUploadData, std::string(buf3->data(), kUploadDataSize));
564 599
565 ASSERT_TRUE(response.headers.get()); 600 ASSERT_TRUE(response.headers.get());
566 ASSERT_EQ(200, response.headers->response_code()); 601 ASSERT_EQ(200, response.headers->response_code());
567 } 602 }
568 603
569 // Test that the SpdyStream state machine can handle sending a final empty data 604 // Test that the SpdyStream state machine can handle sending a final empty data
570 // frame when uploading a chunked data stream. 605 // frame when uploading a chunked data stream.
571 TEST_P(SpdyHttpStreamTest, DelayedSendChunkedPostWithEmptyFinalDataFrame) { 606 TEST_P(SpdyHttpStreamTest, DelayedSendChunkedPostWithEmptyFinalDataFrame) {
572 std::unique_ptr<SpdySerializedFrame> req( 607 std::unique_ptr<SpdySerializedFrame> req(
573 spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 608 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
574 std::unique_ptr<SpdySerializedFrame> chunk1( 609 std::unique_ptr<SpdySerializedFrame> chunk1(
575 spdy_util_.ConstructSpdyBodyFrame(1, false)); 610 spdy_util_.ConstructSpdyBodyFrame(1, false));
576 std::unique_ptr<SpdySerializedFrame> chunk2( 611 std::unique_ptr<SpdySerializedFrame> chunk2(
577 spdy_util_.ConstructSpdyBodyFrame(1, "", 0, true)); 612 spdy_util_.ConstructSpdyBodyFrame(1, "", 0, true));
578 MockWrite writes[] = { 613 MockWrite writes[] = {
579 CreateMockWrite(*req.get(), 0), 614 CreateMockWrite(*req.get(), 0),
580 CreateMockWrite(*chunk1, 1), // POST upload frames 615 CreateMockWrite(*chunk1, 1), // POST upload frames
581 CreateMockWrite(*chunk2, 2), 616 CreateMockWrite(*chunk2, 2),
582 }; 617 };
583 std::unique_ptr<SpdySerializedFrame> resp( 618 std::unique_ptr<SpdySerializedFrame> resp(
584 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 619 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
585 MockRead reads[] = { 620 MockRead reads[] = {
586 CreateMockRead(*resp, 3), 621 CreateMockRead(*resp, 3),
587 CreateMockRead(*chunk1, 4), 622 CreateMockRead(*chunk1, 4),
588 CreateMockRead(*chunk2, 5), 623 CreateMockRead(*chunk2, 5),
589 MockRead(ASYNC, 0, 6) // EOF 624 MockRead(ASYNC, 0, 6) // EOF
590 }; 625 };
591 626
592 HostPortPair host_port_pair("www.example.org", 80); 627 HostPortPair host_port_pair("www.example.org", 80);
593 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 628 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
594 PRIVACY_MODE_DISABLED); 629 PRIVACY_MODE_DISABLED);
(...skipping 27 matching lines...) Expand all
622 // Complete the initial request write and the first chunk. 657 // Complete the initial request write and the first chunk.
623 base::RunLoop().RunUntilIdle(); 658 base::RunLoop().RunUntilIdle();
624 ASSERT_TRUE(callback.have_result()); 659 ASSERT_TRUE(callback.have_result());
625 EXPECT_EQ(OK, callback.WaitForResult()); 660 EXPECT_EQ(OK, callback.WaitForResult());
626 661
627 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()), 662 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()),
628 http_stream->GetTotalSentBytes()); 663 http_stream->GetTotalSentBytes());
629 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); 664 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes());
630 665
631 // Now end the stream with an empty data frame and the FIN set. 666 // Now end the stream with an empty data frame and the FIN set.
632 upload_stream.AppendData(NULL, 0, true); 667 upload_stream.AppendData(nullptr, 0, true);
633 668
634 // Finish writing the final frame, and perform all reads. 669 // Finish writing the final frame, and perform all reads.
635 base::RunLoop().RunUntilIdle(); 670 base::RunLoop().RunUntilIdle();
636 671
637 // Check response headers. 672 // Check response headers.
638 ASSERT_EQ(OK, http_stream->ReadResponseHeaders(callback.callback())); 673 ASSERT_EQ(OK, http_stream->ReadResponseHeaders(callback.callback()));
639 674
640 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size() + chunk2->size()), 675 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size() + chunk2->size()),
641 http_stream->GetTotalSentBytes()); 676 http_stream->GetTotalSentBytes());
642 EXPECT_EQ( 677 EXPECT_EQ(
(...skipping 13 matching lines...) Expand all
656 buf1.get(), kUploadDataSize, callback.callback())); 691 buf1.get(), kUploadDataSize, callback.callback()));
657 692
658 ASSERT_TRUE(response.headers.get()); 693 ASSERT_TRUE(response.headers.get());
659 ASSERT_EQ(200, response.headers->response_code()); 694 ASSERT_EQ(200, response.headers->response_code());
660 } 695 }
661 696
662 // Test that the SpdyStream state machine handles a chunked upload with no 697 // Test that the SpdyStream state machine handles a chunked upload with no
663 // payload. Unclear if this is a case worth supporting. 698 // payload. Unclear if this is a case worth supporting.
664 TEST_P(SpdyHttpStreamTest, ChunkedPostWithEmptyPayload) { 699 TEST_P(SpdyHttpStreamTest, ChunkedPostWithEmptyPayload) {
665 std::unique_ptr<SpdySerializedFrame> req( 700 std::unique_ptr<SpdySerializedFrame> req(
666 spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 701 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
667 std::unique_ptr<SpdySerializedFrame> chunk( 702 std::unique_ptr<SpdySerializedFrame> chunk(
668 spdy_util_.ConstructSpdyBodyFrame(1, "", 0, true)); 703 spdy_util_.ConstructSpdyBodyFrame(1, "", 0, true));
669 MockWrite writes[] = { 704 MockWrite writes[] = {
670 CreateMockWrite(*req.get(), 0), 705 CreateMockWrite(*req.get(), 0),
671 CreateMockWrite(*chunk, 1), 706 CreateMockWrite(*chunk, 1),
672 }; 707 };
673 std::unique_ptr<SpdySerializedFrame> resp( 708 std::unique_ptr<SpdySerializedFrame> resp(
674 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 709 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
675 MockRead reads[] = { 710 MockRead reads[] = {
676 CreateMockRead(*resp, 2), 711 CreateMockRead(*resp, 2),
677 CreateMockRead(*chunk, 3), 712 CreateMockRead(*chunk, 3),
678 MockRead(ASYNC, 0, 4) // EOF 713 MockRead(ASYNC, 0, 4) // EOF
679 }; 714 };
680 715
681 HostPortPair host_port_pair("www.example.org", 80); 716 HostPortPair host_port_pair("www.example.org", 80);
682 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 717 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
683 PRIVACY_MODE_DISABLED); 718 PRIVACY_MODE_DISABLED);
684 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); 719 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 // Test case for bug: http://code.google.com/p/chromium/issues/detail?id=50058 769 // Test case for bug: http://code.google.com/p/chromium/issues/detail?id=50058
735 TEST_P(SpdyHttpStreamTest, SpdyURLTest) { 770 TEST_P(SpdyHttpStreamTest, SpdyURLTest) {
736 const char* const full_url = "http://www.example.org/foo?query=what#anchor"; 771 const char* const full_url = "http://www.example.org/foo?query=what#anchor";
737 const char* const base_url = "http://www.example.org/foo?query=what"; 772 const char* const base_url = "http://www.example.org/foo?query=what";
738 std::unique_ptr<SpdySerializedFrame> req( 773 std::unique_ptr<SpdySerializedFrame> req(
739 spdy_util_.ConstructSpdyGet(base_url, 1, LOWEST)); 774 spdy_util_.ConstructSpdyGet(base_url, 1, LOWEST));
740 MockWrite writes[] = { 775 MockWrite writes[] = {
741 CreateMockWrite(*req.get(), 0), 776 CreateMockWrite(*req.get(), 0),
742 }; 777 };
743 std::unique_ptr<SpdySerializedFrame> resp( 778 std::unique_ptr<SpdySerializedFrame> resp(
744 spdy_util_.ConstructSpdyGetSynReply(NULL, 0, 1)); 779 spdy_util_.ConstructSpdyGetSynReply(nullptr, 0, 1));
745 MockRead reads[] = { 780 MockRead reads[] = {
746 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF 781 CreateMockRead(*resp, 1), MockRead(SYNCHRONOUS, 0, 2) // EOF
747 }; 782 };
748 783
749 HostPortPair host_port_pair("www.example.org", 80); 784 HostPortPair host_port_pair("www.example.org", 80);
750 SpdySessionKey key(host_port_pair, ProxyServer::Direct(), 785 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
751 PRIVACY_MODE_DISABLED); 786 PRIVACY_MODE_DISABLED);
752 InitSession(reads, arraysize(reads), writes, arraysize(writes), key); 787 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
753 788
754 HttpRequestInfo request; 789 HttpRequestInfo request;
(...skipping 23 matching lines...) Expand all
778 813
779 // Because we abandoned the stream, we don't expect to find a session in the 814 // Because we abandoned the stream, we don't expect to find a session in the
780 // pool anymore. 815 // pool anymore.
781 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key)); 816 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key));
782 } 817 }
783 818
784 // Test the receipt of a WINDOW_UPDATE frame while waiting for a chunk to be 819 // Test the receipt of a WINDOW_UPDATE frame while waiting for a chunk to be
785 // made available is handled correctly. 820 // made available is handled correctly.
786 TEST_P(SpdyHttpStreamTest, DelayedSendChunkedPostWithWindowUpdate) { 821 TEST_P(SpdyHttpStreamTest, DelayedSendChunkedPostWithWindowUpdate) {
787 std::unique_ptr<SpdySerializedFrame> req( 822 std::unique_ptr<SpdySerializedFrame> req(
788 spdy_util_.ConstructChunkedSpdyPost(NULL, 0)); 823 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
789 std::unique_ptr<SpdySerializedFrame> chunk1( 824 std::unique_ptr<SpdySerializedFrame> chunk1(
790 spdy_util_.ConstructSpdyBodyFrame(1, true)); 825 spdy_util_.ConstructSpdyBodyFrame(1, true));
791 MockWrite writes[] = { 826 MockWrite writes[] = {
792 CreateMockWrite(*req.get(), 0), 827 CreateMockWrite(*req.get(), 0),
793 CreateMockWrite(*chunk1, 1), 828 CreateMockWrite(*chunk1, 1),
794 }; 829 };
795 std::unique_ptr<SpdySerializedFrame> resp( 830 std::unique_ptr<SpdySerializedFrame> resp(
796 spdy_util_.ConstructSpdyPostSynReply(NULL, 0)); 831 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
797 std::unique_ptr<SpdySerializedFrame> window_update( 832 std::unique_ptr<SpdySerializedFrame> window_update(
798 spdy_util_.ConstructSpdyWindowUpdate(1, kUploadDataSize)); 833 spdy_util_.ConstructSpdyWindowUpdate(1, kUploadDataSize));
799 MockRead reads[] = { 834 MockRead reads[] = {
800 CreateMockRead(*window_update, 2), 835 CreateMockRead(*window_update, 2),
801 MockRead(ASYNC, ERR_IO_PENDING, 3), 836 MockRead(ASYNC, ERR_IO_PENDING, 3),
802 CreateMockRead(*resp, 4), 837 CreateMockRead(*resp, 4),
803 CreateMockRead(*chunk1, 5), 838 CreateMockRead(*chunk1, 5),
804 MockRead(ASYNC, 0, 6) // EOF 839 MockRead(ASYNC, 0, 6) // EOF
805 }; 840 };
806 841
(...skipping 22 matching lines...) Expand all
829 HttpResponseInfo response; 864 HttpResponseInfo response;
830 // This will attempt to Write() the initial request and headers, which will 865 // This will attempt to Write() the initial request and headers, which will
831 // complete asynchronously. 866 // complete asynchronously.
832 TestCompletionCallback callback; 867 TestCompletionCallback callback;
833 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response, 868 EXPECT_EQ(ERR_IO_PENDING, http_stream->SendRequest(headers, &response,
834 callback.callback())); 869 callback.callback()));
835 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key)); 870 EXPECT_TRUE(HasSpdySession(http_session_->spdy_session_pool(), key));
836 871
837 // Complete the initial request write and first chunk. 872 // Complete the initial request write and first chunk.
838 base::RunLoop().RunUntilIdle(); 873 base::RunLoop().RunUntilIdle();
839 ASSERT_TRUE(callback.have_result());
840 EXPECT_EQ(OK, callback.WaitForResult());
841 874
842 EXPECT_EQ(static_cast<int64_t>(req->size()), 875 EXPECT_EQ(static_cast<int64_t>(req->size()),
843 http_stream->GetTotalSentBytes()); 876 http_stream->GetTotalSentBytes());
844 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); 877 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes());
845 878
846 upload_stream.AppendData(kUploadData, kUploadDataSize, true); 879 upload_stream.AppendData(kUploadData, kUploadDataSize, true);
847 880
848 // Verify that the window size has decreased. 881 // Verify that the window size has decreased.
849 ASSERT_TRUE(http_stream->stream() != NULL); 882 ASSERT_TRUE(http_stream->stream() != nullptr);
850 EXPECT_NE(static_cast<int>( 883 EXPECT_NE(static_cast<int>(
851 SpdySession::GetDefaultInitialWindowSize(session_->protocol())), 884 SpdySession::GetDefaultInitialWindowSize(session_->protocol())),
852 http_stream->stream()->send_window_size()); 885 http_stream->stream()->send_window_size());
853 886
887 ASSERT_TRUE(callback.have_result());
888 EXPECT_EQ(OK, callback.WaitForResult());
maksims (do not use this acc) 2016/06/03 11:39:08 Due to new behavior, the callback should be read o
889
854 // Read window update. 890 // Read window update.
855 base::RunLoop().RunUntilIdle(); 891 base::RunLoop().RunUntilIdle();
856 892
857 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()), 893 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()),
858 http_stream->GetTotalSentBytes()); 894 http_stream->GetTotalSentBytes());
859 // The window update is not counted in the total received bytes. 895 // The window update is not counted in the total received bytes.
860 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes()); 896 EXPECT_EQ(0, http_stream->GetTotalReceivedBytes());
861 897
862 // Verify the window update. 898 // Verify the window update.
863 ASSERT_TRUE(http_stream->stream() != NULL); 899 ASSERT_TRUE(http_stream->stream() != nullptr);
864 EXPECT_EQ(static_cast<int>( 900 EXPECT_EQ(static_cast<int>(
865 SpdySession::GetDefaultInitialWindowSize(session_->protocol())), 901 SpdySession::GetDefaultInitialWindowSize(session_->protocol())),
866 http_stream->stream()->send_window_size()); 902 http_stream->stream()->send_window_size());
867 903
868 // Read rest of data. 904 // Read rest of data.
869 sequenced_data_->Resume(); 905 sequenced_data_->Resume();
870 base::RunLoop().RunUntilIdle(); 906 base::RunLoop().RunUntilIdle();
871 907
872 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()), 908 EXPECT_EQ(static_cast<int64_t>(req->size() + chunk1->size()),
873 http_stream->GetTotalSentBytes()); 909 http_stream->GetTotalSentBytes());
874 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk1->size()), 910 EXPECT_EQ(static_cast<int64_t>(resp->size() + chunk1->size()),
875 http_stream->GetTotalReceivedBytes()); 911 http_stream->GetTotalReceivedBytes());
876 912
877 // Check response headers. 913 // Check response headers.
878 ASSERT_EQ(OK, http_stream->ReadResponseHeaders(callback.callback())); 914 ASSERT_EQ(OK, http_stream->ReadResponseHeaders(callback.callback()));
879 915
880 // Check |chunk1| response. 916 // Check |chunk1| response.
881 scoped_refptr<IOBuffer> buf1(new IOBuffer(kUploadDataSize)); 917 scoped_refptr<IOBuffer> buf1(new IOBuffer(kUploadDataSize));
882 ASSERT_EQ(kUploadDataSize, 918 ASSERT_EQ(kUploadDataSize,
883 http_stream->ReadResponseBody( 919 http_stream->ReadResponseBody(
884 buf1.get(), kUploadDataSize, callback.callback())); 920 buf1.get(), kUploadDataSize, callback.callback()));
885 EXPECT_EQ(kUploadData, std::string(buf1->data(), kUploadDataSize)); 921 EXPECT_EQ(kUploadData, std::string(buf1->data(), kUploadDataSize));
886 922
887 ASSERT_TRUE(response.headers.get()); 923 ASSERT_TRUE(response.headers.get());
888 ASSERT_EQ(200, response.headers->response_code()); 924 ASSERT_EQ(200, response.headers->response_code());
889 } 925 }
890 926
927 TEST_P(SpdyHttpStreamTest, DataReadErrorSynchronous) {
928 std::unique_ptr<SpdySerializedFrame> req(
929 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
930
931 // Server receives RST_STREAM_INTERNAL_ERROR on clients' internal failure.
932 // The failure is a reading error in this case caused by
933 // UploadDataStream::Read()
934 std::unique_ptr<SpdySerializedFrame> rst_frame(
935 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_INTERNAL_ERROR));
936
937 MockWrite writes[] = {
938 CreateMockWrite(*req, 0, SYNCHRONOUS), // Request
939 CreateMockWrite(*rst_frame, 1, SYNCHRONOUS) // Reset frame
940 };
941
942 std::unique_ptr<SpdySerializedFrame> resp(
943 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
944
945 MockRead reads[] = {
946 CreateMockRead(*resp, 2),
947 MockRead(SYNCHRONOUS, 0, 3),
948 };
949
950 HostPortPair host_port_pair("www.example.org", 80);
951 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
952 PRIVACY_MODE_DISABLED);
953 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
954 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion());
955 ReadErrorUploadDataStream upload_data_stream(
956 ReadErrorUploadDataStream::FailureMode::SYNC);
957 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback()));
958
959 HttpRequestInfo request;
960 request.method = "POST";
961 request.url = GURL("http://www.example.org/");
962 request.upload_data_stream = &upload_data_stream;
963
964 TestCompletionCallback callback;
965 HttpResponseInfo response;
966 HttpRequestHeaders headers;
967 BoundNetLog net_log;
968 SpdyHttpStream http_stream(session_, true);
969 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY,
970 net_log, CompletionCallback()));
971
972 int result = http_stream.SendRequest(headers, &response, callback.callback());
973 EXPECT_EQ(ERR_FAILED, callback.GetResult(result));
974
975 // Because the server has not closed the connection yet, there shouldn't be
976 // a stream but a session in the pool
977 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key));
978 }
979
980 TEST_P(SpdyHttpStreamTest, DataReadErrorAsynchronous) {
981 std::unique_ptr<SpdySerializedFrame> req(
982 spdy_util_.ConstructChunkedSpdyPost(nullptr, 0));
983
984 // Server receives RST_STREAM_INTERNAL_ERROR on clients' internal failure.
985 // The failure is a reading error in this case caused by
986 // UploadDataStream::Read()
987 std::unique_ptr<SpdySerializedFrame> rst_frame(
988 spdy_util_.ConstructSpdyRstStream(1, RST_STREAM_INTERNAL_ERROR));
989
990 MockWrite writes[] = {
991 CreateMockWrite(*req, 0), // Request
992 CreateMockWrite(*rst_frame, 1) // Reset frame
993 };
994
995 std::unique_ptr<SpdySerializedFrame> resp(
996 spdy_util_.ConstructSpdyPostSynReply(nullptr, 0));
997
998 MockRead reads[] = {
999 MockRead(ASYNC, 0, 2),
1000 };
1001
1002 HostPortPair host_port_pair("www.example.org", 80);
1003 SpdySessionKey key(host_port_pair, ProxyServer::Direct(),
1004 PRIVACY_MODE_DISABLED);
1005 InitSession(reads, arraysize(reads), writes, arraysize(writes), key);
1006 EXPECT_EQ(spdy_util_.spdy_version(), session_->GetProtocolVersion());
1007
1008 ReadErrorUploadDataStream upload_data_stream(
1009 ReadErrorUploadDataStream::FailureMode::ASYNC);
1010 ASSERT_EQ(OK, upload_data_stream.Init(TestCompletionCallback().callback()));
1011
1012 HttpRequestInfo request;
1013 request.method = "POST";
1014 request.url = GURL("http://www.example.org/");
1015 request.upload_data_stream = &upload_data_stream;
1016
1017 TestCompletionCallback callback;
1018 HttpResponseInfo response;
1019 HttpRequestHeaders headers;
1020 BoundNetLog net_log;
1021 SpdyHttpStream http_stream(session_, true);
1022 ASSERT_EQ(OK, http_stream.InitializeStream(&request, DEFAULT_PRIORITY,
1023 net_log, CompletionCallback()));
1024
1025 int result = http_stream.SendRequest(headers, &response, callback.callback());
1026 EXPECT_EQ(ERR_IO_PENDING, result);
1027 EXPECT_EQ(ERR_FAILED, callback.GetResult(result));
1028
1029 // Because the server has closed the connection, there shouldn't be a session
1030 // in the pool anymore.
1031 EXPECT_FALSE(HasSpdySession(http_session_->spdy_session_pool(), key));
1032 }
1033
891 // TODO(willchan): Write a longer test for SpdyStream that exercises all 1034 // TODO(willchan): Write a longer test for SpdyStream that exercises all
892 // methods. 1035 // methods.
893 1036
894 } // namespace net 1037 } // namespace net
OLDNEW
« no previous file with comments | « net/spdy/spdy_http_stream.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698