/*
 *  Copyright (c) 2022 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 "video/video_receive_stream_timeout_tracker.h"

#include <vector>

#include "api/units/time_delta.h"
#include "api/units/timestamp.h"
#include "test/gmock.h"
#include "test/gtest.h"
#include "test/time_controller/simulated_time_controller.h"

namespace webrtc {

namespace {

constexpr auto kMaxWaitForKeyframe = TimeDelta::Millis(500);
constexpr auto kMaxWaitForFrame = TimeDelta::Millis(1500);
constexpr VideoReceiveStreamTimeoutTracker::Timeouts config = {
    .max_wait_for_keyframe = kMaxWaitForKeyframe,
    .max_wait_for_frame = kMaxWaitForFrame};
}  // namespace

class VideoReceiveStreamTimeoutTrackerTest : public ::testing::Test {
 public:
  VideoReceiveStreamTimeoutTrackerTest()
      : time_controller_(Timestamp::Millis(2000)),
        timeout_tracker_(time_controller_.GetClock(),
                         time_controller_.GetMainThread(),
                         config,
                         [this](TimeDelta delay) { OnTimeout(delay); }) {}

 protected:
  GlobalSimulatedTimeController time_controller_;
  VideoReceiveStreamTimeoutTracker timeout_tracker_;
  std::vector<TimeDelta> timeouts_;

 private:
  void OnTimeout(TimeDelta delay) { timeouts_.push_back(delay); }
};

TEST_F(VideoReceiveStreamTimeoutTrackerTest, TimeoutAfterInitialPeriod) {
  timeout_tracker_.Start(true);
  time_controller_.AdvanceTime(kMaxWaitForKeyframe);
  EXPECT_THAT(timeouts_, testing::ElementsAre(kMaxWaitForKeyframe));
  timeout_tracker_.Stop();
}

TEST_F(VideoReceiveStreamTimeoutTrackerTest, NoTimeoutAfterStop) {
  timeout_tracker_.Start(true);
  time_controller_.AdvanceTime(kMaxWaitForKeyframe / 2);
  timeout_tracker_.Stop();
  time_controller_.AdvanceTime(kMaxWaitForKeyframe);
  EXPECT_THAT(timeouts_, testing::IsEmpty());
}

TEST_F(VideoReceiveStreamTimeoutTrackerTest, TimeoutForDeltaFrame) {
  timeout_tracker_.Start(true);
  time_controller_.AdvanceTime(TimeDelta::Millis(5));
  timeout_tracker_.OnEncodedFrameReleased();
  time_controller_.AdvanceTime(kMaxWaitForFrame);
  EXPECT_THAT(timeouts_, testing::ElementsAre(kMaxWaitForFrame));
  timeout_tracker_.Stop();
}

TEST_F(VideoReceiveStreamTimeoutTrackerTest, TimeoutForKeyframeWhenForced) {
  timeout_tracker_.Start(true);
  time_controller_.AdvanceTime(TimeDelta::Millis(5));
  timeout_tracker_.OnEncodedFrameReleased();
  timeout_tracker_.SetWaitingForKeyframe();
  time_controller_.AdvanceTime(kMaxWaitForKeyframe);
  EXPECT_THAT(timeouts_, testing::ElementsAre(kMaxWaitForKeyframe));
  timeout_tracker_.Stop();
}

TEST_F(VideoReceiveStreamTimeoutTrackerTest, TotalTimeoutUsedInCallback) {
  timeout_tracker_.Start(true);
  time_controller_.AdvanceTime(kMaxWaitForKeyframe * 2);
  timeout_tracker_.OnEncodedFrameReleased();
  time_controller_.AdvanceTime(kMaxWaitForFrame * 2);
  EXPECT_THAT(timeouts_,
              testing::ElementsAre(kMaxWaitForKeyframe, kMaxWaitForKeyframe * 2,
                                   kMaxWaitForFrame, kMaxWaitForFrame * 2));
  timeout_tracker_.Stop();
}

}  // namespace webrtc
