| Index: webrtc/modules/pacing/packet_router_unittest.cc
 | 
| diff --git a/webrtc/modules/pacing/packet_router_unittest.cc b/webrtc/modules/pacing/packet_router_unittest.cc
 | 
| index f7fdf7bbcaee84905669a4fb66421fada55a338f..ef589641c191bc007c21e176f748ae94e4df5a11 100644
 | 
| --- a/webrtc/modules/pacing/packet_router_unittest.cc
 | 
| +++ b/webrtc/modules/pacing/packet_router_unittest.cc
 | 
| @@ -33,19 +33,22 @@ class PacketRouterTest : public ::testing::Test {
 | 
|  };
 | 
|  
 | 
|  TEST_F(PacketRouterTest, TimeToSendPacket) {
 | 
| +  const uint16_t kSsrc1 = 1234;
 | 
| +  const uint16_t kSsrc2 = 4567;
 | 
| +
 | 
|    MockRtpRtcp rtp_1;
 | 
| +  EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
 | 
|    MockRtpRtcp rtp_2;
 | 
| +  EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
 | 
|    packet_router_->AddRtpModule(&rtp_1);
 | 
|    packet_router_->AddRtpModule(&rtp_2);
 | 
|  
 | 
| -  const uint16_t kSsrc1 = 1234;
 | 
|    uint16_t sequence_number = 17;
 | 
|    uint64_t timestamp = 7890;
 | 
|    bool retransmission = false;
 | 
|  
 | 
|    // Send on the first module by letting rtp_1 be sending with correct ssrc.
 | 
|    EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
 | 
| -  EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
 | 
|    EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp,
 | 
|                                        retransmission))
 | 
|        .Times(1)
 | 
| @@ -58,15 +61,15 @@ TEST_F(PacketRouterTest, TimeToSendPacket) {
 | 
|    ++sequence_number;
 | 
|    timestamp += 30;
 | 
|    retransmission = true;
 | 
| -  const uint16_t kSsrc2 = 4567;
 | 
|    EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(false));
 | 
|    EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
 | 
| -  EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
 | 
|    EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0);
 | 
|    EXPECT_CALL(rtp_2, TimeToSendPacket(kSsrc2, sequence_number, timestamp,
 | 
|                                        retransmission))
 | 
|        .Times(1)
 | 
|        .WillOnce(Return(true));
 | 
| +  EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
 | 
| +                                               timestamp, retransmission));
 | 
|    EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number,
 | 
|                                                 timestamp, retransmission));
 | 
|  
 | 
| @@ -77,12 +80,10 @@ TEST_F(PacketRouterTest, TimeToSendPacket) {
 | 
|    EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0);
 | 
|    EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
 | 
|                                                 timestamp, retransmission));
 | 
| +  EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number,
 | 
| +                                               timestamp, retransmission));
 | 
|  
 | 
|    // Add a packet with incorrect ssrc and test it's dropped in the router.
 | 
| -  EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
 | 
| -  EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
 | 
| -  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
 | 
| -  EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
 | 
|    EXPECT_CALL(rtp_1, TimeToSendPacket(_, _, _, _)).Times(0);
 | 
|    EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0);
 | 
|    EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1 + kSsrc2, sequence_number,
 | 
| @@ -92,8 +93,6 @@ TEST_F(PacketRouterTest, TimeToSendPacket) {
 | 
|  
 | 
|    // rtp_1 has been removed, try sending a packet on that ssrc and make sure
 | 
|    // it is dropped as expected by not expecting any calls to rtp_1.
 | 
| -  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
 | 
| -  EXPECT_CALL(rtp_2, SSRC()).Times(1).WillOnce(Return(kSsrc2));
 | 
|    EXPECT_CALL(rtp_2, TimeToSendPacket(_, _, _, _)).Times(0);
 | 
|    EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
 | 
|                                                 timestamp, retransmission));
 | 
