| Index: media/cast/rtp_receiver/rtp_parser/rtp_parser_unittest.cc
|
| diff --git a/media/cast/rtp_receiver/rtp_parser/rtp_parser_unittest.cc b/media/cast/rtp_receiver/rtp_parser/rtp_parser_unittest.cc
|
| index 94e67c6183d7daddcdd96ab974dabf298baaa0c2..4e3560a9c7ab570269efd4e5bf1cd63252d0e5fb 100644
|
| --- a/media/cast/rtp_receiver/rtp_parser/rtp_parser_unittest.cc
|
| +++ b/media/cast/rtp_receiver/rtp_parser/rtp_parser_unittest.cc
|
| @@ -2,13 +2,13 @@
|
| // 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 "base/rand_util.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"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace media {
|
| namespace cast {
|
| @@ -20,175 +20,178 @@ static const uint32 kTestTimestamp = 111111;
|
| static const uint16 kTestSeqNum = 4321;
|
| static const uint8 kRefFrameId = 17;
|
|
|
| -class RtpTestParser : public RtpParser {
|
| - public:
|
| - RtpTestParser(const RtpParserConfig config) : RtpParser(config) {
|
| - expected_header_.reset(new RtpCastHeader());
|
| - }
|
| -
|
| - virtual ~RtpTestParser() {}
|
| -
|
| - 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_;
|
| -
|
| - DISALLOW_COPY_AND_ASSIGN(RtpTestParser);
|
| -};
|
| -
|
| class RtpParserTest : public ::testing::Test {
|
| protected:
|
| - RtpParserTest() {
|
| - PopulateConfig();
|
| - rtp_parser_.reset(new RtpTestParser(config_));
|
| - cast_header_.is_reference = true;
|
| - cast_header_.reference_frame_id = kRefFrameId;
|
| + RtpParserTest() : rtp_parser_(kTestSsrc, kTestPayloadType) {
|
| 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.
|
| + cast_header_.sender_ssrc = kTestSsrc;
|
| + cast_header_.sequence_number = kTestSeqNum;
|
| + cast_header_.rtp_timestamp = kTestTimestamp;
|
| + cast_header_.payload_type = kTestPayloadType;
|
| + cast_header_.marker = true;
|
| }
|
|
|
| virtual ~RtpParserTest() {}
|
|
|
| - void PopulateConfig() {
|
| - config_.payload_type = kTestPayloadType;
|
| - config_.ssrc = kTestSsrc;
|
| + void ExpectParsesPacket() {
|
| + RtpCastHeader parsed_header;
|
| + const uint8* payload = NULL;
|
| + size_t payload_size = -1;
|
| + EXPECT_TRUE(rtp_parser_.ParsePacket(
|
| + packet_, kPacketLength, &parsed_header, &payload, &payload_size));
|
| +
|
| + EXPECT_EQ(cast_header_.marker, parsed_header.marker);
|
| + EXPECT_EQ(cast_header_.payload_type, parsed_header.payload_type);
|
| + EXPECT_EQ(cast_header_.sequence_number, parsed_header.sequence_number);
|
| + EXPECT_EQ(cast_header_.rtp_timestamp, parsed_header.rtp_timestamp);
|
| + EXPECT_EQ(cast_header_.sender_ssrc, parsed_header.sender_ssrc);
|
| +
|
| + EXPECT_EQ(cast_header_.is_key_frame, parsed_header.is_key_frame);
|
| + EXPECT_EQ(cast_header_.frame_id, parsed_header.frame_id);
|
| + EXPECT_EQ(cast_header_.packet_id, parsed_header.packet_id);
|
| + EXPECT_EQ(cast_header_.max_packet_id, parsed_header.max_packet_id);
|
| + EXPECT_EQ(cast_header_.reference_frame_id,
|
| + parsed_header.reference_frame_id);
|
| +
|
| + EXPECT_TRUE(!!payload);
|
| + EXPECT_NE(static_cast<size_t>(-1), payload_size);
|
| + }
|
| +
|
| + void ExpectDoesNotParsePacket() {
|
| + RtpCastHeader parsed_header;
|
| + const uint8* payload = NULL;
|
| + size_t payload_size = -1;
|
| + EXPECT_FALSE(rtp_parser_.ParsePacket(
|
| + packet_, kPacketLength, &parsed_header, &payload, &payload_size));
|
| }
|
|
|
| RtpPacketBuilder packet_builder_;
|
| - scoped_ptr<RtpTestParser> rtp_parser_;
|
| - RtpParserConfig config_;
|
| + uint8 packet_[kPacketLength];
|
| + RtpParser rtp_parser_;
|
| 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_parser_->SetExpectedHeader(cast_header_);
|
| - EXPECT_TRUE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| + ExpectParsesPacket();
|
| }
|
|
|
| TEST_F(RtpParserTest, ParseNonDefaultCastPacket) {
|
| - // Build generic data packet.
|
| - uint8 packet[kPacketLength];
|
| packet_builder_.SetKeyFrame(true);
|
| - packet_builder_.SetFrameId(10);
|
| + packet_builder_.SetFrameIds(10, 10);
|
| packet_builder_.SetPacketId(5);
|
| packet_builder_.SetMaxPacketId(15);
|
| packet_builder_.SetMarkerBit(false);
|
| - packet_builder_.BuildHeader(packet, kPacketLength);
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| cast_header_.is_key_frame = true;
|
| cast_header_.frame_id = 10;
|
| + cast_header_.reference_frame_id = 10;
|
| cast_header_.packet_id = 5;
|
| cast_header_.max_packet_id = 15;
|
| - rtp_parser_->SetExpectedHeader(cast_header_);
|
| - // Parse packet as is.
|
| - RtpCastHeader rtp_header;
|
| - EXPECT_TRUE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
|
| + cast_header_.marker = false;
|
| + ExpectParsesPacket();
|
| }
|
|
|
| TEST_F(RtpParserTest, TooBigPacketId) {
|
| - // Build generic data packet.
|
| - uint8 packet[kPacketLength];
|
| packet_builder_.SetKeyFrame(true);
|
| - packet_builder_.SetFrameId(10);
|
| + packet_builder_.SetFrameIds(10, 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));
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| + cast_header_.is_key_frame = true;
|
| + cast_header_.frame_id = 10;
|
| + cast_header_.reference_frame_id = 10;
|
| + cast_header_.packet_id = 15;
|
| + cast_header_.max_packet_id = 5;
|
| + ExpectDoesNotParsePacket();
|
| }
|
|
|
| TEST_F(RtpParserTest, MaxPacketId) {
|
| - // Build generic data packet.
|
| - uint8 packet[kPacketLength];
|
| packet_builder_.SetKeyFrame(true);
|
| - packet_builder_.SetFrameId(10);
|
| + packet_builder_.SetFrameIds(10, 10);
|
| packet_builder_.SetPacketId(65535);
|
| packet_builder_.SetMaxPacketId(65535);
|
| - packet_builder_.BuildHeader(packet, kPacketLength);
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| cast_header_.is_key_frame = true;
|
| cast_header_.frame_id = 10;
|
| + cast_header_.reference_frame_id = 10;
|
| cast_header_.packet_id = 65535;
|
| cast_header_.max_packet_id = 65535;
|
| - rtp_parser_->SetExpectedHeader(cast_header_);
|
| - // Parse packet as is.
|
| - RtpCastHeader rtp_header;
|
| - EXPECT_TRUE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
|
| + ExpectParsesPacket();
|
| }
|
|
|
| TEST_F(RtpParserTest, InvalidPayloadType) {
|
| - // Build generic data packet.
|
| - uint8 packet[kPacketLength];
|
| packet_builder_.SetKeyFrame(true);
|
| - packet_builder_.SetFrameId(10);
|
| + packet_builder_.SetFrameIds(10, 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));
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| + cast_header_.is_key_frame = true;
|
| + cast_header_.frame_id = 10;
|
| + cast_header_.reference_frame_id = 10;
|
| + cast_header_.packet_id = 65535;
|
| + cast_header_.max_packet_id = 65535;
|
| + cast_header_.payload_type = kTestPayloadType - 1;
|
| + ExpectDoesNotParsePacket();
|
| }
|
|
|
| TEST_F(RtpParserTest, InvalidSsrc) {
|
| - // Build generic data packet.
|
| - uint8 packet[kPacketLength];
|
| packet_builder_.SetKeyFrame(true);
|
| - packet_builder_.SetFrameId(10);
|
| + packet_builder_.SetFrameIds(10, 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));
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| + cast_header_.is_key_frame = true;
|
| + cast_header_.frame_id = 10;
|
| + cast_header_.reference_frame_id = 10;
|
| + cast_header_.packet_id = 65535;
|
| + cast_header_.max_packet_id = 65535;
|
| + cast_header_.sender_ssrc = kTestSsrc - 1;
|
| + ExpectDoesNotParsePacket();
|
| }
|
|
|
| -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_parser_->SetExpectedHeader(cast_header_);
|
| - EXPECT_TRUE(rtp_parser_->ParsePacket(packet, kPacketLength, &rtp_header));
|
| +TEST_F(RtpParserTest, ParseCastPacketWithSpecificFrameReference) {
|
| + packet_builder_.SetFrameIds(kRefFrameId + 3, kRefFrameId);
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| + cast_header_.frame_id = kRefFrameId + 3;
|
| + cast_header_.reference_frame_id = kRefFrameId;
|
| + ExpectParsesPacket();
|
| +}
|
| +
|
| +TEST_F(RtpParserTest, ParseExpandingFrameIdTo32Bits) {
|
| + const uint32 kMaxFrameId = 1000;
|
| + packet_builder_.SetKeyFrame(true);
|
| + cast_header_.is_key_frame = true;
|
| + for (uint32 frame_id = 0; frame_id <= kMaxFrameId; ++frame_id) {
|
| + packet_builder_.SetFrameIds(frame_id, frame_id);
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| + cast_header_.frame_id = frame_id;
|
| + cast_header_.reference_frame_id = frame_id;
|
| + ExpectParsesPacket();
|
| + }
|
| +}
|
| +
|
| +TEST_F(RtpParserTest, ParseExpandingReferenceFrameIdTo32Bits) {
|
| + const uint32 kMaxFrameId = 1000;
|
| + const uint32 kMaxBackReferenceOffset = 10;
|
| + packet_builder_.SetKeyFrame(false);
|
| + cast_header_.is_key_frame = false;
|
| + for (uint32 frame_id = kMaxBackReferenceOffset;
|
| + frame_id <= kMaxFrameId; ++frame_id) {
|
| + const uint32 reference_frame_id =
|
| + frame_id - base::RandInt(1, kMaxBackReferenceOffset);
|
| + packet_builder_.SetFrameIds(frame_id, reference_frame_id);
|
| + packet_builder_.BuildHeader(packet_, kPacketLength);
|
| + cast_header_.frame_id = frame_id;
|
| + cast_header_.reference_frame_id = reference_frame_id;
|
| + ExpectParsesPacket();
|
| + }
|
| }
|
|
|
| } // namespace cast
|
|
|