| Index: webrtc/modules/pacing/paced_sender_unittest.cc
 | 
| diff --git a/webrtc/modules/pacing/paced_sender_unittest.cc b/webrtc/modules/pacing/paced_sender_unittest.cc
 | 
| index 4410377e5f8da9b9dd7bc98dbc437f8c89663630..6a0a006c32600f5bfe0489da183d3957d45b9e34 100644
 | 
| --- a/webrtc/modules/pacing/paced_sender_unittest.cc
 | 
| +++ b/webrtc/modules/pacing/paced_sender_unittest.cc
 | 
| @@ -26,11 +26,12 @@ static const int kTargetBitrateBps = 800000;
 | 
|  
 | 
|  class MockPacedSenderCallback : public PacedSender::PacketSender {
 | 
|   public:
 | 
| -  MOCK_METHOD4(TimeToSendPacket,
 | 
| +  MOCK_METHOD5(TimeToSendPacket,
 | 
|                 bool(uint32_t ssrc,
 | 
|                      uint16_t sequence_number,
 | 
|                      int64_t capture_time_ms,
 | 
| -                    bool retransmission));
 | 
| +                    bool retransmission,
 | 
| +                    int probe_cluster_id));
 | 
|    MOCK_METHOD1(TimeToSendPadding,
 | 
|        size_t(size_t bytes));
 | 
|  };
 | 
| @@ -42,11 +43,12 @@ class PacedSenderPadding : public PacedSender::PacketSender {
 | 
|    bool TimeToSendPacket(uint32_t ssrc,
 | 
|                          uint16_t sequence_number,
 | 
|                          int64_t capture_time_ms,
 | 
| -                        bool retransmission) {
 | 
| +                        bool retransmission,
 | 
| +                        int probe_cluster_id) override {
 | 
|      return true;
 | 
|    }
 | 
|  
 | 
| -  size_t TimeToSendPadding(size_t bytes) {
 | 
| +  size_t TimeToSendPadding(size_t bytes) override {
 | 
|      const size_t kPaddingPacketSize = 224;
 | 
|      size_t num_packets = (bytes + kPaddingPacketSize - 1) / kPaddingPacketSize;
 | 
|      padding_sent_ += kPaddingPacketSize * num_packets;
 | 
| @@ -70,12 +72,13 @@ class PacedSenderProbing : public PacedSender::PacketSender {
 | 
|    bool TimeToSendPacket(uint32_t ssrc,
 | 
|                          uint16_t sequence_number,
 | 
|                          int64_t capture_time_ms,
 | 
| -                        bool retransmission) {
 | 
| +                        bool retransmission,
 | 
| +                        int probe_cluster_id) override {
 | 
|      ExpectAndCountPacket();
 | 
|      return true;
 | 
|    }
 | 
|  
 | 
| -  size_t TimeToSendPadding(size_t bytes) {
 | 
| +  size_t TimeToSendPadding(size_t bytes) override {
 | 
|      ExpectAndCountPacket();
 | 
|      return bytes;
 | 
|    }
 | 
| @@ -125,8 +128,8 @@ class PacedSenderTest : public ::testing::Test {
 | 
|                             bool retransmission) {
 | 
|      send_bucket_->InsertPacket(priority, ssrc, sequence_number, capture_time_ms,
 | 
|                                 size, retransmission);
 | 
| -    EXPECT_CALL(callback_,
 | 
| -                TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
 | 
| +    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
 | 
| +                                            capture_time_ms, false, _))
 | 
|          .Times(1)
 | 
|          .WillRepeatedly(Return(true));
 | 
|    }
 | 
| @@ -162,8 +165,8 @@ TEST_F(PacedSenderTest, QueuePacket) {
 | 
|    clock_.AdvanceTimeMilliseconds(1);
 | 
|    EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
 | 
|    EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
 | 
| -  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
 | 
| -                                          queued_packet_timestamp, false))
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
 | 
| +                                          queued_packet_timestamp, false, _))
 | 
|        .Times(1)
 | 
|        .WillRepeatedly(Return(true));
 | 
|    send_bucket_->Process();
 | 
| @@ -212,7 +215,7 @@ TEST_F(PacedSenderTest, PaceQueuedPackets) {
 | 
|    for (int k = 0; k < 10; ++k) {
 | 
|      EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
 | 
|      clock_.AdvanceTimeMilliseconds(5);
 | 
| -    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false))
 | 
| +    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, _, false, _))
 | 
|          .Times(packets_to_send_per_interval)
 | 
|          .WillRepeatedly(Return(true));
 | 
|      EXPECT_EQ(0, send_bucket_->TimeUntilNextProcess());
 | 
| @@ -269,7 +272,7 @@ TEST_F(PacedSenderTest, PaceQueuedPacketsWithDuplicates) {
 | 
|  
 | 
|      for (size_t i = 0; i < packets_to_send_per_interval; ++i) {
 | 
|        EXPECT_CALL(callback_,
 | 
| -                  TimeToSendPacket(ssrc, queued_sequence_number++, _, false))
 | 
| +                  TimeToSendPacket(ssrc, queued_sequence_number++, _, false, _))
 | 
|            .Times(1)
 | 
|            .WillRepeatedly(Return(true));
 | 
|      }
 | 
