blob: 9702da0699d25d26e0002afa28823a75f6a9851b [file] [log] [blame]
niklase@google.com470e71d2011-07-07 08:21:25 +00001/*
stefan@webrtc.org9354cc92012-06-07 08:10:14 +00002 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
niklase@google.com470e71d2011-07-07 08:21:25 +00003 *
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
Stefan Holmerfb8fc532016-04-22 15:48:23 +020011#include <algorithm>
12
pbos@webrtc.org47ce1202013-05-27 12:41:33 +000013#include "testing/gtest/include/gtest/gtest.h"
tkchinf75d0082016-02-23 22:49:42 -080014#include "webrtc/base/rate_statistics.h"
niklase@google.com470e71d2011-07-07 08:21:25 +000015
16namespace {
17
sprang@webrtc.org37968a92013-12-03 10:31:59 +000018using webrtc::RateStatistics;
niklase@google.com470e71d2011-07-07 08:21:25 +000019
Stefan Holmerfb8fc532016-04-22 15:48:23 +020020const int64_t kWindowMs = 500;
21
sprang@webrtc.org37968a92013-12-03 10:31:59 +000022class RateStatisticsTest : public ::testing::Test {
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +000023 protected:
Stefan Holmerfb8fc532016-04-22 15:48:23 +020024 RateStatisticsTest() : stats_(kWindowMs, 8000) {}
sprang@webrtc.org37968a92013-12-03 10:31:59 +000025 RateStatistics stats_;
niklase@google.com470e71d2011-07-07 08:21:25 +000026};
27
sprang@webrtc.org37968a92013-12-03 10:31:59 +000028TEST_F(RateStatisticsTest, TestStrictMode) {
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +000029 int64_t now_ms = 0;
30 // Should be initialized to 0.
sprang@webrtc.org37968a92013-12-03 10:31:59 +000031 EXPECT_EQ(0u, stats_.Rate(now_ms));
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +000032 stats_.Update(1500, now_ms);
Stefan Holmerfb8fc532016-04-22 15:48:23 +020033 // Expecting 1200 kbps since the window is initially kept small and grows as
34 // we have more data.
35 EXPECT_EQ(12000000u, stats_.Rate(now_ms));
sprang@webrtc.org37968a92013-12-03 10:31:59 +000036 stats_.Reset();
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +000037 // Expecting 0 after init.
sprang@webrtc.org37968a92013-12-03 10:31:59 +000038 EXPECT_EQ(0u, stats_.Rate(now_ms));
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +000039 for (int i = 0; i < 100000; ++i) {
40 if (now_ms % 10 == 0) {
41 stats_.Update(1500, now_ms);
niklase@google.com470e71d2011-07-07 08:21:25 +000042 }
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +000043 // Approximately 1200 kbps expected. Not exact since when packets
44 // are removed we will jump 10 ms to the next packet.
Stefan Holmerfb8fc532016-04-22 15:48:23 +020045 if (now_ms > 0 && now_ms % kWindowMs == 0) {
46 EXPECT_NEAR(1200000u, stats_.Rate(now_ms), 22000u);
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +000047 }
48 now_ms += 1;
49 }
Stefan Holmerfb8fc532016-04-22 15:48:23 +020050 now_ms += kWindowMs;
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +000051 // The window is 2 seconds. If nothing has been received for that time
52 // the estimate should be 0.
sprang@webrtc.org37968a92013-12-03 10:31:59 +000053 EXPECT_EQ(0u, stats_.Rate(now_ms));
niklase@google.com470e71d2011-07-07 08:21:25 +000054}
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000055
sprang@webrtc.org37968a92013-12-03 10:31:59 +000056TEST_F(RateStatisticsTest, IncreasingThenDecreasingBitrate) {
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000057 int64_t now_ms = 0;
sprang@webrtc.org37968a92013-12-03 10:31:59 +000058 stats_.Reset();
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000059 // Expecting 0 after init.
sprang@webrtc.org37968a92013-12-03 10:31:59 +000060 uint32_t bitrate = stats_.Rate(now_ms);
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000061 EXPECT_EQ(0u, bitrate);
Stefan Holmerfb8fc532016-04-22 15:48:23 +020062 const uint32_t kExpectedBitrate = 8000000;
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000063 // 1000 bytes per millisecond until plateau is reached.
Stefan Holmerfb8fc532016-04-22 15:48:23 +020064 int prev_error = kExpectedBitrate;
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000065 while (++now_ms < 10000) {
66 stats_.Update(1000, now_ms);
Stefan Holmerfb8fc532016-04-22 15:48:23 +020067 bitrate = stats_.Rate(now_ms);
68 int error = kExpectedBitrate - bitrate;
69 error = std::abs(error);
70 // Expect the estimation error to decrease as the window is extended.
71 EXPECT_LE(error, prev_error + 1);
72 prev_error = error;
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000073 }
Stefan Holmerfb8fc532016-04-22 15:48:23 +020074 // Window filled, expect to be close to 8000000.
75 EXPECT_EQ(kExpectedBitrate, bitrate);
76
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000077 // 1000 bytes per millisecond until 10-second mark, 8000 kbps expected.
78 while (++now_ms < 10000) {
79 stats_.Update(1000, now_ms);
sprang@webrtc.org37968a92013-12-03 10:31:59 +000080 bitrate = stats_.Rate(now_ms);
Stefan Holmerfb8fc532016-04-22 15:48:23 +020081 EXPECT_EQ(kExpectedBitrate, bitrate);
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000082 }
83 // Zero bytes per millisecond until 0 is reached.
84 while (++now_ms < 20000) {
85 stats_.Update(0, now_ms);
sprang@webrtc.org37968a92013-12-03 10:31:59 +000086 uint32_t new_bitrate = stats_.Rate(now_ms);
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +000087 if (new_bitrate != bitrate) {
88 // New bitrate must be lower than previous one.
89 EXPECT_LT(new_bitrate, bitrate);
90 } else {
91 // 0 kbps expected.
92 EXPECT_EQ(0u, bitrate);
93 break;
94 }
95 bitrate = new_bitrate;
96 }
97 // Zero bytes per millisecond until 20-second mark, 0 kbps expected.
98 while (++now_ms < 20000) {
99 stats_.Update(0, now_ms);
sprang@webrtc.org37968a92013-12-03 10:31:59 +0000100 EXPECT_EQ(0u, stats_.Rate(now_ms));
mikhal@webrtc.orgd89b52a2013-11-25 17:49:28 +0000101 }
102}
Stefan Holmerfb8fc532016-04-22 15:48:23 +0200103
104TEST_F(RateStatisticsTest, ResetAfterSilence) {
105 int64_t now_ms = 0;
106 stats_.Reset();
107 // Expecting 0 after init.
108 uint32_t bitrate = stats_.Rate(now_ms);
109 EXPECT_EQ(0u, bitrate);
110 const uint32_t kExpectedBitrate = 8000000;
111 // 1000 bytes per millisecond until the window has been filled.
112 int prev_error = kExpectedBitrate;
113 while (++now_ms < 10000) {
114 stats_.Update(1000, now_ms);
115 bitrate = stats_.Rate(now_ms);
116 int error = kExpectedBitrate - bitrate;
117 error = std::abs(error);
118 // Expect the estimation error to decrease as the window is extended.
119 EXPECT_LE(error, prev_error + 1);
120 prev_error = error;
121 }
122 // Window filled, expect to be close to 8000000.
123 EXPECT_EQ(kExpectedBitrate, bitrate);
124
125 now_ms += kWindowMs + 1;
126 EXPECT_EQ(0u, stats_.Rate(now_ms));
127 stats_.Update(1000, now_ms);
128 // We expect one sample of 1000 bytes, and that the bitrate is measured over
129 // 1 ms, i.e., 8 * 1000 / 0.001 = 8000000.
130 EXPECT_EQ(kExpectedBitrate, stats_.Rate(now_ms));
131}
solenberg@webrtc.orgd26457f2013-04-18 12:25:32 +0000132} // namespace