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