| // 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 |