quic_test_packet_maker.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file.
45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/test_tools/quic_test_packet_maker.h"
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_framer.h"
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_http_utils.h"
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_utils.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net {
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace test {
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version,
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)                                         QuicConnectionId connection_id)
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : version_(version),
18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      connection_id_(connection_id),
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      spdy_request_framer_(SPDY3),
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      spdy_response_framer_(SPDY3) {
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicTestPacketMaker::~QuicTestPacketMaker() {
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket(
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber num,
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool include_version,
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicRstStreamErrorCode error_code) {
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header;
32a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.reset_flag = false;
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.version_flag = include_version;
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.packet_sequence_number = num;
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.entropy_flag = false;
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_flag = false;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_group = 0;
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicRstStreamFrame rst(stream_id, error_code, 0);
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&rst)));
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket(
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber num,
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool include_version,
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicRstStreamErrorCode error_code,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber largest_received,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber least_unacked,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool send_feedback) {
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header;
55a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.reset_flag = false;
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.version_flag = include_version;
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.packet_sequence_number = num;
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.entropy_flag = false;
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_flag = false;
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_group = 0;
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  QuicAckFrame ack(MakeAckFrame(largest_received));
655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ack.delta_time_largest_observed = QuicTime::Delta::Zero();
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFrames frames;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frames.push_back(QuicFrame(&ack));
68a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicCongestionFeedbackFrame feedback;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (send_feedback) {
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    feedback.type = kTCP;
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    feedback.tcp.receive_window = 256000;
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frames.push_back(QuicFrame(&feedback));
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicStopWaitingFrame stop_waiting;
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stop_waiting.least_unacked = least_unacked;
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  frames.push_back(QuicFrame(&stop_waiting));
79a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicRstStreamFrame rst(stream_id, error_code, 0);
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frames.push_back(QuicFrame(&rst));
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicPacket> packet(
8546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer, header, frames).packet);
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ENCRYPTION_NONE, header.packet_sequence_number, *packet));
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeConnectionClosePacket(
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber num) {
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header;
93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.reset_flag = false;
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.version_flag = false;
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.packet_sequence_number = num;
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.entropy_flag = false;
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_flag = false;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_group = 0;
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicConnectionCloseFrame close;
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED;
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  close.error_details = "Time to panic!";
1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&close)));
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket(
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber largest_received,
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber least_unacked,
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool send_feedback) {
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header;
114a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.reset_flag = false;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.version_flag = false;
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.packet_sequence_number = sequence_number;
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.entropy_flag = false;
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_flag = false;
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_group = 0;
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  QuicAckFrame ack(MakeAckFrame(largest_received));
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ack.delta_time_largest_observed = QuicTime::Delta::Zero();
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicCongestionFeedbackFrame feedback;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  feedback.type = kTCP;
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  feedback.tcp.receive_window = 256000;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFrames frames;
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frames.push_back(QuicFrame(&ack));
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (send_feedback) {
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frames.push_back(QuicFrame(&feedback));
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
136a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
137a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicStopWaitingFrame stop_waiting;
1385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stop_waiting.least_unacked = least_unacked;
1395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  frames.push_back(QuicFrame(&stop_waiting));
140a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicPacket> packet(
14246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer, header, frames).packet);
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
1445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ENCRYPTION_NONE, header.packet_sequence_number, *packet));
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns a newly created packet to send kData on stream 1.
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket(
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_include_version,
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool fin,
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamOffset offset,
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::StringPiece data) {
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeHeader(sequence_number, should_include_version);
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data));
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return MakePacket(header_, QuicFrame(&frame));
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket(
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_include_version,
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool fin,
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SpdyHeaderBlock& headers) {
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeHeader(sequence_number, should_include_version);
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdySynStreamIR syn_stream(stream_id);
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_stream.set_name_value_block(headers);
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_stream.set_fin(fin);
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_stream.set_priority(0);
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<SpdySerializedFrame> spdy_frame(
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      spdy_request_framer_.SerializeSynStream(syn_stream));
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicStreamFrame frame(kHeadersStreamId, false, 0,
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        MakeIOVector(base::StringPiece(spdy_frame->data(),
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                       spdy_frame->size())));
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return MakePacket(header_, QuicFrame(&frame));
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket(
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_include_version,
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool fin,
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SpdyHeaderBlock& headers) {
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeHeader(sequence_number, should_include_version);
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdySynReplyIR syn_reply(stream_id);
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_reply.set_name_value_block(headers);
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_reply.set_fin(fin);
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<SpdySerializedFrame> spdy_frame(
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      spdy_response_framer_.SerializeSynReply(syn_reply));
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicStreamFrame frame(kHeadersStreamId, false, 0,
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        MakeIOVector(base::StringPiece(spdy_frame->data(),
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                       spdy_frame->size())));
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return MakePacket(header_, QuicFrame(&frame));
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders(
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& method,
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& scheme,
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& path) {
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyHeaderBlock headers;
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":method"] = method;
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":host"] = "www.google.com";
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":path"] = path;
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":scheme"] = scheme;
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":version"] = "HTTP/1.1";
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return headers;
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyHeaderBlock QuicTestPacketMaker::GetResponseHeaders(
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& status) {
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyHeaderBlock headers;
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":status"] = status;
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":version"] = "HTTP/1.1";
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers["content-type"] = "text/plain";
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return headers;
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket(
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const QuicPacketHeader& header,
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const QuicFrame& frame) {
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFrames frames;
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frames.push_back(frame);
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicPacket> packet(
22646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer, header, frames).packet);
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ENCRYPTION_NONE, header.packet_sequence_number, *packet));
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuicTestPacketMaker::InitializeHeader(
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_include_version) {
234a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header_.public_header.connection_id = connection_id_;
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.public_header.reset_flag = false;
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.public_header.version_flag = should_include_version;
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.packet_sequence_number = sequence_number;
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.fec_group = 0;
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.entropy_flag = false;
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.fec_flag = false;
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace test
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace net
246