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)// Provides a simple interface for QUIC tests to create a variety of packets.
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef NET_QUIC_TEST_TOOLS_QUIC_TEST_PACKET_MAKER_H_
85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define NET_QUIC_TEST_TOOLS_QUIC_TEST_PACKET_MAKER_H_
95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/base/request_priority.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_protocol.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "net/quic/test_tools/mock_clock.h"
145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/test_tools/mock_random.h"
155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/spdy/spdy_framer.h"
165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/spdy/spdy_protocol.h"
175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace net {
195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace test {
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class QuicTestPacketMaker {
225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) public:
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  QuicTestPacketMaker(QuicVersion version,
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      QuicConnectionId connection_id,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                      MockClock* clock);
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  ~QuicTestPacketMaker();
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> MakeRstPacket(
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber num,
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool include_version,
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicStreamId stream_id,
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicRstStreamErrorCode error_code);
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> MakeAckAndRstPacket(
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber num,
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool include_version,
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicStreamId stream_id,
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicRstStreamErrorCode error_code,
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber largest_received,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber least_unacked,
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool send_feedback);
415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> MakeConnectionClosePacket(
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber num);
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> MakeAckPacket(
445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber sequence_number,
455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber largest_received,
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber least_unacked,
475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool send_feedback);
485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> MakeDataPacket(
495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber sequence_number,
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicStreamId stream_id,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool should_include_version,
525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool fin,
535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicStreamOffset offset,
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      base::StringPiece data);
555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> MakeRequestHeadersPacket(
565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber sequence_number,
575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicStreamId stream_id,
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool should_include_version,
595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool fin,
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const SpdyHeaderBlock& headers);
615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> MakeResponseHeadersPacket(
625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicPacketSequenceNumber sequence_number,
635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      QuicStreamId stream_id,
645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool should_include_version,
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      bool fin,
665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const SpdyHeaderBlock& headers);
675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyHeaderBlock GetRequestHeaders(const std::string& method,
695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    const std::string& scheme,
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                    const std::string& path);
715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyHeaderBlock GetResponseHeaders(const std::string& status);
725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) private:
745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  scoped_ptr<QuicEncryptedPacket> MakePacket(
755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const QuicPacketHeader& header,
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      const QuicFrame& frame);
775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void InitializeHeader(QuicPacketSequenceNumber sequence_number,
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                        bool should_include_version);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicVersion version_;
82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  QuicConnectionId connection_id_;
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  MockClock* clock_;  // Owned by QuicStreamFactory.
845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyFramer spdy_request_framer_;
855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SpdyFramer spdy_response_framer_;
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  MockRandom random_generator_;
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  QuicPacketHeader header_;
885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicTestPacketMaker);
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace test
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace net
945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // NET_QUIC_TEST_TOOLS_QUIC_TEST_PACKET_MAKER_H_
96