| OLD | NEW |
| 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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
| 6 #include "base/compiler_specific.h" | 6 #include "base/compiler_specific.h" |
| 7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "net/base/test_completion_callback.h" | 8 #include "net/base/test_completion_callback.h" |
| 9 #include "net/cert/mock_cert_verifier.h" | 9 #include "net/cert/mock_cert_verifier.h" |
| 10 #include "net/dns/mock_host_resolver.h" | 10 #include "net/dns/mock_host_resolver.h" |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 114 header.fec_entropy_flag = false; | 114 header.fec_entropy_flag = false; |
| 115 header.fec_group = 0; | 115 header.fec_group = 0; |
| 116 | 116 |
| 117 QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked); | 117 QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked); |
| 118 | 118 |
| 119 QuicCongestionFeedbackFrame feedback; | 119 QuicCongestionFeedbackFrame feedback; |
| 120 feedback.type = kTCP; | 120 feedback.type = kTCP; |
| 121 feedback.tcp.accumulated_number_of_lost_packets = 0; | 121 feedback.tcp.accumulated_number_of_lost_packets = 0; |
| 122 feedback.tcp.receive_window = 256000; | 122 feedback.tcp.receive_window = 256000; |
| 123 | 123 |
| 124 QuicFramer framer(kQuicVersion1, | 124 QuicFramer framer(kQuicVersion1, QuicTime::Zero(), false); |
| 125 QuicDecrypter::Create(kNULL), | |
| 126 QuicEncrypter::Create(kNULL), | |
| 127 QuicTime::Zero(), | |
| 128 false); | |
| 129 QuicFrames frames; | 125 QuicFrames frames; |
| 130 frames.push_back(QuicFrame(&ack)); | 126 frames.push_back(QuicFrame(&ack)); |
| 131 frames.push_back(QuicFrame(&feedback)); | 127 frames.push_back(QuicFrame(&feedback)); |
| 132 scoped_ptr<QuicPacket> packet( | 128 scoped_ptr<QuicPacket> packet( |
| 133 framer.ConstructFrameDataPacket(header, frames).packet); | 129 framer.ConstructFrameDataPacket(header, frames).packet); |
| 134 return scoped_ptr<QuicEncryptedPacket>( | 130 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( |
| 135 framer.EncryptPacket(header.packet_sequence_number, *packet)); | 131 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); |
| 136 } | 132 } |
| 137 | 133 |
| 138 std::string GetRequestString(const std::string& method, | 134 std::string GetRequestString(const std::string& method, |
| 139 const std::string& path) { | 135 const std::string& path) { |
| 140 SpdyHeaderBlock headers; | 136 SpdyHeaderBlock headers; |
| 141 headers[":method"] = method; | 137 headers[":method"] = method; |
| 142 headers[":host"] = "www.google.com"; | 138 headers[":host"] = "www.google.com"; |
| 143 headers[":path"] = path; | 139 headers[":path"] = path; |
| 144 headers[":scheme"] = "http"; | 140 headers[":scheme"] = "http"; |
| 145 headers[":version"] = "HTTP/1.1"; | 141 headers[":version"] = "HTTP/1.1"; |
| (...skipping 25 matching lines...) Expand all Loading... |
| 171 QuicStreamOffset offset, | 167 QuicStreamOffset offset, |
| 172 base::StringPiece data) { | 168 base::StringPiece data) { |
| 173 InitializeHeader(sequence_number, should_include_version); | 169 InitializeHeader(sequence_number, should_include_version); |
| 174 QuicStreamFrame frame(3, fin, offset, data); | 170 QuicStreamFrame frame(3, fin, offset, data); |
| 175 return ConstructPacket(header_, QuicFrame(&frame)).release(); | 171 return ConstructPacket(header_, QuicFrame(&frame)).release(); |
| 176 } | 172 } |
| 177 | 173 |
| 178 scoped_ptr<QuicEncryptedPacket> ConstructPacket( | 174 scoped_ptr<QuicEncryptedPacket> ConstructPacket( |
| 179 const QuicPacketHeader& header, | 175 const QuicPacketHeader& header, |
| 180 const QuicFrame& frame) { | 176 const QuicFrame& frame) { |
| 181 QuicFramer framer(kQuicVersion1, | 177 QuicFramer framer(kQuicVersion1, QuicTime::Zero(), false); |
| 182 QuicDecrypter::Create(kNULL), | |
| 183 QuicEncrypter::Create(kNULL), | |
| 184 QuicTime::Zero(), | |
| 185 false); | |
| 186 QuicFrames frames; | 178 QuicFrames frames; |
| 187 frames.push_back(frame); | 179 frames.push_back(frame); |
| 188 scoped_ptr<QuicPacket> packet( | 180 scoped_ptr<QuicPacket> packet( |
| 189 framer.ConstructFrameDataPacket(header, frames).packet); | 181 framer.ConstructFrameDataPacket(header, frames).packet); |
| 190 return scoped_ptr<QuicEncryptedPacket>( | 182 return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( |
| 191 framer.EncryptPacket(header.packet_sequence_number, *packet)); | 183 ENCRYPTION_NONE, header.packet_sequence_number, *packet)); |
| 192 } | 184 } |
| 193 | 185 |
| 194 void InitializeHeader(QuicPacketSequenceNumber sequence_number, | 186 void InitializeHeader(QuicPacketSequenceNumber sequence_number, |
| 195 bool should_include_version) { | 187 bool should_include_version) { |
| 196 header_.public_header.guid = random_generator_.RandUint64(); | 188 header_.public_header.guid = random_generator_.RandUint64(); |
| 197 header_.public_header.reset_flag = false; | 189 header_.public_header.reset_flag = false; |
| 198 header_.public_header.version_flag = should_include_version; | 190 header_.public_header.version_flag = should_include_version; |
| 199 header_.packet_sequence_number = sequence_number; | 191 header_.packet_sequence_number = sequence_number; |
| 200 header_.fec_group = 0; | 192 header_.fec_group = 0; |
| 201 header_.entropy_flag = false; | 193 header_.entropy_flag = false; |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 489 response = trans->GetResponseInfo(); | 481 response = trans->GetResponseInfo(); |
| 490 ASSERT_TRUE(response != NULL); | 482 ASSERT_TRUE(response != NULL); |
| 491 ASSERT_TRUE(response->headers != NULL); | 483 ASSERT_TRUE(response->headers != NULL); |
| 492 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); | 484 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 493 EXPECT_FALSE(response->was_fetched_via_spdy); | 485 EXPECT_FALSE(response->was_fetched_via_spdy); |
| 494 | 486 |
| 495 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); | 487 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 496 EXPECT_EQ("hello!", response_data); | 488 EXPECT_EQ("hello!", response_data); |
| 497 } | 489 } |
| 498 | 490 |
| 491 TEST_F(QuicNetworkTransactionTest, ZeroRTT) { |
| 492 HttpStreamFactory::set_use_alternate_protocols(true); |
| 493 HttpStreamFactory::SetNextProtos(QuicNextProtos()); |
| 494 |
| 495 HttpRequestInfo request; |
| 496 request.method = "GET"; |
| 497 request.url = GURL("http://www.google.com/"); |
| 498 request.load_flags = 0; |
| 499 |
| 500 scoped_ptr<QuicEncryptedPacket> data( |
| 501 ConstructDataPacket(1, true, true, 0, GetRequestString("GET", "/"))); |
| 502 scoped_ptr<QuicEncryptedPacket> ack(ConstructAckPacket(1, 0)); |
| 503 |
| 504 MockWrite quic_writes[] = { |
| 505 MockWrite(SYNCHRONOUS, data->data(), data->length()), |
| 506 MockWrite(SYNCHRONOUS, ack->data(), ack->length()), |
| 507 }; |
| 508 |
| 509 scoped_ptr<QuicEncryptedPacket> resp( |
| 510 ConstructDataPacket( |
| 511 1, false, true, 0, GetResponseString("200 OK", "hello!"))); |
| 512 MockRead quic_reads[] = { |
| 513 MockRead(SYNCHRONOUS, resp->data(), resp->length()), |
| 514 MockRead(ASYNC, OK), // EOF |
| 515 }; |
| 516 |
| 517 DelayedSocketData quic_data( |
| 518 1, // wait for one write to finish before reading. |
| 519 quic_reads, arraysize(quic_reads), |
| 520 quic_writes, arraysize(quic_writes)); |
| 521 |
| 522 socket_factory_.AddSocketDataProvider(&quic_data); |
| 523 |
| 524 TestCompletionCallback callback; |
| 525 |
| 526 CreateSession(); |
| 527 crypto_client_stream_factory_.set_handshake_mode( |
| 528 MockCryptoClientStream::ZERO_RTT); |
| 529 |
| 530 HttpServerProperties* http_server_properties = |
| 531 session_->http_server_properties(); |
| 532 http_server_properties->SetAlternateProtocol( |
| 533 HostPortPair("www.google.com", 80), 80, QUIC); |
| 534 |
| 535 scoped_ptr<HttpNetworkTransaction> trans( |
| 536 new HttpNetworkTransaction(DEFAULT_PRIORITY, session_)); |
| 537 |
| 538 int rv = trans->Start(&request, callback.callback(), BoundNetLog()); |
| 539 EXPECT_EQ(ERR_IO_PENDING, rv); |
| 540 EXPECT_EQ(OK, callback.WaitForResult()); |
| 541 |
| 542 const HttpResponseInfo* response = trans->GetResponseInfo(); |
| 543 ASSERT_TRUE(response != NULL); |
| 544 ASSERT_TRUE(response->headers != NULL); |
| 545 EXPECT_EQ("HTTP/1.1 200 OK", response->headers->GetStatusLine()); |
| 546 EXPECT_TRUE(response->was_fetched_via_spdy); |
| 547 EXPECT_TRUE(response->was_npn_negotiated); |
| 548 EXPECT_EQ("quic/1+spdy/3", response->npn_negotiated_protocol); |
| 549 |
| 550 std::string response_data; |
| 551 ASSERT_EQ(OK, ReadTransaction(trans.get(), &response_data)); |
| 552 EXPECT_EQ("hello!", response_data); |
| 553 } |
| 554 |
| 499 } // namespace test | 555 } // namespace test |
| 500 } // namespace net | 556 } // namespace net |
| OLD | NEW |