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