blob: 16f17b1340a42f1e03c9af3615d1840c26b1e791 [file] [log] [blame]
/*
* Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include <memory>
#include "webrtc/modules/include/module_common_types.h"
#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h"
#include "webrtc/system_wrappers/include/atomic32.h"
#include "webrtc/system_wrappers/include/sleep.h"
#include "webrtc/voice_engine/test/auto_test/fixtures/before_streaming_fixture.h"
using ::testing::_;
using ::testing::AtLeast;
using ::testing::Eq;
using ::testing::Field;
class ExtensionVerifyTransport : public webrtc::Transport {
public:
ExtensionVerifyTransport()
: parser_(webrtc::RtpHeaderParser::Create()),
received_packets_(0),
bad_packets_(0),
audio_level_id_(-1),
absolute_sender_time_id_(-1) {}
bool SendRtp(const uint8_t* data,
size_t len,
const webrtc::PacketOptions& options) override {
webrtc::RTPHeader header;
if (parser_->Parse(reinterpret_cast<const uint8_t*>(data), len, &header)) {
bool ok = true;
if (audio_level_id_ >= 0 &&
!header.extension.hasAudioLevel) {
ok = false;
}
if (absolute_sender_time_id_ >= 0 &&
!header.extension.hasAbsoluteSendTime) {
ok = false;
}
if (!ok) {
// bad_packets_ count packets we expected to have an extension but
// didn't have one.
++bad_packets_;
}
}
// received_packets_ count all packets we receive.
++received_packets_;
return true;
}
bool SendRtcp(const uint8_t* data, size_t len) override {
return true;
}
void SetAudioLevelId(int id) {
audio_level_id_ = id;
parser_->RegisterRtpHeaderExtension(webrtc::kRtpExtensionAudioLevel, id);
}
void SetAbsoluteSenderTimeId(int id) {
absolute_sender_time_id_ = id;
parser_->RegisterRtpHeaderExtension(webrtc::kRtpExtensionAbsoluteSendTime,
id);
}
bool Wait() {
// Wait until we've received to specified number of packets.
while (received_packets_.Value() < kPacketsExpected) {
webrtc::SleepMs(kSleepIntervalMs);
}
// Check whether any were 'bad' (didn't contain an extension when they
// where supposed to).
return bad_packets_.Value() == 0;
}
private:
enum {
kPacketsExpected = 10,
kSleepIntervalMs = 10
};
std::unique_ptr<webrtc::RtpHeaderParser> parser_;
webrtc::Atomic32 received_packets_;
webrtc::Atomic32 bad_packets_;
int audio_level_id_;
int absolute_sender_time_id_;
};
class SendRtpRtcpHeaderExtensionsTest : public BeforeStreamingFixture {
protected:
void SetUp() override {
EXPECT_EQ(0, voe_network_->DeRegisterExternalTransport(channel_));
EXPECT_EQ(0, voe_network_->RegisterExternalTransport(channel_,
verifying_transport_));
}
void TearDown() override { PausePlaying(); }
ExtensionVerifyTransport verifying_transport_;
};
TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeNoAudioLevel) {
verifying_transport_.SetAudioLevelId(0);
ResumePlaying();
EXPECT_FALSE(verifying_transport_.Wait());
}
TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAudioLevel) {
EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAudioLevelIndicationStatus(channel_, true,
9));
verifying_transport_.SetAudioLevelId(9);
ResumePlaying();
EXPECT_TRUE(verifying_transport_.Wait());
}
TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeNoAbsoluteSenderTime)
{
verifying_transport_.SetAbsoluteSenderTimeId(0);
ResumePlaying();
EXPECT_FALSE(verifying_transport_.Wait());
}
TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAbsoluteSenderTime) {
EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAbsoluteSenderTimeStatus(channel_, true,
11));
verifying_transport_.SetAbsoluteSenderTimeId(11);
ResumePlaying();
EXPECT_TRUE(verifying_transport_.Wait());
}
TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAllExtensions1) {
EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAudioLevelIndicationStatus(channel_, true,
9));
EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAbsoluteSenderTimeStatus(channel_, true,
11));
verifying_transport_.SetAudioLevelId(9);
verifying_transport_.SetAbsoluteSenderTimeId(11);
ResumePlaying();
EXPECT_TRUE(verifying_transport_.Wait());
}
TEST_F(SendRtpRtcpHeaderExtensionsTest, SentPacketsIncludeAllExtensions2) {
EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAbsoluteSenderTimeStatus(channel_, true,
3));
EXPECT_EQ(0, voe_rtp_rtcp_->SetSendAudioLevelIndicationStatus(channel_, true,
9));
verifying_transport_.SetAbsoluteSenderTimeId(3);
// Don't register audio level with header parser - unknown extensions should
// be ignored when parsing.
ResumePlaying();
EXPECT_TRUE(verifying_transport_.Wait());
}