blob: 6e921928c52ac19a24fa81ca7613ea90d4edc01f [file] [log] [blame]
sprang@webrtc.orgccd42842014-01-07 09:54:34 +00001/*
2 * Copyright (c) 2013 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// This file includes unit tests for SendStatisticsProxy.
12#include "webrtc/video/send_statistics_proxy.h"
13
14#include <map>
15#include <string>
16#include <vector>
17
18#include "testing/gtest/include/gtest/gtest.h"
19
20namespace webrtc {
21
22class SendStatisticsProxyTest
23 : public ::testing::Test,
24 protected SendStatisticsProxy::StreamStatsProvider {
25 public:
26 SendStatisticsProxyTest() : avg_delay_ms_(0), max_delay_ms_(0) {}
27 virtual ~SendStatisticsProxyTest() {}
28
29 protected:
30 virtual void SetUp() {
31 statistics_proxy_.reset(
32 new SendStatisticsProxy(GetTestConfig(), this));
33 config_ = GetTestConfig();
34 expected_ = VideoSendStream::Stats();
35 }
36
37 VideoSendStream::Config GetTestConfig() {
38 VideoSendStream::Config config;
39 config.rtp.ssrcs.push_back(17);
40 config.rtp.ssrcs.push_back(42);
41 return config;
42 }
43
44 virtual bool GetSendSideDelay(VideoSendStream::Stats* stats) OVERRIDE {
45 stats->avg_delay_ms = avg_delay_ms_;
46 stats->max_delay_ms = max_delay_ms_;
47 return true;
48 }
49
50 virtual std::string GetCName() { return cname_; }
51
52 scoped_ptr<SendStatisticsProxy> statistics_proxy_;
53 VideoSendStream::Config config_;
54 int avg_delay_ms_;
55 int max_delay_ms_;
56 std::string cname_;
57 VideoSendStream::Stats expected_;
58 typedef std::map<uint32_t, StreamStats>::const_iterator StreamIterator;
59};
60
61TEST_F(SendStatisticsProxyTest, RtcpStatistics) {
62 RtcpStatisticsCallback* callback = statistics_proxy_.get();
63 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
64 it != config_.rtp.ssrcs.end();
65 ++it) {
66 const uint32_t ssrc = *it;
67 StreamStats& ssrc_stats = expected_.substreams[ssrc];
68
69 // Add statistics with some arbitrary, but unique, numbers.
70 uint32_t offset = ssrc * sizeof(RtcpStatistics);
71 ssrc_stats.rtcp_stats.cumulative_lost = offset;
72 ssrc_stats.rtcp_stats.extended_max_sequence_number = offset + 1;
73 ssrc_stats.rtcp_stats.fraction_lost = offset + 2;
74 ssrc_stats.rtcp_stats.jitter = offset + 3;
75 callback->StatisticsUpdated(ssrc_stats.rtcp_stats, ssrc);
76 }
77
78 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
79 EXPECT_EQ(expected_, stats);
80}
81
82TEST_F(SendStatisticsProxyTest, FrameRates) {
83 const int capture_fps = 31;
84 const int encode_fps = 29;
85
86 ViECaptureObserver* capture_observer = statistics_proxy_.get();
87 capture_observer->CapturedFrameRate(0, capture_fps);
88 ViEEncoderObserver* encoder_observer = statistics_proxy_.get();
89 encoder_observer->OutgoingRate(0, encode_fps, 0);
90
91 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
92 EXPECT_EQ(capture_fps, stats.input_frame_rate);
93 EXPECT_EQ(encode_fps, stats.encode_frame_rate);
94}
95
96TEST_F(SendStatisticsProxyTest, FrameCounts) {
97 FrameCountObserver* observer = statistics_proxy_.get();
98 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
99 it != config_.rtp.ssrcs.end();
100 ++it) {
101 const uint32_t ssrc = *it;
102 // Add statistics with some arbitrary, but unique, numbers.
103 StreamStats& stats = expected_.substreams[ssrc];
104 uint32_t offset = ssrc * sizeof(StreamStats);
105 stats.key_frames = offset;
106 stats.delta_frames = offset + 1;
107 observer->FrameCountUpdated(kVideoFrameKey, stats.key_frames, ssrc);
108 observer->FrameCountUpdated(kVideoFrameDelta, stats.delta_frames, ssrc);
109 }
110
111 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
112 EXPECT_EQ(expected_, stats);
113}
114
115TEST_F(SendStatisticsProxyTest, DataCounters) {
116 StreamDataCountersCallback* callback = statistics_proxy_.get();
117 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
118 it != config_.rtp.ssrcs.end();
119 ++it) {
120 const uint32_t ssrc = *it;
121 StreamDataCounters& counters = expected_.substreams[ssrc].rtp_stats;
122 // Add statistics with some arbitrary, but unique, numbers.
123 uint32_t offset = ssrc * sizeof(StreamDataCounters);
124 counters.bytes = offset;
125 counters.header_bytes = offset + 1;
126 counters.fec_packets = offset + 2;
127 counters.padding_bytes = offset + 3;
128 counters.retransmitted_packets = offset + 4;
129 counters.packets = offset + 5;
130 callback->DataCountersUpdated(counters, ssrc);
131 }
132
133 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
134 EXPECT_EQ(expected_, stats);
135}
136
137TEST_F(SendStatisticsProxyTest, Bitrate) {
138 BitrateStatisticsObserver* observer = statistics_proxy_.get();
139 for (std::vector<uint32_t>::const_iterator it = config_.rtp.ssrcs.begin();
140 it != config_.rtp.ssrcs.end();
141 ++it) {
142 const uint32_t ssrc = *it;
143 BitrateStatistics bitrate;
144 bitrate.bitrate_bps = ssrc;
145 observer->Notify(bitrate, ssrc);
146 expected_.substreams[ssrc].bitrate_bps = ssrc;
147 }
148
149 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
150 EXPECT_EQ(expected_, stats);
151}
152
153TEST_F(SendStatisticsProxyTest, StreamStats) {
154 avg_delay_ms_ = 1;
155 max_delay_ms_ = 2;
156 cname_ = "qwertyuiop";
157
158 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
159
160 EXPECT_EQ(avg_delay_ms_, stats.avg_delay_ms);
161 EXPECT_EQ(max_delay_ms_, stats.max_delay_ms);
162 EXPECT_EQ(cname_, stats.c_name);
163}
164
165TEST_F(SendStatisticsProxyTest, NoSubstreams) {
166 uint32_t exluded_ssrc =
167 *std::max_element(config_.rtp.ssrcs.begin(), config_.rtp.ssrcs.end()) + 1;
168 // From RtcpStatisticsCallback.
169 RtcpStatistics rtcp_stats;
170 RtcpStatisticsCallback* rtcp_callback = statistics_proxy_.get();
171 rtcp_callback->StatisticsUpdated(rtcp_stats, exluded_ssrc);
172
173 // From StreamDataCountersCallback.
174 StreamDataCounters rtp_stats;
175 StreamDataCountersCallback* rtp_callback = statistics_proxy_.get();
176 rtp_callback->DataCountersUpdated(rtp_stats, exluded_ssrc);
177
178 // From BitrateStatisticsObserver.
179 BitrateStatistics bitrate;
180 BitrateStatisticsObserver* bitrate_observer = statistics_proxy_.get();
181 bitrate_observer->Notify(bitrate, exluded_ssrc);
182
183 // From FrameCountObserver.
184 FrameCountObserver* fps_observer = statistics_proxy_.get();
185 fps_observer->FrameCountUpdated(kVideoFrameKey, 1, exluded_ssrc);
186
187 VideoSendStream::Stats stats = statistics_proxy_->GetStats();
188 EXPECT_TRUE(stats.substreams.empty());
189}
190
191} // namespace webrtc