Chromium Code Reviews| 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 45019871b11812262f851da2967a778fc54b7e3d..19d3f1ca3431e53471cff2197fb300e99c59c85f 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 |
|
philipel
2017/08/02 15:35:16
revert
stefan-webrtc
2017/08/04 09:50:00
I didn't get the reason why we use RTC_DCHECK over
philipel
2017/08/04 14:13:04
Thought this was an unintentional change, but yeah
|
| + << " 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_); |