// 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();
  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 or equal to kDataFrameHeaderSize, 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 value is ignored.
    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();
  void SetEnabled(bool value);

 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_
