blob: 1196ada3ab94dc3e4aafbaf3a668912326e657f2 [file] [log] [blame]
mflodman@webrtc.orgb2f474e2012-11-16 13:57:261/*
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.orgf5d4cb12013-05-17 13:44:4811#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
mflodman@webrtc.orgb2f474e2012-11-16 13:57:2613
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.orgaea96d32013-02-19 22:09:3625class MockStatsObserver : public CallStatsObserver {
mflodman@webrtc.orgb2f474e2012-11-16 13:57:2626 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.org1ae1d0c2013-11-20 12:46:1144 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orgb2f474e2012-11-16 13:57:2645 call_stats_->RegisterStatsObserver(&stats_observer);
46 TickTime::AdvanceFakeClock(1000);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:1147 EXPECT_EQ(0U, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orgb2f474e2012-11-16 13:57:2648
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:1149 const uint32_t kRtt = 25;
50 rtcp_rtt_stats->OnRttUpdate(kRtt);
51 EXPECT_CALL(stats_observer, OnRttUpdate(kRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:2652 .Times(1);
53 call_stats_->Process();
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:1154 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.orgb2f474e2012-11-16 13:57:2662
63 call_stats_->DeregisterStatsObserver(&stats_observer);
64}
65
66TEST_F(CallStatsTest, ProcessTime) {
67 MockStatsObserver stats_observer;
68 call_stats_->RegisterStatsObserver(&stats_observer);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:1169 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
70 rtcp_rtt_stats->OnRttUpdate(100);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:2671
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.org1ae1d0c2013-11-20 12:46:1185 rtcp_rtt_stats->OnRttUpdate(100);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:2686 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);
asapersson@webrtc.org8084f952014-12-10 11:04:13104 // Add the second observer twice, there should still be only one report to the
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26105 // observer.
106 MockStatsObserver stats_observer_2;
107 call_stats_->RegisterStatsObserver(&stats_observer_2);
108 call_stats_->RegisterStatsObserver(&stats_observer_2);
109
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11110 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
asapersson@webrtc.org8084f952014-12-10 11:04:13111 const uint32_t kRtt = 100;
112 rtcp_rtt_stats->OnRttUpdate(kRtt);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26113
114 // Verify both observers are updated.
115 TickTime::AdvanceFakeClock(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13116 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26117 .Times(1);
asapersson@webrtc.org8084f952014-12-10 11:04:13118 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26119 .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.org8084f952014-12-10 11:04:13125 rtcp_rtt_stats->OnRttUpdate(kRtt);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26126 TickTime::AdvanceFakeClock(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13127 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26128 .Times(1);
asapersson@webrtc.org8084f952014-12-10 11:04:13129 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26130 .Times(0);
131 call_stats_->Process();
132
133 // Deregister the first observer.
134 call_stats_->DeregisterStatsObserver(&stats_observer_1);
asapersson@webrtc.org8084f952014-12-10 11:04:13135 rtcp_rtt_stats->OnRttUpdate(kRtt);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26136 TickTime::AdvanceFakeClock(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13137 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26138 .Times(0);
asapersson@webrtc.org8084f952014-12-10 11:04:13139 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26140 .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.org1ae1d0c2013-11-20 12:46:11148 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26149
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.
asapersson@webrtc.org8084f952014-12-10 11:04:13154 const uint32_t kFirstRtt = 100;
155 rtcp_rtt_stats->OnRttUpdate(kFirstRtt);
156 EXPECT_CALL(stats_observer, OnRttUpdate(kFirstRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26157 .Times(1);
158 call_stats_->Process();
159
160 // Increase rtt and verify the new value is reported.
161 TickTime::AdvanceFakeClock(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13162 const uint32_t kHighRtt = kFirstRtt + 20;
163 rtcp_rtt_stats->OnRttUpdate(kHighRtt);
164 EXPECT_CALL(stats_observer, OnRttUpdate(kHighRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26165 .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);
asapersson@webrtc.org8084f952014-12-10 11:04:13172 const uint32_t kLowRtt = kFirstRtt - 20;
173 rtcp_rtt_stats->OnRttUpdate(kLowRtt);
174 EXPECT_CALL(stats_observer, OnRttUpdate(kHighRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26175 .Times(1);
176 call_stats_->Process();
177
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11178 // Advance time to make the high report invalid, the lower rtt should now be
179 // in the callback.
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26180 TickTime::AdvanceFakeClock(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13181 EXPECT_CALL(stats_observer, OnRttUpdate(kLowRtt))
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26182 .Times(1);
183 call_stats_->Process();
184
185 call_stats_->DeregisterStatsObserver(&stats_observer);
186}
187
asapersson@webrtc.org8084f952014-12-10 11:04:13188TEST_F(CallStatsTest, LastProcessedRtt) {
189 MockStatsObserver stats_observer;
190 call_stats_->RegisterStatsObserver(&stats_observer);
191 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
192 TickTime::AdvanceFakeClock(1000);
193
194 // Set a first values and verify that LastProcessedRtt initially returns the
195 // average rtt.
196 const uint32_t kRttLow = 10;
197 const uint32_t kRttHigh = 30;
198 const uint32_t kAvgRtt = 20;
199 rtcp_rtt_stats->OnRttUpdate(kRttLow);
200 rtcp_rtt_stats->OnRttUpdate(kRttHigh);
201 EXPECT_CALL(stats_observer, OnRttUpdate(kRttHigh))
202 .Times(1);
203 call_stats_->Process();
204 EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
205
206 // Update values and verify LastProcessedRtt.
207 TickTime::AdvanceFakeClock(1000);
208 rtcp_rtt_stats->OnRttUpdate(kRttLow);
209 rtcp_rtt_stats->OnRttUpdate(kRttHigh);
210 EXPECT_CALL(stats_observer, OnRttUpdate(kRttHigh))
211 .Times(1);
212 call_stats_->Process();
213 EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
214
215 call_stats_->DeregisterStatsObserver(&stats_observer);
216}
217
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26218} // namespace webrtc