blob: f550c0d8e4b5771fbde2b41b8bf083594825ce9c [file] [log] [blame]
Henrik Boströmce33b6a2019-05-28 15:42:381/*
2 * Copyright 2019 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include "video/quality_limitation_reason_tracker.h"
12
13#include "common_video/include/quality_limitation_reason.h"
14#include "system_wrappers/include/clock.h"
15#include "test/gtest.h"
16
17namespace webrtc {
18
19class QualityLimitationReasonTrackerTest : public ::testing::Test {
20 public:
21 QualityLimitationReasonTrackerTest()
22 : fake_clock_(1234), tracker_(&fake_clock_) {}
23
24 protected:
25 SimulatedClock fake_clock_;
26 QualityLimitationReasonTracker tracker_;
27};
28
29TEST_F(QualityLimitationReasonTrackerTest, DefaultValues) {
30 EXPECT_EQ(QualityLimitationReason::kNone, tracker_.current_reason());
31 auto durations_ms = tracker_.DurationsMs();
32 EXPECT_EQ(4u, durations_ms.size());
33 EXPECT_EQ(0, durations_ms.find(QualityLimitationReason::kNone)->second);
34 EXPECT_EQ(0, durations_ms.find(QualityLimitationReason::kCpu)->second);
35 EXPECT_EQ(0, durations_ms.find(QualityLimitationReason::kBandwidth)->second);
36 EXPECT_EQ(0, durations_ms.find(QualityLimitationReason::kOther)->second);
37}
38
39TEST_F(QualityLimitationReasonTrackerTest, NoneDurationIncreasesByDefault) {
40 int64_t initial_duration_ms =
41 tracker_.DurationsMs()[QualityLimitationReason::kNone];
42 fake_clock_.AdvanceTimeMilliseconds(9999);
43 EXPECT_EQ(initial_duration_ms + 9999,
44 tracker_.DurationsMs()[QualityLimitationReason::kNone]);
45}
46
47TEST_F(QualityLimitationReasonTrackerTest,
48 RememberDurationAfterSwitchingReason) {
49 tracker_.SetReason(QualityLimitationReason::kCpu);
50 int64_t initial_duration_ms =
51 tracker_.DurationsMs()[QualityLimitationReason::kCpu];
52 fake_clock_.AdvanceTimeMilliseconds(50);
53 tracker_.SetReason(QualityLimitationReason::kOther);
54 fake_clock_.AdvanceTimeMilliseconds(50);
55 EXPECT_EQ(initial_duration_ms + 50,
56 tracker_.DurationsMs()[QualityLimitationReason::kCpu]);
57}
58
59class QualityLimitationReasonTrackerTestWithParamReason
60 : public QualityLimitationReasonTrackerTest,
61 public ::testing::WithParamInterface<QualityLimitationReason> {
62 public:
63 QualityLimitationReasonTrackerTestWithParamReason()
64 : reason_(GetParam()),
65 different_reason_(reason_ != QualityLimitationReason::kCpu
66 ? QualityLimitationReason::kCpu
67 : QualityLimitationReason::kOther) {}
68
69 protected:
70 QualityLimitationReason reason_;
71 QualityLimitationReason different_reason_;
72};
73
74TEST_P(QualityLimitationReasonTrackerTestWithParamReason,
75 DurationIncreasesOverTime) {
76 int64_t initial_duration_ms = tracker_.DurationsMs()[reason_];
77 tracker_.SetReason(reason_);
78 EXPECT_EQ(initial_duration_ms, tracker_.DurationsMs()[reason_]);
79 fake_clock_.AdvanceTimeMilliseconds(4321);
80 EXPECT_EQ(initial_duration_ms + 4321, tracker_.DurationsMs()[reason_]);
81}
82
83TEST_P(QualityLimitationReasonTrackerTestWithParamReason,
84 SwitchBetweenReasonsBackAndForth) {
85 int64_t initial_duration_ms = tracker_.DurationsMs()[reason_];
Artem Titovab30d722021-07-27 14:22:1186 // Spend 100 ms in `different_reason_`.
Henrik Boströmce33b6a2019-05-28 15:42:3887 tracker_.SetReason(different_reason_);
88 fake_clock_.AdvanceTimeMilliseconds(100);
89 EXPECT_EQ(initial_duration_ms, tracker_.DurationsMs()[reason_]);
Artem Titovab30d722021-07-27 14:22:1190 // Spend 50 ms in `reason_`.
Henrik Boströmce33b6a2019-05-28 15:42:3891 tracker_.SetReason(reason_);
92 fake_clock_.AdvanceTimeMilliseconds(50);
93 EXPECT_EQ(initial_duration_ms + 50, tracker_.DurationsMs()[reason_]);
Artem Titovab30d722021-07-27 14:22:1194 // Spend another 1000 ms in `different_reason_`.
Henrik Boströmce33b6a2019-05-28 15:42:3895 tracker_.SetReason(different_reason_);
96 fake_clock_.AdvanceTimeMilliseconds(1000);
97 EXPECT_EQ(initial_duration_ms + 50, tracker_.DurationsMs()[reason_]);
Artem Titovab30d722021-07-27 14:22:1198 // Spend another 100 ms in `reason_`.
Henrik Boströmce33b6a2019-05-28 15:42:3899 tracker_.SetReason(reason_);
100 fake_clock_.AdvanceTimeMilliseconds(100);
101 EXPECT_EQ(initial_duration_ms + 150, tracker_.DurationsMs()[reason_]);
102 // Change reason one last time without advancing time.
103 tracker_.SetReason(different_reason_);
104 EXPECT_EQ(initial_duration_ms + 150, tracker_.DurationsMs()[reason_]);
105}
106
107INSTANTIATE_TEST_SUITE_P(
Mirko Bonadei09f11952019-09-29 08:19:42108 All,
Henrik Boströmce33b6a2019-05-28 15:42:38109 QualityLimitationReasonTrackerTestWithParamReason,
110 ::testing::Values(QualityLimitationReason::kNone, // "/0"
111 QualityLimitationReason::kCpu, // "/1"
112 QualityLimitationReason::kBandwidth, // "/2"
113 QualityLimitationReason::kOther)); // "/3"
114
115} // namespace webrtc