Home | History | Annotate | Download | only in video_engine
      1 /*
      2  *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
      3  *
      4  *  Use of this source code is governed by a BSD-style license
      5  *  that can be found in the LICENSE file in the root of the source
      6  *  tree. An additional intellectual property rights grant can be found
      7  *  in the file PATENTS.  All contributing project authors may
      8  *  be found in the AUTHORS file in the root of the source tree.
      9  */
     10 
     11 #include "testing/gmock/include/gmock/gmock.h"
     12 #include "testing/gtest/include/gtest/gtest.h"
     13 
     14 #include "webrtc/modules/rtp_rtcp/interface/rtp_rtcp_defines.h"
     15 #include "webrtc/system_wrappers/interface/scoped_ptr.h"
     16 #include "webrtc/system_wrappers/interface/tick_util.h"
     17 #include "webrtc/video_engine/call_stats.h"
     18 
     19 using ::testing::_;
     20 using ::testing::AnyNumber;
     21 using ::testing::Return;
     22 
     23 namespace webrtc {
     24 
     25 class MockStatsObserver : public CallStatsObserver {
     26  public:
     27   MockStatsObserver() {}
     28   virtual ~MockStatsObserver() {}
     29 
     30   MOCK_METHOD1(OnRttUpdate, void(uint32_t));
     31 };
     32 
     33 class CallStatsTest : public ::testing::Test {
     34  protected:
     35   virtual void SetUp() {
     36     TickTime::UseFakeClock(12345);
     37     call_stats_.reset(new CallStats());
     38   }
     39   scoped_ptr<CallStats> call_stats_;
     40 };
     41 
     42 TEST_F(CallStatsTest, AddAndTriggerCallback) {
     43   MockStatsObserver stats_observer;
     44   RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
     45   call_stats_->RegisterStatsObserver(&stats_observer);
     46   TickTime::AdvanceFakeClock(1000);
     47   EXPECT_EQ(0U, rtcp_rtt_stats->LastProcessedRtt());
     48 
     49   const uint32_t kRtt = 25;
     50   rtcp_rtt_stats->OnRttUpdate(kRtt);
     51   EXPECT_CALL(stats_observer, OnRttUpdate(kRtt))
     52       .Times(1);
     53   call_stats_->Process();
     54   EXPECT_EQ(kRtt, rtcp_rtt_stats->LastProcessedRtt());
     55 
     56   const int kRttTimeOutMs = 1500 + 10;
     57   TickTime::AdvanceFakeClock(kRttTimeOutMs);
     58   EXPECT_CALL(stats_observer, OnRttUpdate(_))
     59       .Times(0);
     60   call_stats_->Process();
     61   EXPECT_EQ(0U, rtcp_rtt_stats->LastProcessedRtt());
     62 
     63   call_stats_->DeregisterStatsObserver(&stats_observer);
     64 }
     65 
     66 TEST_F(CallStatsTest, ProcessTime) {
     67   MockStatsObserver stats_observer;
     68   call_stats_->RegisterStatsObserver(&stats_observer);
     69   RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
     70   rtcp_rtt_stats->OnRttUpdate(100);
     71 
     72   // Time isn't updated yet.
     73   EXPECT_CALL(stats_observer, OnRttUpdate(_))
     74       .Times(0);
     75   call_stats_->Process();
     76 
     77   // Advance clock and verify we get an update.
     78   TickTime::AdvanceFakeClock(1000);
     79   EXPECT_CALL(stats_observer, OnRttUpdate(_))
     80       .Times(1);
     81   call_stats_->Process();
     82 
     83   // Advance clock just too little to get an update.
     84   TickTime::AdvanceFakeClock(999);
     85   rtcp_rtt_stats->OnRttUpdate(100);
     86   EXPECT_CALL(stats_observer, OnRttUpdate(_))
     87       .Times(0);
     88   call_stats_->Process();
     89 
     90   // Advance enough to trigger a new update.
     91   TickTime::AdvanceFakeClock(1);
     92   EXPECT_CALL(stats_observer, OnRttUpdate(_))
     93       .Times(1);
     94   call_stats_->Process();
     95 
     96   call_stats_->DeregisterStatsObserver(&stats_observer);
     97 }
     98 
     99 // Verify all observers get correct estimates and observers can be added and
    100 // removed.
    101 TEST_F(CallStatsTest, MultipleObservers) {
    102   MockStatsObserver stats_observer_1;
    103   call_stats_->RegisterStatsObserver(&stats_observer_1);
    104   // Add the secondobserver twice, there should still be only one report to the
    105   // observer.
    106   MockStatsObserver stats_observer_2;
    107   call_stats_->RegisterStatsObserver(&stats_observer_2);
    108   call_stats_->RegisterStatsObserver(&stats_observer_2);
    109 
    110   RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
    111   uint32_t rtt = 100;
    112   rtcp_rtt_stats->OnRttUpdate(rtt);
    113 
    114   // Verify both observers are updated.
    115   TickTime::AdvanceFakeClock(1000);
    116   EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
    117       .Times(1);
    118   EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
    119       .Times(1);
    120   call_stats_->Process();
    121 
    122   // Deregister the second observer and verify update is only sent to the first
    123   // observer.
    124   call_stats_->DeregisterStatsObserver(&stats_observer_2);
    125   rtcp_rtt_stats->OnRttUpdate(rtt);
    126   TickTime::AdvanceFakeClock(1000);
    127   EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
    128       .Times(1);
    129   EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
    130       .Times(0);
    131   call_stats_->Process();
    132 
    133   // Deregister the first observer.
    134   call_stats_->DeregisterStatsObserver(&stats_observer_1);
    135   rtcp_rtt_stats->OnRttUpdate(rtt);
    136   TickTime::AdvanceFakeClock(1000);
    137   EXPECT_CALL(stats_observer_1, OnRttUpdate(rtt))
    138       .Times(0);
    139   EXPECT_CALL(stats_observer_2, OnRttUpdate(rtt))
    140       .Times(0);
    141   call_stats_->Process();
    142 }
    143 
    144 // Verify increasing and decreasing rtt triggers callbacks with correct values.
    145 TEST_F(CallStatsTest, ChangeRtt) {
    146   MockStatsObserver stats_observer;
    147   call_stats_->RegisterStatsObserver(&stats_observer);
    148   RtcpRttStats* rtcp_rtt_stats = call_stats_->rtcp_rtt_stats();
    149 
    150   // Advance clock to be ready for an update.
    151   TickTime::AdvanceFakeClock(1000);
    152 
    153   // Set a first value and verify the callback is triggered.
    154   const uint32_t first_rtt = 100;
    155   rtcp_rtt_stats->OnRttUpdate(first_rtt);
    156   EXPECT_CALL(stats_observer, OnRttUpdate(first_rtt))
    157       .Times(1);
    158   call_stats_->Process();
    159 
    160   // Increase rtt and verify the new value is reported.
    161   TickTime::AdvanceFakeClock(1000);
    162   const uint32_t high_rtt = first_rtt + 20;
    163   rtcp_rtt_stats->OnRttUpdate(high_rtt);
    164   EXPECT_CALL(stats_observer, OnRttUpdate(high_rtt))
    165       .Times(1);
    166   call_stats_->Process();
    167 
    168   // Increase time enough for a new update, but not too much to make the
    169   // rtt invalid. Report a lower rtt and verify the old/high value still is sent
    170   // in the callback.
    171   TickTime::AdvanceFakeClock(1000);
    172   const uint32_t low_rtt = first_rtt - 20;
    173   rtcp_rtt_stats->OnRttUpdate(low_rtt);
    174   EXPECT_CALL(stats_observer, OnRttUpdate(high_rtt))
    175       .Times(1);
    176   call_stats_->Process();
    177 
    178   // Advance time to make the high report invalid, the lower rtt should now be
    179   // in the callback.
    180   TickTime::AdvanceFakeClock(1000);
    181   EXPECT_CALL(stats_observer, OnRttUpdate(low_rtt))
    182       .Times(1);
    183   call_stats_->Process();
    184 
    185   call_stats_->DeregisterStatsObserver(&stats_observer);
    186 }
    187 
    188 }  // namespace webrtc
    189