| @@ -441,7 +444,7 @@ TEST_F(PacedSenderTest, Priority) {
 | 
|  
 | 
|    // Expect all high and normal priority to be sent out first.
 | 
|    EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
 | 
| -  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false))
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, _, capture_time_ms, false, _))
 | 
|        .Times(packets_to_send_per_interval + 1)
 | 
|        .WillRepeatedly(Return(true));
 | 
|  
 | 
| @@ -452,8 +455,8 @@ TEST_F(PacedSenderTest, Priority) {
 | 
|    EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
 | 
|  
 | 
|    EXPECT_CALL(callback_,
 | 
| -              TimeToSendPacket(
 | 
| -                  ssrc_low_priority, _, capture_time_ms_low_priority, false))
 | 
| +              TimeToSendPacket(ssrc_low_priority, _,
 | 
| +                               capture_time_ms_low_priority, false, _))
 | 
|        .Times(1)
 | 
|        .WillRepeatedly(Return(true));
 | 
|  
 | 
| @@ -491,8 +494,8 @@ TEST_F(PacedSenderTest, HighPrioDoesntAffectBudget) {
 | 
|    clock_.AdvanceTimeMilliseconds(5);
 | 
|    send_bucket_->Process();
 | 
|    EXPECT_EQ(1u, send_bucket_->QueueSizePackets());
 | 
| -  EXPECT_CALL(callback_,
 | 
| -              TimeToSendPacket(ssrc, sequence_number++, capture_time_ms, false))
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number++,
 | 
| +                                          capture_time_ms, false, _))
 | 
|        .Times(1)
 | 
|        .WillRepeatedly(Return(true));
 | 
|    EXPECT_EQ(5, send_bucket_->TimeUntilNextProcess());
 | 
| @@ -543,7 +546,7 @@ TEST_F(PacedSenderTest, Pause) {
 | 
|  
 | 
|    // Expect no packet to come out while paused.
 | 
|    EXPECT_CALL(callback_, TimeToSendPadding(_)).Times(0);
 | 
| -  EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _)).Times(0);
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, _)).Times(0);
 | 
|  
 | 
|    for (int i = 0; i < 10; ++i) {
 | 
|      clock_.AdvanceTimeMilliseconds(5);
 | 
| @@ -552,10 +555,11 @@ TEST_F(PacedSenderTest, Pause) {
 | 
|    }
 | 
|    // Expect high prio packets to come out first followed by all packets in the
 | 
|    // way they were added.
 | 
| -  EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false))
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(_, _, capture_time_ms, false, _))
 | 
|        .Times(3)
 | 
|        .WillRepeatedly(Return(true));
 | 
| -  EXPECT_CALL(callback_, TimeToSendPacket(_, _, second_capture_time_ms, false))
 | 
| +  EXPECT_CALL(callback_,
 | 
| +              TimeToSendPacket(_, _, second_capture_time_ms, false, _))
 | 
|        .Times(1)
 | 
|        .WillRepeatedly(Return(true));
 | 
|    send_bucket_->Resume();
 | 
| @@ -584,8 +588,8 @@ TEST_F(PacedSenderTest, ResendPacket) {
 | 
|    EXPECT_EQ(clock_.TimeInMilliseconds() - capture_time_ms,
 | 
|              send_bucket_->QueueInMs());
 | 
|    // Fails to send first packet so only one call.
 | 
| -  EXPECT_CALL(callback_,
 | 
| -              TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
 | 
| +                                          capture_time_ms, false, _))
 | 
|        .Times(1)
 | 
|        .WillOnce(Return(false));
 | 
|    clock_.AdvanceTimeMilliseconds(10000);
 | 
| @@ -596,13 +600,12 @@ TEST_F(PacedSenderTest, ResendPacket) {
 | 
|              send_bucket_->QueueInMs());
 | 
|  
 | 
|    // Fails to send second packet.
 | 
| -  EXPECT_CALL(callback_,
 | 
| -              TimeToSendPacket(ssrc, sequence_number, capture_time_ms, false))
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
 | 
| +                                          capture_time_ms, false, _))
 | 
|        .Times(1)
 | 
|        .WillOnce(Return(true));
 | 
| -  EXPECT_CALL(
 | 
| -      callback_,
 | 
| -      TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
 | 
| +                                          capture_time_ms + 1, false, _))
 | 
|        .Times(1)
 | 
|        .WillOnce(Return(false));
 | 
|    clock_.AdvanceTimeMilliseconds(10000);
 | 
| @@ -613,9 +616,8 @@ TEST_F(PacedSenderTest, ResendPacket) {
 | 
|              send_bucket_->QueueInMs());
 | 
|  
 | 
|    // Send second packet and queue becomes empty.
 | 
| -  EXPECT_CALL(
 | 
| -      callback_,
 | 
| -      TimeToSendPacket(ssrc, sequence_number + 1, capture_time_ms + 1, false))
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
 | 
| +                                          capture_time_ms + 1, false, _))
 | 
