blob: 028aaf2dab6149487a463c04a970adb466d09d48 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2018 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/quartc/quartc_interval_counter.h"
6
QUICHE teama6ef0a62019-03-07 20:34:33 -05007#include "net/third_party/quiche/src/quic/core/quic_interval.h"
8#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
9
10namespace quic {
11namespace {
12
13class QuartcIntervalCounterTest : public QuicTest {
14 protected:
15 QuartcIntervalCounter<int> counter_;
16};
17
18void ExpectCount(const QuartcIntervalCounter<int>& counter,
19 QuicInterval<int> interval,
20 size_t count) {
21 for (int i = interval.min(); i < interval.max(); ++i) {
22 EXPECT_EQ(counter.Count(i), count) << "i=" << i;
23 }
24}
25
26TEST_F(QuartcIntervalCounterTest, InitiallyEmpty) {
27 EXPECT_EQ(counter_.MaxCount(), 0u);
28}
29
30TEST_F(QuartcIntervalCounterTest, SameInterval) {
31 counter_.AddInterval(QuicInterval<int>(0, 6));
32 EXPECT_EQ(counter_.MaxCount(), 1u);
33 ExpectCount(counter_, QuicInterval<int>(0, 6), 1);
34
35 counter_.AddInterval(QuicInterval<int>(0, 6));
36 EXPECT_EQ(counter_.MaxCount(), 2u);
37 ExpectCount(counter_, QuicInterval<int>(0, 6), 2);
38}
39
40TEST_F(QuartcIntervalCounterTest, DisjointIntervals) {
41 counter_.AddInterval(QuicInterval<int>(0, 5));
42 EXPECT_EQ(counter_.MaxCount(), 1u);
43 ExpectCount(counter_, QuicInterval<int>(0, 5), 1);
44 ExpectCount(counter_, QuicInterval<int>(5, 10), 0);
45
46 counter_.AddInterval(QuicInterval<int>(5, 10));
47 EXPECT_EQ(counter_.MaxCount(), 1u);
48 ExpectCount(counter_, QuicInterval<int>(0, 5), 1);
49 ExpectCount(counter_, QuicInterval<int>(5, 10), 1);
50}
51
52TEST_F(QuartcIntervalCounterTest, OverlappingIntervals) {
53 counter_.AddInterval(QuicInterval<int>(0, 6));
54 EXPECT_EQ(counter_.MaxCount(), 1u);
55 ExpectCount(counter_, QuicInterval<int>(0, 6), 1);
56 ExpectCount(counter_, QuicInterval<int>(6, 10), 0);
57
58 counter_.AddInterval(QuicInterval<int>(5, 10));
59 EXPECT_EQ(counter_.MaxCount(), 2u);
60 ExpectCount(counter_, QuicInterval<int>(0, 5), 1);
61 EXPECT_EQ(counter_.Count(5), 2u);
62 ExpectCount(counter_, QuicInterval<int>(6, 10), 1);
63}
64
65TEST_F(QuartcIntervalCounterTest, IntervalsWithGapThenOverlap) {
66 counter_.AddInterval(QuicInterval<int>(0, 4));
67 EXPECT_EQ(counter_.MaxCount(), 1u);
68 ExpectCount(counter_, QuicInterval<int>(0, 4), 1);
69 ExpectCount(counter_, QuicInterval<int>(4, 10), 0);
70
71 counter_.AddInterval(QuicInterval<int>(7, 10));
72 EXPECT_EQ(counter_.MaxCount(), 1u);
73 ExpectCount(counter_, QuicInterval<int>(0, 4), 1);
74 ExpectCount(counter_, QuicInterval<int>(4, 7), 0);
75 ExpectCount(counter_, QuicInterval<int>(7, 10), 1);
76
77 counter_.AddInterval(QuicInterval<int>(3, 8));
78 EXPECT_EQ(counter_.MaxCount(), 2u);
79 ExpectCount(counter_, QuicInterval<int>(0, 3), 1);
80 EXPECT_EQ(counter_.Count(3), 2u);
81 ExpectCount(counter_, QuicInterval<int>(4, 7), 1);
82 EXPECT_EQ(counter_.Count(7), 2u);
83 ExpectCount(counter_, QuicInterval<int>(8, 10), 1);
84}
85
86TEST_F(QuartcIntervalCounterTest, RemoveIntervals) {
87 counter_.AddInterval(QuicInterval<int>(0, 5));
88 EXPECT_EQ(counter_.MaxCount(), 1u);
89 ExpectCount(counter_, QuicInterval<int>(0, 5), 1);
90
91 counter_.AddInterval(QuicInterval<int>(4, 10));
92 EXPECT_EQ(counter_.MaxCount(), 2u);
93 ExpectCount(counter_, QuicInterval<int>(0, 4), 1);
94 EXPECT_EQ(counter_.Count(4), 2u);
95 ExpectCount(counter_, QuicInterval<int>(5, 10), 1);
96
97 counter_.RemoveInterval(QuicInterval<int>(0, 5));
98 EXPECT_EQ(counter_.MaxCount(), 1u);
99 ExpectCount(counter_, QuicInterval<int>(0, 5), 0);
100 ExpectCount(counter_, QuicInterval<int>(5, 10), 1);
101
102 counter_.RemoveInterval(QuicInterval<int>(5, 10));
103 EXPECT_EQ(counter_.MaxCount(), 0u);
104 ExpectCount(counter_, QuicInterval<int>(0, 10), 0);
105}
106
107} // namespace
108} // namespace quic