Home | History | Annotate | Download | only in standard
      1 /*
      2  *  Copyright (c) 2014 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 "webrtc/modules/interface/module_common_types.h"
     12 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h"
     13 #include "webrtc/system_wrappers/interface/atomic32.h"
     14 #include "webrtc/system_wrappers/interface/sleep.h"
     15 #include "webrtc/video_engine/include/vie_network.h"
     16 #include "webrtc/voice_engine/test/auto_test/fixtures/before_streaming_fixture.h"
     17 
     18 using ::testing::_;
     19 using ::testing::AtLeast;
     20 using ::testing::Eq;
     21 using ::testing::Field;
     22 
     23 class ExtensionVerifyTransport : public webrtc::Transport {
     24  public:
     25   ExtensionVerifyTransport()
     26       : parser_(webrtc::RtpHeaderParser::Create()),
     27         received_packets_(0),
     28         bad_packets_(0),
     29         audio_level_id_(-1),
     30         absolute_sender_time_id_(-1) {}
     31 
     32   virtual int SendPacket(int channel, const void* data, int len) {
     33     webrtc::RTPHeader header;
     34     if (parser_->Parse(static_cast<const uint8_t*>(data), len, &header)) {
     35       bool ok = true;
     36       if (audio_level_id_ >= 0 &&
     37           !header.extension.hasAudioLevel) {
     38         ok = false;
     39       }
     40       if (absolute_sender_time_id_ >= 0 &&
     41           !header.extension.hasAbsoluteSendTime) {
     42         ok = false;
     43       }
     44       if (!ok) {
     45         // bad_packets_ count packets we expected to have an extension but
     46         // didn't have one.
     47         ++bad_packets_;
     48       }
     49     }
     50     // received_packets_ count all packets we receive.
     51     ++received_packets_;
     52     return len;
     53   }
     54 
     55   virtual int SendRTCPPacket(int channel, const void* data, int len) {
     56     return len;
     57   }
     58 
     59   void SetAudioLevelId(int id) {
     60     audio_level_id_ = id;
     61     parser_->RegisterRtpHeaderExtension(webrtc::kRtpExtensionAudioLevel, id);
     62   }
     63 
     64   void SetAbsoluteSenderTimeId(int id) {
     65     absolute_sender_time_id_ = id;
     66     parser_->RegisterRtpHeaderExtension(webrtc::kRtpExtensionAbsoluteSendTime,
     67                                         id);
     68   }
     69 
     70   bool Wait() {
     71     // Wait until we've received to specified number of packets.
     72     while (received_packets_.Value() < kPacketsExpected) {
     73       webrtc::SleepMs(kSleepIntervalMs);
     74     }
     75     // Check whether any where 'bad' (didn't contain an extension when they
     76     // where supposed to).
     77     return bad_packets_.Value() == 0;
     78   }
     79 
     80  private:
     81   enum {
     82     kPacketsExpected = 10,
     83     kSleepIntervalMs = 10
     84   };
     85   webrtc::scoped_ptr<webrtc::RtpHeaderParser> parser_;
     86   webrtc::Atomic32 received_packets_;
     87   webrtc::Atomic32 bad_packets_;
     88   int audio_level_id_;
     89   int absolute_sender_time_id_;
     90 };
     91 
     92 class SendRtpRtcpHeaderExtensionsTest : public BeforeStreamingFixture {
     93  protected:
     94   virtual void SetUp() {
     95     EXPECT_EQ(0, voe_network_->DeRegisterExternalTransport(channel_));
     96     EXPECT_EQ(0, voe_network_->RegisterExternalTransport(channel_,
     97                                                          verifying_transport_));
     98   }
     99   virtual void TearDown() {
    100     PausePlaying();
    101   }
    102 
    103   ExtensionVerifyTransport verifying_transport_;
    104 };
    105 
    106 TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeNoAudioLevel) {
    107   verifying_transport_.SetAudioLevelId(0);
    108   ResumePlaying();
    109   EXPECT_FALSE(verifying_transport_.Wait());
    110 }
    111 
    112 TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAudioLevel) {
    113   EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAudioLevelIndicationStatus(channel_, true,
    114                                                                 9));
    115   verifying_transport_.SetAudioLevelId(9);
    116   ResumePlaying();
    117   EXPECT_TRUE(verifying_transport_.Wait());
    118 }
    119 
    120 TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeNoAbsoluteSenderTime)
    121 {
    122   verifying_transport_.SetAbsoluteSenderTimeId(0);
    123   ResumePlaying();
    124   EXPECT_FALSE(verifying_transport_.Wait());
    125 }
    126 
    127 TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAbsoluteSenderTime) {
    128   EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAbsoluteSenderTimeStatus(channel_, true,
    129                                                               11));
    130   verifying_transport_.SetAbsoluteSenderTimeId(11);
    131   ResumePlaying();
    132   EXPECT_TRUE(verifying_transport_.Wait());
    133 }
    134 
    135 TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAllExtensions1) {
    136   EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAudioLevelIndicationStatus(channel_, true,
    137                                                                 9));
    138   EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAbsoluteSenderTimeStatus(channel_, true,
    139                                                               11));
    140   verifying_transport_.SetAudioLevelId(9);
    141   verifying_transport_.SetAbsoluteSenderTimeId(11);
    142   ResumePlaying();
    143   EXPECT_TRUE(verifying_transport_.Wait());
    144 }
    145 
    146 TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAllExtensions2) {
    147   EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAbsoluteSenderTimeStatus(channel_, true,
    148                                                               3));
    149   EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAudioLevelIndicationStatus(channel_, true,
    150                                                                 9));
    151   verifying_transport_.SetAbsoluteSenderTimeId(3);
    152   // Don't register audio level with header parser - unknown extensions should
    153   // be ignored when parsing.
    154   ResumePlaying();
    155   EXPECT_TRUE(verifying_transport_.Wait());
    156 }
    157 
    158 class MockViENetwork : public webrtc::ViENetwork {
    159  public:
    160   MockViENetwork() {}
    161   virtual ~MockViENetwork() {}
    162 
    163   MOCK_METHOD0(Release, int());
    164   MOCK_METHOD2(SetNetworkTransmissionState, void(const int, const bool));
    165   MOCK_METHOD2(RegisterSendTransport, int(const int, webrtc::Transport&));
    166   MOCK_METHOD1(DeregisterSendTransport, int(const int));
    167   MOCK_METHOD4(ReceivedRTPPacket, int(const int, const void*, const int,
    168                                       const webrtc::PacketTime&));
    169   MOCK_METHOD3(ReceivedRTCPPacket, int(const int, const void*, const int));
    170   MOCK_METHOD2(SetMTU, int(int, unsigned int));
    171   MOCK_METHOD4(ReceivedBWEPacket, int(const int, int64_t, int,
    172                                       const webrtc::RTPHeader&));
    173 };
    174 
    175 class ReceiveRtpRtcpHeaderExtensionsTest : public BeforeStreamingFixture {
    176  protected:
    177   virtual void SetUp() {
    178     EXPECT_EQ(0,
    179         voe_rtp_rtcp_->SetSendAbsoluteSenderTimeStatus(channel_, true, 11));
    180     EXPECT_EQ(0,
    181         voe_rtp_rtcp_->SetReceiveAbsoluteSenderTimeStatus(channel_, true, 11));
    182   }
    183 
    184   enum {
    185     kVideoChannelId1 = 667,
    186     kVideoChannelId2 = 668
    187   };
    188   MockViENetwork mock_network_;
    189 };
    190 
    191 TEST_F(ReceiveRtpRtcpHeaderExtensionsTest, ReceiveASTDisabled) {
    192   ResumePlaying();
    193   Sleep(500);
    194 }
    195 
    196 TEST_F(ReceiveRtpRtcpHeaderExtensionsTest, ReceiveASTFailSetTarget) {
    197   EXPECT_CALL(mock_network_, Release()).Times(1);
    198   EXPECT_EQ(-1, voe_rtp_rtcp_->SetVideoEngineBWETarget(-1, &mock_network_,
    199                                                       kVideoChannelId1));
    200   ResumePlaying();
    201 }
    202 
    203 TEST_F(ReceiveRtpRtcpHeaderExtensionsTest, ReceiveASTEnabled) {
    204   EXPECT_CALL(mock_network_, Release()).Times(1);
    205   EXPECT_CALL(mock_network_, ReceivedBWEPacket(kVideoChannelId1, _, _,
    206       Field(&webrtc::RTPHeader::extension,
    207       Field(&webrtc::RTPHeaderExtension::hasAbsoluteSendTime, Eq(true)))))
    208       .Times(AtLeast(1));
    209   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, &mock_network_,
    210                                                       kVideoChannelId1));
    211   ResumePlaying();
    212   Sleep(500);
    213   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, NULL, -1));
    214 }
    215 
    216 TEST_F(ReceiveRtpRtcpHeaderExtensionsTest, ReceiveASTEnabledBadExtensionId) {
    217   EXPECT_CALL(mock_network_, Release()).Times(1);
    218   EXPECT_CALL(mock_network_, ReceivedBWEPacket(kVideoChannelId1, _, _,
    219       Field(&webrtc::RTPHeader::extension,
    220       Field(&webrtc::RTPHeaderExtension::hasAbsoluteSendTime, Eq(false)))))
    221       .Times(AtLeast(1));
    222   EXPECT_EQ(0, voe_rtp_rtcp_->SetReceiveAbsoluteSenderTimeStatus(channel_, true,
    223                                                                  1));
    224   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, &mock_network_,
    225                                                       kVideoChannelId1));
    226   ResumePlaying();
    227   Sleep(500);
    228   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, NULL, -1));
    229 }
    230 
    231 TEST_F(ReceiveRtpRtcpHeaderExtensionsTest, ReceiveASTEnabledNotSending) {
    232   EXPECT_CALL(mock_network_, Release()).Times(1);
    233   EXPECT_CALL(mock_network_, ReceivedBWEPacket(kVideoChannelId1, _, _,
    234       Field(&webrtc::RTPHeader::extension,
    235       Field(&webrtc::RTPHeaderExtension::hasAbsoluteSendTime, Eq(false)))))
    236       .Times(AtLeast(1));
    237   EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAbsoluteSenderTimeStatus(channel_, false,
    238                                                               11));
    239   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, &mock_network_,
    240                                                       kVideoChannelId1));
    241   ResumePlaying();
    242   Sleep(500);
    243   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, NULL, -1));
    244 }
    245 
    246 TEST_F(ReceiveRtpRtcpHeaderExtensionsTest, ReceiveASTEnabledNotReceiving) {
    247   EXPECT_CALL(mock_network_, Release()).Times(1);
    248   EXPECT_CALL(mock_network_, ReceivedBWEPacket(kVideoChannelId1, _, _,
    249       Field(&webrtc::RTPHeader::extension,
    250       Field(&webrtc::RTPHeaderExtension::hasAbsoluteSendTime, Eq(false)))))
    251       .Times(AtLeast(1));
    252   EXPECT_EQ(0, voe_rtp_rtcp_->SetReceiveAbsoluteSenderTimeStatus(channel_,
    253                                                                  false, 11));
    254   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, &mock_network_,
    255                                                       kVideoChannelId1));
    256   ResumePlaying();
    257   Sleep(500);
    258   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, NULL, -1));
    259 }
    260 
    261 TEST_F(ReceiveRtpRtcpHeaderExtensionsTest, ReceiveASTSwitchViENetwork) {
    262   MockViENetwork mock_network_2;
    263   EXPECT_CALL(mock_network_2, Release()).Times(1);
    264   EXPECT_CALL(mock_network_2, ReceivedBWEPacket(kVideoChannelId1, _, _,
    265       Field(&webrtc::RTPHeader::extension,
    266       Field(&webrtc::RTPHeaderExtension::hasAbsoluteSendTime, Eq(true)))))
    267       .Times(AtLeast(1));
    268   EXPECT_CALL(mock_network_, Release()).Times(1);
    269   EXPECT_CALL(mock_network_, ReceivedBWEPacket(kVideoChannelId1, _, _,
    270       Field(&webrtc::RTPHeader::extension,
    271       Field(&webrtc::RTPHeaderExtension::hasAbsoluteSendTime, Eq(true)))))
    272       .Times(AtLeast(1));
    273   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, &mock_network_2,
    274                                                       kVideoChannelId1));
    275   ResumePlaying();
    276   Sleep(500);
    277   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, &mock_network_,
    278                                                       kVideoChannelId1));
    279   Sleep(500);
    280   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, NULL, -1));
    281 }
    282 
    283 TEST_F(ReceiveRtpRtcpHeaderExtensionsTest, ReceiveASTSwitchVideoChannel) {
    284   EXPECT_CALL(mock_network_, Release()).Times(2);
    285   EXPECT_CALL(mock_network_, ReceivedBWEPacket(kVideoChannelId1, _, _,
    286       Field(&webrtc::RTPHeader::extension,
    287       Field(&webrtc::RTPHeaderExtension::hasAbsoluteSendTime, Eq(true)))))
    288       .Times(AtLeast(1));
    289   EXPECT_CALL(mock_network_, ReceivedBWEPacket(kVideoChannelId2, _, _,
    290       Field(&webrtc::RTPHeader::extension,
    291       Field(&webrtc::RTPHeaderExtension::hasAbsoluteSendTime, Eq(true)))))
    292       .Times(AtLeast(1));
    293   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, &mock_network_,
    294                                                       kVideoChannelId1));
    295   ResumePlaying();
    296   Sleep(500);
    297   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, &mock_network_,
    298                                                       kVideoChannelId2));
    299   Sleep(500);
    300   EXPECT_EQ(0, voe_rtp_rtcp_->SetVideoEngineBWETarget(channel_, NULL, -1));
    301 }
    302