|  | // Copyright (c) 2018 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include "net/third_party/quiche/src/quic/quartc/quartc_interval_counter.h" | 
|  |  | 
|  | #include "net/third_party/quiche/src/quic/core/quic_interval.h" | 
|  | #include "net/third_party/quiche/src/quic/platform/api/quic_test.h" | 
|  |  | 
|  | namespace quic { | 
|  | namespace { | 
|  |  | 
|  | class QuartcIntervalCounterTest : public QuicTest { | 
|  | protected: | 
|  | QuartcIntervalCounter<int> counter_; | 
|  | }; | 
|  |  | 
|  | void ExpectCount(const QuartcIntervalCounter<int>& counter, | 
|  | QuicInterval<int> interval, | 
|  | size_t count) { | 
|  | for (int i = interval.min(); i < interval.max(); ++i) { | 
|  | EXPECT_EQ(counter.Count(i), count) << "i=" << i; | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST_F(QuartcIntervalCounterTest, InitiallyEmpty) { | 
|  | EXPECT_EQ(counter_.MaxCount(), 0u); | 
|  | } | 
|  |  | 
|  | TEST_F(QuartcIntervalCounterTest, SameInterval) { | 
|  | counter_.AddInterval(QuicInterval<int>(0, 6)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 1u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 6), 1); | 
|  |  | 
|  | counter_.AddInterval(QuicInterval<int>(0, 6)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 2u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 6), 2); | 
|  | } | 
|  |  | 
|  | TEST_F(QuartcIntervalCounterTest, DisjointIntervals) { | 
|  | counter_.AddInterval(QuicInterval<int>(0, 5)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 1u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 5), 1); | 
|  | ExpectCount(counter_, QuicInterval<int>(5, 10), 0); | 
|  |  | 
|  | counter_.AddInterval(QuicInterval<int>(5, 10)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 1u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 5), 1); | 
|  | ExpectCount(counter_, QuicInterval<int>(5, 10), 1); | 
|  | } | 
|  |  | 
|  | TEST_F(QuartcIntervalCounterTest, OverlappingIntervals) { | 
|  | counter_.AddInterval(QuicInterval<int>(0, 6)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 1u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 6), 1); | 
|  | ExpectCount(counter_, QuicInterval<int>(6, 10), 0); | 
|  |  | 
|  | counter_.AddInterval(QuicInterval<int>(5, 10)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 2u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 5), 1); | 
|  | EXPECT_EQ(counter_.Count(5), 2u); | 
|  | ExpectCount(counter_, QuicInterval<int>(6, 10), 1); | 
|  | } | 
|  |  | 
|  | TEST_F(QuartcIntervalCounterTest, IntervalsWithGapThenOverlap) { | 
|  | counter_.AddInterval(QuicInterval<int>(0, 4)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 1u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 4), 1); | 
|  | ExpectCount(counter_, QuicInterval<int>(4, 10), 0); | 
|  |  | 
|  | counter_.AddInterval(QuicInterval<int>(7, 10)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 1u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 4), 1); | 
|  | ExpectCount(counter_, QuicInterval<int>(4, 7), 0); | 
|  | ExpectCount(counter_, QuicInterval<int>(7, 10), 1); | 
|  |  | 
|  | counter_.AddInterval(QuicInterval<int>(3, 8)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 2u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 3), 1); | 
|  | EXPECT_EQ(counter_.Count(3), 2u); | 
|  | ExpectCount(counter_, QuicInterval<int>(4, 7), 1); | 
|  | EXPECT_EQ(counter_.Count(7), 2u); | 
|  | ExpectCount(counter_, QuicInterval<int>(8, 10), 1); | 
|  | } | 
|  |  | 
|  | TEST_F(QuartcIntervalCounterTest, RemoveIntervals) { | 
|  | counter_.AddInterval(QuicInterval<int>(0, 5)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 1u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 5), 1); | 
|  |  | 
|  | counter_.AddInterval(QuicInterval<int>(4, 10)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 2u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 4), 1); | 
|  | EXPECT_EQ(counter_.Count(4), 2u); | 
|  | ExpectCount(counter_, QuicInterval<int>(5, 10), 1); | 
|  |  | 
|  | counter_.RemoveInterval(QuicInterval<int>(0, 5)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 1u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 5), 0); | 
|  | ExpectCount(counter_, QuicInterval<int>(5, 10), 1); | 
|  |  | 
|  | counter_.RemoveInterval(QuicInterval<int>(5, 10)); | 
|  | EXPECT_EQ(counter_.MaxCount(), 0u); | 
|  | ExpectCount(counter_, QuicInterval<int>(0, 10), 0); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace quic |