| // Copyright (c) 2017 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef QUICHE_QUIC_QUARTC_TEST_QUARTC_DATA_SOURCE_H_ |
| #define QUICHE_QUIC_QUARTC_TEST_QUARTC_DATA_SOURCE_H_ |
| |
| #include "net/third_party/quiche/src/quic/core/crypto/quic_random.h" |
| #include "net/third_party/quiche/src/quic/core/quic_alarm.h" |
| #include "net/third_party/quiche/src/quic/core/quic_alarm_factory.h" |
| #include "net/third_party/quiche/src/quic/core/quic_bandwidth.h" |
| #include "net/third_party/quiche/src/quic/core/quic_time.h" |
| #include "net/third_party/quiche/src/quic/platform/api/quic_clock.h" |
| #include "net/third_party/quiche/src/quic/platform/api/quic_string_piece.h" |
| |
| namespace quic { |
| namespace test { |
| |
| // Frames sent by a QuartcDataSource have a 20-byte header (4 bytes for the |
| // source id, 8 bytes for the sequence number, 8 bytes for the timestamp). |
| constexpr QuicByteCount kDataFrameHeaderSize = 20; |
| |
| // Struct representing one frame of data sent by a QuartcDataSource. |
| struct ParsedQuartcDataFrame { |
| // Parses the given data as a frame generated by QuartcDataSource. Returns |
| // true if parsing succeeds or false if parsing fails. |
| static bool Parse(QuicStringPiece data, ParsedQuartcDataFrame* out); |
| |
| // Note that a properly formatted, parseable frame always contains these three |
| // header fields. |
| int32_t source_id = -1; |
| int64_t sequence_number = -1; |
| QuicTime send_time = QuicTime::Zero(); |
| |
| // Total size, including header and payload. |
| QuicByteCount size = 0; |
| std::string payload; |
| }; |
| |
| // Alarm-based source of random data to send. QuartcDataSource is configured to |
| // generate new data at fixed intervals. |
| class QuartcDataSource { |
| public: |
| struct Config { |
| // 32-bit ID for this data source. |
| int32_t id = 0; |
| |
| // Minimum bandwidth allocated to this data source. |
| QuicBandwidth min_bandwidth = QuicBandwidth::Zero(); |
| |
| // Maximum bandwidth allocated to this data source. |
| QuicBandwidth max_bandwidth = QuicBandwidth::Infinite(); |
| |
| // Interval between frames for this data source. |
| QuicTime::Delta frame_interval = QuicTime::Delta::FromMilliseconds(10); |
| |
| // Maximum size of frames produced by this source. If this value is greater |
| // than 0, the source may produce multiple frames with the same timestamp |
| // rather than a single frame that is larger than this size. |
| // If less than kDataFrameHeaderSize, the source produces frames of |
| // kDataFrameHeaderSize. |
| QuicByteCount max_frame_size = 0; |
| }; |
| |
| class Delegate { |
| public: |
| virtual ~Delegate() = default; |
| |
| virtual void OnDataProduced(const char* data, size_t length) = 0; |
| }; |
| |
| QuartcDataSource(const QuicClock* clock, |
| QuicAlarmFactory* alarm_factory, |
| QuicRandom* random, |
| const Config& config, |
| Delegate* delegate); |
| |
| void OnSendAlarm(); |
| |
| // Allocates bandwidth to this source. The source clamps the given value |
| // between its configured min and max bandwidth, and returns any amount in |
| // excess of its maximum allocation. |
| QuicBandwidth AllocateBandwidth(QuicBandwidth bandwidth); |
| |
| // Whether the data source is enabled. The data source only produces data |
| // when enabled. When first enabled, the data source starts sending |
| // immediately. When disabled, the data source stops sending immediately. |
| bool Enabled() const; |
| void SetEnabled(bool value); |
| |
| // Returns the sequence number of the last frame generated (or -1 if no frames |
| // have been generated). |
| int64_t sequence_number() const { return sequence_number_ - 1; } |
| |
| private: |
| void GenerateFrame(QuicByteCount frame_size, QuicTime now); |
| |
| const QuicClock* clock_; |
| QuicAlarmFactory* alarm_factory_; |
| QuicRandom* random_; |
| const Config config_; |
| Delegate* delegate_; |
| |
| std::unique_ptr<QuicAlarm> send_alarm_; |
| |
| int64_t sequence_number_; |
| QuicBandwidth allocated_bandwidth_; |
| QuicTime last_send_time_; |
| |
| // Buffer for frames of data generated by the source. The source writes each |
| // frame into this buffer, then hands the delegate a pointer to it. It's a |
| // std::vector simply to make it quick and easy to resize if necessary (eg. if |
| // |allocated_bandwidth_| increases and the frame size goes up. Otherwise, it |
| // would be a char[]. |
| std::vector<char> buffer_; |
| }; |
| |
| } // namespace test |
| } // namespace quic |
| |
| #endif // QUICHE_QUIC_QUARTC_TEST_QUARTC_DATA_SOURCE_H_ |