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