blob: e182d35510831d71aedab3768a5c314fbaa71a5a [file] [log] [blame]
tschumim82c55932017-07-11 06:56:04 -07001/*
2 * Copyright (c) 2016 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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#include "modules/pacing/interval_budget.h"
tschumim82c55932017-07-11 06:56:04 -070012
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "test/gtest.h"
tschumim82c55932017-07-11 06:56:04 -070014
15namespace webrtc {
16
17namespace {
18constexpr int kWindowMs = 500;
19constexpr int kBitrateKbps = 100;
20constexpr bool kCanBuildUpUnderuse = true;
21constexpr bool kCanNotBuildUpUnderuse = false;
22size_t TimeToBytes(int bitrate_kbps, int time_ms) {
23 return static_cast<size_t>(bitrate_kbps * time_ms / 8);
24}
25} // namespace
26
27TEST(IntervalBudgetTest, InitailState) {
28 IntervalBudget interval_budget(kBitrateKbps);
Jonas Olsson944dace2019-06-05 17:59:32 +020029 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(), 0.0);
tschumim82c55932017-07-11 06:56:04 -070030 EXPECT_EQ(interval_budget.bytes_remaining(), 0u);
31}
32
33TEST(IntervalBudgetTest, Underuse) {
34 IntervalBudget interval_budget(kBitrateKbps);
35 int delta_time_ms = 50;
36 interval_budget.IncreaseBudget(delta_time_ms);
Jonas Olsson944dace2019-06-05 17:59:32 +020037 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(),
38 kWindowMs / static_cast<double>(100 * delta_time_ms));
tschumim82c55932017-07-11 06:56:04 -070039 EXPECT_EQ(interval_budget.bytes_remaining(),
40 TimeToBytes(kBitrateKbps, delta_time_ms));
41}
42
43TEST(IntervalBudgetTest, DontUnderuseMoreThanMaxWindow) {
44 IntervalBudget interval_budget(kBitrateKbps);
45 int delta_time_ms = 1000;
46 interval_budget.IncreaseBudget(delta_time_ms);
Jonas Olsson944dace2019-06-05 17:59:32 +020047 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(), 1.0);
tschumim82c55932017-07-11 06:56:04 -070048 EXPECT_EQ(interval_budget.bytes_remaining(),
49 TimeToBytes(kBitrateKbps, kWindowMs));
50}
51
52TEST(IntervalBudgetTest, DontUnderuseMoreThanMaxWindowWhenChangeBitrate) {
53 IntervalBudget interval_budget(kBitrateKbps);
54 int delta_time_ms = kWindowMs / 2;
55 interval_budget.IncreaseBudget(delta_time_ms);
56 interval_budget.set_target_rate_kbps(kBitrateKbps / 10);
Jonas Olsson944dace2019-06-05 17:59:32 +020057 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(), 1.0);
tschumim82c55932017-07-11 06:56:04 -070058 EXPECT_EQ(interval_budget.bytes_remaining(),
59 TimeToBytes(kBitrateKbps / 10, kWindowMs));
60}
61
62TEST(IntervalBudgetTest, BalanceChangeOnBitrateChange) {
63 IntervalBudget interval_budget(kBitrateKbps);
64 int delta_time_ms = kWindowMs;
65 interval_budget.IncreaseBudget(delta_time_ms);
66 interval_budget.set_target_rate_kbps(kBitrateKbps * 2);
Jonas Olsson944dace2019-06-05 17:59:32 +020067 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(), 0.5);
tschumim82c55932017-07-11 06:56:04 -070068 EXPECT_EQ(interval_budget.bytes_remaining(),
69 TimeToBytes(kBitrateKbps, kWindowMs));
70}
71
72TEST(IntervalBudgetTest, Overuse) {
73 IntervalBudget interval_budget(kBitrateKbps);
74 int overuse_time_ms = 50;
75 int used_bytes = TimeToBytes(kBitrateKbps, overuse_time_ms);
76 interval_budget.UseBudget(used_bytes);
Jonas Olsson944dace2019-06-05 17:59:32 +020077 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(),
78 -kWindowMs / static_cast<double>(100 * overuse_time_ms));
tschumim82c55932017-07-11 06:56:04 -070079 EXPECT_EQ(interval_budget.bytes_remaining(), 0u);
80}
81
82TEST(IntervalBudgetTest, DontOveruseMoreThanMaxWindow) {
83 IntervalBudget interval_budget(kBitrateKbps);
84 int overuse_time_ms = 1000;
85 int used_bytes = TimeToBytes(kBitrateKbps, overuse_time_ms);
86 interval_budget.UseBudget(used_bytes);
Jonas Olsson944dace2019-06-05 17:59:32 +020087 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(), -1.0);
tschumim82c55932017-07-11 06:56:04 -070088 EXPECT_EQ(interval_budget.bytes_remaining(), 0u);
89}
90
91TEST(IntervalBudgetTest, CanBuildUpUnderuseWhenConfigured) {
92 IntervalBudget interval_budget(kBitrateKbps, kCanBuildUpUnderuse);
93 int delta_time_ms = 50;
94 interval_budget.IncreaseBudget(delta_time_ms);
Jonas Olsson944dace2019-06-05 17:59:32 +020095 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(),
96 kWindowMs / static_cast<double>(100 * delta_time_ms));
tschumim82c55932017-07-11 06:56:04 -070097 EXPECT_EQ(interval_budget.bytes_remaining(),
98 TimeToBytes(kBitrateKbps, delta_time_ms));
99
100 interval_budget.IncreaseBudget(delta_time_ms);
Jonas Olsson944dace2019-06-05 17:59:32 +0200101 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(),
102 2 * kWindowMs / static_cast<double>(100 * delta_time_ms));
tschumim82c55932017-07-11 06:56:04 -0700103 EXPECT_EQ(interval_budget.bytes_remaining(),
104 TimeToBytes(kBitrateKbps, 2 * delta_time_ms));
105}
106
107TEST(IntervalBudgetTest, CanNotBuildUpUnderuseWhenConfigured) {
108 IntervalBudget interval_budget(kBitrateKbps, kCanNotBuildUpUnderuse);
109 int delta_time_ms = 50;
110 interval_budget.IncreaseBudget(delta_time_ms);
Jonas Olsson944dace2019-06-05 17:59:32 +0200111 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(),
112 kWindowMs / static_cast<double>(100 * delta_time_ms));
tschumim82c55932017-07-11 06:56:04 -0700113 EXPECT_EQ(interval_budget.bytes_remaining(),
114 TimeToBytes(kBitrateKbps, delta_time_ms));
115
116 interval_budget.IncreaseBudget(delta_time_ms);
Jonas Olsson944dace2019-06-05 17:59:32 +0200117 EXPECT_DOUBLE_EQ(interval_budget.budget_ratio(),
118 kWindowMs / static_cast<double>(100 * delta_time_ms));
tschumim82c55932017-07-11 06:56:04 -0700119 EXPECT_EQ(interval_budget.bytes_remaining(),
120 TimeToBytes(kBitrateKbps, delta_time_ms));
121}
122
123} // namespace webrtc