Home | History | Annotate | Download | only in test_tools
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "net/quic/test_tools/simple_quic_framer.h"
      6 
      7 #include "net/quic/crypto/crypto_framer.h"
      8 #include "net/quic/crypto/quic_decrypter.h"
      9 #include "net/quic/crypto/quic_encrypter.h"
     10 
     11 using base::StringPiece;
     12 using std::string;
     13 using std::vector;
     14 
     15 namespace net {
     16 namespace test {
     17 
     18 class SimpleFramerVisitor : public QuicFramerVisitorInterface {
     19  public:
     20   SimpleFramerVisitor()
     21       : error_(QUIC_NO_ERROR) {
     22   }
     23 
     24   virtual void OnError(QuicFramer* framer) OVERRIDE {
     25     error_ = framer->error();
     26   }
     27 
     28   virtual bool OnProtocolVersionMismatch(QuicVersion version) OVERRIDE {
     29     return false;
     30   }
     31 
     32   virtual void OnPacket() OVERRIDE {}
     33   virtual void OnPublicResetPacket(
     34       const QuicPublicResetPacket& packet) OVERRIDE {}
     35   virtual void OnVersionNegotiationPacket(
     36       const QuicVersionNegotiationPacket& packet) OVERRIDE {}
     37   virtual void OnRevivedPacket() OVERRIDE {}
     38 
     39   virtual bool OnPacketHeader(const QuicPacketHeader& header) OVERRIDE {
     40     has_header_ = true;
     41     header_ = header;
     42     return true;
     43   }
     44 
     45   virtual void OnFecProtectedPayload(StringPiece payload) OVERRIDE {}
     46 
     47   virtual bool OnStreamFrame(const QuicStreamFrame& frame) OVERRIDE {
     48     // Save a copy of the data so it is valid after the packet is processed.
     49     stream_data_.push_back(frame.data.as_string());
     50     QuicStreamFrame stream_frame(frame);
     51     // Make sure that the stream frame points to this data.
     52     stream_frame.data = stream_data_.back();
     53     stream_frames_.push_back(stream_frame);
     54     return true;
     55   }
     56 
     57   virtual bool OnAckFrame(const QuicAckFrame& frame) OVERRIDE {
     58     ack_frames_.push_back(frame);
     59     return true;
     60   }
     61 
     62   virtual bool OnCongestionFeedbackFrame(
     63       const QuicCongestionFeedbackFrame& frame) OVERRIDE {
     64     feedback_frames_.push_back(frame);
     65     return true;
     66   }
     67 
     68   virtual void OnFecData(const QuicFecData& fec) OVERRIDE {
     69     fec_data_ = fec;
     70     fec_redundancy_ = fec_data_.redundancy.as_string();
     71     fec_data_.redundancy = fec_redundancy_;
     72   }
     73 
     74   virtual bool OnRstStreamFrame(const QuicRstStreamFrame& frame) OVERRIDE {
     75     rst_stream_frames_.push_back(frame);
     76     return true;
     77   }
     78 
     79   virtual bool OnConnectionCloseFrame(
     80       const QuicConnectionCloseFrame& frame) OVERRIDE {
     81     connection_close_frames_.push_back(frame);
     82     return true;
     83   }
     84 
     85   virtual bool OnGoAwayFrame(const QuicGoAwayFrame& frame) OVERRIDE {
     86     goaway_frames_.push_back(frame);
     87     return true;
     88   }
     89 
     90   virtual void OnPacketComplete() OVERRIDE {}
     91 
     92   const QuicPacketHeader& header() const { return header_; }
     93   const vector<QuicAckFrame>& ack_frames() const { return ack_frames_; }
     94   const vector<QuicConnectionCloseFrame>& connection_close_frames() const {
     95     return connection_close_frames_;
     96   }
     97   const vector<QuicCongestionFeedbackFrame>& feedback_frames() const {
     98     return feedback_frames_;
     99   }
    100   const vector<QuicGoAwayFrame>& goaway_frames() const {
    101     return goaway_frames_;
    102   }
    103   const vector<QuicRstStreamFrame>& rst_stream_frames() const {
    104     return rst_stream_frames_;
    105   }
    106   const vector<QuicStreamFrame>& stream_frames() const {
    107     return stream_frames_;
    108   }
    109   const QuicFecData& fec_data() const {
    110     return fec_data_;
    111   }
    112 
    113  private:
    114   QuicErrorCode error_;
    115   bool has_header_;
    116   QuicPacketHeader header_;
    117   QuicFecData fec_data_;
    118   string fec_redundancy_;
    119   vector<QuicAckFrame> ack_frames_;
    120   vector<QuicCongestionFeedbackFrame> feedback_frames_;
    121   vector<QuicStreamFrame> stream_frames_;
    122   vector<QuicRstStreamFrame> rst_stream_frames_;
    123   vector<QuicGoAwayFrame> goaway_frames_;
    124   vector<QuicConnectionCloseFrame> connection_close_frames_;
    125   vector<string> stream_data_;
    126 
    127   DISALLOW_COPY_AND_ASSIGN(SimpleFramerVisitor);
    128 };
    129 
    130 SimpleQuicFramer::SimpleQuicFramer()
    131     : framer_(QuicVersionMax(), QuicTime::Zero(), true) {
    132 }
    133 
    134 SimpleQuicFramer::~SimpleQuicFramer() {
    135 }
    136 
    137 bool SimpleQuicFramer::ProcessPacket(const QuicPacket& packet) {
    138   scoped_ptr<QuicEncryptedPacket> encrypted(framer_.EncryptPacket(
    139       ENCRYPTION_NONE, 0, packet));
    140   return ProcessPacket(*encrypted);
    141 }
    142 
    143 bool SimpleQuicFramer::ProcessPacket(const QuicEncryptedPacket& packet) {
    144   visitor_.reset(new SimpleFramerVisitor);
    145   framer_.set_visitor(visitor_.get());
    146   return framer_.ProcessPacket(packet);
    147 }
    148 
    149 const QuicPacketHeader& SimpleQuicFramer::header() const {
    150   return visitor_->header();
    151 }
    152 
    153 const QuicFecData& SimpleQuicFramer::fec_data() const {
    154   return visitor_->fec_data();
    155 }
    156 
    157 QuicFramer* SimpleQuicFramer::framer() {
    158   return &framer_;
    159 }
    160 
    161 size_t SimpleQuicFramer::num_frames() const {
    162   return ack_frames().size() +
    163       stream_frames().size() +
    164       feedback_frames().size() +
    165       rst_stream_frames().size() +
    166       goaway_frames().size() +
    167       connection_close_frames().size();
    168 }
    169 
    170 const vector<QuicAckFrame>& SimpleQuicFramer::ack_frames() const {
    171   return visitor_->ack_frames();
    172 }
    173 
    174 const vector<QuicStreamFrame>& SimpleQuicFramer::stream_frames() const {
    175   return visitor_->stream_frames();
    176 }
    177 
    178 const vector<QuicRstStreamFrame>& SimpleQuicFramer::rst_stream_frames() const {
    179   return visitor_->rst_stream_frames();
    180 }
    181 
    182 const vector<QuicCongestionFeedbackFrame>&
    183 SimpleQuicFramer::feedback_frames() const {
    184   return visitor_->feedback_frames();
    185 }
    186 
    187 const vector<QuicGoAwayFrame>&
    188 SimpleQuicFramer::goaway_frames() const {
    189   return visitor_->goaway_frames();
    190 }
    191 
    192 const vector<QuicConnectionCloseFrame>&
    193 SimpleQuicFramer::connection_close_frames() const {
    194   return visitor_->connection_close_frames();
    195 }
    196 
    197 }  // namespace test
    198 }  // namespace net
    199