blob: 4c146997381c80a49c2bb1d7b6e534575470b10f [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
11#include <gmock/gmock.h>
12#include <gtest/gtest.h>
13
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:36 +000025class MockStatsObserver : public CallStatsObserver {
mflodman@webrtc.orgb2f474e2012-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;
44 RtcpRttObserver* rtcp_observer = call_stats_->rtcp_rtt_observer();
45 call_stats_->RegisterStatsObserver(&stats_observer);
46 TickTime::AdvanceFakeClock(1000);
47
48 uint32_t rtt = 25;
49 rtcp_observer->OnRttUpdate(rtt);
50 EXPECT_CALL(stats_observer, OnRttUpdate(rtt))
51 .Times(1);
52 call_stats_->Process();
53
54 call_stats_->DeregisterStatsObserver(&stats_observer);
55}
56
57TEST_F(CallStatsTest, ProcessTime) {
58 MockStatsObserver stats_observer;
59 call_stats_->RegisterStatsObserver(&stats_observer);
60 RtcpRttObserver* rtcp_observer = call_stats_->rtcp_rtt_observer();
61 rtcp_observer->OnRttUpdate(100);
62
63 // Time isn't updated yet.
64 EXPECT_CALL(stats_observer, OnRttUpdate(_))
65 .Times(0);
66 call_stats_->Process();
67
68 // Advance clock and verify we get an update.
69 TickTime::AdvanceFakeClock(1000);
70 EXPECT_CALL(stats_observer, OnRttUpdate(_))
71 .Times(1);
72 call_stats_->Process();
73
74 // Advance clock just too little to get an update.
75 TickTime::AdvanceFakeClock(999);
76 rtcp_observer->OnRttUpdate(100);
77 EXPECT_CALL(stats_observer, OnRttUpdate(_))
78 .Times(0);
79 call_stats_->Process();
80
81 // Advance enough to trigger a new update.
82 TickTime::AdvanceFakeClock(1);
83 EXPECT_CALL(stats_observer, OnRttUpdate(_))
84 .Times(1);
85 call_stats_->Process();
86
87 call_stats_->DeregisterStatsObserver(&stats_observer);
88}
89
90// Verify all observers get correct estimates and observers can be added and
91// removed.
92TEST_F(CallStatsTest, MultipleObservers) {
93 MockStatsObserver stats_observer_1;
94 call_stats_->RegisterStatsObserver(&stats_observer_1);
95 // Add the secondobserver twice, there should still be only one report to the
96 // observer.
97 MockStatsObserver stats_observer_2;
98 call_stats_->RegisterStatsObserver(&stats_observer_2);
99 call_stats_->RegisterStatsObserver(&stats_observer_2);
100
101 RtcpRttObserver* rtcp_observer = call_stats_->rtcp_rtt_observer();
102 uint32_t rtt = 100;
103 rtcp_observer->OnRttUpdate(rtt);
104
105 // Verify both observers are updated.
106 TickTime::AdvanceFakeClock(1000);
107 EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
108 .Times(1);
109 EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
110 .Times(1);
111 call_stats_->Process();
112
113 // Deregister the second observer and verify update is only sent to the first
114 // observer.
115 call_stats_->DeregisterStatsObserver(&stats_observer_2);
116 rtcp_observer->OnRttUpdate(rtt);
117 TickTime::AdvanceFakeClock(1000);
118 EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
119 .Times(1);
120 EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
121 .Times(0);
122 call_stats_->Process();
123
124 // Deregister the first observer.
125 call_stats_->DeregisterStatsObserver(&stats_observer_1);
126 rtcp_observer->OnRttUpdate(rtt);
127 TickTime::AdvanceFakeClock(1000);
128 EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
129 .Times(0);
130 EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
131 .Times(0);
132 call_stats_->Process();
133}
134
135// Verify increasing and decreasing rtt triggers callbacks with correct values.
136TEST_F(CallStatsTest, ChangeRtt) {
137 MockStatsObserver stats_observer;
138 call_stats_->RegisterStatsObserver(&stats_observer);
139 RtcpRttObserver* rtcp_observer = call_stats_->rtcp_rtt_observer();
140
141 // Advance clock to be ready for an update.
142 TickTime::AdvanceFakeClock(1000);
143
144 // Set a first value and verify the callback is triggered.
145 const uint32_t first_rtt = 100;
146 rtcp_observer->OnRttUpdate(first_rtt);
147 EXPECT_CALL(stats_observer, OnRttUpdate(first_rtt))
148 .Times(1);
149 call_stats_->Process();
150
151 // Increase rtt and verify the new value is reported.
152 TickTime::AdvanceFakeClock(1000);
153 const uint32_t high_rtt = first_rtt + 20;
154 rtcp_observer->OnRttUpdate(high_rtt);
155 EXPECT_CALL(stats_observer, OnRttUpdate(high_rtt))
156 .Times(1);
157 call_stats_->Process();
158
159 // Increase time enough for a new update, but not too much to make the
160 // rtt invalid. Report a lower rtt and verify the old/high value still is sent
161 // in the callback.
162 TickTime::AdvanceFakeClock(1000);
163 const uint32_t low_rtt = first_rtt - 20;
164 rtcp_observer->OnRttUpdate(low_rtt);
165 EXPECT_CALL(stats_observer, OnRttUpdate(high_rtt))
166 .Times(1);
167 call_stats_->Process();
168
169 // Advance time to make the high report invalid, the lower rtt should no be in
170 // the callback.
171 TickTime::AdvanceFakeClock(1000);
172 EXPECT_CALL(stats_observer, OnRttUpdate(low_rtt))
173 .Times(1);
174 call_stats_->Process();
175
176 call_stats_->DeregisterStatsObserver(&stats_observer);
177}
178
mflodman@webrtc.orgb2f474e2012-11-16 13:57:26 +0000179} // namespace webrtc