| @@ -102,20 +101,30 @@ TEST_F(PacketRouterTest, TimeToSendPacket) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(PacketRouterTest, TimeToSendPadding) {
 | 
| +  const uint16_t kSsrc1 = 1234;
 | 
| +  const uint16_t kSsrc2 = 4567;
 | 
| +
 | 
|    MockRtpRtcp rtp_1;
 | 
| +  EXPECT_CALL(rtp_1, SSRC()).WillRepeatedly(Return(kSsrc1));
 | 
|    MockRtpRtcp rtp_2;
 | 
| +  EXPECT_CALL(rtp_2, SSRC()).WillRepeatedly(Return(kSsrc2));
 | 
|    packet_router_->AddRtpModule(&rtp_1);
 | 
|    packet_router_->AddRtpModule(&rtp_2);
 | 
|  
 | 
| -  // Default configuration, sending padding on the first sending module.
 | 
| +  // Default configuration, sending padding on all modules sending media,
 | 
| +  // ordered by SSRC.
 | 
|    const size_t requested_padding_bytes = 1000;
 | 
|    const size_t sent_padding_bytes = 890;
 | 
|    EXPECT_CALL(rtp_1, SendingMedia()).Times(1).WillOnce(Return(true));
 | 
|    EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes))
 | 
|        .Times(1)
 | 
|        .WillOnce(Return(sent_padding_bytes));
 | 
| -  EXPECT_CALL(rtp_2, TimeToSendPadding(_)).Times(0);
 | 
| -  EXPECT_EQ(sent_padding_bytes,
 | 
| +  EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
 | 
| +  EXPECT_CALL(rtp_2,
 | 
| +              TimeToSendPadding(requested_padding_bytes - sent_padding_bytes))
 | 
| +      .Times(1)
 | 
| +      .WillOnce(Return(requested_padding_bytes - sent_padding_bytes));
 | 
| +  EXPECT_EQ(requested_padding_bytes,
 | 
|              packet_router_->TimeToSendPadding(requested_padding_bytes));
 | 
|  
 | 
|    // Let only the second module be sending and verify the padding request is
 | 
| @@ -134,8 +143,7 @@ TEST_F(PacketRouterTest, TimeToSendPadding) {
 | 
|    EXPECT_CALL(rtp_1, TimeToSendPadding(requested_padding_bytes)).Times(0);
 | 
|    EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(false));
 | 
|    EXPECT_CALL(rtp_2, TimeToSendPadding(_)).Times(0);
 | 
| -  EXPECT_EQ(static_cast<size_t>(0),
 | 
| -            packet_router_->TimeToSendPadding(requested_padding_bytes));
 | 
| +  EXPECT_EQ(0u, packet_router_->TimeToSendPadding(requested_padding_bytes));
 | 
|  
 | 
|    packet_router_->RemoveRtpModule(&rtp_1);
 | 
|  
 | 
| @@ -143,9 +151,108 @@ TEST_F(PacketRouterTest, TimeToSendPadding) {
 | 
|    // to send by not expecting any calls. Instead verify rtp_2 is called.
 | 
|    EXPECT_CALL(rtp_2, SendingMedia()).Times(1).WillOnce(Return(true));
 | 
|    EXPECT_CALL(rtp_2, TimeToSendPadding(requested_padding_bytes)).Times(1);
 | 
| -  EXPECT_EQ(static_cast<size_t>(0),
 | 
| -            packet_router_->TimeToSendPadding(requested_padding_bytes));
 | 
| +  EXPECT_EQ(0u, packet_router_->TimeToSendPadding(requested_padding_bytes));
 | 
|  
 | 
|    packet_router_->RemoveRtpModule(&rtp_2);
 | 
|  }
 | 
| +
 | 
| +TEST_F(PacketRouterTest, ChangingSsrc) {
 | 
| +  const uint16_t kSsrc1 = 1234;
 | 
| +  const uint16_t kSsrc2 = 4567;
 | 
| +  uint16_t sequence_number = 17;
 | 
| +  uint64_t timestamp = 7890;
 | 
| +  bool retransmission = false;
 | 
| +
 | 
| +  MockRtpRtcp rtp_1;
 | 
| +  EXPECT_CALL(rtp_1, SendingMedia()).WillRepeatedly(Return(true));
 | 
| +
 | 
| +  EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc1));
 | 
| +  packet_router_->AddRtpModule(&rtp_1);
 | 
| +
 | 
| +  EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc1, sequence_number, timestamp,
 | 
| +                                      retransmission))
 | 
| +      .Times(1)
 | 
| +      .WillOnce(Return(true));
 | 
| +  EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc1, sequence_number,
 | 
| +                                               timestamp, retransmission));
 | 
| +
 | 
| +  packet_router_->OnSsrcChanged();
 | 
| +
 | 
| +  EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc2));
 | 
| +  EXPECT_CALL(rtp_1, TimeToSendPacket(kSsrc2, sequence_number, timestamp,
 | 
| +                                      retransmission))
 | 
| +      .Times(1)
 | 
