Index: net/quic/test_tools/quic_test_packet_maker.cc |
diff --git a/net/quic/test_tools/quic_test_packet_maker.cc b/net/quic/test_tools/quic_test_packet_maker.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..4f9061d926a98c4ab42b1e8e347c5cd192e15765 |
--- /dev/null |
+++ b/net/quic/test_tools/quic_test_packet_maker.cc |
@@ -0,0 +1,216 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "net/quic/test_tools/quic_test_packet_maker.h" |
+ |
+#include "net/quic/quic_framer.h" |
+#include "net/quic/quic_http_utils.h" |
+#include "net/quic/test_tools/quic_test_utils.h" |
+ |
+namespace net { |
+namespace test { |
+ |
+QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version, QuicGuid guid) |
+ : version_(version), |
+ guid_(guid), |
+ spdy_request_framer_(SPDY3), |
+ spdy_response_framer_(SPDY3) { |
+} |
+ |
+QuicTestPacketMaker::~QuicTestPacketMaker() { |
+} |
+ |
+scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket( |
+ QuicPacketSequenceNumber num, |
+ bool include_version, |
+ QuicStreamId stream_id, |
+ QuicRstStreamErrorCode error_code) { |
+ QuicPacketHeader header; |
+ header.public_header.guid = guid_; |
+ header.public_header.reset_flag = false; |
+ header.public_header.version_flag = include_version; |
+ header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
+ header.packet_sequence_number = num; |
+ header.entropy_flag = false; |
+ header.fec_flag = false; |
+ header.fec_group = 0; |
+ |
+ QuicRstStreamFrame rst(stream_id, error_code); |
+ return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&rst))); |
+} |
+ |
+scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeConnectionClosePacket( |
+ QuicPacketSequenceNumber num) { |
+ QuicPacketHeader header; |
+ header.public_header.guid = guid_; |
+ header.public_header.reset_flag = false; |
+ header.public_header.version_flag = false; |
+ header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
+ header.packet_sequence_number = num; |
+ header.entropy_flag = false; |
+ header.fec_flag = false; |
+ header.fec_group = 0; |
+ |
+ QuicConnectionCloseFrame close; |
+ close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED; |
+ close.error_details = "Time to panic!"; |
+ return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&close))); |
+} |
+ |
+scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket( |
+ QuicPacketSequenceNumber sequence_number, |
+ QuicPacketSequenceNumber largest_received, |
+ QuicPacketSequenceNumber least_unacked, |
+ bool send_feedback) { |
+ QuicPacketHeader header; |
+ header.public_header.guid = guid_; |
+ header.public_header.reset_flag = false; |
+ header.public_header.version_flag = false; |
+ header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
+ header.packet_sequence_number = sequence_number; |
+ header.entropy_flag = false; |
+ header.fec_flag = false; |
+ header.fec_group = 0; |
+ |
+ QuicAckFrame ack(largest_received, QuicTime::Zero(), least_unacked); |
+ |
+ QuicCongestionFeedbackFrame feedback; |
+ feedback.type = kTCP; |
+ feedback.tcp.accumulated_number_of_lost_packets = 0; |
+ feedback.tcp.receive_window = 256000; |
+ |
+ QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); |
+ QuicFrames frames; |
+ frames.push_back(QuicFrame(&ack)); |
+ if (send_feedback) { |
+ frames.push_back(QuicFrame(&feedback)); |
+ } |
+ scoped_ptr<QuicPacket> packet( |
+ framer.BuildUnsizedDataPacket(header, frames).packet); |
+ return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( |
+ ENCRYPTION_NONE, header.packet_sequence_number, *packet)); |
+} |
+ |
+// Returns a newly created packet to send kData on stream 1. |
+scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket( |
+ QuicPacketSequenceNumber sequence_number, |
+ QuicStreamId stream_id, |
+ bool should_include_version, |
+ bool fin, |
+ QuicStreamOffset offset, |
+ base::StringPiece data) { |
+ InitializeHeader(sequence_number, should_include_version); |
+ QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data)); |
+ return MakePacket(header_, QuicFrame(&frame)); |
+} |
+ |
+scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket( |
+ QuicPacketSequenceNumber sequence_number, |
+ QuicStreamId stream_id, |
+ bool should_include_version, |
+ bool fin, |
+ const SpdyHeaderBlock& headers) { |
+ EXPECT_LT(QUIC_VERSION_12, version_); |
+ InitializeHeader(sequence_number, should_include_version); |
+ SpdySynStreamIR syn_stream(stream_id); |
+ *syn_stream.GetMutableNameValueBlock() = headers; |
+ syn_stream.set_fin(fin); |
+ syn_stream.set_priority(0); |
+ scoped_ptr<SpdySerializedFrame> spdy_frame( |
+ spdy_request_framer_.SerializeSynStream(syn_stream)); |
+ QuicStreamFrame frame(kHeadersStreamId, false, 0, |
+ MakeIOVector(base::StringPiece(spdy_frame->data(), |
+ spdy_frame->size()))); |
+ return MakePacket(header_, QuicFrame(&frame)); |
+} |
+ |
+scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket( |
+ QuicPacketSequenceNumber sequence_number, |
+ QuicStreamId stream_id, |
+ bool should_include_version, |
+ bool fin, |
+ const SpdyHeaderBlock& headers) { |
+ EXPECT_LT(QUIC_VERSION_12, version_); |
+ InitializeHeader(sequence_number, should_include_version); |
+ SpdySynReplyIR syn_reply(stream_id); |
+ *syn_reply.GetMutableNameValueBlock() = headers; |
+ syn_reply.set_fin(fin); |
+ scoped_ptr<SpdySerializedFrame> spdy_frame( |
+ spdy_response_framer_.SerializeSynReply(syn_reply)); |
+ QuicStreamFrame frame(kHeadersStreamId, false, 0, |
+ MakeIOVector(base::StringPiece(spdy_frame->data(), |
+ spdy_frame->size()))); |
+ return MakePacket(header_, QuicFrame(&frame)); |
+} |
+ |
+SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders( |
+ const std::string& method, |
+ const std::string& scheme, |
+ const std::string& path) { |
+ SpdyHeaderBlock headers; |
+ headers[":method"] = method; |
+ headers[":host"] = "www.google.com"; |
+ headers[":path"] = path; |
+ headers[":scheme"] = scheme; |
+ headers[":version"] = "HTTP/1.1"; |
+ return headers; |
+} |
+ |
+std::string QuicTestPacketMaker::GetRequestString( |
+ const std::string& method, |
+ const std::string& scheme, |
+ const std::string& path) { |
+ DCHECK_GE(QUIC_VERSION_12, version_); |
+ return SerializeHeaderBlock(GetRequestHeaders(method, scheme, path)); |
+} |
+ |
+SpdyHeaderBlock QuicTestPacketMaker::GetResponseHeaders( |
+ const std::string& status) { |
+ SpdyHeaderBlock headers; |
+ headers[":status"] = status; |
+ headers[":version"] = "HTTP/1.1"; |
+ headers["content-type"] = "text/plain"; |
+ return headers; |
+} |
+ |
+std::string QuicTestPacketMaker::GetResponseString(const std::string& status, |
+ const std::string& body) { |
+ DCHECK_GE(QUIC_VERSION_12, version_); |
+ return compressor_.CompressHeaders(GetResponseHeaders(status)) + body; |
+} |
+ |
+scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket( |
+ const QuicPacketHeader& header, |
+ const QuicFrame& frame) { |
+ QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false); |
+ QuicFrames frames; |
+ frames.push_back(frame); |
+ scoped_ptr<QuicPacket> packet( |
+ framer.BuildUnsizedDataPacket(header, frames).packet); |
+ return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket( |
+ ENCRYPTION_NONE, header.packet_sequence_number, *packet)); |
+} |
+ |
+void QuicTestPacketMaker::InitializeHeader( |
+ QuicPacketSequenceNumber sequence_number, |
+ bool should_include_version) { |
+ header_.public_header.guid = guid_; |
+ header_.public_header.reset_flag = false; |
+ header_.public_header.version_flag = should_include_version; |
+ header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER; |
+ header_.packet_sequence_number = sequence_number; |
+ header_.fec_group = 0; |
+ header_.entropy_flag = false; |
+ header_.fec_flag = false; |
+} |
+ |
+std::string QuicTestPacketMaker::SerializeHeaderBlock( |
+ const SpdyHeaderBlock& headers) { |
+ QuicSpdyCompressor compressor; |
+ return compressor.CompressHeadersWithPriority( |
+ ConvertRequestPriorityToQuicPriority(DEFAULT_PRIORITY), headers); |
+} |
+ |
+} // namespace test |
+} // namespace net |