Index: webrtc/modules/pacing/bitrate_prober_unittest.cc |
diff --git a/webrtc/modules/pacing/bitrate_prober_unittest.cc b/webrtc/modules/pacing/bitrate_prober_unittest.cc |
index 9ada11462572fda41178b0e05b0ecd2046ca2655..edae30cfffdb45378c298f7fc39bbff379eba5d9 100644 |
--- a/webrtc/modules/pacing/bitrate_prober_unittest.cc |
+++ b/webrtc/modules/pacing/bitrate_prober_unittest.cc |
@@ -9,17 +9,44 @@ |
*/ |
#include <limits> |
+#include <vector> |
#include "webrtc/modules/pacing/bitrate_prober.h" |
+#include "webrtc/system_wrappers/include/clock.h" |
#include "webrtc/test/gtest.h" |
namespace webrtc { |
-TEST(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) { |
- BitrateProber prober; |
- EXPECT_FALSE(prober.IsProbing()); |
- int64_t now_ms = 0; |
- EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms)); |
+class BitrateProberTest : public ::testing::Test, |
+ public ProbeClusterCreatedObserver { |
+ public: |
+ struct ProbeInfo { |
+ int cluster_id = 0; |
+ int min_bytes = 0; |
+ int min_probes = 0; |
+ }; |
+ |
+ void OnProbingClusterCreated(int cluster_id, |
+ int min_bytes, |
+ int min_probes) override { |
+ ProbeInfo info; |
+ info.cluster_id = cluster_id; |
+ info.min_bytes = min_bytes; |
+ info.min_probes = min_probes; |
+ probe_info_.push_back(info); |
+ } |
+ |
+ protected: |
+ BitrateProberTest() : prober_(this), clock_(0) {} |
+ BitrateProber prober_; |
+ SimulatedClock clock_; |
+ std::vector<ProbeInfo> probe_info_; |
+}; |
+ |
+TEST_F(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) { |
+ int64_t now_ms = clock_.TimeInMilliseconds(); |
+ EXPECT_FALSE(prober_.IsProbing()); |
+ EXPECT_EQ(-1, prober_.TimeUntilNextProbe(now_ms)); |
const int kTestBitrate1 = 900000; |
const int kTestBitrate2 = 1800000; |
@@ -27,22 +54,22 @@ TEST(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) { |
const int kProbeSize = 1000; |
const int kMinProbeDurationMs = 15; |
- prober.CreateProbeCluster(kTestBitrate1); |
- prober.CreateProbeCluster(kTestBitrate2); |
- EXPECT_FALSE(prober.IsProbing()); |
+ prober_.CreateProbeCluster(kTestBitrate1); |
+ prober_.CreateProbeCluster(kTestBitrate2); |
+ EXPECT_FALSE(prober_.IsProbing()); |
- prober.OnIncomingPacket(kProbeSize); |
- EXPECT_TRUE(prober.IsProbing()); |
- EXPECT_EQ(0, prober.CurrentClusterId()); |
+ prober_.OnIncomingPacket(kProbeSize); |
+ EXPECT_TRUE(prober_.IsProbing()); |
+ EXPECT_EQ(0, prober_.CurrentClusterId()); |
// First packet should probe as soon as possible. |
- EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms)); |
+ EXPECT_EQ(0, prober_.TimeUntilNextProbe(now_ms)); |
for (int i = 0; i < kClusterSize; ++i) { |
- now_ms += prober.TimeUntilNextProbe(now_ms); |
- EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms)); |
- EXPECT_EQ(0, prober.CurrentClusterId()); |
- prober.ProbeSent(now_ms, kProbeSize); |
+ now_ms += prober_.TimeUntilNextProbe(now_ms); |
+ EXPECT_EQ(0, prober_.TimeUntilNextProbe(now_ms)); |
+ EXPECT_EQ(0, prober_.CurrentClusterId()); |
+ prober_.ProbeSent(now_ms, kProbeSize); |
} |
EXPECT_GE(now_ms, kMinProbeDurationMs); |
@@ -51,14 +78,14 @@ TEST(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) { |
EXPECT_GT(bitrate, kTestBitrate1 * 0.9); |
EXPECT_LT(bitrate, kTestBitrate1 * 1.1); |
- now_ms += prober.TimeUntilNextProbe(now_ms); |
+ now_ms += prober_.TimeUntilNextProbe(now_ms); |
int64_t probe2_started = now_ms; |
for (int i = 0; i < kClusterSize; ++i) { |
- now_ms += prober.TimeUntilNextProbe(now_ms); |
- EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms)); |
- EXPECT_EQ(1, prober.CurrentClusterId()); |
- prober.ProbeSent(now_ms, kProbeSize); |
+ now_ms += prober_.TimeUntilNextProbe(now_ms); |
+ EXPECT_EQ(0, prober_.TimeUntilNextProbe(now_ms)); |
+ EXPECT_EQ(1, prober_.CurrentClusterId()); |
+ prober_.ProbeSent(now_ms, kProbeSize); |
} |
// Verify that the actual bitrate is withing 10% of the target. |
@@ -68,91 +95,93 @@ TEST(BitrateProberTest, VerifyStatesAndTimeBetweenProbes) { |
EXPECT_GT(bitrate, kTestBitrate2 * 0.9); |
EXPECT_LT(bitrate, kTestBitrate2 * 1.1); |
- EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms)); |
- EXPECT_FALSE(prober.IsProbing()); |
+ EXPECT_EQ(-1, prober_.TimeUntilNextProbe(now_ms)); |
+ EXPECT_FALSE(prober_.IsProbing()); |
} |
-TEST(BitrateProberTest, DoesntProbeWithoutRecentPackets) { |
- BitrateProber prober; |
- EXPECT_FALSE(prober.IsProbing()); |
+TEST_F(BitrateProberTest, DoesntProbeWithoutRecentPackets) { |
+ EXPECT_FALSE(prober_.IsProbing()); |
int64_t now_ms = 0; |
- EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms)); |
+ EXPECT_EQ(-1, prober_.TimeUntilNextProbe(now_ms)); |
- prober.CreateProbeCluster(900000); |
- EXPECT_FALSE(prober.IsProbing()); |
+ prober_.CreateProbeCluster(900000); |
+ EXPECT_FALSE(prober_.IsProbing()); |
- prober.OnIncomingPacket(1000); |
- EXPECT_TRUE(prober.IsProbing()); |
- EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms)); |
- prober.ProbeSent(now_ms, 1000); |
- // Let time pass, no large enough packets put into prober. |
+ prober_.OnIncomingPacket(1000); |
+ EXPECT_TRUE(prober_.IsProbing()); |
+ EXPECT_EQ(0, prober_.TimeUntilNextProbe(now_ms)); |
+ prober_.ProbeSent(now_ms, 1000); |
+ // Let time pass, no large enough packets put into prober_. |
now_ms += 6000; |
- EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms)); |
+ EXPECT_EQ(-1, prober_.TimeUntilNextProbe(now_ms)); |
// Insert a small packet, not a candidate for probing. |
- prober.OnIncomingPacket(100); |
- EXPECT_FALSE(prober.IsProbing()); |
- EXPECT_EQ(-1, prober.TimeUntilNextProbe(now_ms)); |
+ prober_.OnIncomingPacket(100); |
+ EXPECT_FALSE(prober_.IsProbing()); |
+ EXPECT_EQ(-1, prober_.TimeUntilNextProbe(now_ms)); |
// Insert a large-enough packet after downtime while probing should reset to |
// perform a new probe since the requested one didn't finish. |
- prober.OnIncomingPacket(1000); |
- EXPECT_EQ(0, prober.TimeUntilNextProbe(now_ms)); |
- prober.ProbeSent(now_ms, 1000); |
+ prober_.OnIncomingPacket(1000); |
+ EXPECT_EQ(0, prober_.TimeUntilNextProbe(now_ms)); |
+ prober_.ProbeSent(now_ms, 1000); |
// Next packet should be part of new probe and be sent with non-zero delay. |
- prober.OnIncomingPacket(1000); |
- EXPECT_GT(prober.TimeUntilNextProbe(now_ms), 0); |
+ prober_.OnIncomingPacket(1000); |
+ EXPECT_GT(prober_.TimeUntilNextProbe(now_ms), 0); |
} |
-TEST(BitrateProberTest, DoesntInitializeProbingForSmallPackets) { |
- BitrateProber prober; |
- prober.SetEnabled(true); |
- EXPECT_FALSE(prober.IsProbing()); |
+TEST_F(BitrateProberTest, DoesntInitializeProbingForSmallPackets) { |
+ prober_.SetEnabled(true); |
+ EXPECT_FALSE(prober_.IsProbing()); |
- prober.OnIncomingPacket(100); |
- EXPECT_FALSE(prober.IsProbing()); |
+ prober_.OnIncomingPacket(100); |
+ EXPECT_FALSE(prober_.IsProbing()); |
} |
-TEST(BitrateProberTest, VerifyProbeSizeOnHighBitrate) { |
- BitrateProber prober; |
+TEST_F(BitrateProberTest, VerifyProbeSizeOnHighBitrate) { |
constexpr unsigned kHighBitrateBps = 10000000; // 10 Mbps |
- prober.CreateProbeCluster(kHighBitrateBps); |
+ prober_.CreateProbeCluster(kHighBitrateBps); |
// Probe size should ensure a minimum of 1 ms interval. |
- EXPECT_GT(prober.RecommendedMinProbeSize(), kHighBitrateBps / 8000); |
+ EXPECT_GT(prober_.RecommendedMinProbeSize(), kHighBitrateBps / 8000); |
} |
-TEST(BitrateProberTest, MinumumNumberOfProbingPackets) { |
- BitrateProber prober; |
+TEST_F(BitrateProberTest, MinProbingPacketsUsedLowBitrates) { |
// Even when probing at a low bitrate we expect a minimum number |
// of packets to be sent. |
- constexpr int kBitrateBps = 100000; // 100 kbps |
- constexpr int kPacketSizeBytes = 1000; |
- |
- prober.CreateProbeCluster(kBitrateBps); |
- prober.OnIncomingPacket(kPacketSizeBytes); |
- for (int i = 0; i < 5; ++i) { |
- EXPECT_TRUE(prober.IsProbing()); |
- prober.ProbeSent(0, kPacketSizeBytes); |
+ constexpr int kLowBitrate = 100000; // 100 kbps |
+ constexpr int kPacketSize = 1400; |
+ int64_t now_ms = clock_.TimeInMilliseconds(); |
+ prober_.SetEnabled(true); |
+ prober_.CreateProbeCluster(kLowBitrate); |
+ prober_.OnIncomingPacket(200); |
+ EXPECT_TRUE(prober_.IsProbing()); |
+ |
+ EXPECT_GT(probe_info_[0].min_probes, 0); |
+ int probes_sent = 0; |
+ int bytes_sent = 0l; |
+ while (prober_.IsProbing()) { |
+ prober_.ProbeSent(now_ms, kPacketSize); |
+ ++probes_sent; |
+ bytes_sent += kPacketSize; |
} |
- EXPECT_FALSE(prober.IsProbing()); |
+ EXPECT_EQ(probes_sent, probe_info_[0].min_probes); |
} |
-TEST(BitrateProberTest, ScaleBytesUsedForProbing) { |
- BitrateProber prober; |
+TEST_F(BitrateProberTest, ScaleBytesUsedForProbing) { |
constexpr int kBitrateBps = 10000000; // 10 Mbps |
constexpr int kPacketSizeBytes = 1000; |
constexpr int kExpectedBytesSent = kBitrateBps * 15 / 8000; |
- prober.CreateProbeCluster(kBitrateBps); |
- prober.OnIncomingPacket(kPacketSizeBytes); |
+ prober_.CreateProbeCluster(kBitrateBps); |
+ prober_.OnIncomingPacket(kPacketSizeBytes); |
int bytes_sent = 0; |
while (bytes_sent < kExpectedBytesSent) { |
- EXPECT_TRUE(prober.IsProbing()); |
- prober.ProbeSent(0, kPacketSizeBytes); |
+ EXPECT_TRUE(prober_.IsProbing()); |
+ prober_.ProbeSent(0, kPacketSizeBytes); |
bytes_sent += kPacketSizeBytes; |
} |
- EXPECT_FALSE(prober.IsProbing()); |
+ EXPECT_FALSE(prober_.IsProbing()); |
} |
} // namespace webrtc |