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

Side by Side Diff: net/quic/bidirectional_stream_quic_impl_unittest.cc

Issue 1744693002: Implement QUIC-based net::BidirectionalStream (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@basecl
Patch Set: Address comments and fixed tests Created 4 years, 9 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
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
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/quic/bidirectional_stream_quic_impl.h"
6
7 #include <stdint.h>
8 #include <vector>
9
10 #include "base/callback_helpers.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h"
13 #include "base/run_loop.h"
14 #include "net/base/net_errors.h"
15 #include "net/http/transport_security_state.h"
16 #include "net/quic/crypto/crypto_protocol.h"
17 #include "net/quic/crypto/quic_decrypter.h"
18 #include "net/quic/crypto/quic_encrypter.h"
19 #include "net/quic/crypto/quic_server_info.h"
20 #include "net/quic/quic_chromium_client_session.h"
21 #include "net/quic/quic_chromium_client_stream.h"
22 #include "net/quic/quic_chromium_connection_helper.h"
23 #include "net/quic/quic_chromium_packet_reader.h"
24 #include "net/quic/quic_chromium_packet_writer.h"
25 #include "net/quic/quic_connection.h"
26 #include "net/quic/quic_http_utils.h"
27 #include "net/quic/spdy_utils.h"
28 #include "net/quic/test_tools/crypto_test_utils.h"
29 #include "net/quic/test_tools/mock_clock.h"
30 #include "net/quic/test_tools/mock_crypto_client_stream_factory.h"
31 #include "net/quic/test_tools/mock_random.h"
32 #include "net/quic/test_tools/quic_connection_peer.h"
33 #include "net/quic/test_tools/quic_test_packet_maker.h"
34 #include "net/quic/test_tools/quic_test_utils.h"
35 #include "net/quic/test_tools/test_task_runner.h"
36 #include "net/socket/socket_test_util.h"
37 #include "testing/gmock/include/gmock/gmock.h"
38 #include "testing/gtest/include/gtest/gtest.h"
39
40 namespace net {
41
42 namespace test {
43
44 namespace {
45
46 const char kUploadData[] = "Really nifty data!";
47 const char kDefaultServerHostName[] = "www.google.com";
48 const uint16_t kDefaultServerPort = 80;
49 // Size of the buffer to be allocated for each read.
50 const size_t kReadBufferSize = 4096;
51
52 class TestDelegateBase : public BidirectionalStreamJob::Delegate {
53 public:
54 TestDelegateBase(IOBuffer* read_buf, int read_buf_len)
55 : TestDelegateBase(read_buf,
56 read_buf_len,
57 make_scoped_ptr(new base::Timer(false, false))) {}
58
59 TestDelegateBase(IOBuffer* read_buf,
60 int read_buf_len,
61 scoped_ptr<base::Timer> timer)
62 : read_buf_(read_buf),
63 read_buf_len_(read_buf_len),
64 timer_(std::move(timer)),
65 loop_(nullptr),
66 error_(OK),
67 on_data_read_count_(0),
68 on_data_sent_count_(0),
69 not_expect_callback_(false) {
70 loop_.reset(new base::RunLoop);
71 }
72
73 ~TestDelegateBase() override {}
74
75 void OnHeadersSent() override {
76 CHECK(!not_expect_callback_);
77 loop_->Quit();
78 }
79
80 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override {
81 CHECK(!not_expect_callback_);
82
83 response_headers_ = response_headers;
84 loop_->Quit();
85 }
86
87 void OnDataRead(int bytes_read) override {
88 CHECK(!not_expect_callback_);
89 CHECK(!callback_.is_null());
90
91 ++on_data_read_count_;
92 CHECK_GE(bytes_read, OK);
93 data_received_.append(read_buf_->data(), bytes_read);
94 base::ResetAndReturn(&callback_).Run(bytes_read);
95 }
96
97 void OnDataSent() override {
98 CHECK(!not_expect_callback_);
99
100 ++on_data_sent_count_;
101 loop_->Quit();
102 }
103
104 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override {
105 CHECK(!not_expect_callback_);
106
107 trailers_ = trailers;
108 loop_->Quit();
109 }
110
111 void OnFailed(int error) override {
112 CHECK(!not_expect_callback_);
113 CHECK_EQ(OK, error_);
114 CHECK_NE(OK, error);
115
116 error_ = error;
117 loop_->Quit();
118 }
119
120 void Start(const BidirectionalStreamRequestInfo* request_info,
121 const BoundNetLog& net_log,
122 const base::WeakPtr<QuicChromiumClientSession> session) {
123 stream_job_.reset(new BidirectionalStreamQuicImpl(session));
124 stream_job_->Start(request_info, net_log, this, nullptr);
125 }
126
127 void SendData(IOBuffer* data, int length, bool end_of_stream) {
128 not_expect_callback_ = true;
129 stream_job_->SendData(data, length, end_of_stream);
130 not_expect_callback_ = false;
131 }
132
133 // Waits until next Delegate callback.
134 void WaitUntilNextCallback() {
135 loop_->Run();
136 loop_.reset(new base::RunLoop);
137 }
138
139 // Calls ReadData on the |stream_| and updates |data_received_|.
140 int ReadData(const CompletionCallback& callback) {
141 not_expect_callback_ = true;
142 int rv = stream_job_->ReadData(read_buf_.get(), read_buf_len_);
143 not_expect_callback_ = false;
144 if (rv > 0)
145 data_received_.append(read_buf_->data(), rv);
146 if (rv == ERR_IO_PENDING)
147 callback_ = callback;
148 return rv;
149 }
150
151 // Cancels |stream_|.
152 void CancelStream() { stream_job_->Cancel(); }
153
154 NextProto GetProtocol() const { return stream_job_->GetProtocol(); }
155
156 int64_t GetTotalReceivedBytes() const {
157 return stream_job_->GetTotalReceivedBytes();
158 }
159
160 int64_t GetTotalSentBytes() const { return stream_job_->GetTotalSentBytes(); }
161
162 // Const getters for internal states.
163 const std::string& data_received() const { return data_received_; }
164 int error() const { return error_; }
165 const SpdyHeaderBlock& response_headers() const { return response_headers_; }
166 const SpdyHeaderBlock& trailers() const { return trailers_; }
167 int on_data_read_count() const { return on_data_read_count_; }
168 int on_data_sent_count() const { return on_data_sent_count_; }
169
170 protected:
171 // Quits |loop_|.
172 void QuitLoop() { loop_->Quit(); }
173
174 // Deletes |stream_|.
175 void DeleteStream() { stream_job_.reset(); }
176
177 private:
178 scoped_ptr<BidirectionalStreamQuicImpl> stream_job_;
179 scoped_refptr<IOBuffer> read_buf_;
180 int read_buf_len_;
181 scoped_ptr<base::Timer> timer_;
182 std::string data_received_;
183 scoped_ptr<base::RunLoop> loop_;
184 SpdyHeaderBlock response_headers_;
185 SpdyHeaderBlock trailers_;
186 int error_;
187 int on_data_read_count_;
188 int on_data_sent_count_;
189 // This is to ensure that delegate callback is not invoked synchronously when
190 // calling into |stream_|.
191 bool not_expect_callback_;
192 CompletionCallback callback_;
193
194 DISALLOW_COPY_AND_ASSIGN(TestDelegateBase);
195 };
196
197 // A delegate that deletes the stream in a particular callback.
198 class DeleteStreamDelegate : public TestDelegateBase {
199 public:
200 // Specifies in which callback the stream can be deleted.
201 enum Phase {
202 ON_HEADERS_RECEIVED,
203 ON_DATA_READ,
204 ON_TRAILERS_RECEIVED,
205 ON_FAILED,
206 };
207
208 DeleteStreamDelegate(IOBuffer* buf, int buf_len, Phase phase, bool do_cancel)
209 : TestDelegateBase(buf, buf_len), phase_(phase), do_cancel_(do_cancel) {}
210 ~DeleteStreamDelegate() override {}
211
212 void OnHeadersReceived(const SpdyHeaderBlock& response_headers) override {
213 if (phase_ == ON_HEADERS_RECEIVED) {
214 DeleteStream();
215 }
216 TestDelegateBase::OnHeadersReceived(response_headers);
217 }
218
219 void OnDataSent() override { NOTREACHED(); }
220
221 void OnDataRead(int bytes_read) override {
222 DCHECK_NE(ON_HEADERS_RECEIVED, phase_);
223 if (phase_ == ON_DATA_READ)
224 DeleteStream();
225 TestDelegateBase::OnDataRead(bytes_read);
226 }
227
228 void OnTrailersReceived(const SpdyHeaderBlock& trailers) override {
229 DCHECK_NE(ON_HEADERS_RECEIVED, phase_);
230 DCHECK_NE(ON_DATA_READ, phase_);
231 if (phase_ == ON_TRAILERS_RECEIVED)
232 DeleteStream();
233 TestDelegateBase::OnTrailersReceived(trailers);
234 }
235
236 void OnFailed(int error) override {
237 DCHECK_EQ(ON_FAILED, phase_);
238 DeleteStream();
239 TestDelegateBase::OnFailed(error);
240 }
241
242 private:
243 // Indicates in which callback the delegate should cancel or delete the
244 // stream.
245 Phase phase_;
246 // Indicates whether to cancel or delete the stream.
247 bool do_cancel_;
248
249 DISALLOW_COPY_AND_ASSIGN(DeleteStreamDelegate);
250 };
251
252 } // namespace
253
254 class BidirectionalStreamQuicImplTest
255 : public ::testing::TestWithParam<QuicVersion> {
256 protected:
257 static const bool kFin = true;
258 static const bool kIncludeVersion = true;
259 static const bool kIncludeCongestionFeedback = true;
260
261 // Holds a packet to be written to the wire, and the IO mode that should
262 // be used by the mock socket when performing the write.
263 struct PacketToWrite {
264 PacketToWrite(IoMode mode, QuicEncryptedPacket* packet)
265 : mode(mode), packet(packet) {}
266 PacketToWrite(IoMode mode, int rv) : mode(mode), packet(nullptr), rv(rv) {}
267 IoMode mode;
268 QuicEncryptedPacket* packet;
269 int rv;
270 };
271
272 BidirectionalStreamQuicImplTest()
273 : net_log_(BoundNetLog()),
274 crypto_config_(CryptoTestUtils::ProofVerifierForTesting()),
275 read_buffer_(new IOBufferWithSize(4096)),
276 connection_id_(2),
277 stream_id_(kClientDataStreamId1),
278 maker_(GetParam(), connection_id_, &clock_, kDefaultServerHostName),
279 random_generator_(0) {
280 IPAddressNumber ip;
281 CHECK(ParseIPLiteralToNumber("192.0.2.33", &ip));
282 peer_addr_ = IPEndPoint(ip, 443);
283 self_addr_ = IPEndPoint(ip, 8435);
284 clock_.AdvanceTime(QuicTime::Delta::FromMilliseconds(20));
285 }
286
287 ~BidirectionalStreamQuicImplTest() {
288 session_->CloseSessionOnError(ERR_ABORTED, QUIC_INTERNAL_ERROR);
289 for (size_t i = 0; i < writes_.size(); i++) {
290 delete writes_[i].packet;
291 }
292 }
293
294 void TearDown() override {
295 EXPECT_TRUE(socket_data_->AllReadDataConsumed());
296 EXPECT_TRUE(socket_data_->AllWriteDataConsumed());
297 }
298
299 // Adds a packet to the list of expected writes.
300 void AddWrite(scoped_ptr<QuicEncryptedPacket> packet) {
301 writes_.push_back(PacketToWrite(SYNCHRONOUS, packet.release()));
302 }
303
304 void ProcessPacket(scoped_ptr<QuicEncryptedPacket> packet) {
305 connection_->ProcessUdpPacket(self_addr_, peer_addr_, *packet);
306 }
307
308 // Configures the test fixture to use the list of expected writes.
309 void Initialize() {
310 mock_writes_.reset(new MockWrite[writes_.size()]);
311 for (size_t i = 0; i < writes_.size(); i++) {
312 if (writes_[i].packet == nullptr) {
313 mock_writes_[i] = MockWrite(writes_[i].mode, writes_[i].rv, i);
314 } else {
315 mock_writes_[i] = MockWrite(writes_[i].mode, writes_[i].packet->data(),
316 writes_[i].packet->length());
317 }
318 };
319
320 socket_data_.reset(new StaticSocketDataProvider(
321 nullptr, 0, mock_writes_.get(), writes_.size()));
322
323 MockUDPClientSocket* socket =
324 new MockUDPClientSocket(socket_data_.get(), net_log_.net_log());
325 socket->Connect(peer_addr_);
326 runner_ = new TestTaskRunner(&clock_);
327 helper_.reset(new QuicChromiumConnectionHelper(runner_.get(), &clock_,
328 &random_generator_));
329 connection_ = new QuicConnection(
330 connection_id_, peer_addr_, helper_.get(),
331 new QuicChromiumPacketWriter(socket), true /* owns_writer */,
332 Perspective::IS_CLIENT, SupportedVersions(GetParam()));
333
334 session_.reset(new QuicChromiumClientSession(
335 connection_, scoped_ptr<DatagramClientSocket>(socket),
336 /*stream_factory=*/nullptr, &crypto_client_stream_factory_, &clock_,
337 &transport_security_state_, make_scoped_ptr((QuicServerInfo*)nullptr),
338 QuicServerId(kDefaultServerHostName, kDefaultServerPort,
339 PRIVACY_MODE_DISABLED),
340 kQuicYieldAfterPacketsRead,
341 QuicTime::Delta::FromMilliseconds(kQuicYieldAfterDurationMilliseconds),
342 /*cert_verify_flags=*/0, DefaultQuicConfig(), &crypto_config_,
343 "CONNECTION_UNKNOWN", base::TimeTicks::Now(), &push_promise_index_,
344 base::ThreadTaskRunnerHandle::Get().get(),
345 /*socket_performance_watcher=*/nullptr, nullptr));
346 session_->Initialize();
347 session_->GetCryptoStream()->CryptoConnect();
348 EXPECT_TRUE(session_->IsCryptoHandshakeConfirmed());
349 }
350
351 void SetRequest(const std::string& method,
352 const std::string& path,
353 RequestPriority priority) {
354 request_headers_ = maker_.GetRequestHeaders(method, "http", path);
355 }
356
357 SpdyHeaderBlock ConstructResponseHeaders(const std::string& response_code) {
358 return maker_.GetResponseHeaders(response_code);
359 }
360
361 scoped_ptr<QuicEncryptedPacket> ConstructDataPacket(
362 QuicPacketNumber packet_number,
363 bool should_include_version,
364 bool fin,
365 QuicStreamOffset offset,
366 base::StringPiece data) {
367 scoped_ptr<QuicEncryptedPacket> packet(maker_.MakeDataPacket(
368 packet_number, stream_id_, should_include_version, fin, offset, data));
369 DVLOG(2) << "packet(" << packet_number << "): " << std::endl
370 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece());
371 return packet;
372 }
373
374 scoped_ptr<QuicEncryptedPacket> ConstructRequestHeadersPacket(
375 QuicPacketNumber packet_number,
376 bool fin,
377 RequestPriority request_priority,
378 size_t* spdy_headers_frame_length) {
379 SpdyPriority priority =
380 ConvertRequestPriorityToQuicPriority(request_priority);
381 return maker_.MakeRequestHeadersPacket(
382 packet_number, stream_id_, kIncludeVersion, fin, priority,
383 request_headers_, spdy_headers_frame_length);
384 }
385
386 scoped_ptr<QuicEncryptedPacket> ConstructResponseHeadersPacket(
387 QuicPacketNumber packet_number,
388 bool fin,
389 const SpdyHeaderBlock& response_headers,
390 size_t* spdy_headers_frame_length,
391 QuicStreamOffset* offset) {
392 return maker_.MakeResponseHeadersPacket(
393 packet_number, stream_id_, !kIncludeVersion, fin, response_headers,
394 spdy_headers_frame_length, offset);
395 }
396
397 scoped_ptr<QuicEncryptedPacket> ConstructResponseTrailersPacket(
398 QuicPacketNumber packet_number,
399 bool fin,
400 const SpdyHeaderBlock& trailers,
401 size_t* spdy_headers_frame_length,
402 QuicStreamOffset* offset) {
403 return maker_.MakeResponseHeadersPacket(packet_number, stream_id_,
404 !kIncludeVersion, fin, trailers,
405 spdy_headers_frame_length, offset);
406 }
407
408 scoped_ptr<QuicEncryptedPacket> ConstructRstStreamPacket(
409 QuicPacketNumber packet_number) {
410 return ConstructRstStreamCancelledPacket(packet_number, 0);
411 }
412
413 scoped_ptr<QuicEncryptedPacket> ConstructRstStreamCancelledPacket(
414 QuicPacketNumber packet_number,
415 size_t bytes_written) {
416 scoped_ptr<QuicEncryptedPacket> packet(
417 maker_.MakeRstPacket(packet_number, !kIncludeVersion, stream_id_,
418 QUIC_STREAM_CANCELLED, bytes_written));
419 DVLOG(2) << "packet(" << packet_number << "): " << std::endl
420 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece());
421 return packet;
422 }
423
424 scoped_ptr<QuicEncryptedPacket> ConstructAckAndRstStreamPacket(
425 QuicPacketNumber packet_number,
426 QuicPacketNumber largest_received,
427 QuicPacketNumber ack_least_unacked,
428 QuicPacketNumber stop_least_unacked) {
429 return maker_.MakeAckAndRstPacket(
430 packet_number, !kIncludeVersion, stream_id_, QUIC_STREAM_CANCELLED,
431 largest_received, ack_least_unacked, stop_least_unacked,
432 !kIncludeCongestionFeedback);
433 }
434
435 scoped_ptr<QuicEncryptedPacket> ConstructAckAndDataPacket(
436 QuicPacketNumber packet_number,
437 bool should_include_version,
438 QuicPacketNumber largest_received,
439 QuicPacketNumber least_unacked,
440 bool fin,
441 QuicStreamOffset offset,
442 base::StringPiece data) {
443 scoped_ptr<QuicEncryptedPacket> packet(maker_.MakeAckAndDataPacket(
444 packet_number, should_include_version, stream_id_, largest_received,
445 least_unacked, fin, offset, data));
446 DVLOG(2) << "packet(" << packet_number << "): " << std::endl
447 << QuicUtils::StringToHexASCIIDump(packet->AsStringPiece());
448 return packet;
449 }
450
451 scoped_ptr<QuicEncryptedPacket> ConstructAckPacket(
452 QuicPacketNumber packet_number,
453 QuicPacketNumber largest_received,
454 QuicPacketNumber least_unacked) {
455 return maker_.MakeAckPacket(packet_number, largest_received, least_unacked,
456 !kIncludeCongestionFeedback);
457 }
458
459 const BoundNetLog& net_log() const { return net_log_; }
460
461 QuicChromiumClientSession* session() const { return session_.get(); }
462
463 private:
464 BoundNetLog net_log_;
465 scoped_refptr<TestTaskRunner> runner_;
466 scoped_ptr<MockWrite[]> mock_writes_;
467 MockClock clock_;
468 QuicConnection* connection_;
469 scoped_ptr<QuicChromiumConnectionHelper> helper_;
470 TransportSecurityState transport_security_state_;
471 scoped_ptr<QuicChromiumClientSession> session_;
472 QuicCryptoClientConfig crypto_config_;
473 HttpRequestHeaders headers_;
474 HttpResponseInfo response_;
475 scoped_refptr<IOBufferWithSize> read_buffer_;
476 SpdyHeaderBlock request_headers_;
477 const QuicConnectionId connection_id_;
478 const QuicStreamId stream_id_;
479 QuicTestPacketMaker maker_;
480 IPEndPoint self_addr_;
481 IPEndPoint peer_addr_;
482 MockRandom random_generator_;
483 MockCryptoClientStreamFactory crypto_client_stream_factory_;
484 scoped_ptr<StaticSocketDataProvider> socket_data_;
485 std::vector<PacketToWrite> writes_;
486 QuicClientPushPromiseIndex push_promise_index_;
487 };
488
489 INSTANTIATE_TEST_CASE_P(Version,
490 BidirectionalStreamQuicImplTest,
491 ::testing::ValuesIn(QuicSupportedVersions()));
492
493 TEST_P(BidirectionalStreamQuicImplTest, GetRequest) {
494 SetRequest("GET", "/", DEFAULT_PRIORITY);
495 size_t spdy_request_headers_frame_length;
496 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
497 &spdy_request_headers_frame_length));
498
499 AddWrite(ConstructAckPacket(2, 3, 1));
500 Initialize();
501
502 BidirectionalStreamRequestInfo request;
503 request.method = "GET";
504 request.url = GURL("http://www.google.com/");
505 request.end_stream_on_headers = true;
506 request.priority = DEFAULT_PRIORITY;
507
508 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
509 scoped_ptr<TestDelegateBase> delegate(
510 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
511 delegate->Start(&request, net_log(), session()->GetWeakPtr());
512 delegate->WaitUntilNextCallback(); // OnHeadersSent
513
514 // Server acks the request.
515 ProcessPacket(ConstructAckPacket(1, 0, 0));
516
517 // Server sends the response headers.
518 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
519
520 size_t spdy_response_headers_frame_length;
521 QuicStreamOffset offset = 0;
522 ProcessPacket(ConstructResponseHeadersPacket(
523 2, !kFin, response_headers, &spdy_response_headers_frame_length,
524 &offset));
525
526 delegate->WaitUntilNextCallback(); // OnHeadersReceived
527 TestCompletionCallback cb;
528 int rv = delegate->ReadData(cb.callback());
529 EXPECT_EQ(ERR_IO_PENDING, rv);
530 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
531 const char kResponseBody[] = "Hello world!";
532 // Server sends data.
533 ProcessPacket(
534 ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
535 EXPECT_EQ(12, cb.WaitForResult());
536
537 EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
538 TestCompletionCallback cb2;
539 EXPECT_EQ(ERR_IO_PENDING, delegate->ReadData(cb2.callback()));
540
541 SpdyHeaderBlock trailers;
542 size_t spdy_trailers_frame_length;
543 trailers["foo"] = "bar";
544 // Server sends trailers.
545 ProcessPacket(ConstructResponseTrailersPacket(
546 4, kFin, trailers, &spdy_trailers_frame_length, &offset));
547
548 delegate->WaitUntilNextCallback(); // OnTrailersReceived
549 EXPECT_EQ(OK, cb2.WaitForResult());
550 EXPECT_EQ(trailers, delegate->trailers());
551
552 EXPECT_EQ(OK, delegate->ReadData(cb2.callback()));
553 base::MessageLoop::current()->RunUntilIdle();
554
555 EXPECT_EQ(2, delegate->on_data_read_count());
556 EXPECT_EQ(0, delegate->on_data_sent_count());
557 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol());
558 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
559 delegate->GetTotalSentBytes());
560 EXPECT_EQ(
561 static_cast<int64_t>(spdy_response_headers_frame_length +
562 strlen(kResponseBody) + spdy_trailers_frame_length),
563 delegate->GetTotalReceivedBytes());
564 }
565
566 TEST_P(BidirectionalStreamQuicImplTest, PostRequest) {
567 SetRequest("POST", "/", DEFAULT_PRIORITY);
568 size_t spdy_request_headers_frame_length;
569 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
570 &spdy_request_headers_frame_length));
571 AddWrite(ConstructDataPacket(2, kIncludeVersion, kFin, 0, kUploadData));
572 AddWrite(ConstructAckPacket(3, 3, 1));
573
574 Initialize();
575
576 BidirectionalStreamRequestInfo request;
577 request.method = "POST";
578 request.url = GURL("http://www.google.com/");
579 request.end_stream_on_headers = false;
580 request.priority = DEFAULT_PRIORITY;
581
582 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
583 scoped_ptr<TestDelegateBase> delegate(
584 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
585 delegate->Start(&request, net_log(), session()->GetWeakPtr());
586 delegate->WaitUntilNextCallback(); // OnHeadersSent
587
588 // Send a DATA frame.
589 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData));
590
591 delegate->SendData(buf.get(), buf->size(), true);
592 delegate->WaitUntilNextCallback(); // OnDataSent
593
594 // Server acks the request.
595 ProcessPacket(ConstructAckPacket(1, 0, 0));
596
597 // Server sends the response headers.
598 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
599 size_t spdy_response_headers_frame_length;
600 QuicStreamOffset offset = 0;
601 ProcessPacket(ConstructResponseHeadersPacket(
602 2, !kFin, response_headers, &spdy_response_headers_frame_length,
603 &offset));
604
605 delegate->WaitUntilNextCallback(); // OnHeadersReceived
606 TestCompletionCallback cb;
607 int rv = delegate->ReadData(cb.callback());
608 EXPECT_EQ(ERR_IO_PENDING, rv);
609 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
610 const char kResponseBody[] = "Hello world!";
611 // Server sends data.
612 ProcessPacket(
613 ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
614
615 EXPECT_EQ(static_cast<int>(strlen(kResponseBody)), cb.WaitForResult());
616
617 size_t spdy_trailers_frame_length;
618 SpdyHeaderBlock trailers;
619 trailers["foo"] = "bar";
620 // Server sends trailers.
621 ProcessPacket(ConstructResponseTrailersPacket(
622 4, kFin, trailers, &spdy_trailers_frame_length, &offset));
623
624 delegate->WaitUntilNextCallback(); // OnTrailersReceived
625 EXPECT_EQ(trailers, delegate->trailers());
626 EXPECT_EQ(OK, delegate->ReadData(cb.callback()));
627
628 EXPECT_EQ(1, delegate->on_data_read_count());
629 EXPECT_EQ(1, delegate->on_data_sent_count());
630 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol());
631 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
632 strlen(kUploadData)),
633 delegate->GetTotalSentBytes());
634 EXPECT_EQ(
635 static_cast<int64_t>(spdy_response_headers_frame_length +
636 strlen(kResponseBody) + spdy_trailers_frame_length),
637 delegate->GetTotalReceivedBytes());
638 }
639
640 TEST_P(BidirectionalStreamQuicImplTest, InterleaveReadDataAndSendData) {
641 SetRequest("POST", "/", DEFAULT_PRIORITY);
642 size_t spdy_request_headers_frame_length;
643 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
644 &spdy_request_headers_frame_length));
645 AddWrite(ConstructAckAndDataPacket(2, !kIncludeVersion, 2, 1, !kFin, 0,
646 kUploadData));
647 AddWrite(ConstructAckAndDataPacket(3, !kIncludeVersion, 3, 3, kFin,
648 strlen(kUploadData), kUploadData));
649 Initialize();
650
651 BidirectionalStreamRequestInfo request;
652 request.method = "POST";
653 request.url = GURL("http://www.google.com/");
654 request.end_stream_on_headers = false;
655 request.priority = DEFAULT_PRIORITY;
656
657 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
658 scoped_ptr<TestDelegateBase> delegate(
659 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
660 delegate->Start(&request, net_log(), session()->GetWeakPtr());
661 delegate->WaitUntilNextCallback(); // OnHeadersSent
662
663 // Server acks the request.
664 ProcessPacket(ConstructAckPacket(1, 0, 0));
665
666 // Server sends the response headers.
667 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
668 size_t spdy_response_headers_frame_length;
669 ProcessPacket(ConstructResponseHeadersPacket(
670 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0));
671
672 delegate->WaitUntilNextCallback(); // OnHeadersReceived
673 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
674
675 // Client sends a data packet.
676 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData));
677
678 delegate->SendData(buf.get(), buf->size(), false);
679 delegate->WaitUntilNextCallback(); // OnDataSent
680
681 TestCompletionCallback cb;
682 int rv = delegate->ReadData(cb.callback());
683 EXPECT_EQ(ERR_IO_PENDING, rv);
684 const char kResponseBody[] = "Hello world!";
685
686 // Server sends a data packet.
687 ProcessPacket(ConstructAckAndDataPacket(3, !kIncludeVersion, 2, 1, !kFin, 0,
688 kResponseBody));
689
690 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult());
691 EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
692
693 // Client sends a data packet.
694 delegate->SendData(buf.get(), buf->size(), true);
695 delegate->WaitUntilNextCallback(); // OnDataSent
696
697 TestCompletionCallback cb2;
698 rv = delegate->ReadData(cb2.callback());
699 EXPECT_EQ(ERR_IO_PENDING, rv);
700 ProcessPacket(ConstructAckAndDataPacket(
701 4, !kIncludeVersion, 3, 1, kFin, strlen(kResponseBody), kResponseBody));
702
703 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb2.WaitForResult());
704
705 std::string expected_body(kResponseBody);
706 expected_body.append(kResponseBody);
707 EXPECT_EQ(expected_body, delegate->data_received());
708
709 EXPECT_EQ(OK, delegate->ReadData(cb.callback()));
710 EXPECT_EQ(2, delegate->on_data_read_count());
711 EXPECT_EQ(2, delegate->on_data_sent_count());
712 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol());
713 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
714 2 * strlen(kUploadData)),
715 delegate->GetTotalSentBytes());
716 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length +
717 2 * strlen(kResponseBody)),
718 delegate->GetTotalReceivedBytes());
719 }
720
721 TEST_P(BidirectionalStreamQuicImplTest, ServerSendsRstAfterHeaders) {
722 SetRequest("GET", "/", DEFAULT_PRIORITY);
723 size_t spdy_request_headers_frame_length;
724 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
725 &spdy_request_headers_frame_length));
726 Initialize();
727
728 BidirectionalStreamRequestInfo request;
729 request.method = "GET";
730 request.url = GURL("http://www.google.com/");
731 request.end_stream_on_headers = true;
732 request.priority = DEFAULT_PRIORITY;
733
734 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
735 scoped_ptr<TestDelegateBase> delegate(
736 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
737 delegate->Start(&request, net_log(), session()->GetWeakPtr());
738 delegate->WaitUntilNextCallback(); // OnHeadersSent
739
740 // Server sends a Rst.
741 ProcessPacket(ConstructRstStreamPacket(1));
742
743 delegate->WaitUntilNextCallback(); // OnFailed
744 TestCompletionCallback cb;
745 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, delegate->ReadData(cb.callback()));
746
747 base::MessageLoop::current()->RunUntilIdle();
748
749 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, delegate->error());
750 EXPECT_EQ(0, delegate->on_data_read_count());
751 EXPECT_EQ(0, delegate->on_data_sent_count());
752 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
753 delegate->GetTotalSentBytes());
754 EXPECT_EQ(0, delegate->GetTotalReceivedBytes());
755 }
756
757 TEST_P(BidirectionalStreamQuicImplTest, ServerSendsRstAfterReadData) {
758 SetRequest("GET", "/", DEFAULT_PRIORITY);
759 size_t spdy_request_headers_frame_length;
760 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
761 &spdy_request_headers_frame_length));
762 // Why does QUIC ack Rst? Is this expected?
763 AddWrite(ConstructAckPacket(2, 3, 1));
764
765 Initialize();
766
767 BidirectionalStreamRequestInfo request;
768 request.method = "GET";
769 request.url = GURL("http://www.google.com/");
770 request.end_stream_on_headers = true;
771 request.priority = DEFAULT_PRIORITY;
772
773 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
774 scoped_ptr<TestDelegateBase> delegate(
775 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
776 delegate->Start(&request, net_log(), session()->GetWeakPtr());
777 delegate->WaitUntilNextCallback(); // OnHeadersSent
778
779 // Server acks the request.
780 ProcessPacket(ConstructAckPacket(1, 0, 0));
781
782 // Server sends the response headers.
783 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
784
785 size_t spdy_response_headers_frame_length;
786 QuicStreamOffset offset = 0;
787 ProcessPacket(ConstructResponseHeadersPacket(
788 2, !kFin, response_headers, &spdy_response_headers_frame_length,
789 &offset));
790
791 delegate->WaitUntilNextCallback(); // OnHeadersReceived
792 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
793
794 TestCompletionCallback cb;
795 int rv = delegate->ReadData(cb.callback());
796 EXPECT_EQ(ERR_IO_PENDING, rv);
797
798 // Server sends a Rst.
799 ProcessPacket(ConstructRstStreamPacket(3));
800
801 delegate->WaitUntilNextCallback(); // OnFailed
802
803 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, delegate->ReadData(cb.callback()));
804 EXPECT_EQ(ERR_QUIC_PROTOCOL_ERROR, delegate->error());
805 EXPECT_EQ(0, delegate->on_data_read_count());
806 EXPECT_EQ(0, delegate->on_data_sent_count());
807 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
808 delegate->GetTotalSentBytes());
809 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length),
810 delegate->GetTotalReceivedBytes());
811 }
812
813 TEST_P(BidirectionalStreamQuicImplTest, CancelStreamAfterSendData) {
814 SetRequest("POST", "/", DEFAULT_PRIORITY);
815 size_t spdy_request_headers_frame_length;
816 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
817 &spdy_request_headers_frame_length));
818 AddWrite(ConstructAckAndDataPacket(2, !kIncludeVersion, 2, 1, !kFin, 0,
819 kUploadData));
820 AddWrite(ConstructRstStreamCancelledPacket(3, strlen(kUploadData)));
821
822 Initialize();
823
824 BidirectionalStreamRequestInfo request;
825 request.method = "POST";
826 request.url = GURL("http://www.google.com/");
827 request.end_stream_on_headers = false;
828 request.priority = DEFAULT_PRIORITY;
829
830 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
831 scoped_ptr<TestDelegateBase> delegate(
832 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
833 delegate->Start(&request, net_log(), session()->GetWeakPtr());
834 delegate->WaitUntilNextCallback(); // OnHeadersSent
835
836 // Server acks the request.
837 ProcessPacket(ConstructAckPacket(1, 0, 0));
838
839 // Server sends the response headers.
840 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
841 size_t spdy_response_headers_frame_length;
842 ProcessPacket(ConstructResponseHeadersPacket(
843 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0));
844
845 delegate->WaitUntilNextCallback(); // OnHeadersReceived
846 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
847
848 // Send a DATA frame.
849 scoped_refptr<StringIOBuffer> buf(new StringIOBuffer(kUploadData));
850
851 delegate->SendData(buf.get(), buf->size(), false);
852 delegate->WaitUntilNextCallback(); // OnDataSent
853
854 delegate->CancelStream();
855 base::MessageLoop::current()->RunUntilIdle();
856
857 EXPECT_EQ(0, delegate->on_data_read_count());
858 EXPECT_EQ(1, delegate->on_data_sent_count());
859 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol());
860 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length +
861 strlen(kUploadData)),
862 delegate->GetTotalSentBytes());
863 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length),
864 delegate->GetTotalReceivedBytes());
865 }
866
867 TEST_P(BidirectionalStreamQuicImplTest, SessionClosedBeforeReadData) {
868 SetRequest("GET", "/", DEFAULT_PRIORITY);
869 size_t spdy_request_headers_frame_length;
870 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
871 &spdy_request_headers_frame_length));
872 Initialize();
873
874 BidirectionalStreamRequestInfo request;
875 request.method = "GET";
876 request.url = GURL("http://www.google.com/");
877 request.end_stream_on_headers = true;
878 request.priority = DEFAULT_PRIORITY;
879
880 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
881 scoped_ptr<TestDelegateBase> delegate(
882 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
883 delegate->Start(&request, net_log(), session()->GetWeakPtr());
884 delegate->WaitUntilNextCallback(); // OnHeadersSent
885
886 // Server acks the request.
887 ProcessPacket(ConstructAckPacket(1, 0, 0));
888
889 // Server sends the response headers.
890 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
891
892 size_t spdy_response_headers_frame_length;
893 QuicStreamOffset offset = 0;
894 ProcessPacket(ConstructResponseHeadersPacket(
895 2, !kFin, response_headers, &spdy_response_headers_frame_length,
896 &offset));
897
898 delegate->WaitUntilNextCallback(); // OnHeadersReceived
899 TestCompletionCallback cb;
900 int rv = delegate->ReadData(cb.callback());
901 EXPECT_EQ(ERR_IO_PENDING, rv);
902 session()->connection()->CloseConnection(QUIC_NO_ERROR,
903 ConnectionCloseSource::FROM_PEER);
904 delegate->WaitUntilNextCallback(); // OnFailed
905
906 base::MessageLoop::current()->RunUntilIdle();
907
908 EXPECT_EQ(ERR_UNEXPECTED, delegate->ReadData(cb.callback()));
909 EXPECT_EQ(ERR_UNEXPECTED, delegate->error());
910 EXPECT_EQ(0, delegate->on_data_read_count());
911 EXPECT_EQ(0, delegate->on_data_sent_count());
912 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol());
913 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
914 delegate->GetTotalSentBytes());
915 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length),
916 delegate->GetTotalReceivedBytes());
917 }
918
919 TEST_P(BidirectionalStreamQuicImplTest, CancelStreamAfterReadData) {
920 SetRequest("POST", "/", DEFAULT_PRIORITY);
921 size_t spdy_request_headers_frame_length;
922 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
923 &spdy_request_headers_frame_length));
924 AddWrite(ConstructAckAndRstStreamPacket(2, 2, 1, 1));
925
926 Initialize();
927
928 BidirectionalStreamRequestInfo request;
929 request.method = "POST";
930 request.url = GURL("http://www.google.com/");
931 request.end_stream_on_headers = false;
932 request.priority = DEFAULT_PRIORITY;
933
934 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
935 scoped_ptr<TestDelegateBase> delegate(
936 new TestDelegateBase(read_buffer.get(), kReadBufferSize));
937 delegate->Start(&request, net_log(), session()->GetWeakPtr());
938 delegate->WaitUntilNextCallback(); // OnHeadersSent
939
940 // Server acks the request.
941 ProcessPacket(ConstructAckPacket(1, 0, 0));
942
943 // Server sends the response headers.
944 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
945 size_t spdy_response_headers_frame_length;
946 ProcessPacket(ConstructResponseHeadersPacket(
947 2, !kFin, response_headers, &spdy_response_headers_frame_length, 0));
948
949 delegate->WaitUntilNextCallback(); // OnHeadersReceived
950 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
951
952 // Cancel the stream after ReadData returns ERR_IO_PENDING.
953 TestCompletionCallback cb;
954 EXPECT_EQ(ERR_IO_PENDING, delegate->ReadData(cb.callback()));
955 delegate->CancelStream();
956
957 base::MessageLoop::current()->RunUntilIdle();
958
959 EXPECT_EQ(0, delegate->on_data_read_count());
960 EXPECT_EQ(0, delegate->on_data_sent_count());
961 EXPECT_EQ(kProtoQUIC1SPDY3, delegate->GetProtocol());
962 EXPECT_EQ(static_cast<int64_t>(spdy_request_headers_frame_length),
963 delegate->GetTotalSentBytes());
964 EXPECT_EQ(static_cast<int64_t>(spdy_response_headers_frame_length),
965 delegate->GetTotalReceivedBytes());
966 }
967
968 TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamDuringOnHeadersReceived) {
969 SetRequest("POST", "/", DEFAULT_PRIORITY);
970 size_t spdy_request_headers_frame_length;
971 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
972 &spdy_request_headers_frame_length));
973 AddWrite(ConstructAckAndRstStreamPacket(2, 2, 1, 1));
974
975 Initialize();
976
977 BidirectionalStreamRequestInfo request;
978 request.method = "POST";
979 request.url = GURL("http://www.google.com/");
980 request.end_stream_on_headers = false;
981 request.priority = DEFAULT_PRIORITY;
982
983 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
984 scoped_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
985 read_buffer.get(), kReadBufferSize,
986 DeleteStreamDelegate::ON_HEADERS_RECEIVED, true));
987 delegate->Start(&request, net_log(), session()->GetWeakPtr());
988 delegate->WaitUntilNextCallback(); // OnHeadersSent
989
990 // Server acks the request.
991 ProcessPacket(ConstructAckPacket(1, 0, 0));
992
993 // Server sends the response headers.
994 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
995
996 size_t spdy_response_headers_frame_length;
997 ProcessPacket(ConstructResponseHeadersPacket(
998 2, !kFin, response_headers, &spdy_response_headers_frame_length,
999 nullptr));
1000
1001 delegate->WaitUntilNextCallback(); // OnHeadersReceived
1002 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
1003
1004 base::MessageLoop::current()->RunUntilIdle();
1005
1006 EXPECT_EQ(0, delegate->on_data_read_count());
1007 EXPECT_EQ(0, delegate->on_data_sent_count());
1008 }
1009
1010 TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamDuringOnDataRead) {
1011 SetRequest("POST", "/", DEFAULT_PRIORITY);
1012 size_t spdy_request_headers_frame_length;
1013 AddWrite(ConstructRequestHeadersPacket(1, !kFin, DEFAULT_PRIORITY,
1014 &spdy_request_headers_frame_length));
1015 AddWrite(ConstructAckPacket(2, 3, 1));
1016 AddWrite(ConstructRstStreamPacket(3));
1017
1018 Initialize();
1019
1020 BidirectionalStreamRequestInfo request;
1021 request.method = "POST";
1022 request.url = GURL("http://www.google.com/");
1023 request.end_stream_on_headers = false;
1024 request.priority = DEFAULT_PRIORITY;
1025
1026 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
1027 scoped_ptr<DeleteStreamDelegate> delegate(
1028 new DeleteStreamDelegate(read_buffer.get(), kReadBufferSize,
1029 DeleteStreamDelegate::ON_DATA_READ, true));
1030 delegate->Start(&request, net_log(), session()->GetWeakPtr());
1031 delegate->WaitUntilNextCallback(); // OnHeadersSent
1032
1033 // Server acks the request.
1034 ProcessPacket(ConstructAckPacket(1, 0, 0));
1035
1036 // Server sends the response headers.
1037 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
1038
1039 size_t spdy_response_headers_frame_length;
1040 ProcessPacket(ConstructResponseHeadersPacket(
1041 2, !kFin, response_headers, &spdy_response_headers_frame_length,
1042 nullptr));
1043
1044 delegate->WaitUntilNextCallback(); // OnHeadersReceived
1045
1046 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
1047
1048 TestCompletionCallback cb;
1049 int rv = delegate->ReadData(cb.callback());
1050 EXPECT_EQ(ERR_IO_PENDING, rv);
1051 const char kResponseBody[] = "Hello world!";
1052 // Server sends data.
1053 ProcessPacket(
1054 ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
1055 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult());
1056
1057 base::MessageLoop::current()->RunUntilIdle();
1058
1059 EXPECT_EQ(1, delegate->on_data_read_count());
1060 EXPECT_EQ(0, delegate->on_data_sent_count());
1061 }
1062
1063 TEST_P(BidirectionalStreamQuicImplTest, DeleteStreamDuringOnTrailersReceived) {
1064 SetRequest("GET", "/", DEFAULT_PRIORITY);
1065 size_t spdy_request_headers_frame_length;
1066 AddWrite(ConstructRequestHeadersPacket(1, kFin, DEFAULT_PRIORITY,
1067 &spdy_request_headers_frame_length));
1068 AddWrite(ConstructAckPacket(2, 3, 1)); // Ack the data packet
1069 AddWrite(ConstructAckAndRstStreamPacket(3, 4, 4, 1));
1070
1071 Initialize();
1072
1073 BidirectionalStreamRequestInfo request;
1074 request.method = "GET";
1075 request.url = GURL("http://www.google.com/");
1076 request.end_stream_on_headers = true;
1077 request.priority = DEFAULT_PRIORITY;
1078
1079 scoped_refptr<IOBuffer> read_buffer(new IOBuffer(kReadBufferSize));
1080 scoped_ptr<DeleteStreamDelegate> delegate(new DeleteStreamDelegate(
1081 read_buffer.get(), kReadBufferSize,
1082 DeleteStreamDelegate::ON_TRAILERS_RECEIVED, true));
1083 delegate->Start(&request, net_log(), session()->GetWeakPtr());
1084 delegate->WaitUntilNextCallback(); // OnHeadersSent
1085
1086 // Server acks the request.
1087 ProcessPacket(ConstructAckPacket(1, 0, 0));
1088
1089 // Server sends the response headers.
1090 SpdyHeaderBlock response_headers = ConstructResponseHeaders("200");
1091
1092 QuicStreamOffset offset = 0;
1093 size_t spdy_response_headers_frame_length;
1094 ProcessPacket(ConstructResponseHeadersPacket(
1095 2, !kFin, response_headers, &spdy_response_headers_frame_length,
1096 &offset));
1097
1098 delegate->WaitUntilNextCallback(); // OnHeadersReceived
1099
1100 EXPECT_EQ("200", delegate->response_headers().find(":status")->second);
1101
1102 TestCompletionCallback cb;
1103 int rv = delegate->ReadData(cb.callback());
1104 EXPECT_EQ(ERR_IO_PENDING, rv);
1105 const char kResponseBody[] = "Hello world!";
1106 // Server sends data.
1107 ProcessPacket(
1108 ConstructDataPacket(3, !kIncludeVersion, !kFin, 0, kResponseBody));
1109
1110 EXPECT_EQ(static_cast<int64_t>(strlen(kResponseBody)), cb.WaitForResult());
1111 EXPECT_EQ(std::string(kResponseBody), delegate->data_received());
1112
1113 size_t spdy_trailers_frame_length;
1114 SpdyHeaderBlock trailers;
1115 trailers["foo"] = "bar";
1116 // Server sends trailers.
1117 ProcessPacket(ConstructResponseTrailersPacket(
1118 4, kFin, trailers, &spdy_trailers_frame_length, &offset));
1119
1120 delegate->WaitUntilNextCallback(); // OnTrailersReceived
1121 EXPECT_EQ(trailers, delegate->trailers());
1122
1123 base::MessageLoop::current()->RunUntilIdle();
1124
1125 EXPECT_EQ(1, delegate->on_data_read_count());
1126 EXPECT_EQ(0, delegate->on_data_sent_count());
1127 }
1128
1129 } // namespace test
1130
1131 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698