| /* | 
 |  *  Copyright (c) 2021 The WebRTC project authors. All Rights Reserved. | 
 |  * | 
 |  *  Use of this source code is governed by a BSD-style license | 
 |  *  that can be found in the LICENSE file in the root of the source | 
 |  *  tree. An additional intellectual property rights grant can be found | 
 |  *  in the file PATENTS.  All contributing project authors may | 
 |  *  be found in the AUTHORS file in the root of the source tree. | 
 |  */ | 
 | #include "modules/remote_bitrate_estimator/packet_arrival_map.h" | 
 |  | 
 | #include <cstdint> | 
 |  | 
 | #include "api/units/timestamp.h" | 
 | #include "test/gtest.h" | 
 |  | 
 | namespace webrtc { | 
 | namespace { | 
 |  | 
 | TEST(PacketArrivalMapTest, IsConsistentWhenEmpty) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), map.end_sequence_number()); | 
 |   EXPECT_FALSE(map.has_received(0)); | 
 |   EXPECT_EQ(map.clamp(-5), 0); | 
 |   EXPECT_EQ(map.clamp(5), 0); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, InsertsFirstItemIntoMap) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   EXPECT_EQ(map.begin_sequence_number(), 42); | 
 |   EXPECT_EQ(map.end_sequence_number(), 43); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(41)); | 
 |   EXPECT_TRUE(map.has_received(42)); | 
 |   EXPECT_FALSE(map.has_received(44)); | 
 |  | 
 |   EXPECT_EQ(map.clamp(-100), 42); | 
 |   EXPECT_EQ(map.clamp(42), 42); | 
 |   EXPECT_EQ(map.clamp(100), 43); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, InsertsWithGaps) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Zero()); | 
 |   map.AddPacket(45, Timestamp::Millis(11)); | 
 |   EXPECT_EQ(map.begin_sequence_number(), 42); | 
 |   EXPECT_EQ(map.end_sequence_number(), 46); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(41)); | 
 |   EXPECT_TRUE(map.has_received(42)); | 
 |   EXPECT_FALSE(map.has_received(43)); | 
 |   EXPECT_FALSE(map.has_received(44)); | 
 |   EXPECT_TRUE(map.has_received(45)); | 
 |   EXPECT_FALSE(map.has_received(46)); | 
 |  | 
 |   EXPECT_EQ(map.get(42), Timestamp::Zero()); | 
 |   EXPECT_LT(map.get(43), Timestamp::Zero()); | 
 |   EXPECT_LT(map.get(44), Timestamp::Zero()); | 
 |   EXPECT_EQ(map.get(45), Timestamp::Millis(11)); | 
 |  | 
 |   EXPECT_EQ(map.clamp(-100), 42); | 
 |   EXPECT_EQ(map.clamp(44), 44); | 
 |   EXPECT_EQ(map.clamp(100), 46); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, FindNextAtOrAfterWithGaps) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Zero()); | 
 |   map.AddPacket(45, Timestamp::Millis(11)); | 
 |   EXPECT_EQ(map.begin_sequence_number(), 42); | 
 |   EXPECT_EQ(map.end_sequence_number(), 46); | 
 |  | 
 |   PacketArrivalTimeMap::PacketArrivalTime packet = map.FindNextAtOrAfter(42); | 
 |   EXPECT_EQ(packet.arrival_time, Timestamp::Zero()); | 
 |   EXPECT_EQ(packet.sequence_number, 42); | 
 |  | 
 |   packet = map.FindNextAtOrAfter(43); | 
 |   EXPECT_EQ(packet.arrival_time, Timestamp::Millis(11)); | 
 |   EXPECT_EQ(packet.sequence_number, 45); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, InsertsWithinBuffer) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   map.AddPacket(45, Timestamp::Millis(11)); | 
 |  | 
 |   map.AddPacket(43, Timestamp::Millis(12)); | 
 |   map.AddPacket(44, Timestamp::Millis(13)); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), 42); | 
 |   EXPECT_EQ(map.end_sequence_number(), 46); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(41)); | 
 |   EXPECT_TRUE(map.has_received(42)); | 
 |   EXPECT_TRUE(map.has_received(43)); | 
 |   EXPECT_TRUE(map.has_received(44)); | 
 |   EXPECT_TRUE(map.has_received(45)); | 
 |   EXPECT_FALSE(map.has_received(46)); | 
 |  | 
 |   EXPECT_EQ(map.get(42), Timestamp::Millis(10)); | 
 |   EXPECT_EQ(map.get(43), Timestamp::Millis(12)); | 
 |   EXPECT_EQ(map.get(44), Timestamp::Millis(13)); | 
 |   EXPECT_EQ(map.get(45), Timestamp::Millis(11)); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, GrowsBufferAndRemoveOld) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   constexpr int64_t kLargeSeq = 42 + PacketArrivalTimeMap::kMaxNumberOfPackets; | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   map.AddPacket(43, Timestamp::Millis(11)); | 
 |   map.AddPacket(44, Timestamp::Millis(12)); | 
 |   map.AddPacket(45, Timestamp::Millis(13)); | 
 |   map.AddPacket(kLargeSeq, Timestamp::Millis(12)); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), 43); | 
 |   EXPECT_EQ(map.end_sequence_number(), kLargeSeq + 1); | 
 |   EXPECT_EQ(map.end_sequence_number() - map.begin_sequence_number(), | 
 |             PacketArrivalTimeMap::kMaxNumberOfPackets); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(41)); | 
 |   EXPECT_FALSE(map.has_received(42)); | 
 |   EXPECT_TRUE(map.has_received(43)); | 
 |   EXPECT_TRUE(map.has_received(44)); | 
 |   EXPECT_TRUE(map.has_received(45)); | 
 |   EXPECT_FALSE(map.has_received(46)); | 
 |   EXPECT_TRUE(map.has_received(kLargeSeq)); | 
 |   EXPECT_FALSE(map.has_received(kLargeSeq + 1)); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, SequenceNumberJumpsDeletesAll) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   constexpr int64_t kLargeSeq = | 
 |       42 + 2 * PacketArrivalTimeMap::kMaxNumberOfPackets; | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   map.AddPacket(kLargeSeq, Timestamp::Millis(12)); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), kLargeSeq); | 
 |   EXPECT_EQ(map.end_sequence_number(), kLargeSeq + 1); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(42)); | 
 |   EXPECT_TRUE(map.has_received(kLargeSeq)); | 
 |   EXPECT_FALSE(map.has_received(kLargeSeq + 1)); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, ExpandsBeforeBeginning) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   map.AddPacket(-1000, Timestamp::Millis(13)); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), -1000); | 
 |   EXPECT_EQ(map.end_sequence_number(), 43); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(-1001)); | 
 |   EXPECT_TRUE(map.has_received(-1000)); | 
 |   EXPECT_FALSE(map.has_received(-999)); | 
 |   EXPECT_TRUE(map.has_received(42)); | 
 |   EXPECT_FALSE(map.has_received(43)); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, ExpandingBeforeBeginningKeepsReceived) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   constexpr int64_t kSmallSeq = | 
 |       static_cast<int64_t>(42) - 2 * PacketArrivalTimeMap::kMaxNumberOfPackets; | 
 |   map.AddPacket(kSmallSeq, Timestamp::Millis(13)); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), 42); | 
 |   EXPECT_EQ(map.end_sequence_number(), 43); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, ErasesToRemoveElements) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   map.AddPacket(43, Timestamp::Millis(11)); | 
 |   map.AddPacket(44, Timestamp::Millis(12)); | 
 |   map.AddPacket(45, Timestamp::Millis(13)); | 
 |  | 
 |   map.EraseTo(44); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), 44); | 
 |   EXPECT_EQ(map.end_sequence_number(), 46); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(43)); | 
 |   EXPECT_TRUE(map.has_received(44)); | 
 |   EXPECT_TRUE(map.has_received(45)); | 
 |   EXPECT_FALSE(map.has_received(46)); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, ErasesInEmptyMap) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), map.end_sequence_number()); | 
 |  | 
 |   map.EraseTo(map.end_sequence_number()); | 
 |   EXPECT_EQ(map.begin_sequence_number(), map.end_sequence_number()); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, IsTolerantToWrongArgumentsForErase) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   map.AddPacket(43, Timestamp::Millis(11)); | 
 |  | 
 |   map.EraseTo(1); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), 42); | 
 |   EXPECT_EQ(map.end_sequence_number(), 44); | 
 |  | 
 |   map.EraseTo(100); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), 44); | 
 |   EXPECT_EQ(map.end_sequence_number(), 44); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, EraseAllRemembersBeginningSeqNbr) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(42, Timestamp::Millis(10)); | 
 |   map.AddPacket(43, Timestamp::Millis(11)); | 
 |   map.AddPacket(44, Timestamp::Millis(12)); | 
 |   map.AddPacket(45, Timestamp::Millis(13)); | 
 |  | 
 |   map.EraseTo(46); | 
 |  | 
 |   map.AddPacket(50, Timestamp::Millis(10)); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), 46); | 
 |   EXPECT_EQ(map.end_sequence_number(), 51); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(45)); | 
 |   EXPECT_FALSE(map.has_received(46)); | 
 |   EXPECT_FALSE(map.has_received(47)); | 
 |   EXPECT_FALSE(map.has_received(48)); | 
 |   EXPECT_FALSE(map.has_received(49)); | 
 |   EXPECT_TRUE(map.has_received(50)); | 
 |   EXPECT_FALSE(map.has_received(51)); | 
 | } | 
 |  | 
 | TEST(PacketArrivalMapTest, EraseToMissingSequenceNumber) { | 
 |   PacketArrivalTimeMap map; | 
 |  | 
 |   map.AddPacket(37, Timestamp::Millis(10)); | 
 |   map.AddPacket(39, Timestamp::Millis(11)); | 
 |   map.AddPacket(40, Timestamp::Millis(12)); | 
 |   map.AddPacket(41, Timestamp::Millis(13)); | 
 |  | 
 |   map.EraseTo(38); | 
 |  | 
 |   map.AddPacket(42, Timestamp::Millis(40)); | 
 |  | 
 |   EXPECT_EQ(map.begin_sequence_number(), 38); | 
 |   EXPECT_EQ(map.end_sequence_number(), 43); | 
 |  | 
 |   EXPECT_FALSE(map.has_received(37)); | 
 |   EXPECT_FALSE(map.has_received(38)); | 
 |   EXPECT_TRUE(map.has_received(39)); | 
 |   EXPECT_TRUE(map.has_received(40)); | 
 |   EXPECT_TRUE(map.has_received(41)); | 
 |   EXPECT_TRUE(map.has_received(42)); | 
 | } | 
 |  | 
 | }  // namespace | 
 | }  // namespace webrtc |