blob: bfba5cb72aa16745dd624a8c992c263e3115c6b4 [file] [log] [blame]
mflodman@webrtc.orgb2f474e2012-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.orgf5d4cb12013-05-17 13:44:48 +000011#include "testing/gmock/include/gmock/gmock.h"
12#include "testing/gtest/include/gtest/gtest.h"
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000013
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000014#include "webrtc/base/scoped_ptr.h"
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010015#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
Henrik Kjellander98f53512015-10-28 18:17:40 +010016#include "webrtc/system_wrappers/include/tick_util.h"
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000017#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:36 +000025class MockStatsObserver : public CallStatsObserver {
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000026 public:
27 MockStatsObserver() {}
28 virtual ~MockStatsObserver() {}
29
stefan2328a942015-08-07 04:27:51 -070030 MOCK_METHOD2(OnRttUpdate, void(int64_t, int64_t));
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000031};
32
33class CallStatsTest : public ::testing::Test {
34 protected:
35 virtual void SetUp() {
36 TickTime::UseFakeClock(12345);
37 call_stats_.reset(new CallStats());
38 }
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000039 rtc::scoped_ptr<CallStats> call_stats_;
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000040};
41
42TEST_F(CallStatsTest, AddAndTriggerCallback) {
43 MockStatsObserver stats_observer;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000044 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000045 call_stats_->RegisterStatsObserver(&stats_observer);
46 TickTime::AdvanceFakeClock(1000);
pkasting@chromium.org16825b12015-01-12 21:51:21 +000047 EXPECT_EQ(0, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000048
pkasting@chromium.org16825b12015-01-12 21:51:21 +000049 const int64_t kRtt = 25;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000050 rtcp_rtt_stats->OnRttUpdate(kRtt);
stefan2328a942015-08-07 04:27:51 -070051 EXPECT_CALL(stats_observer, OnRttUpdate(kRtt, kRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000052 call_stats_->Process();
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000053 EXPECT_EQ(kRtt, rtcp_rtt_stats->LastProcessedRtt());
54
pkasting@chromium.org16825b12015-01-12 21:51:21 +000055 const int64_t kRttTimeOutMs = 1500 + 10;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000056 TickTime::AdvanceFakeClock(kRttTimeOutMs);
stefan2328a942015-08-07 04:27:51 -070057 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000058 call_stats_->Process();
pkasting@chromium.org16825b12015-01-12 21:51:21 +000059 EXPECT_EQ(0, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000060
61 call_stats_->DeregisterStatsObserver(&stats_observer);
62}
63
64TEST_F(CallStatsTest, ProcessTime) {
65 MockStatsObserver stats_observer;
66 call_stats_->RegisterStatsObserver(&stats_observer);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000067 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
68 rtcp_rtt_stats->OnRttUpdate(100);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000069
70 // Time isn't updated yet.
stefan2328a942015-08-07 04:27:51 -070071 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000072 call_stats_->Process();
73
74 // Advance clock and verify we get an update.
75 TickTime::AdvanceFakeClock(1000);
stefan2328a942015-08-07 04:27:51 -070076 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000077 call_stats_->Process();
78
79 // Advance clock just too little to get an update.
80 TickTime::AdvanceFakeClock(999);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000081 rtcp_rtt_stats->OnRttUpdate(100);
stefan2328a942015-08-07 04:27:51 -070082 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000083 call_stats_->Process();
84
85 // Advance enough to trigger a new update.
86 TickTime::AdvanceFakeClock(1);
stefan2328a942015-08-07 04:27:51 -070087 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000088 call_stats_->Process();
89
90 call_stats_->DeregisterStatsObserver(&stats_observer);
91}
92
93// Verify all observers get correct estimates and observers can be added and
94// removed.
95TEST_F(CallStatsTest, MultipleObservers) {
96 MockStatsObserver stats_observer_1;
97 call_stats_->RegisterStatsObserver(&stats_observer_1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +000098 // Add the second observer twice, there should still be only one report to the
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000099 // observer.
100 MockStatsObserver stats_observer_2;
101 call_stats_->RegisterStatsObserver(&stats_observer_2);
102 call_stats_->RegisterStatsObserver(&stats_observer_2);
103
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000104 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000105 const int64_t kRtt = 100;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000106 rtcp_rtt_stats->OnRttUpdate(kRtt);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000107
108 // Verify both observers are updated.
109 TickTime::AdvanceFakeClock(1000);
stefan2328a942015-08-07 04:27:51 -0700110 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(1);
111 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000112 call_stats_->Process();
113
114 // Deregister the second observer and verify update is only sent to the first
115 // observer.
116 call_stats_->DeregisterStatsObserver(&stats_observer_2);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000117 rtcp_rtt_stats->OnRttUpdate(kRtt);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000118 TickTime::AdvanceFakeClock(1000);
stefan2328a942015-08-07 04:27:51 -0700119 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(1);
120 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000121 call_stats_->Process();
122
123 // Deregister the first observer.
124 call_stats_->DeregisterStatsObserver(&stats_observer_1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000125 rtcp_rtt_stats->OnRttUpdate(kRtt);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000126 TickTime::AdvanceFakeClock(1000);
stefan2328a942015-08-07 04:27:51 -0700127 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(0);
128 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000129 call_stats_->Process();
130}
131
132// Verify increasing and decreasing rtt triggers callbacks with correct values.
133TEST_F(CallStatsTest, ChangeRtt) {
134 MockStatsObserver stats_observer;
135 call_stats_->RegisterStatsObserver(&stats_observer);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000136 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000137
138 // Advance clock to be ready for an update.
139 TickTime::AdvanceFakeClock(1000);
140
141 // Set a first value and verify the callback is triggered.
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000142 const int64_t kFirstRtt = 100;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000143 rtcp_rtt_stats->OnRttUpdate(kFirstRtt);
stefan2328a942015-08-07 04:27:51 -0700144 EXPECT_CALL(stats_observer, OnRttUpdate(kFirstRtt, kFirstRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000145 call_stats_->Process();
146
147 // Increase rtt and verify the new value is reported.
148 TickTime::AdvanceFakeClock(1000);
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000149 const int64_t kHighRtt = kFirstRtt + 20;
stefan2328a942015-08-07 04:27:51 -0700150 const int64_t kAvgRtt1 = 103;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000151 rtcp_rtt_stats->OnRttUpdate(kHighRtt);
stefan2328a942015-08-07 04:27:51 -0700152 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt1, kHighRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000153 call_stats_->Process();
154
155 // Increase time enough for a new update, but not too much to make the
156 // rtt invalid. Report a lower rtt and verify the old/high value still is sent
157 // in the callback.
158 TickTime::AdvanceFakeClock(1000);
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000159 const int64_t kLowRtt = kFirstRtt - 20;
stefan2328a942015-08-07 04:27:51 -0700160 const int64_t kAvgRtt2 = 102;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000161 rtcp_rtt_stats->OnRttUpdate(kLowRtt);
stefan2328a942015-08-07 04:27:51 -0700162 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt2, kHighRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000163 call_stats_->Process();
164
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000165 // Advance time to make the high report invalid, the lower rtt should now be
166 // in the callback.
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000167 TickTime::AdvanceFakeClock(1000);
stefan2328a942015-08-07 04:27:51 -0700168 const int64_t kAvgRtt3 = 95;
169 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt3, kLowRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000170 call_stats_->Process();
171
172 call_stats_->DeregisterStatsObserver(&stats_observer);
173}
174
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000175TEST_F(CallStatsTest, LastProcessedRtt) {
176 MockStatsObserver stats_observer;
177 call_stats_->RegisterStatsObserver(&stats_observer);
178 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
179 TickTime::AdvanceFakeClock(1000);
180
181 // Set a first values and verify that LastProcessedRtt initially returns the
182 // average rtt.
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000183 const int64_t kRttLow = 10;
184 const int64_t kRttHigh = 30;
185 const int64_t kAvgRtt = 20;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000186 rtcp_rtt_stats->OnRttUpdate(kRttLow);
187 rtcp_rtt_stats->OnRttUpdate(kRttHigh);
stefan2328a942015-08-07 04:27:51 -0700188 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt, kRttHigh)).Times(1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000189 call_stats_->Process();
190 EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
191
192 // Update values and verify LastProcessedRtt.
193 TickTime::AdvanceFakeClock(1000);
194 rtcp_rtt_stats->OnRttUpdate(kRttLow);
195 rtcp_rtt_stats->OnRttUpdate(kRttHigh);
stefan2328a942015-08-07 04:27:51 -0700196 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt, kRttHigh)).Times(1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000197 call_stats_->Process();
198 EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
199
200 call_stats_->DeregisterStatsObserver(&stats_observer);
201}
202
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000203} // namespace webrtc