blob: 8a2a89a7c61db73618cf49bf840b2e0fd40eece8 [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
kwiberg27f982b2016-03-01 11:52:33 -080011#include <memory>
12
Henrik Kjellanderff761fb2015-11-04 08:31:52 +010013#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h"
sprange2d83d62016-02-19 09:03:26 -080014#include "webrtc/system_wrappers/include/metrics.h"
asapersson01d70a32016-05-20 06:29:46 -070015#include "webrtc/system_wrappers/include/metrics_default.h"
kwibergac9f8762016-09-30 22:29:43 -070016#include "webrtc/test/gmock.h"
17#include "webrtc/test/gtest.h"
Peter Boström7623ce42015-12-09 12:13:30 +010018#include "webrtc/video/call_stats.h"
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000019
20using ::testing::_;
21using ::testing::AnyNumber;
22using ::testing::Return;
23
24namespace webrtc {
25
fischman@webrtc.orgaea96d32013-02-19 22:09:36 +000026class MockStatsObserver : public CallStatsObserver {
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000027 public:
28 MockStatsObserver() {}
29 virtual ~MockStatsObserver() {}
30
stefan2328a942015-08-07 04:27:51 -070031 MOCK_METHOD2(OnRttUpdate, void(int64_t, int64_t));
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000032};
33
34class CallStatsTest : public ::testing::Test {
Peter Boströmd3c94472015-12-09 11:20:58 +010035 public:
36 CallStatsTest() : fake_clock_(12345) {}
37
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000038 protected:
Peter Boströmd3c94472015-12-09 11:20:58 +010039 virtual void SetUp() { call_stats_.reset(new CallStats(&fake_clock_)); }
40 SimulatedClock fake_clock_;
kwiberg27f982b2016-03-01 11:52:33 -080041 std::unique_ptr<CallStats> call_stats_;
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000042};
43
44TEST_F(CallStatsTest, AddAndTriggerCallback) {
45 MockStatsObserver stats_observer;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000046 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000047 call_stats_->RegisterStatsObserver(&stats_observer);
Peter Boströmd3c94472015-12-09 11:20:58 +010048 fake_clock_.AdvanceTimeMilliseconds(1000);
sprange2d83d62016-02-19 09:03:26 -080049 EXPECT_EQ(-1, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000050
pkasting@chromium.org16825b12015-01-12 21:51:21 +000051 const int64_t kRtt = 25;
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000052 rtcp_rtt_stats->OnRttUpdate(kRtt);
stefan2328a942015-08-07 04:27:51 -070053 EXPECT_CALL(stats_observer, OnRttUpdate(kRtt, kRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000054 call_stats_->Process();
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000055 EXPECT_EQ(kRtt, rtcp_rtt_stats->LastProcessedRtt());
56
pkasting@chromium.org16825b12015-01-12 21:51:21 +000057 const int64_t kRttTimeOutMs = 1500 + 10;
Peter Boströmd3c94472015-12-09 11:20:58 +010058 fake_clock_.AdvanceTimeMilliseconds(kRttTimeOutMs);
stefan2328a942015-08-07 04:27:51 -070059 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000060 call_stats_->Process();
sprange2d83d62016-02-19 09:03:26 -080061 EXPECT_EQ(-1, rtcp_rtt_stats->LastProcessedRtt());
mflodman@webrtc.orgb2f474e2012-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.org1ae1d0c2013-11-20 12:46:11 +000069 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
70 rtcp_rtt_stats->OnRttUpdate(100);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000071
72 // Time isn't updated yet.
stefan2328a942015-08-07 04:27:51 -070073 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000074 call_stats_->Process();
75
76 // Advance clock and verify we get an update.
Peter Boströmd3c94472015-12-09 11:20:58 +010077 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -070078 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000079 call_stats_->Process();
80
81 // Advance clock just too little to get an update.
Peter Boströmd3c94472015-12-09 11:20:58 +010082 fake_clock_.AdvanceTimeMilliseconds(999);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +000083 rtcp_rtt_stats->OnRttUpdate(100);
stefan2328a942015-08-07 04:27:51 -070084 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000085 call_stats_->Process();
86
87 // Advance enough to trigger a new update.
Peter Boströmd3c94472015-12-09 11:20:58 +010088 fake_clock_.AdvanceTimeMilliseconds(1);
stefan2328a942015-08-07 04:27:51 -070089 EXPECT_CALL(stats_observer, OnRttUpdate(_, _)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +000090 call_stats_->Process();
91
92 call_stats_->DeregisterStatsObserver(&stats_observer);
93}
94
95// Verify all observers get correct estimates and observers can be added and
96// removed.
97TEST_F(CallStatsTest, MultipleObservers) {
98 MockStatsObserver stats_observer_1;
99 call_stats_->RegisterStatsObserver(&stats_observer_1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000100 // Add the second observer twice, there should still be only one report to the
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000101 // observer.
102 MockStatsObserver stats_observer_2;
103 call_stats_->RegisterStatsObserver(&stats_observer_2);
104 call_stats_->RegisterStatsObserver(&stats_observer_2);
105
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000106 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000107 const int64_t kRtt = 100;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000108 rtcp_rtt_stats->OnRttUpdate(kRtt);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000109
110 // Verify both observers are updated.
Peter Boströmd3c94472015-12-09 11:20:58 +0100111 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -0700112 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(1);
113 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000114 call_stats_->Process();
115
116 // Deregister the second observer and verify update is only sent to the first
117 // observer.
118 call_stats_->DeregisterStatsObserver(&stats_observer_2);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000119 rtcp_rtt_stats->OnRttUpdate(kRtt);
Peter Boströmd3c94472015-12-09 11:20:58 +0100120 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -0700121 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(1);
122 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000123 call_stats_->Process();
124
125 // Deregister the first observer.
126 call_stats_->DeregisterStatsObserver(&stats_observer_1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000127 rtcp_rtt_stats->OnRttUpdate(kRtt);
Peter Boströmd3c94472015-12-09 11:20:58 +0100128 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -0700129 EXPECT_CALL(stats_observer_1, OnRttUpdate(kRtt, kRtt)).Times(0);
130 EXPECT_CALL(stats_observer_2, OnRttUpdate(kRtt, kRtt)).Times(0);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000131 call_stats_->Process();
132}
133
134// Verify increasing and decreasing rtt triggers callbacks with correct values.
135TEST_F(CallStatsTest, ChangeRtt) {
136 MockStatsObserver stats_observer;
137 call_stats_->RegisterStatsObserver(&stats_observer);
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000138 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000139
140 // Advance clock to be ready for an update.
Peter Boströmd3c94472015-12-09 11:20:58 +0100141 fake_clock_.AdvanceTimeMilliseconds(1000);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000142
143 // Set a first value and verify the callback is triggered.
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000144 const int64_t kFirstRtt = 100;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000145 rtcp_rtt_stats->OnRttUpdate(kFirstRtt);
stefan2328a942015-08-07 04:27:51 -0700146 EXPECT_CALL(stats_observer, OnRttUpdate(kFirstRtt, kFirstRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000147 call_stats_->Process();
148
149 // Increase rtt and verify the new value is reported.
Peter Boströmd3c94472015-12-09 11:20:58 +0100150 fake_clock_.AdvanceTimeMilliseconds(1000);
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000151 const int64_t kHighRtt = kFirstRtt + 20;
stefan2328a942015-08-07 04:27:51 -0700152 const int64_t kAvgRtt1 = 103;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000153 rtcp_rtt_stats->OnRttUpdate(kHighRtt);
stefan2328a942015-08-07 04:27:51 -0700154 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt1, kHighRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000155 call_stats_->Process();
156
157 // Increase time enough for a new update, but not too much to make the
158 // rtt invalid. Report a lower rtt and verify the old/high value still is sent
159 // in the callback.
Peter Boströmd3c94472015-12-09 11:20:58 +0100160 fake_clock_.AdvanceTimeMilliseconds(1000);
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000161 const int64_t kLowRtt = kFirstRtt - 20;
stefan2328a942015-08-07 04:27:51 -0700162 const int64_t kAvgRtt2 = 102;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000163 rtcp_rtt_stats->OnRttUpdate(kLowRtt);
stefan2328a942015-08-07 04:27:51 -0700164 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt2, kHighRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000165 call_stats_->Process();
166
asapersson@webrtc.org1ae1d0c2013-11-20 12:46:11 +0000167 // Advance time to make the high report invalid, the lower rtt should now be
168 // in the callback.
Peter Boströmd3c94472015-12-09 11:20:58 +0100169 fake_clock_.AdvanceTimeMilliseconds(1000);
stefan2328a942015-08-07 04:27:51 -0700170 const int64_t kAvgRtt3 = 95;
171 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt3, kLowRtt)).Times(1);
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000172 call_stats_->Process();
173
174 call_stats_->DeregisterStatsObserver(&stats_observer);
175}
176
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000177TEST_F(CallStatsTest, LastProcessedRtt) {
178 MockStatsObserver stats_observer;
179 call_stats_->RegisterStatsObserver(&stats_observer);
180 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
Peter Boströmd3c94472015-12-09 11:20:58 +0100181 fake_clock_.AdvanceTimeMilliseconds(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000182
183 // Set a first values and verify that LastProcessedRtt initially returns the
184 // average rtt.
pkasting@chromium.org16825b12015-01-12 21:51:21 +0000185 const int64_t kRttLow = 10;
186 const int64_t kRttHigh = 30;
187 const int64_t kAvgRtt = 20;
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000188 rtcp_rtt_stats->OnRttUpdate(kRttLow);
189 rtcp_rtt_stats->OnRttUpdate(kRttHigh);
stefan2328a942015-08-07 04:27:51 -0700190 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt, kRttHigh)).Times(1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000191 call_stats_->Process();
192 EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
193
194 // Update values and verify LastProcessedRtt.
Peter Boströmd3c94472015-12-09 11:20:58 +0100195 fake_clock_.AdvanceTimeMilliseconds(1000);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000196 rtcp_rtt_stats->OnRttUpdate(kRttLow);
197 rtcp_rtt_stats->OnRttUpdate(kRttHigh);
stefan2328a942015-08-07 04:27:51 -0700198 EXPECT_CALL(stats_observer, OnRttUpdate(kAvgRtt, kRttHigh)).Times(1);
asapersson@webrtc.org8084f952014-12-10 11:04:13 +0000199 call_stats_->Process();
200 EXPECT_EQ(kAvgRtt, rtcp_rtt_stats->LastProcessedRtt());
201
202 call_stats_->DeregisterStatsObserver(&stats_observer);
203}
204
sprange2d83d62016-02-19 09:03:26 -0800205TEST_F(CallStatsTest, ProducesHistogramMetrics) {
asapersson01d70a32016-05-20 06:29:46 -0700206 metrics::Reset();
sprange2d83d62016-02-19 09:03:26 -0800207 const int64_t kRtt = 123;
208 RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
209 rtcp_rtt_stats->OnRttUpdate(kRtt);
210 fake_clock_.AdvanceTimeMilliseconds(metrics::kMinRunTimeInSeconds * 1000);
211 rtcp_rtt_stats->OnRttUpdate(kRtt);
212 call_stats_->Process();
213 call_stats_.reset();
214
asapersson01d70a32016-05-20 06:29:46 -0700215 EXPECT_EQ(1, metrics::NumSamples(
sprange2d83d62016-02-19 09:03:26 -0800216 "WebRTC.Video.AverageRoundTripTimeInMilliseconds"));
asapersson01d70a32016-05-20 06:29:46 -0700217 EXPECT_EQ(1, metrics::NumEvents(
218 "WebRTC.Video.AverageRoundTripTimeInMilliseconds", kRtt));
sprange2d83d62016-02-19 09:03:26 -0800219}
220
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000221} // namespace webrtc