blob: c0f91d10fff250ba3d6fae7be43af10e4819a0be [file] [log] [blame]
// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include <gtest/gtest.h>
#include "base/memory/scoped_ptr.h"
#include "media/cast/rtp_receiver/rtp_parser/rtp_parser.h"
#include "media/cast/rtp_receiver/rtp_parser/test/rtp_packet_builder.h"
#include "media/cast/rtp_receiver/rtp_receiver.h"
#include "media/cast/rtp_receiver/rtp_receiver_defines.h"
namespace media {
namespace cast {
static const size_t kPacketLength = 1500;
static const int kTestPayloadType = 127;
static const uint32 kTestSsrc = 1234;
static const uint32 kTestTimestamp = 111111;
static const uint16 kTestSeqNum = 4321;
static const uint8 kRefFrameId = 17;
class RtpDataTest : public RtpData {
public:
RtpDataTest() {
expected_header_.reset(new RtpCastHeader());
}
virtual ~RtpDataTest() {}
void SetExpectedHeader(const RtpCastHeader& cast_header) {
memcpy(expected_header_.get(), &cast_header, sizeof(RtpCastHeader));
}
virtual void OnReceivedPayloadData(const uint8* payloadData,
size_t payloadSize,
const RtpCastHeader* rtpHeader) OVERRIDE {
VerifyCommonHeader(*rtpHeader);
VerifyCastHeader(*rtpHeader);
}
void VerifyCommonHeader(const RtpCastHeader& parsed_header) {
EXPECT_EQ(expected_header_->packet_id == expected_header_->max_packet_id,
parsed_header.webrtc.header.markerBit);
EXPECT_EQ(kTestPayloadType, parsed_header.webrtc.header.payloadType);
EXPECT_EQ(kTestSsrc, parsed_header.webrtc.header.ssrc);
EXPECT_EQ(0, parsed_header.webrtc.header.numCSRCs);
}
void VerifyCastHeader(const RtpCastHeader& parsed_header) {
EXPECT_EQ(expected_header_->is_key_frame, parsed_header.is_key_frame);
EXPECT_EQ(expected_header_->frame_id, parsed_header.frame_id);
EXPECT_EQ(expected_header_->packet_id, parsed_header.packet_id);
EXPECT_EQ(expected_header_->max_packet_id, parsed_header.max_packet_id);
EXPECT_EQ(expected_header_->is_reference, parsed_header.is_reference);
}
private:
scoped_ptr<RtpCastHeader> expected_header_;
};
class RtpParserTest : public ::testing::Test {
protected:
RtpParserTest() {
PopulateConfig();
rtp_data_.reset(new RtpDataTest());
rtp_parser_.reset(new RtpParser(rtp_data_.get(), config_));
}
virtual ~RtpParserTest() {}
virtual void SetUp() {
cast_header_.is_reference = true;
cast_header_.reference_frame_id = kRefFrameId;
packet_builder_.SetSsrc(kTestSsrc);
packet_builder_.SetReferenceFrameId(kRefFrameId, true);
packet_builder_.SetSequenceNumber(kTestSeqNum);
packet_builder_.SetTimestamp(kTestTimestamp);
packet_builder_.SetPayloadType(kTestPayloadType);
packet_builder_.SetMarkerBit(true); // Only one packet.
}
void PopulateConfig() {
config_.payload_type = kTestPayloadType;
config_.ssrc = kTestSsrc;
}
scoped_ptr<RtpDataTest> rtp_data_;
RtpPacketBuilder packet_builder_;
scoped_ptr<RtpParser> rtp_parser_;
RtpParserConfig config_;
RtpCastHeader cast_header_;
};
TEST_F(RtpParserTest, ParseDefaultCastPacket) {
// Build generic data packet.
uint8 packet[kPacketLength];
packet_builder_.BuildHeader(packet, kPacketLength);
// Parse packet as is.
RtpCastHeader rtp_header;
rtp_data_->SetExpectedHeader(cast_header_);
EXPECT_TRUE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
}
TEST_F(RtpParserTest, ParseNonDefaultCastPacket) {
// Build generic data packet.
uint8 packet[kPacketLength];
packet_builder_.SetKeyFrame(true);
packet_builder_.SetFrameId(10);
packet_builder_.SetPacketId(5);
packet_builder_.SetMaxPacketId(15);
packet_builder_.SetMarkerBit(false);
packet_builder_.BuildHeader(packet, kPacketLength);
cast_header_.is_key_frame = true;
cast_header_.frame_id = 10;
cast_header_.packet_id = 5;
cast_header_.max_packet_id = 15;
rtp_data_->SetExpectedHeader(cast_header_);
// Parse packet as is.
RtpCastHeader rtp_header;
EXPECT_TRUE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
}
TEST_F(RtpParserTest, TooBigPacketId) {
// Build generic data packet.
uint8 packet[kPacketLength];
packet_builder_.SetKeyFrame(true);
packet_builder_.SetFrameId(10);
packet_builder_.SetPacketId(15);
packet_builder_.SetMaxPacketId(5);
packet_builder_.BuildHeader(packet, kPacketLength);
// Parse packet as is.
RtpCastHeader rtp_header;
EXPECT_FALSE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
}
TEST_F(RtpParserTest, MaxPacketId) {
// Build generic data packet.
uint8 packet[kPacketLength];
packet_builder_.SetKeyFrame(true);
packet_builder_.SetFrameId(10);
packet_builder_.SetPacketId(65535);
packet_builder_.SetMaxPacketId(65535);
packet_builder_.BuildHeader(packet, kPacketLength);
cast_header_.is_key_frame = true;
cast_header_.frame_id = 10;
cast_header_.packet_id = 65535;
cast_header_.max_packet_id = 65535;
rtp_data_->SetExpectedHeader(cast_header_);
// Parse packet as is.
RtpCastHeader rtp_header;
EXPECT_TRUE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
}
TEST_F(RtpParserTest, InvalidPayloadType) {
// Build generic data packet.
uint8 packet[kPacketLength];
packet_builder_.SetKeyFrame(true);
packet_builder_.SetFrameId(10);
packet_builder_.SetPacketId(65535);
packet_builder_.SetMaxPacketId(65535);
packet_builder_.SetPayloadType(kTestPayloadType - 1);
packet_builder_.BuildHeader(packet, kPacketLength);
// Parse packet as is.
RtpCastHeader rtp_header;
EXPECT_FALSE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
}
TEST_F(RtpParserTest, InvalidSsrc) {
// Build generic data packet.
uint8 packet[kPacketLength];
packet_builder_.SetKeyFrame(true);
packet_builder_.SetFrameId(10);
packet_builder_.SetPacketId(65535);
packet_builder_.SetMaxPacketId(65535);
packet_builder_.SetSsrc(kTestSsrc - 1);
packet_builder_.BuildHeader(packet, kPacketLength);
// Parse packet as is.
RtpCastHeader rtp_header;
EXPECT_FALSE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
}
TEST_F(RtpParserTest, ParseCastPacketWithoutReference) {
cast_header_.is_reference = false;
cast_header_.reference_frame_id = 0;
packet_builder_.SetReferenceFrameId(kRefFrameId, false);
// Build generic data packet.
uint8 packet[kPacketLength];
packet_builder_.BuildHeader(packet, kPacketLength);
// Parse packet as is.
RtpCastHeader rtp_header;
rtp_data_->SetExpectedHeader(cast_header_);
EXPECT_TRUE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
}
} // namespace cast
} // namespace media