blob: 30e2c798f174557ec7026104f87a5cfea7c0be0d [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
11#include "webrtc/modules/pacing/interval_budget.h"
12
13#include "webrtc/test/gtest.h"
14
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);
29 EXPECT_EQ(interval_budget.budget_level_percent(), 0);
30 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);
37 EXPECT_EQ(interval_budget.budget_level_percent(), kWindowMs / delta_time_ms);
38 EXPECT_EQ(interval_budget.bytes_remaining(),
39 TimeToBytes(kBitrateKbps, delta_time_ms));
40}
41
42TEST(IntervalBudgetTest, DontUnderuseMoreThanMaxWindow) {
43 IntervalBudget interval_budget(kBitrateKbps);
44 int delta_time_ms = 1000;
45 interval_budget.IncreaseBudget(delta_time_ms);
46 EXPECT_EQ(interval_budget.budget_level_percent(), 100);
47 EXPECT_EQ(interval_budget.bytes_remaining(),
48 TimeToBytes(kBitrateKbps, kWindowMs));
49}
50
51TEST(IntervalBudgetTest, DontUnderuseMoreThanMaxWindowWhenChangeBitrate) {
52 IntervalBudget interval_budget(kBitrateKbps);
53 int delta_time_ms = kWindowMs / 2;
54 interval_budget.IncreaseBudget(delta_time_ms);
55 interval_budget.set_target_rate_kbps(kBitrateKbps / 10);
56 EXPECT_EQ(interval_budget.budget_level_percent(), 100);
57 EXPECT_EQ(interval_budget.bytes_remaining(),
58 TimeToBytes(kBitrateKbps / 10, kWindowMs));
59}
60
61TEST(IntervalBudgetTest, BalanceChangeOnBitrateChange) {
62 IntervalBudget interval_budget(kBitrateKbps);
63 int delta_time_ms = kWindowMs;
64 interval_budget.IncreaseBudget(delta_time_ms);
65 interval_budget.set_target_rate_kbps(kBitrateKbps * 2);
66 EXPECT_EQ(interval_budget.budget_level_percent(), 50);
67 EXPECT_EQ(interval_budget.bytes_remaining(),
68 TimeToBytes(kBitrateKbps, kWindowMs));
69}
70
71TEST(IntervalBudgetTest, Overuse) {
72 IntervalBudget interval_budget(kBitrateKbps);
73 int overuse_time_ms = 50;
74 int used_bytes = TimeToBytes(kBitrateKbps, overuse_time_ms);
75 interval_budget.UseBudget(used_bytes);
76 EXPECT_EQ(interval_budget.budget_level_percent(),
77 -kWindowMs / overuse_time_ms);
78 EXPECT_EQ(interval_budget.bytes_remaining(), 0u);
79}
80
81TEST(IntervalBudgetTest, DontOveruseMoreThanMaxWindow) {
82 IntervalBudget interval_budget(kBitrateKbps);
83 int overuse_time_ms = 1000;
84 int used_bytes = TimeToBytes(kBitrateKbps, overuse_time_ms);
85 interval_budget.UseBudget(used_bytes);
86 EXPECT_EQ(interval_budget.budget_level_percent(), -100);
87 EXPECT_EQ(interval_budget.bytes_remaining(), 0u);
88}
89
90TEST(IntervalBudgetTest, CanBuildUpUnderuseWhenConfigured) {
91 IntervalBudget interval_budget(kBitrateKbps, kCanBuildUpUnderuse);
92 int delta_time_ms = 50;
93 interval_budget.IncreaseBudget(delta_time_ms);
94 EXPECT_EQ(interval_budget.budget_level_percent(), kWindowMs / delta_time_ms);
95 EXPECT_EQ(interval_budget.bytes_remaining(),
96 TimeToBytes(kBitrateKbps, delta_time_ms));
97
98 interval_budget.IncreaseBudget(delta_time_ms);
99 EXPECT_EQ(interval_budget.budget_level_percent(),
100 2 * kWindowMs / delta_time_ms);
101 EXPECT_EQ(interval_budget.bytes_remaining(),
102 TimeToBytes(kBitrateKbps, 2 * delta_time_ms));
103}
104
105TEST(IntervalBudgetTest, CanNotBuildUpUnderuseWhenConfigured) {
106 IntervalBudget interval_budget(kBitrateKbps, kCanNotBuildUpUnderuse);
107 int delta_time_ms = 50;
108 interval_budget.IncreaseBudget(delta_time_ms);
109 EXPECT_EQ(interval_budget.budget_level_percent(), kWindowMs / delta_time_ms);
110 EXPECT_EQ(interval_budget.bytes_remaining(),
111 TimeToBytes(kBitrateKbps, delta_time_ms));
112
113 interval_budget.IncreaseBudget(delta_time_ms);
114 EXPECT_EQ(interval_budget.budget_level_percent(), kWindowMs / delta_time_ms);
115 EXPECT_EQ(interval_budget.bytes_remaining(),
116 TimeToBytes(kBitrateKbps, delta_time_ms));
117}
118
119} // namespace webrtc