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)
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <list>
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_framer.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_http_utils.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_utils.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/test_tools/quic_test_utils.h"
135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciusing std::make_pair;
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net {
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace test {
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
19a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)QuicTestPacketMaker::QuicTestPacketMaker(QuicVersion version,
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         QuicConnectionId connection_id,
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                         MockClock* clock)
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : version_(version),
23a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      connection_id_(connection_id),
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      clock_(clock),
255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      spdy_request_framer_(SPDY3),
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      spdy_response_framer_(SPDY3) {
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)QuicTestPacketMaker::~QuicTestPacketMaker() {
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRstPacket(
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber num,
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool include_version,
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicRstStreamErrorCode error_code) {
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header;
38a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.reset_flag = false;
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.version_flag = include_version;
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.packet_sequence_number = num;
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.entropy_flag = false;
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_flag = false;
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_group = 0;
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicRstStreamFrame rst(stream_id, error_code, 0);
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&rst)));
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckAndRstPacket(
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber num,
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool include_version,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicRstStreamErrorCode error_code,
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber largest_received,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber least_unacked,
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool send_feedback) {
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header;
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.reset_flag = false;
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.version_flag = include_version;
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.packet_sequence_number = num;
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.entropy_flag = false;
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_flag = false;
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_group = 0;
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  QuicAckFrame ack(MakeAckFrame(largest_received));
715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ack.delta_time_largest_observed = QuicTime::Delta::Zero();
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (version_ > QUIC_VERSION_22) {
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received;
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++i) {
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ack.received_packet_times.push_back(make_pair(i, clock_->Now()));
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFrames frames;
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frames.push_back(QuicFrame(&ack));
80a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicCongestionFeedbackFrame feedback;
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (send_feedback && version_ <= QUIC_VERSION_22) {
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    feedback.type = kTCP;
835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    feedback.tcp.receive_window = 256000;
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frames.push_back(QuicFrame(&feedback));
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
88a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicStopWaitingFrame stop_waiting;
895f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stop_waiting.least_unacked = least_unacked;
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  frames.push_back(QuicFrame(&stop_waiting));
91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicRstStreamFrame rst(stream_id, error_code, 0);
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frames.push_back(QuicFrame(&rst));
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  QuicFramer framer(SupportedVersions(version_), clock_->Now(), false);
965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicPacket> packet(
9746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer, header, frames).packet);
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ENCRYPTION_NONE, header.packet_sequence_number, *packet));
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeConnectionClosePacket(
1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber num) {
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header;
105a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.reset_flag = false;
1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.version_flag = false;
1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.packet_sequence_number = num;
1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.entropy_flag = false;
1115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_flag = false;
1125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_group = 0;
1135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicConnectionCloseFrame close;
1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  close.error_code = QUIC_CRYPTO_VERSION_NOT_SUPPORTED;
1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  close.error_details = "Time to panic!";
1175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(MakePacket(header, QuicFrame(&close)));
1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeAckPacket(
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber largest_received,
1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber least_unacked,
1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool send_feedback) {
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header;
126a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header.public_header.connection_id = connection_id_;
1275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.reset_flag = false;
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.version_flag = false;
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.packet_sequence_number = sequence_number;
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.entropy_flag = false;
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_flag = false;
1335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header.fec_group = 0;
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  QuicAckFrame ack(MakeAckFrame(largest_received));
1365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ack.delta_time_largest_observed = QuicTime::Delta::Zero();
1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (version_ > QUIC_VERSION_22) {
1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    for (QuicPacketSequenceNumber i = least_unacked; i <= largest_received;
1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci         ++i) {
1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ack.received_packet_times.push_back(make_pair(i, clock_->Now()));
1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    }
1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
1435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  QuicFramer framer(SupportedVersions(version_), clock_->Now(), false);
1455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFrames frames;
1465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frames.push_back(QuicFrame(&ack));
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  QuicCongestionFeedbackFrame feedback;
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (send_feedback && version_ <= QUIC_VERSION_22) {
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    feedback.type = kTCP;
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    feedback.tcp.receive_window = 256000;
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    frames.push_back(QuicFrame(&feedback));
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
153a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
154a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicStopWaitingFrame stop_waiting;
1555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  stop_waiting.least_unacked = least_unacked;
1565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  frames.push_back(QuicFrame(&stop_waiting));
157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicPacket> packet(
15946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer, header, frames).packet);
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ENCRYPTION_NONE, header.packet_sequence_number, *packet));
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Returns a newly created packet to send kData on stream 1.
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeDataPacket(
1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_include_version,
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool fin,
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamOffset offset,
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::StringPiece data) {
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeHeader(sequence_number, should_include_version);
1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicStreamFrame frame(stream_id, fin, offset, MakeIOVector(data));
1745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return MakePacket(header_, QuicFrame(&frame));
1755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeRequestHeadersPacket(
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_include_version,
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool fin,
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SpdyHeaderBlock& headers) {
1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeHeader(sequence_number, should_include_version);
1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdySynStreamIR syn_stream(stream_id);
1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_stream.set_name_value_block(headers);
1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_stream.set_fin(fin);
1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_stream.set_priority(0);
1885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<SpdySerializedFrame> spdy_frame(
1895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      spdy_request_framer_.SerializeSynStream(syn_stream));
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicStreamFrame frame(kHeadersStreamId, false, 0,
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        MakeIOVector(base::StringPiece(spdy_frame->data(),
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                       spdy_frame->size())));
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return MakePacket(header_, QuicFrame(&frame));
1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakeResponseHeadersPacket(
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicStreamId stream_id,
1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_include_version,
2005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool fin,
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const SpdyHeaderBlock& headers) {
2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  InitializeHeader(sequence_number, should_include_version);
2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdySynReplyIR syn_reply(stream_id);
2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_reply.set_name_value_block(headers);
2055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  syn_reply.set_fin(fin);
2065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<SpdySerializedFrame> spdy_frame(
2075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      spdy_response_framer_.SerializeSynReply(syn_reply));
2085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicStreamFrame frame(kHeadersStreamId, false, 0,
2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        MakeIOVector(base::StringPiece(spdy_frame->data(),
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                       spdy_frame->size())));
2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return MakePacket(header_, QuicFrame(&frame));
2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyHeaderBlock QuicTestPacketMaker::GetRequestHeaders(
2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& method,
2165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& scheme,
2175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& path) {
2185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyHeaderBlock headers;
2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":method"] = method;
2205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":host"] = "www.google.com";
2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":path"] = path;
2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":scheme"] = scheme;
2235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":version"] = "HTTP/1.1";
2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return headers;
2255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)SpdyHeaderBlock QuicTestPacketMaker::GetResponseHeaders(
2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const std::string& status) {
2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyHeaderBlock headers;
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":status"] = status;
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers[":version"] = "HTTP/1.1";
2325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  headers["content-type"] = "text/plain";
2335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return headers;
2345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)scoped_ptr<QuicEncryptedPacket> QuicTestPacketMaker::MakePacket(
2375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const QuicPacketHeader& header,
2385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    const QuicFrame& frame) {
2395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFramer framer(SupportedVersions(version_), QuicTime::Zero(), false);
2405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicFrames frames;
2415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  frames.push_back(frame);
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicPacket> packet(
24346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)      BuildUnsizedDataPacket(&framer, header, frames).packet);
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return scoped_ptr<QuicEncryptedPacket>(framer.EncryptPacket(
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ENCRYPTION_NONE, header.packet_sequence_number, *packet));
2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void QuicTestPacketMaker::InitializeHeader(
2495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    QuicPacketSequenceNumber sequence_number,
2505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    bool should_include_version) {
251a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  header_.public_header.connection_id = connection_id_;
2525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.public_header.reset_flag = false;
2535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.public_header.version_flag = should_include_version;
2545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.public_header.sequence_number_length = PACKET_1BYTE_SEQUENCE_NUMBER;
2555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.packet_sequence_number = sequence_number;
2565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.fec_group = 0;
2575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.entropy_flag = false;
2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  header_.fec_flag = false;
2595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}
2605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
2615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace test
2625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace net
263