| // 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_ |