/*
 *  Copyright 2018 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.
 */
#include "rtc_base/random.h"

#include "modules/congestion_controller/bbr/bbr_factory.h"
#include "rtc_base/experiments/field_trial_parser.h"
#include "rtc_base/experiments/field_trial_units.h"
#include "test/field_trial.h"
#include "test/gtest.h"
#include "test/scenario/scenario.h"

namespace webrtc {
namespace test {
namespace {
constexpr int64_t kRunTimeMs = 60000;

using ::testing::Values;
using ::testing::Combine;
using ::testing::tuple;
using ::testing::make_tuple;

using Codec = VideoStreamConfig::Encoder::Codec;
using CodecImpl = VideoStreamConfig::Encoder::Implementation;

struct CallTestConfig {
  struct Scenario {
    FieldTrialParameter<int> random_seed;
    FieldTrialFlag return_traffic;
    FieldTrialParameter<DataRate> capacity;
    FieldTrialParameter<TimeDelta> propagation_delay;
    FieldTrialParameter<DataRate> cross_traffic;
    FieldTrialParameter<TimeDelta> delay_noise;
    FieldTrialParameter<double> loss_rate;
    Scenario()
        : random_seed("rs", 1),
          return_traffic("ret"),
          capacity("bw", DataRate::kbps(300)),
          propagation_delay("dl", TimeDelta::ms(100)),
          cross_traffic("ct", DataRate::Zero()),
          delay_noise("dn", TimeDelta::Zero()),
          loss_rate("pl", 0) {}
    void Parse(std::string config_str) {
      ParseFieldTrial(
          {&random_seed, &return_traffic, &capacity, &propagation_delay,
           &cross_traffic, &delay_noise, &loss_rate},
          config_str);
    }
  } scenario;
  struct Tuning {
    FieldTrialFlag use_bbr;
    FieldTrialFlag bbr_no_target_rate;
    FieldTrialOptional<DataSize> bbr_initial_window;
    FieldTrialParameter<double> bbr_encoder_gain;
    Tuning()
        : use_bbr("bbr"),
          bbr_no_target_rate("notr"),
          bbr_initial_window("iw", DataSize::bytes(8000)),
          bbr_encoder_gain("eg", 0.8) {}
    void Parse(std::string config_str) {
      ParseFieldTrial(
          {
              &use_bbr, &bbr_no_target_rate, &bbr_initial_window,
              &bbr_encoder_gain,
          },
          config_str);
    }
  } tuning;

  void Parse(std::string scenario_string, std::string tuning_string) {
    scenario.Parse(scenario_string);
    tuning.Parse(tuning_string);
    scenario_str = scenario_string;
    tuning_str = tuning_string;
  }
  std::string scenario_str;
  std::string tuning_str;

  std::string BbrTrial() const {
    char trial_buf[1024];
    rtc::SimpleStringBuilder trial(trial_buf);
    trial << "WebRTC-BweBbrConfig/";
    trial << "encoder_rate_gain_in_probe_rtt:0.5";
    trial.AppendFormat(",encoder_rate_gain:%.1lf",
                       tuning.bbr_encoder_gain.Get());
    if (tuning.bbr_no_target_rate)
      trial << ",pacing_rate_as_target:1";
    if (tuning.bbr_initial_window)
      trial << ",initial_cwin:" << tuning.bbr_initial_window->bytes();
    trial << "/";
    return trial.str();
  }
  std::string FieldTrials() const {
    std::string trials;
    if (tuning.use_bbr) {
      trials +=
          "WebRTC-BweCongestionController/Enabled,BBR/"
          "WebRTC-Pacer-DrainQueue/Disabled/"
          "WebRTC-Pacer-PadInSilence/Enabled/"
          "WebRTC-Pacer-BlockAudio/Disabled/"
          "WebRTC-Audio-SendSideBwe/Enabled/"
          "WebRTC-SendSideBwe-WithOverhead/Enabled/";
      trials += BbrTrial();
    }
    return trials;
  }

