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