|        .Times(1)
 | 
|        .WillOnce(Return(true));
 | 
|    clock_.AdvanceTimeMilliseconds(10000);
 | 
| @@ -768,18 +770,22 @@ TEST_F(PacedSenderTest, PriorityInversion) {
 | 
|    // Packets from earlier frames should be sent first.
 | 
|    {
 | 
|      ::testing::InSequence sequence;
 | 
| -    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
 | 
| -                                            clock_.TimeInMilliseconds(), true))
 | 
| +    EXPECT_CALL(callback_,
 | 
| +                TimeToSendPacket(ssrc, sequence_number,
 | 
| +                                 clock_.TimeInMilliseconds(), true, _))
 | 
|          .WillOnce(Return(true));
 | 
| -    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
 | 
| -                                            clock_.TimeInMilliseconds(), true))
 | 
| +    EXPECT_CALL(callback_,
 | 
| +                TimeToSendPacket(ssrc, sequence_number + 1,
 | 
| +                                 clock_.TimeInMilliseconds(), true, _))
 | 
| +        .WillOnce(Return(true));
 | 
| +    EXPECT_CALL(callback_,
 | 
| +                TimeToSendPacket(ssrc, sequence_number + 3,
 | 
| +                                 clock_.TimeInMilliseconds() + 33, true, _))
 | 
| +        .WillOnce(Return(true));
 | 
| +    EXPECT_CALL(callback_,
 | 
| +                TimeToSendPacket(ssrc, sequence_number + 2,
 | 
| +                                 clock_.TimeInMilliseconds() + 33, true, _))
 | 
|          .WillOnce(Return(true));
 | 
| -    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 3,
 | 
| -                                            clock_.TimeInMilliseconds() + 33,
 | 
| -                                            true)).WillOnce(Return(true));
 | 
| -    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 2,
 | 
| -                                            clock_.TimeInMilliseconds() + 33,
 | 
| -                                            true)).WillOnce(Return(true));
 | 
|  
 | 
|      while (send_bucket_->QueueSizePackets() > 0) {
 | 
|        int time_until_process = send_bucket_->TimeUntilNextProcess();
 | 
| @@ -843,7 +849,7 @@ TEST_F(PacedSenderTest, AverageQueueTime) {
 | 
|    // Only first packet (queued for 20ms) should be removed, leave the second
 | 
|    // packet (queued for 10ms) alone in the queue.
 | 
|    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number,
 | 
| -                                          first_capture_time, false))
 | 
| +                                          first_capture_time, false, _))
 | 
|        .Times(1)
 | 
|        .WillRepeatedly(Return(true));
 | 
|    send_bucket_->Process();
 | 
| @@ -852,7 +858,7 @@ TEST_F(PacedSenderTest, AverageQueueTime) {
 | 
|  
 | 
|    clock_.AdvanceTimeMilliseconds(10);
 | 
|    EXPECT_CALL(callback_, TimeToSendPacket(ssrc, sequence_number + 1,
 | 
| -                                          first_capture_time + 10, false))
 | 
| +                                          first_capture_time + 10, false, _))
 | 
|        .Times(1)
 | 
|        .WillRepeatedly(Return(true));
 | 
|    for (int i = 0; i < 3; ++i) {
 | 
| @@ -863,5 +869,37 @@ TEST_F(PacedSenderTest, AverageQueueTime) {
 | 
|    EXPECT_EQ(0, send_bucket_->AverageQueueTimeMs());
 | 
|  }
 | 
|  
 | 
| +TEST_F(PacedSenderTest, ProbeClusterId) {
 | 
| +  uint32_t ssrc = 12346;
 | 
| +  uint16_t sequence_number = 1234;
 | 
| +  const size_t kPacketSize = 1200;
 | 
| +
 | 
| +  send_bucket_->SetProbingEnabled(true);
 | 
| +  for (int i = 0; i < 11; ++i) {
 | 
| +    send_bucket_->InsertPacket(PacedSender::kNormalPriority, ssrc,
 | 
| +                               sequence_number + i, clock_.TimeInMilliseconds(),
 | 
| +                               kPacketSize, false);
 | 
| +  }
 | 
| +
 | 
| +  // First probing cluster.
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 0))
 | 
| +      .Times(6)
 | 
| +      .WillRepeatedly(Return(true));
 | 
| +  for (int i = 0; i < 6; ++i)
 | 
| +    send_bucket_->Process();
 | 
| +
 | 
| +  // Second probing cluster.
 | 
| +  EXPECT_CALL(callback_, TimeToSendPacket(_, _, _, _, 1))
 | 
| +      .Times(5)
 | 
| +      .WillRepeatedly(Return(true));
 | 
| +  for (int i = 0; i < 5; ++i)
 | 
| +    send_bucket_->Process();
 | 
| +
 | 
| +  // No more probing packets.
 | 
| +  EXPECT_CALL(callback_, TimeToSendPadding(_))
 | 
| +      .Times(1);
 | 
| +  send_bucket_->Process();
 | 
| +}
 | 
| +
 | 
|  }  // namespace test
 | 
|  }  // namespace webrtc
 | 
| 
 |