Index: webrtc/video/end_to_end_tests.cc |
diff --git a/webrtc/video/end_to_end_tests.cc b/webrtc/video/end_to_end_tests.cc |
index 6d56da5e0184c27d2f582ac220213ebc71494047..66c8b60178e9c23b0b1f4679d29fef080f1d811c 100644 |
--- a/webrtc/video/end_to_end_tests.cc |
+++ b/webrtc/video/end_to_end_tests.cc |
@@ -2196,6 +2196,111 @@ TEST_F(EndToEndTest, RembWithSendSideBwe) { |
RunBaseTest(&test); |
} |
+class ProbingTest : public test::EndToEndTest { |
+ public: |
+ explicit ProbingTest(int start_bitrate_bps) |
+ : clock_(Clock::GetRealTimeClock()), |
+ start_bitrate_bps_(start_bitrate_bps), |
+ state_(0), |
+ sender_call_(nullptr) {} |
+ |
+ ~ProbingTest() {} |
+ |
+ Call::Config GetSenderCallConfig() override { |
+ Call::Config config(&event_log_); |
+ config.bitrate_config.start_bitrate_bps = start_bitrate_bps_; |
+ return config; |
+ } |
+ |
+ void OnCallsCreated(Call* sender_call, Call* receiver_call) override { |
+ sender_call_ = sender_call; |
+ } |
+ |
+ protected: |
+ Clock* const clock_; |
+ const int start_bitrate_bps_; |
+ int state_; |
+ Call* sender_call_; |
+}; |
+ |
+TEST_F(EndToEndTest, InitialProbing) { |
+ class InitialProbingTest : public ProbingTest { |
+ public: |
+ InitialProbingTest() : ProbingTest(300000) {} |
+ |
+ void PerformTest() override { |
+ int64_t start_time_ms = clock_->TimeInMilliseconds(); |
+ do { |
+ if (clock_->TimeInMilliseconds() - start_time_ms > kTimeoutMs) { |
+ ADD_FAILURE() << "Timed out while waiting for initial probing."; |
+ break; |
+ } |
+ |
+ Call::Stats stats = sender_call_->GetStats(); |
+ // Initial probing is done with a x3 and x6 multiplier of the start |
+ // bitrate, so a x4 multiplier is a high enough threshold. |
+ if (stats.send_bandwidth_bps > 4 * 300000) |
+ break; |
+ } while (!observation_complete_.Wait(20)); |
+ } |
+ |
+ private: |
+ const int kTimeoutMs = 1000; |
+ } test; |
+ |
+ RunBaseTest(&test); |
+} |
+ |
+TEST_F(EndToEndTest, TriggerMidCallProbing) { |
+ class TriggerMidCallProbingTest : public ProbingTest { |
+ public: |
+ TriggerMidCallProbingTest() : ProbingTest(300000) {} |
+ |
+ void PerformTest() override { |
+ int64_t start_time_ms = clock_->TimeInMilliseconds(); |
+ do { |
+ if (clock_->TimeInMilliseconds() - start_time_ms > kTimeoutMs) { |
+ ADD_FAILURE() << "Timed out while waiting for mid-call probing."; |
+ break; |
+ } |
+ |
+ Call::Stats stats = sender_call_->GetStats(); |
+ |
+ switch (state_) { |
+ case 0: |
+ if (stats.send_bandwidth_bps > 5 * 300000) { |
+ Call::Config::BitrateConfig bitrate_config; |
+ bitrate_config.max_bitrate_bps = 100000; |
+ sender_call_->SetBitrateConfig(bitrate_config); |
+ ++state_; |
+ } |
+ break; |
+ case 1: |
+ if (stats.send_bandwidth_bps < 110000) { |
+ Call::Config::BitrateConfig bitrate_config; |
+ bitrate_config.max_bitrate_bps = 2500000; |
+ sender_call_->SetBitrateConfig(bitrate_config); |
+ ++state_; |
+ } |
+ break; |
+ case 2: |
+ // During high cpu load the pacer will not be able to pace packets |
+ // at the correct speed, but if we go from 110 to 1250 kbps |
+ // in 5 seconds then it is due to probing. |
+ if (stats.send_bandwidth_bps > 1250000) |
+ observation_complete_.Set(); |
+ break; |
+ } |
+ } while (!observation_complete_.Wait(20)); |
+ } |
+ |
+ private: |
+ const int kTimeoutMs = 5000; |
+ } test; |
+ |
+ RunBaseTest(&test); |
+} |
+ |
TEST_F(EndToEndTest, VerifyNackStats) { |
static const int kPacketNumberToDrop = 200; |
class NackObserver : public test::EndToEndTest { |