  std::string Name() const {
    char raw_name[1024];
    rtc::SimpleStringBuilder name(raw_name);
    for (char c : scenario_str + "__tun__" + tuning_str) {
      if (c == ':') {
        continue;
      } else if (c == ',') {
        name << "_";
      } else if (c == '%') {
        name << "p";
      } else {
        name << c;
      }
    }
    return name.str();
  }
};
}  // namespace
class BbrScenarioTest
    : public ::testing::Test,
      public ::testing::WithParamInterface<tuple<std::string, std::string>> {
 public:
  BbrScenarioTest() {
    conf_.Parse(::testing::get<0>(GetParam()), ::testing::get<1>(GetParam()));
    field_trial_.reset(new test::ScopedFieldTrials(conf_.FieldTrials()));
  }
  CallTestConfig conf_;

 private:
  std::unique_ptr<test::ScopedFieldTrials> field_trial_;
};

TEST_P(BbrScenarioTest, ReceivesVideo) {
  BbrNetworkControllerFactory bbr_factory;
  Scenario s("bbr_test_gen/bbr__" + conf_.Name());
  CallClientConfig call_config;
  if (conf_.tuning.use_bbr) {
    call_config.transport.cc =
        TransportControllerConfig::CongestionController::kInjected;
    call_config.transport.cc_factory = &bbr_factory;
  }
  call_config.transport.rates.min_rate = DataRate::kbps(30);
  call_config.transport.rates.max_rate = DataRate::kbps(1800);

  CallClient* alice = s.CreateClient("send", call_config);
  CallClient* bob = s.CreateClient("return", call_config);
  NetworkNodeConfig net_conf;
  net_conf.simulation.bandwidth = conf_.scenario.capacity;
  net_conf.simulation.delay = conf_.scenario.propagation_delay;
  net_conf.simulation.loss_rate = conf_.scenario.loss_rate;
  net_conf.simulation.delay_std_dev = conf_.scenario.delay_noise;
  SimulationNode* send_net = s.CreateSimulationNode(net_conf);
  SimulationNode* ret_net = s.CreateSimulationNode(net_conf);
  auto route = s.CreateRoutes(alice, {send_net}, bob, {ret_net});

  VideoStreamPair* alice_video =
      s.CreateVideoStream(route->forward(), [&](VideoStreamConfig* c) {
        c->encoder.fake.max_rate = DataRate::kbps(1800);
      });
  s.CreateAudioStream(route->forward(), [&](AudioStreamConfig* c) {
    if (conf_.tuning.use_bbr) {
      c->stream.in_bandwidth_estimation = true;
      c->encoder.fixed_rate = DataRate::kbps(31);
    }
  });

  VideoStreamPair* bob_video = nullptr;
  if (conf_.scenario.return_traffic) {
    bob_video =
        s.CreateVideoStream(route->reverse(), [&](VideoStreamConfig* c) {
          c->encoder.fake.max_rate = DataRate::kbps(1800);
        });
    s.CreateAudioStream(route->reverse(), [&](AudioStreamConfig* c) {
      if (conf_.tuning.use_bbr) {
        c->stream.in_bandwidth_estimation = true;
        c->encoder.fixed_rate = DataRate::kbps(31);
      }
    });
  }
  CrossTrafficConfig cross_config;
  cross_config.peak_rate = conf_.scenario.cross_traffic;
  cross_config.random_seed = conf_.scenario.random_seed;
  CrossTrafficSource* cross_traffic =
      s.CreateCrossTraffic({send_net}, cross_config);

  s.CreatePrinter("send.stats.txt", TimeDelta::ms(100),
                  {alice->StatsPrinter(), alice_video->send()->StatsPrinter(),
                   cross_traffic->StatsPrinter(), send_net->ConfigPrinter()});

  std::vector<ColumnPrinter> return_printers{
      bob->StatsPrinter(), ColumnPrinter::Fixed("cross_traffic_rate", "0"),
      ret_net->ConfigPrinter()};
  if (bob_video)
    return_printers.push_back(bob_video->send()->StatsPrinter());
  s.CreatePrinter("return.stats.txt", TimeDelta::ms(100), return_printers);

  s.RunFor(TimeDelta::ms(kRunTimeMs));
}

INSTANTIATE_TEST_SUITE_P(Selected,
                         BbrScenarioTest,
                         Values(make_tuple("rs:1,bw:150,dl:100,ct:100",
                                           "bbr")));

INSTANTIATE_TEST_SUITE_P(
    OneWayTuning,
    BbrScenarioTest,
    Values(make_tuple("bw:150,dl:100", "bbr,iw:,eg:100%,notr"),
           make_tuple("bw:150,dl:100", "bbr,iw:8000,eg:100%,notr"),
           make_tuple("bw:150,dl:100", "bbr,iw:8000,eg:100%"),
           make_tuple("bw:150,dl:100", "bbr,iw:8000,eg:80%")));

INSTANTIATE_TEST_SUITE_P(OneWayTuned,
                         BbrScenarioTest,
                         Values(make_tuple("bw:150,dl:100", "bbr"),
                                make_tuple("bw:150,dl:100", ""),
                                make_tuple("bw:800,dl:100", "bbr"),
                                make_tuple("bw:800,dl:100", "")));

INSTANTIATE_TEST_SUITE_P(OneWayDegraded,
                         BbrScenarioTest,
                         Values(make_tuple("bw:150,dl:100,dn:30,pl:5%", "bbr"),
                                make_tuple("bw:150,dl:100,dn:30,pl:5%", ""),

                                make_tuple("bw:150,ct:100,dl:100", "bbr"),
                                make_tuple("bw:150,ct:100,dl:100", ""),

                                make_tuple("bw:800,dl:100,dn:30,pl:5%", "bbr"),
                                make_tuple("bw:800,dl:100,dn:30,pl:5%", ""),

                                make_tuple("bw:800,ct:600,dl:100", "bbr"),
                                make_tuple("bw:800,ct:600,dl:100", "")));

INSTANTIATE_TEST_SUITE_P(TwoWay,
                         BbrScenarioTest,
                         Values(make_tuple("ret,bw:150,dl:100", "bbr"),
                                make_tuple("ret,bw:150,dl:100", ""),
                                make_tuple("ret,bw:800,dl:100", "bbr"),
                                make_tuple("ret,bw:800,dl:100", ""),
                                make_tuple("ret,bw:150,dl:50", "bbr"),
                                make_tuple("ret,bw:150,dl:50", "")));
}  // namespace test
}  // namespace webrtc
