Home | History | Annotate | Download | only in rtp_receiver
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include <gtest/gtest.h>
      6 
      7 #include <stdint.h>
      8 
      9 #include "base/test/simple_test_tick_clock.h"
     10 #include "base/time/time.h"
     11 #include "media/cast/rtp_receiver/receiver_stats.h"
     12 #include "media/cast/rtp_receiver/rtp_receiver_defines.h"
     13 
     14 namespace media {
     15 namespace cast {
     16 
     17 static const int64 kStartMillisecond = INT64_C(12345678900000);
     18 static const uint32 kStdTimeIncrementMs = 33;
     19 
     20 class ReceiverStatsTest : public ::testing::Test {
     21  protected:
     22   ReceiverStatsTest()
     23       : stats_(&testing_clock_),
     24         fraction_lost_(0),
     25         cumulative_lost_(0),
     26         extended_high_sequence_number_(0),
     27         jitter_(0) {
     28     testing_clock_.Advance(
     29         base::TimeDelta::FromMilliseconds(kStartMillisecond));
     30     start_time_ = testing_clock_.NowTicks();
     31     delta_increments_ = base::TimeDelta::FromMilliseconds(kStdTimeIncrementMs);
     32   }
     33   virtual ~ReceiverStatsTest() {}
     34 
     35   uint32 ExpectedJitter(uint32 const_interval, int num_packets) {
     36     float jitter = 0;
     37     // Assume timestamps have a constant kStdTimeIncrementMs interval.
     38     float float_interval =
     39         static_cast<float>(const_interval - kStdTimeIncrementMs);
     40     for (int i = 0; i < num_packets; ++i) {
     41       jitter += (float_interval - jitter) / 16;
     42     }
     43     return static_cast<uint32>(jitter + 0.5f);
     44   }
     45 
     46   ReceiverStats stats_;
     47   RtpCastHeader rtp_header_;
     48   uint8 fraction_lost_;
     49   uint32 cumulative_lost_;
     50   uint32 extended_high_sequence_number_;
     51   uint32 jitter_;
     52   base::SimpleTestTickClock testing_clock_;
     53   base::TimeTicks start_time_;
     54   base::TimeDelta delta_increments_;
     55 
     56   DISALLOW_COPY_AND_ASSIGN(ReceiverStatsTest);
     57 };
     58 
     59 TEST_F(ReceiverStatsTest, ResetState) {
     60   stats_.GetStatistics(&fraction_lost_,
     61                        &cumulative_lost_,
     62                        &extended_high_sequence_number_,
     63                        &jitter_);
     64   EXPECT_EQ(0u, fraction_lost_);
     65   EXPECT_EQ(0u, cumulative_lost_);
     66   EXPECT_EQ(0u, extended_high_sequence_number_);
     67   EXPECT_EQ(0u, jitter_);
     68 }
     69 
     70 TEST_F(ReceiverStatsTest, LossCount) {
     71   for (int i = 0; i < 300; ++i) {
     72     if (i % 4)
     73       stats_.UpdateStatistics(rtp_header_);
     74     if (i % 3) {
     75       rtp_header_.rtp_timestamp += 33 * 90;
     76     }
     77     ++rtp_header_.sequence_number;
     78     testing_clock_.Advance(delta_increments_);
     79   }
     80   stats_.GetStatistics(&fraction_lost_,
     81                        &cumulative_lost_,
     82                        &extended_high_sequence_number_,
     83                        &jitter_);
     84   EXPECT_EQ(63u, fraction_lost_);
     85   EXPECT_EQ(74u, cumulative_lost_);
     86   // Build extended sequence number.
     87   const uint32 extended_seq_num = rtp_header_.sequence_number - 1;
     88   EXPECT_EQ(extended_seq_num, extended_high_sequence_number_);
     89 }
     90 
     91 TEST_F(ReceiverStatsTest, NoLossWrap) {
     92   rtp_header_.sequence_number = 65500;
     93   for (int i = 0; i < 300; ++i) {
     94     stats_.UpdateStatistics(rtp_header_);
     95     if (i % 3) {
     96       rtp_header_.rtp_timestamp += 33 * 90;
     97     }
     98     ++rtp_header_.sequence_number;
     99     testing_clock_.Advance(delta_increments_);
    100   }
    101   stats_.GetStatistics(&fraction_lost_,
    102                        &cumulative_lost_,
    103                        &extended_high_sequence_number_,
    104                        &jitter_);
    105   EXPECT_EQ(0u, fraction_lost_);
    106   EXPECT_EQ(0u, cumulative_lost_);
    107   // Build extended sequence number (one wrap cycle).
    108   const uint32 extended_seq_num = (1 << 16) + rtp_header_.sequence_number - 1;
    109   EXPECT_EQ(extended_seq_num, extended_high_sequence_number_);
    110 }
    111 
    112 TEST_F(ReceiverStatsTest, LossCountWrap) {
    113   const uint32 kStartSequenceNumber = 65500;
    114   rtp_header_.sequence_number = kStartSequenceNumber;
    115   for (int i = 0; i < 300; ++i) {
    116     if (i % 4)
    117       stats_.UpdateStatistics(rtp_header_);
    118     if (i % 3)
    119       // Update timestamp.
    120       ++rtp_header_.rtp_timestamp;
    121     ++rtp_header_.sequence_number;
    122     testing_clock_.Advance(delta_increments_);
    123   }
    124   stats_.GetStatistics(&fraction_lost_,
    125                        &cumulative_lost_,
    126                        &extended_high_sequence_number_,
    127                        &jitter_);
    128   EXPECT_EQ(63u, fraction_lost_);
    129   EXPECT_EQ(74u, cumulative_lost_);
    130   // Build extended sequence number (one wrap cycle).
    131   const uint32 extended_seq_num = (1 << 16) + rtp_header_.sequence_number - 1;
    132   EXPECT_EQ(extended_seq_num, extended_high_sequence_number_);
    133 }
    134 
    135 TEST_F(ReceiverStatsTest, BasicJitter) {
    136   for (int i = 0; i < 300; ++i) {
    137     stats_.UpdateStatistics(rtp_header_);
    138     ++rtp_header_.sequence_number;
    139     rtp_header_.rtp_timestamp += 33 * 90;
    140     testing_clock_.Advance(delta_increments_);
    141   }
    142   stats_.GetStatistics(&fraction_lost_,
    143                        &cumulative_lost_,
    144                        &extended_high_sequence_number_,
    145                        &jitter_);
    146   EXPECT_FALSE(fraction_lost_);
    147   EXPECT_FALSE(cumulative_lost_);
    148   // Build extended sequence number (one wrap cycle).
    149   const uint32 extended_seq_num = rtp_header_.sequence_number - 1;
    150   EXPECT_EQ(extended_seq_num, extended_high_sequence_number_);
    151   EXPECT_EQ(ExpectedJitter(kStdTimeIncrementMs, 300), jitter_);
    152 }
    153 
    154 TEST_F(ReceiverStatsTest, NonTrivialJitter) {
    155   const int kAdditionalIncrement = 5;
    156   for (int i = 0; i < 300; ++i) {
    157     stats_.UpdateStatistics(rtp_header_);
    158     ++rtp_header_.sequence_number;
    159     rtp_header_.rtp_timestamp += 33 * 90;
    160     base::TimeDelta additional_delta =
    161         base::TimeDelta::FromMilliseconds(kAdditionalIncrement);
    162     testing_clock_.Advance(delta_increments_ + additional_delta);
    163   }
    164   stats_.GetStatistics(&fraction_lost_,
    165                        &cumulative_lost_,
    166                        &extended_high_sequence_number_,
    167                        &jitter_);
    168   EXPECT_FALSE(fraction_lost_);
    169   EXPECT_FALSE(cumulative_lost_);
    170   // Build extended sequence number (one wrap cycle).
    171   const uint32 extended_seq_num = rtp_header_.sequence_number - 1;
    172   EXPECT_EQ(extended_seq_num, extended_high_sequence_number_);
    173   EXPECT_EQ(ExpectedJitter(kStdTimeIncrementMs + kAdditionalIncrement, 300),
    174             jitter_);
    175 }
    176 
    177 }  // namespace cast
    178 }  // namespace media
    179