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 f350effc2178f10ea78b6d4fe367436ecc02794e..d04ff4d200aa80c75fae2ca65509886e162f27b5 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_sender_unittest.cc |
@@ -122,6 +122,11 @@ class MockTransportSequenceNumberAllocator |
MOCK_METHOD0(AllocateSequenceNumber, uint16_t()); |
}; |
+class MockSendPacketObserver : public SendPacketObserver { |
+ public: |
+ MOCK_METHOD3(OnSendPacket, void(uint16_t, int64_t, uint32_t)); |
+}; |
+ |
class RtpSenderTest : public ::testing::Test { |
protected: |
RtpSenderTest() |
@@ -137,10 +142,10 @@ class RtpSenderTest : public ::testing::Test { |
void SetUp() override { SetUpRtpSender(true); } |
void SetUpRtpSender(bool pacer) { |
- rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, |
- pacer ? &mock_paced_sender_ : nullptr, |
- &seq_num_allocator_, nullptr, nullptr, |
- nullptr, nullptr, &mock_rtc_event_log_)); |
+ rtp_sender_.reset(new RTPSender( |
+ false, &fake_clock_, &transport_, pacer ? &mock_paced_sender_ : nullptr, |
+ &seq_num_allocator_, nullptr, nullptr, nullptr, nullptr, |
+ &mock_rtc_event_log_, &send_packet_observer_)); |
rtp_sender_->SetSequenceNumber(kSeqNum); |
} |
@@ -148,6 +153,7 @@ class RtpSenderTest : public ::testing::Test { |
MockRtcEventLog mock_rtc_event_log_; |
MockRtpPacketSender mock_paced_sender_; |
MockTransportSequenceNumberAllocator seq_num_allocator_; |
+ MockSendPacketObserver send_packet_observer_; |
std::unique_ptr<RTPSender> rtp_sender_; |
int payload_; |
LoopbackTransportTest transport_; |
@@ -185,6 +191,20 @@ class RtpSenderTest : public ::testing::Test { |
packet_, payload_length, rtp_length, capture_time_ms, |
kAllowRetransmission, RtpPacketSender::kNormalPriority)); |
} |
+ |
+ 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(); |
+ char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
+ EXPECT_EQ(0, rtp_sender_->RegisterPayload(payload_name, kPayloadType, 90000, |
+ 0, 1500)); |
+ |
+ EXPECT_EQ(0, rtp_sender_->SendOutgoingData( |
+ kVideoFrameKey, kPayloadType, kTimestamp, kCaptureTimeMs, |
+ kPayload, sizeof(kPayload), nullptr)); |
+ } |
}; |
// TODO(pbos): Move tests over from WithoutPacer to RtpSenderTest as this is our |
@@ -479,21 +499,13 @@ TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { |
kRtpExtensionTransportSequenceNumber, |
kTransportSequenceNumberExtensionId)); |
- char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
- const uint8_t payload_type = 127; |
- ASSERT_EQ(0, rtp_sender_->RegisterPayload(payload_name, payload_type, 90000, |
- 0, 1500)); |
- // Create a dummy payload of 5 bytes. |
- uint8_t payload[] = {47, 11, 32, 93, 89}; |
- |
- const uint16_t kTransportSequenceNumber = 17; |
EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
.WillOnce(testing::Return(kTransportSequenceNumber)); |
- const uint32_t kTimestamp = 1234; |
- const int64_t kCaptureTimeMs = 4321; |
- ASSERT_EQ(0, rtp_sender_->SendOutgoingData( |
- kVideoFrameKey, payload_type, kTimestamp, kCaptureTimeMs, |
- payload, sizeof(payload), nullptr)); |
+ EXPECT_CALL(send_packet_observer_, |
+ OnSendPacket(kTransportSequenceNumber, _, _)) |
+ .Times(1); |
+ |
+ SendGenericPayload(); |
RtpUtility::RtpHeaderParser rtp_parser(transport_.last_sent_packet_, |
transport_.last_sent_packet_len_); |
@@ -509,6 +521,19 @@ TEST_F(RtpSenderTestWithoutPacer, SendsPacketsWithTransportSequenceNumber) { |
rtp_header.extension.transportSequenceNumber); |
} |
+TEST_F(RtpSenderTestWithoutPacer, OnSendPacketUpdated) { |
+ EXPECT_CALL(mock_rtc_event_log_, // Ignore rtc event calls. |
+ LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
+ |
+ EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
+ .WillOnce(testing::Return(kTransportSequenceNumber)); |
+ EXPECT_CALL(send_packet_observer_, |
+ OnSendPacket(kTransportSequenceNumber, _, _)) |
+ .Times(1); |
+ |
+ SendGenericPayload(); |
+} |
+ |
// Test CVO header extension is only set when marker bit is true. |
TEST_F(RtpSenderTestWithoutPacer, BuildRTPPacketWithVideoRotation_MarkerBit) { |
rtp_sender_->SetVideoRotation(kRotation); |
@@ -947,11 +972,66 @@ TEST_F(RtpSenderTest, SendPadding) { |
EXPECT_EQ(expected_send_time, rtp_header.extension.absoluteSendTime); |
} |
+TEST_F(RtpSenderTest, OnSendPacketUpdated) { |
+ EXPECT_CALL(mock_rtc_event_log_, // Ignore rtc event calls. |
+ LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
+ rtp_sender_->SetStorePacketsStatus(true, 10); |
+ |
+ EXPECT_CALL(send_packet_observer_, |
+ OnSendPacket(kTransportSequenceNumber, _, _)) |
+ .Times(1); |
+ EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
+ .WillOnce(testing::Return(kTransportSequenceNumber)); |
+ EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); |
+ |
+ SendGenericPayload(); // Packet passed to pacer. |
+ const bool kIsRetransmit = false; |
+ rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), |
+ kIsRetransmit); |
+ EXPECT_EQ(1, transport_.packets_sent_); |
+} |
+ |
+TEST_F(RtpSenderTest, OnSendPacketNotUpdatedForRetransmits) { |
+ EXPECT_CALL(mock_rtc_event_log_, // Ignore rtc event calls. |
+ LogRtpHeader(PacketDirection::kOutgoingPacket, _, _, _)); |
+ rtp_sender_->SetStorePacketsStatus(true, 10); |
+ |
+ EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0); |
+ EXPECT_CALL(seq_num_allocator_, AllocateSequenceNumber()) |
+ .WillOnce(testing::Return(kTransportSequenceNumber)); |
+ EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); |
+ |
+ SendGenericPayload(); // Packet passed to pacer. |
+ const bool kIsRetransmit = true; |
+ rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), |
+ kIsRetransmit); |
+ EXPECT_EQ(1, transport_.packets_sent_); |
+} |
+ |
+TEST_F(RtpSenderTest, OnSendPacketNotUpdatedWithoutSeqNumAllocator) { |
+ rtp_sender_.reset(new RTPSender( |
+ false, &fake_clock_, &transport_, &mock_paced_sender_, |
+ nullptr /* TransportSequenceNumberAllocator */, nullptr, nullptr, nullptr, |
+ nullptr, nullptr, &send_packet_observer_)); |
+ rtp_sender_->SetSequenceNumber(kSeqNum); |
+ rtp_sender_->SetStorePacketsStatus(true, 10); |
+ |
+ EXPECT_CALL(send_packet_observer_, OnSendPacket(_, _, _)).Times(0); |
+ EXPECT_CALL(mock_paced_sender_, InsertPacket(_, _, _, _, _, _)).Times(1); |
+ |
+ SendGenericPayload(); // Packet passed to pacer. |
+ const bool kIsRetransmit = false; |
+ rtp_sender_->TimeToSendPacket(kSeqNum, fake_clock_.TimeInMilliseconds(), |
+ kIsRetransmit); |
+ EXPECT_EQ(1, transport_.packets_sent_); |
+} |
+ |
TEST_F(RtpSenderTest, SendRedundantPayloads) { |
MockTransport transport; |
rtp_sender_.reset(new RTPSender( |
- false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, |
- nullptr, nullptr, nullptr, nullptr, &mock_rtc_event_log_)); |
+ false, &fake_clock_, &transport, &mock_paced_sender_, nullptr, nullptr, |
+ nullptr, nullptr, nullptr, &mock_rtc_event_log_, nullptr)); |
+ |
rtp_sender_->SetSequenceNumber(kSeqNum); |
rtp_sender_->SetRtxPayloadType(kRtxPayload, kPayload); |
@@ -1092,9 +1172,9 @@ TEST_F(RtpSenderTest, FrameCountCallbacks) { |
FrameCounts frame_counts_; |
} callback; |
- rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, |
- &mock_paced_sender_, nullptr, nullptr, |
- nullptr, &callback, nullptr, nullptr)); |
+ rtp_sender_.reset(new RTPSender( |
+ false, &fake_clock_, &transport_, &mock_paced_sender_, nullptr, nullptr, |
+ nullptr, &callback, nullptr, nullptr, nullptr)); |
char payload_name[RTP_PAYLOAD_NAME_SIZE] = "GENERIC"; |
const uint8_t payload_type = 127; |
@@ -1148,8 +1228,8 @@ TEST_F(RtpSenderTest, BitrateCallbacks) { |
BitrateStatistics total_stats_; |
BitrateStatistics retransmit_stats_; |
} callback; |
- rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, |
- nullptr, nullptr, nullptr, &callback, nullptr, |
+ rtp_sender_.reset(new RTPSender(false, &fake_clock_, &transport_, nullptr, |
+ nullptr, nullptr, &callback, nullptr, nullptr, |
nullptr, nullptr)); |
// Simulate kNumPackets sent with kPacketInterval ms intervals. |
@@ -1201,7 +1281,7 @@ class RtpSenderAudioTest : public RtpSenderTest { |
void SetUp() override { |
payload_ = kAudioPayload; |
- rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, |
+ rtp_sender_.reset(new RTPSender(true, &fake_clock_, &transport_, nullptr, |
nullptr, nullptr, nullptr, nullptr, nullptr, |
nullptr, nullptr)); |
rtp_sender_->SetSequenceNumber(kSeqNum); |