blob: f504094ba27bb3fd55e5673fef26caec6137024a [file] [log] [blame]
mflodman@webrtc.orge2967832012-11-16 13:57:26 +00001/*
2 * Copyright (c) 2012 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
pbos@webrtc.org281cff82013-05-17 13:44:48 +000011#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
mflodman@webrtc.orge2967832012-11-16 13:57:26 +000013
14#include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
15#include "webrtc/system_wrappers/interface/scoped_ptr.h"
16#include "webrtc/system_wrappers/interface/tick_util.h"
17#include "webrtc/video_engine/call_stats.h"
18
19using ::testing::_;
20using ::testing::AnyNumber;
21using ::testing::Return;
22
23namespace webrtc {
24
fischman@webrtc.org0329e592013-02-19 22:09:36 +000025class MockStatsObserver : public CallStatsObserver {
mflodman@webrtc.orge2967832012-11-16 13:57:26 +000026 public:
27 MockStatsObserver() {}
28 virtual ~MockStatsObserver() {}
29
30 MOCK_METHOD1(OnRttUpdate, void(uint32_t));
31};
32
33class CallStatsTest : public ::testing::Test {
34 protected:
35 virtual void SetUp() {
36 TickTime::UseFakeClock(12345);
37 call_stats_.reset(new CallStats());
38 }
39 scoped_ptr<CallStats> call_stats_;
40};
41
42TEST_F(CallStatsTest, AddAndTriggerCallback) {
43 MockStatsObserver stats_observer;
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +000044 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orge2967832012-11-16 13:57:26 +000045 call_stats_->RegisterStatsObserver(&stats_observer);
46 TickTime::AdvanceFakeClock(1000);
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +000047 EXPECT_EQ(0U, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orge2967832012-11-16 13:57:26 +000048
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +000049 const uint32_t kRtt = 25;
50 rtcp_rtt_stats->OnRttUpdate(kRtt);
51 EXPECT_CALL(stats_observer, OnRttUpdate(kRtt))
mflodman@webrtc.orge2967832012-11-16 13:57:26 +000052 .Times(1);
53 call_stats_->Process();
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +000054 EXPECT_EQ(kRtt, rtcp_rtt_stats->LastProcessedRtt());
55
56 const int kRttTimeOutMs = 1500 + 10;
57 TickTime::AdvanceFakeClock(kRttTimeOutMs);
58 EXPECT_CALL(stats_observer, OnRttUpdate(_))
59 .Times(0);
60 call_stats_->Process();
61 EXPECT_EQ(0U, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orge2967832012-11-16 13:57:26 +000062
63 call_stats_->DeregisterStatsObserver(&stats_observer);
64}
65
66TEST_F(CallStatsTest, ProcessTime) {
67 MockStatsObserver stats_observer;
68 call_stats_->RegisterStatsObserver(&stats_observer);
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +000069 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
70 rtcp_rtt_stats->OnRttUpdate(100);
mflodman@webrtc.orge2967832012-11-16 13:57:26 +000071
72 // Time isn't updated yet.
73 EXPECT_CALL(stats_observer, OnRttUpdate(_))
74 .Times(0);
75 call_stats_->Process();
76
77 // Advance clock and verify we get an update.
78 TickTime::AdvanceFakeClock(1000);
79 EXPECT_CALL(stats_observer, OnRttUpdate(_))
80 .Times(1);
81 call_stats_->Process();
82
83 // Advance clock just too little to get an update.
84 TickTime::AdvanceFakeClock(999);
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +000085 rtcp_rtt_stats->OnRttUpdate(100);
mflodman@webrtc.orge2967832012-11-16 13:57:26 +000086 EXPECT_CALL(stats_observer, OnRttUpdate(_))
87 .Times(0);
88 call_stats_->Process();
89
90 // Advance enough to trigger a new update.
91 TickTime::AdvanceFakeClock(1);
92 EXPECT_CALL(stats_observer, OnRttUpdate(_))
93 .Times(1);
94 call_stats_->Process();
95
96 call_stats_->DeregisterStatsObserver(&stats_observer);
97}
98
99// Verify all observers get correct estimates and observers can be added and
100// removed.
101TEST_F(CallStatsTest, MultipleObservers) {
102 MockStatsObserver stats_observer_1;
103 call_stats_->RegisterStatsObserver(&stats_observer_1);
104 // Add the secondobserver twice, there should still be only one report to the
105 // observer.
106 MockStatsObserver stats_observer_2;
107 call_stats_->RegisterStatsObserver(&stats_observer_2);
108 call_stats_->RegisterStatsObserver(&stats_observer_2);
109
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000110 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000111 uint32_t rtt = 100;
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000112 rtcp_rtt_stats->OnRttUpdate(rtt);
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000113
114 // Verify both observers are updated.
115 TickTime::AdvanceFakeClock(1000);
116 EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
117 .Times(1);
118 EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
119 .Times(1);
120 call_stats_->Process();
121
122 // Deregister the second observer and verify update is only sent to the first
123 // observer.
124 call_stats_->DeregisterStatsObserver(&stats_observer_2);
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000125 rtcp_rtt_stats->OnRttUpdate(rtt);
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000126 TickTime::AdvanceFakeClock(1000);
127 EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
128 .Times(1);
129 EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
130 .Times(0);
131 call_stats_->Process();
132
133 // Deregister the first observer.
134 call_stats_->DeregisterStatsObserver(&stats_observer_1);
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000135 rtcp_rtt_stats->OnRttUpdate(rtt);
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000136 TickTime::AdvanceFakeClock(1000);
137 EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
138 .Times(0);
139 EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
140 .Times(0);
141 call_stats_->Process();
142}
143
144// Verify increasing and decreasing rtt triggers callbacks with correct values.
145TEST_F(CallStatsTest, ChangeRtt) {
146 MockStatsObserver stats_observer;
147 call_stats_->RegisterStatsObserver(&stats_observer);
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000148 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000149
150 // Advance clock to be ready for an update.
151 TickTime::AdvanceFakeClock(1000);
152
153 // Set a first value and verify the callback is triggered.
154 const uint32_t first_rtt = 100;
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000155 rtcp_rtt_stats->OnRttUpdate(first_rtt);
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000156 EXPECT_CALL(stats_observer, OnRttUpdate(first_rtt))
157 .Times(1);
158 call_stats_->Process();
159
160 // Increase rtt and verify the new value is reported.
161 TickTime::AdvanceFakeClock(1000);
162 const uint32_t high_rtt = first_rtt + 20;
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000163 rtcp_rtt_stats->OnRttUpdate(high_rtt);
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000164 EXPECT_CALL(stats_observer, OnRttUpdate(high_rtt))
165 .Times(1);
166 call_stats_->Process();
167
168 // Increase time enough for a new update, but not too much to make the
169 // rtt invalid. Report a lower rtt and verify the old/high value still is sent
170 // in the callback.
171 TickTime::AdvanceFakeClock(1000);
172 const uint32_t low_rtt = first_rtt - 20;
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000173 rtcp_rtt_stats->OnRttUpdate(low_rtt);
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000174 EXPECT_CALL(stats_observer, OnRttUpdate(high_rtt))
175 .Times(1);
176 call_stats_->Process();
177
asapersson@webrtc.orgc4af4cf2013-11-20 12:46:11 +0000178 // Advance time to make the high report invalid, the lower rtt should now be
179 // in the callback.
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000180 TickTime::AdvanceFakeClock(1000);
181 EXPECT_CALL(stats_observer, OnRttUpdate(low_rtt))
182 .Times(1);
183 call_stats_->Process();
184
185 call_stats_->DeregisterStatsObserver(&stats_observer);
186}
187
mflodman@webrtc.orge2967832012-11-16 13:57:26 +0000188} // namespace webrtc