diff options
Diffstat (limited to 'third_party/libwebrtc/video/video_receive_stream_timeout_tracker_unittest.cc')
-rw-r--r-- | third_party/libwebrtc/video/video_receive_stream_timeout_tracker_unittest.cc | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/third_party/libwebrtc/video/video_receive_stream_timeout_tracker_unittest.cc b/third_party/libwebrtc/video/video_receive_stream_timeout_tracker_unittest.cc new file mode 100644 index 0000000000..ea3bf896b8 --- /dev/null +++ b/third_party/libwebrtc/video/video_receive_stream_timeout_tracker_unittest.cc @@ -0,0 +1,94 @@ +/* + * 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 <utility> +#include <vector> + +#include "api/task_queue/task_queue_base.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 = { + kMaxWaitForKeyframe, 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 |