/* * 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 "test/gmock.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(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