| +      .WillOnce(Return(true));
 | 
| +  EXPECT_TRUE(packet_router_->TimeToSendPacket(kSsrc2, sequence_number,
 | 
| +                                               timestamp, retransmission));
 | 
| +
 | 
| +  EXPECT_CALL(rtp_1, SSRC()).Times(1).WillOnce(Return(kSsrc2));
 | 
| +  packet_router_->RemoveRtpModule(&rtp_1);
 | 
| +}
 | 
| +
 | 
| +TEST_F(PacketRouterTest, TransportSeqNotEnabled) {
 | 
| +  packet_router_->SetTransportWideSequenceNumber(1000);
 | 
| +  EXPECT_EQ(0u, packet_router_->AllocateSequenceNumber());
 | 
| +
 | 
| +  const uint16_t kSeq = 1;
 | 
| +  packet_router_->OnPacketSent(kSeq, 1);
 | 
| +  std::vector<PacketInfo> packet_vec;
 | 
| +  packet_vec.push_back(PacketInfo(0, 0, kSeq, 0, false));
 | 
| +  EXPECT_EQ(0u, packet_router_->PopulateSendTimes(&packet_vec));
 | 
| +}
 | 
| +
 | 
| +TEST_F(PacketRouterTest, AddAndPopulateTransportSeq) {
 | 
| +  packet_router_->EnableTransportWideFeedback();
 | 
| +
 | 
| +  const uint16_t kStartSeq = 0xFFF0;
 | 
| +  const int64_t kStartTime = 2000;
 | 
| +  const size_t kNumPackets = 32;
 | 
| +
 | 
| +  packet_router_->SetTransportWideSequenceNumber(kStartSeq - 1);
 | 
| +  std::vector<PacketInfo> packet_vec;
 | 
| +
 | 
| +  for (size_t i = 0; i < kNumPackets; ++i) {
 | 
| +    uint16_t seq = packet_router_->AllocateSequenceNumber();
 | 
| +    packet_router_->OnPacketSent(seq, kStartTime + i);
 | 
| +    packet_vec.push_back(PacketInfo(0, 0, seq, 0, false));
 | 
| +  }
 | 
| +
 | 
| +  EXPECT_EQ(kNumPackets, packet_router_->PopulateSendTimes(&packet_vec));
 | 
| +  for (size_t i = 0; i < kNumPackets; ++i) {
 | 
| +    EXPECT_EQ(static_cast<uint16_t>(kStartSeq + i),
 | 
| +              packet_vec[i].sequence_number);
 | 
| +    EXPECT_EQ(static_cast<int64_t>(kStartTime + i), packet_vec[i].send_time_ms);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
| +TEST_F(PacketRouterTest, AddAndPopulateTransportSeqWithLosses) {
 | 
| +  packet_router_->EnableTransportWideFeedback();
 | 
| +
 | 
| +  const uint16_t kStartSeq = 0xFFF0;
 | 
| +  const int64_t kStartTime = 2000;
 | 
| +  const size_t kNumPackets = 32;
 | 
| +
 | 
| +  packet_router_->SetTransportWideSequenceNumber(kStartSeq - 1);
 | 
| +  std::vector<PacketInfo> packet_vec;
 | 
| +
 | 
| +  for (size_t i = 0; i < kNumPackets; ++i) {
 | 
| +    uint16_t seq = packet_router_->AllocateSequenceNumber();
 | 
| +    packet_router_->OnPacketSent(seq, kStartTime + i);
 | 
| +    packet_vec.push_back(PacketInfo(0, 0, seq, 0, false));
 | 
| +  }
 | 
| +
 | 
| +  const size_t kNumReceivedPackets = 16;
 | 
| +  const size_t kFirstLossPos = 5;
 | 
| +  packet_vec.erase(
 | 
| +      packet_vec.begin() + kFirstLossPos,
 | 
| +      packet_vec.begin() + kFirstLossPos + (kNumPackets - kNumReceivedPackets));
 | 
| +
 | 
| +  EXPECT_EQ(kNumReceivedPackets,
 | 
| +            packet_router_->PopulateSendTimes(&packet_vec));
 | 
| +  for (const PacketInfo& info : packet_vec) {
 | 
| +    uint16_t seq_delta = info.sequence_number - kStartSeq;
 | 
| +    EXPECT_EQ(static_cast<int64_t>(kStartTime + seq_delta), info.send_time_ms);
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  }  // namespace webrtc
 | 
| 
 |