/*
 *  Copyright (c) 2014 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 <memory>

#include "webrtc/base/constructormagic.h"
#include "webrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h"
#include "webrtc/modules/remote_bitrate_estimator/test/bwe_test.h"
#include "webrtc/modules/remote_bitrate_estimator/test/packet_receiver.h"
#include "webrtc/modules/remote_bitrate_estimator/test/packet_sender.h"
#include "webrtc/test/gtest.h"
#include "webrtc/test/testsupport/fileutils.h"


namespace webrtc {
namespace testing {
namespace bwe {

// This test fixture is used to instantiate tests running with adaptive video
// senders.
class BweSimulation : public BweTest,
                      public ::testing::TestWithParam<BandwidthEstimatorType> {
 public:
  BweSimulation()
      : BweTest(), random_(Clock::GetRealTimeClock()->TimeInMicroseconds()) {}
  virtual ~BweSimulation() {}

 protected:
  void SetUp() override {
    BweTest::SetUp();
    VerboseLogging(true);
  }

  Random random_;

 private:
  RTC_DISALLOW_COPY_AND_ASSIGN(BweSimulation);
};

INSTANTIATE_TEST_CASE_P(VideoSendersTest,
                        BweSimulation,
                        ::testing::Values(kRembEstimator,
                                          kSendSideEstimator,
                                          kNadaEstimator));

TEST_P(BweSimulation, SprintUplinkTest) {
  AdaptiveVideoSource source(0, 30, 300, 0, 0);
  VideoSender sender(&uplink_, &source, GetParam());
  RateCounterFilter counter1(&uplink_, 0, "sender_output",
                             bwe_names[GetParam()]);
  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  ASSERT_TRUE(filter.Init(test::ResourcePath("sprint-uplink", "rx")));
  RunFor(60 * 1000);
}

TEST_P(BweSimulation, Verizon4gDownlinkTest) {
  AdaptiveVideoSource source(0, 30, 300, 0, 0);
  VideoSender sender(&downlink_, &source, GetParam());
  RateCounterFilter counter1(&downlink_, 0, "sender_output",
                             bwe_names[GetParam()] + "_up");
  TraceBasedDeliveryFilter filter(&downlink_, 0, "link_capacity");
  RateCounterFilter counter2(&downlink_, 0, "Receiver",
                             bwe_names[GetParam()] + "_down");
  PacketReceiver receiver(&downlink_, 0, GetParam(), true, true);
  ASSERT_TRUE(filter.Init(test::ResourcePath("verizon4g-downlink", "rx")));
  RunFor(22 * 60 * 1000);
}

TEST_P(BweSimulation, Choke1000kbps500kbps1000kbpsBiDirectional) {
  const int kFlowIds[] = {0, 1};
  const size_t kNumFlows = sizeof(kFlowIds) / sizeof(kFlowIds[0]);

  AdaptiveVideoSource source(kFlowIds[0], 30, 300, 0, 0);
  VideoSender sender(&uplink_, &source, GetParam());
  ChokeFilter choke(&uplink_, kFlowIds[0]);
  RateCounterFilter counter(&uplink_, kFlowIds[0], "Receiver_0",
                            bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, kFlowIds[0], GetParam(), true, false);

  AdaptiveVideoSource source2(kFlowIds[1], 30, 300, 0, 0);
  VideoSender sender2(&downlink_, &source2, GetParam());
  ChokeFilter choke2(&downlink_, kFlowIds[1]);
  DelayFilter delay(&downlink_, CreateFlowIds(kFlowIds, kNumFlows));
  RateCounterFilter counter2(&downlink_, kFlowIds[1], "Receiver_1",
                             bwe_names[GetParam()]);
  PacketReceiver receiver2(&downlink_, kFlowIds[1], GetParam(), true, false);

  choke2.set_capacity_kbps(500);
  delay.SetOneWayDelayMs(0);

  choke.set_capacity_kbps(1000);
  choke.set_max_delay_ms(500);
  RunFor(60 * 1000);
  choke.set_capacity_kbps(500);
  RunFor(60 * 1000);
  choke.set_capacity_kbps(1000);
  RunFor(60 * 1000);
}

TEST_P(BweSimulation, Choke1000kbps500kbps1000kbps) {
  AdaptiveVideoSource source(0, 30, 300, 0, 0);
  VideoSender sender(&uplink_, &source, GetParam());
  ChokeFilter choke(&uplink_, 0);
  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, false);

  choke.set_capacity_kbps(1000);
  choke.set_max_delay_ms(500);
  RunFor(60 * 1000);
  choke.set_capacity_kbps(500);
  RunFor(60 * 1000);
  choke.set_capacity_kbps(1000);
  RunFor(60 * 1000);
}

TEST_P(BweSimulation, PacerChoke1000kbps500kbps1000kbps) {
  AdaptiveVideoSource source(0, 30, 300, 0, 0);
  PacedVideoSender sender(&uplink_, &source, GetParam());
  ChokeFilter filter(&uplink_, 0);
  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  filter.set_capacity_kbps(1000);
  filter.set_max_delay_ms(500);
  RunFor(60 * 1000);
  filter.set_capacity_kbps(500);
  RunFor(60 * 1000);
  filter.set_capacity_kbps(1000);
  RunFor(60 * 1000);
}

TEST_P(BweSimulation, PacerChoke10000kbps) {
  PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000);
  PacedVideoSender sender(&uplink_, &source, GetParam());
  ChokeFilter filter(&uplink_, 0);
  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  filter.set_capacity_kbps(10000);
  filter.set_max_delay_ms(500);
  RunFor(60 * 1000);
}

TEST_P(BweSimulation, PacerChoke200kbps30kbps200kbps) {
  AdaptiveVideoSource source(0, 30, 300, 0, 0);
  PacedVideoSender sender(&uplink_, &source, GetParam());
  ChokeFilter filter(&uplink_, 0);
  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  filter.set_capacity_kbps(200);
  filter.set_max_delay_ms(500);
  RunFor(60 * 1000);
  filter.set_capacity_kbps(30);
  RunFor(60 * 1000);
  filter.set_capacity_kbps(200);
  RunFor(60 * 1000);
}

TEST_P(BweSimulation, Choke200kbps30kbps200kbps) {
  AdaptiveVideoSource source(0, 30, 300, 0, 0);
  VideoSender sender(&uplink_, &source, GetParam());
  ChokeFilter filter(&uplink_, 0);
  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  filter.set_capacity_kbps(200);
  filter.set_max_delay_ms(500);
  RunFor(60 * 1000);
  filter.set_capacity_kbps(30);
  RunFor(60 * 1000);
  filter.set_capacity_kbps(200);
  RunFor(60 * 1000);
}

TEST_P(BweSimulation, GoogleWifiTrace3Mbps) {
  AdaptiveVideoSource source(0, 30, 300, 0, 0);
  VideoSender sender(&uplink_, &source, GetParam());
  RateCounterFilter counter1(&uplink_, 0, "sender_output",
                             bwe_names[GetParam()]);
  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
  filter.set_max_delay_ms(500);
  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
  RunFor(300 * 1000);
}

TEST_P(BweSimulation, LinearIncreasingCapacity) {
  PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000000);
  PacedVideoSender sender(&uplink_, &source, GetParam());
  ChokeFilter filter(&uplink_, 0);
  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  filter.set_max_delay_ms(500);
  const int kStartingCapacityKbps = 150;
  const int kEndingCapacityKbps = 1500;
  const int kStepKbps = 5;
  const int kStepTimeMs = 1000;

  for (int i = kStartingCapacityKbps; i <= kEndingCapacityKbps;
       i += kStepKbps) {
    filter.set_capacity_kbps(i);
    RunFor(kStepTimeMs);
  }
}

TEST_P(BweSimulation, LinearDecreasingCapacity) {
  PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000000);
  PacedVideoSender sender(&uplink_, &source, GetParam());
  ChokeFilter filter(&uplink_, 0);
  RateCounterFilter counter(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  filter.set_max_delay_ms(500);
  const int kStartingCapacityKbps = 1500;
  const int kEndingCapacityKbps = 150;
  const int kStepKbps = -5;
  const int kStepTimeMs = 1000;

  for (int i = kStartingCapacityKbps; i >= kEndingCapacityKbps;
       i += kStepKbps) {
    filter.set_capacity_kbps(i);
    RunFor(kStepTimeMs);
  }
}

TEST_P(BweSimulation, PacerGoogleWifiTrace3Mbps) {
  PeriodicKeyFrameSource source(0, 30, 300, 0, 0, 1000);
  PacedVideoSender sender(&uplink_, &source, GetParam());
  RateCounterFilter counter1(&uplink_, 0, "sender_output",
                             bwe_names[GetParam()]);
  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
  filter.set_max_delay_ms(500);
  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
  RunFor(300 * 1000);
}

TEST_P(BweSimulation, PacerGoogleWifiTrace3MbpsLowFramerate) {
  PeriodicKeyFrameSource source(0, 5, 300, 0, 0, 1000);
  PacedVideoSender sender(&uplink_, &source, GetParam());
  RateCounterFilter counter1(&uplink_, 0, "sender_output",
                             bwe_names[GetParam()]);
  TraceBasedDeliveryFilter filter(&uplink_, 0, "link_capacity");
  filter.set_max_delay_ms(500);
  RateCounterFilter counter2(&uplink_, 0, "Receiver", bwe_names[GetParam()]);
  PacketReceiver receiver(&uplink_, 0, GetParam(), true, true);
  ASSERT_TRUE(filter.Init(test::ResourcePath("google-wifi-3mbps", "rx")));
  RunFor(300 * 1000);
}

TEST_P(BweSimulation, SelfFairnessTest) {
  Random prng(Clock::GetRealTimeClock()->TimeInMicroseconds());
  const int kAllFlowIds[] = {0, 1, 2, 3};
  const size_t kNumFlows = sizeof(kAllFlowIds) / sizeof(kAllFlowIds[0]);
  std::unique_ptr<VideoSource> sources[kNumFlows];
  std::unique_ptr<VideoSender> senders[kNumFlows];
  for (size_t i = 0; i < kNumFlows; ++i) {
    // Streams started 20 seconds apart to give them different advantage when
    // competing for the bandwidth.
    sources[i].reset(new AdaptiveVideoSource(kAllFlowIds[i], 30, 300, 0,
                                             i * prng.Rand(39999)));
    senders[i].reset(new VideoSender(&uplink_, sources[i].get(), GetParam()));
  }

  ChokeFilter choke(&uplink_, CreateFlowIds(kAllFlowIds, kNumFlows));
  choke.set_capacity_kbps(1000);

  std::unique_ptr<RateCounterFilter> rate_counters[kNumFlows];
  for (size_t i = 0; i < kNumFlows; ++i) {
    rate_counters[i].reset(
        new RateCounterFilter(&uplink_, CreateFlowIds(&kAllFlowIds[i], 1),
                              "Receiver", bwe_names[GetParam()]));
  }

  RateCounterFilter total_utilization(
      &uplink_, CreateFlowIds(kAllFlowIds, kNumFlows), "total_utilization",
      "Total_link_utilization");

  std::unique_ptr<PacketReceiver> receivers[kNumFlows];
  for (size_t i = 0; i < kNumFlows; ++i) {
    receivers[i].reset(new PacketReceiver(&uplink_, kAllFlowIds[i], GetParam(),
                                          i == 0, false));
  }

  RunFor(30 * 60 * 1000);
}

TEST_P(BweSimulation, PacedSelfFairness50msTest) {
  const int64_t kAverageOffsetMs = 20 * 1000;
  const int kNumRmcatFlows = 4;
  int64_t offsets_ms[kNumRmcatFlows];
  offsets_ms[0] = random_.Rand(2 * kAverageOffsetMs);
  for (int i = 1; i < kNumRmcatFlows; ++i) {
    offsets_ms[i] = offsets_ms[i - 1] + random_.Rand(2 * kAverageOffsetMs);
  }
  RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 1000, 3000, 50, 50, 0,
                  offsets_ms);
}

TEST_P(BweSimulation, PacedSelfFairness500msTest) {
  const int64_t kAverageOffsetMs = 20 * 1000;
  const int kNumRmcatFlows = 4;
  int64_t offsets_ms[kNumRmcatFlows];
  offsets_ms[0] = random_.Rand(2 * kAverageOffsetMs);
  for (int i = 1; i < kNumRmcatFlows; ++i) {
    offsets_ms[i] = offsets_ms[i - 1] + random_.Rand(2 * kAverageOffsetMs);
  }
  RunFairnessTest(GetParam(), kNumRmcatFlows, 0, 1000, 3000, 500, 50, 0,
                  offsets_ms);
}

TEST_P(BweSimulation, PacedSelfFairness1000msTest) {
  const int64_t kAverageOffsetMs = 20 * 1000;
  const int kNumRmcatFlows = 4;
  int64_t offsets_ms[kNumRmcatFlows];
  offsets_ms[0] = random_.Rand(2 * kAverageOffsetMs);
  for (int i = 1; i < kNumRmcatFlows; ++i) {
    offsets_ms[i] = offsets_ms[i - 1] + random_.Rand(2 * kAverageOffsetMs);
  }
  RunFairnessTest(GetParam(), 4, 0, 1000, 3000, 1000, 50, 0, offsets_ms);
}

TEST_P(BweSimulation, TcpFairness50msTest) {
  const int64_t kAverageOffsetMs = 20 * 1000;
  int64_t offset_ms[] = {random_.Rand(2 * kAverageOffsetMs), 0};
  RunFairnessTest(GetParam(), 1, 1, 1000, 2000, 50, 50, 0, offset_ms);
}

TEST_P(BweSimulation, TcpFairness500msTest) {
  const int64_t kAverageOffsetMs = 20 * 1000;
  int64_t offset_ms[] = {random_.Rand(2 * kAverageOffsetMs), 0};
  RunFairnessTest(GetParam(), 1, 1, 1000, 2000, 500, 50, 0, offset_ms);
}

TEST_P(BweSimulation, TcpFairness1000msTest) {
  const int kAverageOffsetMs = 20 * 1000;
  int64_t offset_ms[] = {random_.Rand(2 * kAverageOffsetMs), 0};
  RunFairnessTest(GetParam(), 1, 1, 1000, 2000, 1000, 50, 0, offset_ms);
}

// The following test cases begin with "Evaluation" as a reference to the
// Internet draft https://tools.ietf.org/html/draft-ietf-rmcat-eval-test-01.

TEST_P(BweSimulation, Evaluation1) {
  RunVariableCapacity1SingleFlow(GetParam());
}

TEST_P(BweSimulation, Evaluation2) {
  const size_t kNumFlows = 2;
  RunVariableCapacity2MultipleFlows(GetParam(), kNumFlows);
}

TEST_P(BweSimulation, Evaluation3) {
  RunBidirectionalFlow(GetParam());
}

TEST_P(BweSimulation, Evaluation4) {
  RunSelfFairness(GetParam());
}

TEST_P(BweSimulation, Evaluation5) {
  RunRoundTripTimeFairness(GetParam());
}

TEST_P(BweSimulation, Evaluation6) {
  RunLongTcpFairness(GetParam());
}

// Different calls to the Evaluation7 will create the same FileSizes
// and StartingTimes as long as the seeds remain unchanged. This is essential
// when calling it with multiple estimators for comparison purposes.
TEST_P(BweSimulation, Evaluation7) {
  const int kNumTcpFiles = 10;
  RunMultipleShortTcpFairness(GetParam(),
                              BweTest::GetFileSizesBytes(kNumTcpFiles),
                              BweTest::GetStartingTimesMs(kNumTcpFiles));
}

TEST_P(BweSimulation, Evaluation8) {
  RunPauseResumeFlows(GetParam());
}

// Following test cases begin with "GccComparison" run the
// evaluation test cases for both GCC and other calling RMCAT.

TEST_P(BweSimulation, GccComparison1) {
  RunVariableCapacity1SingleFlow(GetParam());
  BweTest gcc_test(false);
  gcc_test.RunVariableCapacity1SingleFlow(kSendSideEstimator);
}

TEST_P(BweSimulation, GccComparison2) {
  const size_t kNumFlows = 2;
  RunVariableCapacity2MultipleFlows(GetParam(), kNumFlows);
  BweTest gcc_test(false);
  gcc_test.RunVariableCapacity2MultipleFlows(kSendSideEstimator, kNumFlows);
}

TEST_P(BweSimulation, GccComparison3) {
  RunBidirectionalFlow(GetParam());
  BweTest gcc_test(false);
  gcc_test.RunBidirectionalFlow(kSendSideEstimator);
}

TEST_P(BweSimulation, GccComparison4) {
  RunSelfFairness(GetParam());
  BweTest gcc_test(false);
  gcc_test.RunSelfFairness(GetParam());
}

TEST_P(BweSimulation, GccComparison5) {
  RunRoundTripTimeFairness(GetParam());
  BweTest gcc_test(false);
  gcc_test.RunRoundTripTimeFairness(kSendSideEstimator);
}

TEST_P(BweSimulation, GccComparison6) {
  RunLongTcpFairness(GetParam());
  BweTest gcc_test(false);
  gcc_test.RunLongTcpFairness(kSendSideEstimator);
}

TEST_P(BweSimulation, GccComparison7) {
  const int kNumTcpFiles = 10;

  std::vector<int> tcp_file_sizes_bytes =
      BweTest::GetFileSizesBytes(kNumTcpFiles);
  std::vector<int64_t> tcp_starting_times_ms =
      BweTest::GetStartingTimesMs(kNumTcpFiles);

  RunMultipleShortTcpFairness(GetParam(), tcp_file_sizes_bytes,
                              tcp_starting_times_ms);

  BweTest gcc_test(false);
  gcc_test.RunMultipleShortTcpFairness(kSendSideEstimator, tcp_file_sizes_bytes,
                                       tcp_starting_times_ms);
}

TEST_P(BweSimulation, GccComparison8) {
  RunPauseResumeFlows(GetParam());
  BweTest gcc_test(false);
  gcc_test.RunPauseResumeFlows(kSendSideEstimator);
}

TEST_P(BweSimulation, GccComparisonChoke) {
  int array[] = {1000, 500, 1000};
  std::vector<int> capacities_kbps(array, array + 3);
  RunChoke(GetParam(), capacities_kbps);

  BweTest gcc_test(false);
  gcc_test.RunChoke(kSendSideEstimator, capacities_kbps);
}

}  // namespace bwe
}  // namespace testing
}  // namespace webrtc

