Index: webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
index 059c4c0b3a7edee7e6f9d82dbc3096c4d07f7a97..41b52a200c8c5fa95c1b575ee60827f862df1627 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
@@ -20,6 +20,7 @@ |
#include "webrtc/modules/rtp_rtcp/include/rtp_cvo.h" |
#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
#include "webrtc/modules/rtp_rtcp/include/rtp_rtcp_defines.h" |
+#include "webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.h" |
#include "webrtc/modules/rtp_rtcp/source/rtp_format_video_generic.h" |
#include "webrtc/modules/rtp_rtcp/source/rtp_header_extension.h" |
#include "webrtc/modules/rtp_rtcp/source/rtp_sender.h" |
@@ -50,6 +51,8 @@ const uint64_t kStartTime = 123456789; |
const size_t kMaxPaddingSize = 224u; |
const int kVideoRotationExtensionId = 5; |
const VideoRotation kRotation = kVideoRotation_270; |
+const size_t kGenericHeaderLength = 1; |
+const uint8_t kPayloadData[] = {47, 11, 32, 93, 89}; |
using testing::_; |
@@ -128,6 +131,12 @@ class MockSendPacketObserver : public SendPacketObserver { |
MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t)); |
}; |
+class MockTransportFeedbackObserver : public TransportFeedbackObserver { |
+ public: |
+ MOCK_METHOD3(AddPacket, void(uint16_t, size_t, int)); |
+ MOCK_METHOD1(OnTransportFeedback, void(const rtcp::TransportFeedback&)); |
+}; |
+ |
class RtpSenderTest : public ::testing::Test { |
protected: |
RtpSenderTest() |
@@ -158,6 +167,7 @@ class RtpSenderTest : public ::testing::Test { |
MockRtpPacketSender mock_paced_sender_; |
testing::StrictMock<MockTransportSequenceNumberAllocator> seq_num_allocator_; |
testing::StrictMock<MockSendPacketObserver> send_packet_observer_; |
+ testing::StrictMock<MockTransportFeedbackObserver> feedback_observer_; |
RateLimiter retransmission_rate_limiter_; |
std::unique_ptr<RTPSender> rtp_sender_; |
int payload_; |
@@ -198,7 +208,6 @@ class RtpSenderTest : public ::testing::Test { |
} |
void SendGenericPayload() { |
- const uint8_t kPayload[] = {47, 11, 32, 93, 89}; |
const uint32_t kTimestamp = 1234; |
const uint8_t kPayloadType = 127; |
const int64_t kCaptureTimeMs = fake_clock_.TimeInMilliseconds(); |
@@ -207,8 +216,8 @@ class RtpSenderTest : public ::testing::Test { |
0, 1500)); |
EXPECT_TRUE(rtp_sender_->SendOutgoingData( |
- kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, kPayload, |
- sizeof(kPayload), nullptr, nullptr, nullptr)); |
+ kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, kPayloadData, |
+ sizeof(kPayloadData), nullptr, nullptr, nullptr)); |
} |
}; |
@@ -493,6 +502,11 @@ TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithAbsoluteSendTimeExtension) { |
} |
TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { |
+ rtp_sender_.reset(new RTPSender( |
+ false, &fake_clock_, &transport_, nullptr, |
+ &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr, |
+ &mock_rtc_event_log_, &send_packet_observer_, |
+ &retransmission_rate_limiter_)); |
EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
kRtpExtensionTransportSequenceNumber, |
kTransportSequenceNumberExtensionId)); |
@@ -502,6 +516,11 @@ TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { |
EXPECT_CALL(send_packet_observer_, |
OnSendPacket(kTransportSequenceNumber, _, _)) |
.Times(1); |
+ EXPECT_CALL(feedback_observer_, |
+ AddPacket(kTransportSequenceNumber, |
+ sizeof(kPayloadData) + kGenericHeaderLength, |
+ PacketInfo::kNotAProbe)) |
+ .Times(1); |
SendGenericPayload(); |
@@ -735,6 +754,50 @@ TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithHeaderExtensions) { |
EXPECT_EQ(0u, rtp_header2.extension.transportSequenceNumber); |
} |
+TEST_F(RtpSenderTest, SendsPacketsWithTransportSequenceNumber) { |
+ rtp_sender_.reset(new RTPSender( |
+ false, &fake_clock_, &transport_, &mock_paced_sender_, |
+ &seq_num_allocator_, &feedback_observer_, nullptr, nullptr, nullptr, |
+ &mock_rtc_event_log_, &send_packet_observer_, |
+ &retransmission_rate_limiter_)); |
+ rtp_sender_->SetStorePacketsStatus(true, 10); |
+ EXPECT_EQ(0, rtp_sender_->RegisterRtpHeaderExtension( |
+ kRtpExtensionTransportSequenceNumber, |
+ kTransportSequenceNumberExtensionId)); |
+ |
+ uint16_t seq_num = 0; |
+ EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)) |
+ .Times(1).WillRepeatedly(testing::SaveArg<2>(&seq_num)); |
+ EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
+ .WillOnce(testing::Return(kTransportSequenceNumber)); |
+ EXPECT_CALL(send_packet_observer_, |
+ OnSendPacket(kTransportSequenceNumber, _, _)) |
+ .Times(1); |
+ const int kProbeClusterId = 1; |
+ EXPECT_CALL( |
+ feedback_observer_, |
+ AddPacket(kTransportSequenceNumber, |
+ sizeof(kPayloadData) + kGenericHeaderLength, kProbeClusterId)) |
+ .Times(1); |
+ |
+ SendGenericPayload(); |
+ rtp_sender_->TimeToSendPacket(seq_num, fake_clock_.TimeInMilliseconds(), |
+ false, kProbeClusterId); |
+ |
+ RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, |
+ transport_.last_sent_packet_len_); |
+ webrtc::RTPHeader rtp_header; |
+ RtpHeaderExtensionMap map; |
+ map.Register(kRtpExtensionTransportSequenceNumber, |
+ kTransportSequenceNumberExtensionId); |
+ EXPECT_TRUE(rtp_parser.Parse(&rtp_header, &map)); |
+ EXPECT_TRUE(rtp_header.extension.hasTransportSequenceNumber); |
+ EXPECT_EQ(kTransportSequenceNumber, |
+ rtp_header.extension.transportSequenceNumber); |
+ EXPECT_EQ(transport_.last_packet_id_, |
+ rtp_header.extension.transportSequenceNumber); |
+} |
+ |
TEST_F(RtpSenderTest, TrafficSmoothingWithExtensions) { |
EXPECT_CALL(mock_paced_sender_, InsertPacket(RtpPacketSender::kNormalPriority, |
_, kSeqNum, _, _, _)); |