Index: webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc |
index 73bdd7a5abd75fac02cbcd1b291912dcae0b2fb2..855414be8da0cbe2fab7873a62e67e69e443e7ab 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtp_rtcp_impl_unittest.cc |
@@ -53,11 +53,12 @@ class SendTransport : public Transport, |
public RtpData { |
public: |
SendTransport() |
- : receiver_(NULL), |
- clock_(NULL), |
+ : receiver_(nullptr), |
+ clock_(nullptr), |
delay_ms_(0), |
- rtp_packets_sent_(0) { |
- } |
+ rtp_packets_sent_(0), |
+ keepalive_payload_type_(0), |
+ num_keepalive_sent_(0) {} |
void SetRtpRtcpModule(ModuleRtpRtcpImpl* receiver) { |
receiver_ = receiver; |
@@ -73,6 +74,8 @@ class SendTransport : public Transport, |
std::unique_ptr<RtpHeaderParser> parser(RtpHeaderParser::Create()); |
EXPECT_TRUE(parser->Parse(static_cast<const uint8_t*>(data), len, &header)); |
++rtp_packets_sent_; |
+ if (header.payloadType == keepalive_payload_type_) |
+ ++num_keepalive_sent_; |
last_rtp_header_ = header; |
return true; |
} |
@@ -93,12 +96,18 @@ class SendTransport : public Transport, |
const WebRtcRTPHeader* rtp_header) override { |
return 0; |
} |
+ void SetKeepalivePayloadType(uint8_t payload_type) { |
+ keepalive_payload_type_ = payload_type; |
+ } |
+ size_t NumKeepaliveSent() { return num_keepalive_sent_; } |
ModuleRtpRtcpImpl* receiver_; |
SimulatedClock* clock_; |
int64_t delay_ms_; |
int rtp_packets_sent_; |
RTPHeader last_rtp_header_; |
std::vector<uint16_t> last_nack_list_; |
+ uint8_t keepalive_payload_type_; |
+ size_t num_keepalive_sent_; |
}; |
class RtpRtcpModule : public RtcpPacketTypeCounterObserver { |
@@ -106,19 +115,9 @@ class RtpRtcpModule : public RtcpPacketTypeCounterObserver { |
explicit RtpRtcpModule(SimulatedClock* clock) |
: receive_statistics_(ReceiveStatistics::Create(clock)), |
remote_ssrc_(0), |
- retransmission_rate_limiter_(clock, kMaxRttMs) { |
- RtpRtcp::Configuration config; |
- config.audio = false; |
- config.clock = clock; |
- config.outgoing_transport = &transport_; |
- config.receive_statistics = receive_statistics_.get(); |
- config.rtcp_packet_type_counter_observer = this; |
- config.rtt_stats = &rtt_stats_; |
- config.retransmission_rate_limiter = &retransmission_rate_limiter_; |
- |
- impl_.reset(new ModuleRtpRtcpImpl(config)); |
- impl_->SetRTCPStatus(RtcpMode::kCompound); |
- |
+ retransmission_rate_limiter_(clock, kMaxRttMs), |
+ clock_(clock) { |
+ CreateModuleImpl(); |
transport_.SimulateNetworkDelay(kOneWayNetworkDelayMs, clock); |
} |
@@ -130,6 +129,7 @@ class RtpRtcpModule : public RtcpPacketTypeCounterObserver { |
std::unique_ptr<ModuleRtpRtcpImpl> impl_; |
uint32_t remote_ssrc_; |
RateLimiter retransmission_rate_limiter_; |
+ VideoSendStream::Config::Rtp::KeepAlive keepalive_config_; |
void SetRemoteSsrc(uint32_t ssrc) { |
remote_ssrc_ = ssrc; |
@@ -160,8 +160,30 @@ class RtpRtcpModule : public RtcpPacketTypeCounterObserver { |
std::vector<uint16_t> LastNackListSent() { |
return transport_.last_nack_list_; |
} |
+ void SetKeepaliveConfigAndReset( |
+ const VideoSendStream::Config::Rtp::KeepAlive& config) { |
+ keepalive_config_ = config; |
+ // Need to create a new module impl, since it's configured at creation. |
+ CreateModuleImpl(); |
+ } |
private: |
+ void CreateModuleImpl() { |
+ RtpRtcp::Configuration config; |
+ config.audio = false; |
+ config.clock = clock_; |
+ config.outgoing_transport = &transport_; |
+ config.receive_statistics = receive_statistics_.get(); |
+ config.rtcp_packet_type_counter_observer = this; |
+ config.rtt_stats = &rtt_stats_; |
+ config.retransmission_rate_limiter = &retransmission_rate_limiter_; |
+ config.keepalive_config = keepalive_config_; |
+ |
+ impl_.reset(new ModuleRtpRtcpImpl(config)); |
+ impl_->SetRTCPStatus(RtcpMode::kCompound); |
+ } |
+ |
+ SimulatedClock* const clock_; |
std::map<uint32_t, RtcpPacketTypeCounter> counter_map_; |
}; |
} // namespace |
@@ -169,9 +191,9 @@ class RtpRtcpModule : public RtcpPacketTypeCounterObserver { |
class RtpRtcpImplTest : public ::testing::Test { |
protected: |
RtpRtcpImplTest() |
- : clock_(133590000000000), |
- sender_(&clock_), |
- receiver_(&clock_) { |
+ : clock_(133590000000000), sender_(&clock_), receiver_(&clock_) {} |
+ |
+ void SetUp() override { |
// Send module. |
sender_.impl_->SetSSRC(kSenderSsrc); |
EXPECT_EQ(0, sender_.impl_->SetSendingStatus(true)); |
@@ -196,6 +218,7 @@ class RtpRtcpImplTest : public ::testing::Test { |
sender_.transport_.SetRtpRtcpModule(receiver_.impl_.get()); |
receiver_.transport_.SetRtpRtcpModule(sender_.impl_.get()); |
} |
+ |
SimulatedClock clock_; |
RtpRtcpModule sender_; |
RtpRtcpModule receiver_; |
@@ -567,4 +590,58 @@ TEST_F(RtpRtcpImplTest, UniqueNackRequests) { |
EXPECT_EQ(6U, sender_.RtcpReceived().unique_nack_requests); |
EXPECT_EQ(75, sender_.RtcpReceived().UniqueNackRequestsInPercent()); |
} |
+ |
+TEST_F(RtpRtcpImplTest, SendsKeepaliveAfterTimout) { |
+ const int kTimeout = 1500; |
åsapersson
2017/06/30 15:09:13
kTimeoutMs
sprang_webrtc
2017/06/30 16:20:59
Done.
|
+ |
+ VideoSendStream::Config::Rtp::KeepAlive config; |
+ config.timeout_interval_ms = kTimeout; |
+ |
+ // Recreate sender impl with new configuration, and redo setup. |
+ sender_.SetKeepaliveConfigAndReset(config); |
+ SetUp(); |
+ |
+ // Initial process call. |
+ sender_.impl_->Process(); |
+ EXPECT_EQ(0U, sender_.transport_.NumKeepaliveSent()); |
+ |
+ // After one time, a single keep-alive packet should be sent. |
+ clock_.AdvanceTimeMilliseconds(kTimeout); |
+ sender_.impl_->Process(); |
+ EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent()); |
+ |
+ // Process for the same timestamp again, no new packet shold be sent. |
åsapersson
2017/06/30 15:09:13
should
sprang_webrtc
2017/06/30 16:21:00
Done.
|
+ sender_.impl_->Process(); |
+ EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent()); |
+ |
+ // Move ahead to the last ms before a keep-alive is expected, no action. |
+ clock_.AdvanceTimeMilliseconds(kTimeout - 1); |
+ sender_.impl_->Process(); |
+ EXPECT_EQ(1U, sender_.transport_.NumKeepaliveSent()); |
+ |
+ // Move the final ms, timeout relative last KA. Should create new keep-alive. |
+ clock_.AdvanceTimeMilliseconds(1); |
+ sender_.impl_->Process(); |
+ EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent()); |
+ |
+ // Move ahead to the last ms before Christmas. |
+ clock_.AdvanceTimeMilliseconds(kTimeout - 1); |
+ sender_.impl_->Process(); |
+ EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent()); |
+ |
+ // Send actual payload data, no keep-alive expected. |
+ SendFrame(&sender_, 0); |
+ sender_.impl_->Process(); |
+ EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent()); |
+ |
+ // Move ahead as far as possible again, timeout now relative payload. No KA. |
+ clock_.AdvanceTimeMilliseconds(kTimeout - 1); |
+ sender_.impl_->Process(); |
+ EXPECT_EQ(2U, sender_.transport_.NumKeepaliveSent()); |
+ |
+ // Timeout relative payload, send new keep-alive. |
+ clock_.AdvanceTimeMilliseconds(1); |
+ sender_.impl_->Process(); |
+ EXPECT_EQ(3U, sender_.transport_.NumKeepaliveSent()); |
+} |
} // namespace webrtc |