/*
 *  Copyright (c) 2021 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */
#ifndef API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_
#define API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_

#include "api/task_queue/task_queue_base.h"
#include "api/test/network_emulation/network_emulation_interfaces.h"
#include "api/units/data_rate.h"
#include "api/units/data_size.h"
#include "api/units/time_delta.h"
#include "api/units/timestamp.h"

namespace webrtc {

// This API is still in development and can be changed without prior notice.

// Represents the endpoint for cross traffic that is going through the network.
// It can be used to emulate unexpected network load.
class CrossTrafficRoute {
 public:
  virtual ~CrossTrafficRoute() = default;

  // Triggers sending of dummy packets with size |packet_size| bytes.
  virtual void TriggerPacketBurst(size_t num_packets, size_t packet_size) = 0;
  // Sends a packet over the nodes. The content of the packet is unspecified;
  // only the size metter for the emulation purposes.
  virtual void SendPacket(size_t packet_size) = 0;
  // Sends a packet over the nodes and runs |action| when it has been delivered.
  virtual void NetworkDelayedAction(size_t packet_size,
                                    std::function<void()> action) = 0;
};

// Describes a way of generating cross traffic on some route. Used by
// NetworkEmulationManager to produce cross traffic during some period of time.
class CrossTrafficGenerator {
 public:
  virtual ~CrossTrafficGenerator() = default;

  // Time between Process calls.
  virtual TimeDelta GetProcessInterval() const = 0;

  // Called periodically by NetworkEmulationManager. Generates traffic on the
  // route.
  virtual void Process(Timestamp at_time) = 0;
};

// Config of a cross traffic generator. Generated traffic rises and falls
// randomly.
struct RandomWalkConfig {
  int random_seed = 1;
  DataRate peak_rate = DataRate::KilobitsPerSec(100);
  DataSize min_packet_size = DataSize::Bytes(200);
  TimeDelta min_packet_interval = TimeDelta::Millis(1);
  TimeDelta update_interval = TimeDelta::Millis(200);
  double variance = 0.6;
  double bias = -0.1;
};

// Config of a cross traffic generator. Generated traffic has form of periodic
// peaks alternating with periods of silence.
struct PulsedPeaksConfig {
  DataRate peak_rate = DataRate::KilobitsPerSec(100);
  DataSize min_packet_size = DataSize::Bytes(200);
  TimeDelta min_packet_interval = TimeDelta::Millis(1);
  TimeDelta send_duration = TimeDelta::Millis(100);
  TimeDelta hold_duration = TimeDelta::Millis(2000);
};

struct FakeTcpConfig {
  DataSize packet_size = DataSize::Bytes(1200);
  DataSize send_limit = DataSize::PlusInfinity();
  TimeDelta process_interval = TimeDelta::Millis(200);
  TimeDelta packet_timeout = TimeDelta::Seconds(1);
};

}  // namespace webrtc

#endif  // API_TEST_NETWORK_EMULATION_CROSS_TRAFFIC_H_
