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 106b5137123100c11b18d6ae3bf066075349b562..44b45a06ef3789632561141fd5aad11d281a14ab 100644 |
--- a/webrtc/video/end_to_end_tests.cc |
+++ b/webrtc/video/end_to_end_tests.cc |
@@ -1831,9 +1831,9 @@ TEST_F(EndToEndTest, AssignsTransportSequenceNumbers) { |
class TransportFeedbackTester : public test::EndToEndTest { |
public: |
- explicit TransportFeedbackTester(bool feedback_enabled, |
- size_t num_video_streams, |
- size_t num_audio_streams) |
+ TransportFeedbackTester(bool feedback_enabled, |
+ size_t num_video_streams, |
+ size_t num_audio_streams) |
: EndToEndTest(::webrtc::EndToEndTest::kDefaultTimeoutMs), |
feedback_enabled_(feedback_enabled), |
num_video_streams_(num_video_streams), |
@@ -1928,6 +1928,76 @@ TEST_F(EndToEndTest, AudioVideoReceivesTransportFeedback) { |
RunBaseTest(&test); |
} |
+TEST_F(EndToEndTest, StopsSendingMediaWithoutFeedback) { |
+ test::ScopedFieldTrials override_field_trials( |
+ "WebRTC-CwndExperiment/Enabled/"); |
+ |
+ class TransportFeedbackTester : public test::EndToEndTest { |
+ public: |
+ TransportFeedbackTester(size_t num_video_streams, size_t num_audio_streams) |
+ : EndToEndTest(::webrtc::EndToEndTest::kDefaultTimeoutMs), |
+ num_video_streams_(num_video_streams), |
+ num_audio_streams_(num_audio_streams), |
+ media_sent_(0), |
+ padding_sent_(0) { |
+ // Only one stream of each supported for now. |
+ EXPECT_LE(num_video_streams, 1u); |
+ EXPECT_LE(num_audio_streams, 1u); |
+ } |
+ |
+ protected: |
+ Action OnSendRtp(const uint8_t* packet, size_t length) override { |
+ RTPHeader header; |
+ EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
+ const bool only_padding = |
+ header.headerLength + header.paddingLength == length; |
+ if (only_padding) { |
+ ++padding_sent_; |
+ } else { |
+ ++media_sent_; |
+ EXPECT_LT(media_sent_, 40) << "Media sent without feedback."; |
+ } |
+ |
+ return SEND_PACKET; |
+ } |
+ |
+ Action OnReceiveRtcp(const uint8_t* data, size_t length) override { |
+ if (media_sent_ > 20 && HasTransportFeedback(data, length)) { |
+ return DROP_PACKET; |
+ } |
+ return SEND_PACKET; |
+ } |
+ |
+ bool HasTransportFeedback(const uint8_t* data, size_t length) const { |
+ test::RtcpPacketParser parser; |
+ EXPECT_TRUE(parser.Parse(data, length)); |
+ return parser.transport_feedback()->num_packets() > 0; |
+ } |
+ |
+ Call::Config GetSenderCallConfig() override { |
+ Call::Config config = EndToEndTest::GetSenderCallConfig(); |
+ config.bitrate_config.max_bitrate_bps = 300000; |
+ return config; |
+ } |
+ |
+ void PerformTest() override { |
+ const int64_t kDisabledFeedbackTimeoutMs = 10000; |
+ observation_complete_.Wait(kDisabledFeedbackTimeoutMs); |
+ EXPECT_GT(padding_sent_, 0); |
+ } |
+ |
+ size_t GetNumVideoStreams() const override { return num_video_streams_; } |
+ size_t GetNumAudioStreams() const override { return num_audio_streams_; } |
+ |
+ private: |
+ const size_t num_video_streams_; |
+ const size_t num_audio_streams_; |
+ int media_sent_; |
+ int padding_sent_; |
+ } test(1, 0); |
+ RunBaseTest(&test); |
+} |
+ |
TEST_F(EndToEndTest, ObserversEncodedFrames) { |
class EncodedFrameTestObserver : public EncodedFrameObserver { |
public: |
@@ -2408,8 +2478,8 @@ TEST_F(EndToEndTest, TriggerMidCallProbing) { |
if (success) |
return; |
} |
- RTC_DCHECK(success) << "Failed to perform mid call probing (" << kMaxAttempts |
- << " attempts)."; |
+ EXPECT_TRUE(success) << "Failed to perform mid call probing (" << kMaxAttempts |
+ << " attempts)."; |
} |
TEST_F(EndToEndTest, VerifyNackStats) { |
@@ -4194,12 +4264,17 @@ TEST_F(EndToEndTest, RespectsNetworkState) { |
receiver_call_(nullptr), |
sender_state_(kNetworkUp), |
sender_rtp_(0), |
+ sender_padding_(0), |
sender_rtcp_(0), |
receiver_rtcp_(0), |
down_frames_(0) {} |
Action OnSendRtp(const uint8_t* packet, size_t length) override { |
rtc::CritScope lock(&test_crit_); |
+ RTPHeader header; |
+ EXPECT_TRUE(parser_->Parse(packet, length, &header)); |
+ if (length == header.headerLength + header.paddingLength) |
+ ++sender_padding_; |
++sender_rtp_; |
packet_event_.Set(); |
return SEND_PACKET; |
@@ -4324,7 +4399,8 @@ TEST_F(EndToEndTest, RespectsNetworkState) { |
int64_t time_now_ms = clock_->TimeInMilliseconds(); |
rtc::CritScope lock(&test_crit_); |
if (sender_down) { |
- ASSERT_LE(sender_rtp_ - initial_sender_rtp, kNumAcceptedDowntimeRtp) |
+ ASSERT_LE(sender_rtp_ - initial_sender_rtp - sender_padding_, |
+ kNumAcceptedDowntimeRtp) |
<< "RTP sent during sender-side downtime."; |
ASSERT_LE(sender_rtcp_ - initial_sender_rtcp, |
kNumAcceptedDowntimeRtcp) |
@@ -4359,6 +4435,7 @@ TEST_F(EndToEndTest, RespectsNetworkState) { |
Call* receiver_call_; |
NetworkState sender_state_ GUARDED_BY(test_crit_); |
int sender_rtp_ GUARDED_BY(test_crit_); |
+ int sender_padding_ GUARDED_BY(test_crit_); |
int sender_rtcp_ GUARDED_BY(test_crit_); |
int receiver_rtcp_ GUARDED_BY(test_crit_); |
int down_frames_ GUARDED_BY(test_crit_); |