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