blob: ec7e8565f0700939f6f69eeb5b1f8eadf7f63e19 [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"
kjellander8237abf2015-12-08 07:12:06 -080017#include "webrtc/video_engine/call_stats.h"
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000018
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 {
Peter Boströmd3c94472015-12-09 11:20:58 +010034 public:
35 CallStatsTest() : fake_clock_(12345) {}
36
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000037 protected:
Peter Boströmd3c94472015-12-09 11:20:58 +010038 virtual void SetUp() { call_stats_.reset(new CallStats(&fake_clock_)); }
39 SimulatedClock fake_clock_;
kwiberg@webrtc.org00b8f6b2015-02-26 14:34:55 +000040 rtc::scoped_ptr<CallStats> call_stats_;
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000041};
42
43TEST_F(CallStatsTest, AddAndTriggerCallback) {
44 MockStatsObserver stats_observer;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000045 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000046 call_stats_->RegisterStatsObserver(&stats_observer);
Peter Boströmd3c94472015-12-09 11:20:58 +010047 fake_clock_.AdvanceTimeMilliseconds(1000);
pkasting@chromium.org16825b12015-01-12 21:51:21 +000048 EXPECT_EQ(0, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000049
pkasting@chromium.org16825b12015-01-12 21:51:21 +000050 const int64_t kRtt = 25;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000051 rtcp_rtt_stats->OnRttUpdate(kRtt);
stefan2328a942015-08-07 04:27:51 -070052 EXPECT_CALL(stats_observer, OnRttUpdate(kRtt, kRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000053 call_stats_->Process();
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000054 EXPECT_EQ(kRtt, rtcp_rtt_stats->LastProcessedRtt());
55
pkasting@chromium.org16825b12015-01-12 21:51:21 +000056 const int64_t kRttTimeOutMs = 1500 + 10;
Peter Boströmd3c94472015-12-09 11:20:58 +010057 fake_clock_.AdvanceTimeMilliseconds(kRttTimeOutMs);
stefan2328a942015-08-07 04:27:51 -070058 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000059 call_stats_->Process();
pkasting@chromium.org16825b12015-01-12 21:51:21 +000060 EXPECT_EQ(0, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000061
62 call_stats_->DeregisterStatsObserver(&stats_observer);
63}
64
65TEST_F(CallStatsTest, ProcessTime) {
66 MockStatsObserver stats_observer;
67 call_stats_->RegisterStatsObserver(&stats_observer);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000068 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
69 rtcp_rtt_stats->OnRttUpdate(100);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000070
71 // Time isn't updated yet.
stefan2328a942015-08-07 04:27:51 -070072 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000073 call_stats_->Process();
74
75 // Advance clock and verify we get an update.
Peter Boströmd3c94472015-12-09 11:20:58 +010076 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -070077 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000078 call_stats_->Process();
79
80 // Advance clock just too little to get an update.
Peter Boströmd3c94472015-12-09 11:20:58 +010081 fake_clock_.AdvanceTimeMilliseconds(999);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000082 rtcp_rtt_stats->OnRttUpdate(100);
stefan2328a942015-08-07 04:27:51 -070083 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000084 call_stats_->Process();
85
86 // Advance enough to trigger a new update.
Peter Boströmd3c94472015-12-09 11:20:58 +010087 fake_clock_.AdvanceTimeMilliseconds(1);
stefan2328a942015-08-07 04:27:51 -070088 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000089 call_stats_->Process();
90
91 call_stats_->DeregisterStatsObserver(&stats_observer);
92}
93
94// Verify all observers get correct estimates and observers can be added and
95// removed.
96TEST_F(CallStatsTest, MultipleObservers) {
97 MockStatsObserver stats_observer_1;
98 call_stats_->RegisterStatsObserver(&stats_observer_1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +000099 // Add the second observer twice, there should still be only one report to the
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000100 // observer.
101 MockStatsObserver stats_observer_2;
102 call_stats_->RegisterStatsObserver(&stats_observer_2);
103 call_stats_->RegisterStatsObserver(&stats_observer_2);
104
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000105 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000106 const int64_t kRtt = 100;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000107 rtcp_rtt_stats->OnRttUpdate(kRtt);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000108
109 // Verify both observers are updated.
Peter Boströmd3c94472015-12-09 11:20:58 +0100110 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -0700111 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(1);
112 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000113 call_stats_->Process();
114
115 // Deregister the second observer and verify update is only sent to the first
116 // observer.
117 call_stats_->DeregisterStatsObserver(&stats_observer_2);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000118 rtcp_rtt_stats->OnRttUpdate(kRtt);
Peter Boströmd3c94472015-12-09 11:20:58 +0100119 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -0700120 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(1);
121 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000122 call_stats_->Process();
123
124 // Deregister the first observer.
125 call_stats_->DeregisterStatsObserver(&stats_observer_1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000126 rtcp_rtt_stats->OnRttUpdate(kRtt);
Peter Boströmd3c94472015-12-09 11:20:58 +0100127 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -0700128 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(0);
129 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000130 call_stats_->Process();
131}
132
133// Verify increasing and decreasing rtt triggers callbacks with correct values.
134TEST_F(CallStatsTest, ChangeRtt) {
135 MockStatsObserver stats_observer;
136 call_stats_->RegisterStatsObserver(&stats_observer);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000137 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000138
139 // Advance clock to be ready for an update.
Peter Boströmd3c94472015-12-09 11:20:58 +0100140 fake_clock_.AdvanceTimeMilliseconds(1000);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000141
142 // Set a first value and verify the callback is triggered.
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000143 const int64_t kFirstRtt = 100;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000144 rtcp_rtt_stats->OnRttUpdate(kFirstRtt);
stefan2328a942015-08-07 04:27:51 -0700145 EXPECT_CALL(stats_observer, OnRttUpdate(kFirstRtt, kFirstRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000146 call_stats_->Process();
147
148 // Increase rtt and verify the new value is reported.
Peter Boströmd3c94472015-12-09 11:20:58 +0100149 fake_clock_.AdvanceTimeMilliseconds(1000);
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000150 const int64_t kHighRtt = kFirstRtt + 20;
stefan2328a942015-08-07 04:27:51 -0700151 const int64_t kAvgRtt1 = 103;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000152 rtcp_rtt_stats->OnRttUpdate(kHighRtt);
stefan2328a942015-08-07 04:27:51 -0700153 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt1, kHighRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000154 call_stats_->Process();
155
156 // Increase time enough for a new update, but not too much to make the
157 // rtt invalid. Report a lower rtt and verify the old/high value still is sent
158 // in the callback.
Peter Boströmd3c94472015-12-09 11:20:58 +0100159 fake_clock_.AdvanceTimeMilliseconds(1000);
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000160 const int64_t kLowRtt = kFirstRtt - 20;
stefan2328a942015-08-07 04:27:51 -0700161 const int64_t kAvgRtt2 = 102;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000162 rtcp_rtt_stats->OnRttUpdate(kLowRtt);
stefan2328a942015-08-07 04:27:51 -0700163 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt2, kHighRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000164 call_stats_->Process();
165
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000166 // Advance time to make the high report invalid, the lower rtt should now be
167 // in the callback.
Peter Boströmd3c94472015-12-09 11:20:58 +0100168 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -0700169 const int64_t kAvgRtt3 = 95;
170 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt3, kLowRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000171 call_stats_->Process();
172
173 call_stats_->DeregisterStatsObserver(&stats_observer);
174}
175
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000176TEST_F(CallStatsTest, LastProcessedRtt) {
177 MockStatsObserver stats_observer;
178 call_stats_->RegisterStatsObserver(&stats_observer);
179 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
Peter Boströmd3c94472015-12-09 11:20:58 +0100180 fake_clock_.AdvanceTimeMilliseconds(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000181
182 // Set a first values and verify that LastProcessedRtt initially returns the
183 // average rtt.
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000184 const int64_t kRttLow = 10;
185 const int64_t kRttHigh = 30;
186 const int64_t kAvgRtt = 20;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000187 rtcp_rtt_stats->OnRttUpdate(kRttLow);
188 rtcp_rtt_stats->OnRttUpdate(kRttHigh);
stefan2328a942015-08-07 04:27:51 -0700189 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt, kRttHigh)).Times(1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000190 call_stats_->Process();
191 EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
192
193 // Update values and verify LastProcessedRtt.
Peter Boströmd3c94472015-12-09 11:20:58 +0100194 fake_clock_.AdvanceTimeMilliseconds(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000195 rtcp_rtt_stats->OnRttUpdate(kRttLow);
196 rtcp_rtt_stats->OnRttUpdate(kRttHigh);
stefan2328a942015-08-07 04:27:51 -0700197 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt, kRttHigh)).Times(1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000198 call_stats_->Process();
199 EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
200
201 call_stats_->DeregisterStatsObserver(&stats_observer);
202}
203
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000204} // namespace webrtc