Index: webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi_unittest.cc |
diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi_unittest.cc |
index 4857a2a0a9cfc88e3f7b24475b7e5cffdeb6bf99..4e1235e6022cef4fdd795629d404221a3c384ce2 100644 |
--- a/webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi_unittest.cc |
+++ b/webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi_unittest.cc |
@@ -12,29 +12,128 @@ |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
+#include "webrtc/base/checks.h" |
-#include "webrtc/test/rtcp_packet_parser.h" |
- |
+using testing::ElementsAreArray; |
+using testing::make_tuple; |
using webrtc::rtcp::RawPacket; |
using webrtc::rtcp::Rpsi; |
-using webrtc::test::RtcpPacketParser; |
+using webrtc::RTCPUtility::RtcpCommonHeader; |
+using webrtc::RTCPUtility::RtcpParseCommonHeader; |
namespace webrtc { |
+namespace { |
+const uint32_t kSenderSsrc = 0x12345678; |
+const uint32_t kRemoteSsrc = 0x23456789; |
+// 10000|01 100001|0 1000011 (7 bits = 1 byte in native string). |
+const uint64_t kPictureId = 0x106143; |
+const uint8_t kPayloadType = 100; |
+// Manually created Rpsi packet matching constants above. |
+const uint8_t kPacket[] = {0x83, 206, 0x00, 0x04, |
+ 0x12, 0x34, 0x56, 0x78, |
+ 0x23, 0x45, 0x67, 0x89, |
+ 24, 100, 0xc1, 0xc2, |
+ 0x43, 0, 0, 0}; |
+ |
+bool ParseRpsi(const uint8_t* buffer, size_t length, Rpsi* rpsi) { |
+ RtcpCommonHeader header; |
+ EXPECT_TRUE(RtcpParseCommonHeader(buffer, length, &header)); |
+ EXPECT_EQ(length, header.BlockSize()); |
+ return rpsi->Parse(header, buffer + RtcpCommonHeader::kHeaderSizeBytes); |
+} |
+// Testing function when test only interested if parse is successful. |
+bool ParseRpsi(const uint8_t* buffer, size_t length) { |
+ Rpsi rpsi; |
+ return ParseRpsi(buffer, length, &rpsi); |
+} |
+} // namespace |
+ |
+TEST(RtcpPacketRpsiTest, Parse) { |
+ Rpsi mutable_parsed; |
+ EXPECT_TRUE(ParseRpsi(kPacket, sizeof(kPacket), &mutable_parsed)); |
+ const Rpsi& parsed = mutable_parsed; // Read values from constant object. |
+ |
+ EXPECT_EQ(kSenderSsrc, parsed.sender_ssrc()); |
+ EXPECT_EQ(kRemoteSsrc, parsed.media_ssrc()); |
+ EXPECT_EQ(kPayloadType, parsed.payload_type()); |
+ EXPECT_EQ(kPictureId, parsed.picture_id()); |
+} |
+ |
+TEST(RtcpPacketRpsiTest, Create) { |
+ Rpsi rpsi; |
+ rpsi.From(kSenderSsrc); |
+ rpsi.To(kRemoteSsrc); |
+ rpsi.WithPayloadType(kPayloadType); |
+ rpsi.WithPictureId(kPictureId); |
+ |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ |
+ EXPECT_THAT(make_tuple(packet->Buffer(), packet->Length()), |
+ ElementsAreArray(kPacket)); |
+} |
+ |
+TEST(RtcpPacketRpsiTest, ParseFailsOnTooSmallPacket) { |
+ Rpsi rpsi; |
+ rpsi.From(kSenderSsrc); |
+ rpsi.To(kRemoteSsrc); |
+ |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ packet->MutableBuffer()[3]--; // Reduce size field by one word (4 bytes). |
+ |
+ EXPECT_FALSE(ParseRpsi(packet->Buffer(), packet->Length() - 4)); |
+} |
+ |
+TEST(RtcpPacketRpsiTest, ParseFailsOnFractionalPaddingBytes) { |
+ Rpsi rpsi; |
+ rpsi.From(kSenderSsrc); |
+ rpsi.To(kRemoteSsrc); |
+ rpsi.WithPictureId(kPictureId); |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ uint8_t* padding_bits = packet->MutableBuffer() + 12; |
+ uint8_t saved_padding_bits = *padding_bits; |
+ ASSERT_TRUE(ParseRpsi(packet->Buffer(), packet->Length())); |
+ |
+ for (uint8_t i = 1; i < 8; ++i) { |
+ *padding_bits = saved_padding_bits + i; |
+ EXPECT_FALSE(ParseRpsi(packet->Buffer(), packet->Length())); |
+ } |
+} |
+ |
+TEST(RtcpPacketRpsiTest, ParseFailsOnTooBigPadding) { |
+ Rpsi rpsi; |
+ rpsi.From(kSenderSsrc); |
+ rpsi.To(kRemoteSsrc); |
+ rpsi.WithPictureId(1); // Small picture id that occupy just 1 byte. |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ uint8_t* padding_bits = packet->MutableBuffer() + 12; |
+ ASSERT_TRUE(ParseRpsi(packet->Buffer(), packet->Length())); |
+ |
+ *padding_bits += 8; |
+ EXPECT_FALSE(ParseRpsi(packet->Buffer(), packet->Length())); |
+} |
+ |
+// For raw rpsi packet extract how many bytes are used to store picture_id. |
+size_t UsedBytes(const RawPacket& packet) { // Works for small packets only. |
+ RTC_CHECK_EQ(packet.Buffer()[2], 0); // Assume packet is small. |
+ size_t total_rpsi_payload_bytes = 4 * (packet.Buffer()[3] - 2) - 2; |
+ uint8_t padding_bits = packet.Buffer()[12]; |
+ RTC_CHECK_EQ(padding_bits % 8, 0); |
+ return total_rpsi_payload_bytes - (padding_bits / 8); |
+} |
TEST(RtcpPacketRpsiTest, WithOneByteNativeString) { |
Rpsi rpsi; |
// 1000001 (7 bits = 1 byte in native string). |
const uint64_t kPictureId = 0x41; |
const uint16_t kNumberOfValidBytes = 1; |
- rpsi.WithPayloadType(100); |
rpsi.WithPictureId(kPictureId); |
- rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); |
- RtcpPacketParser parser; |
- parser.Parse(packet->Buffer(), packet->Length()); |
- EXPECT_EQ(100, parser.rpsi()->PayloadType()); |
- EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); |
- EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); |
+ |
+ Rpsi parsed; |
+ EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); |
+ EXPECT_EQ(kPictureId, parsed.picture_id()); |
} |
TEST(RtcpPacketRpsiTest, WithTwoByteNativeString) { |
@@ -44,11 +143,12 @@ TEST(RtcpPacketRpsiTest, WithTwoByteNativeString) { |
const uint16_t kNumberOfValidBytes = 2; |
rpsi.WithPictureId(kPictureId); |
- rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); |
- RtcpPacketParser parser; |
- parser.Parse(packet->Buffer(), packet->Length()); |
- EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); |
- EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); |
+ |
+ Rpsi parsed; |
+ EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); |
+ EXPECT_EQ(kPictureId, parsed.picture_id()); |
} |
TEST(RtcpPacketRpsiTest, WithThreeByteNativeString) { |
@@ -58,11 +158,12 @@ TEST(RtcpPacketRpsiTest, WithThreeByteNativeString) { |
const uint16_t kNumberOfValidBytes = 3; |
rpsi.WithPictureId(kPictureId); |
- rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); |
- RtcpPacketParser parser; |
- parser.Parse(packet->Buffer(), packet->Length()); |
- EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); |
- EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); |
+ |
+ Rpsi parsed; |
+ EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); |
+ EXPECT_EQ(kPictureId, parsed.picture_id()); |
} |
TEST(RtcpPacketRpsiTest, WithFourByteNativeString) { |
@@ -72,11 +173,12 @@ TEST(RtcpPacketRpsiTest, WithFourByteNativeString) { |
const uint16_t kNumberOfValidBytes = 4; |
rpsi.WithPictureId(kPictureId); |
- rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); |
- RtcpPacketParser parser; |
- parser.Parse(packet->Buffer(), packet->Length()); |
- EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); |
- EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); |
+ |
+ Rpsi parsed; |
+ EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); |
+ EXPECT_EQ(kPictureId, parsed.picture_id()); |
} |
TEST(RtcpPacketRpsiTest, WithMaxPictureId) { |
@@ -87,11 +189,11 @@ TEST(RtcpPacketRpsiTest, WithMaxPictureId) { |
const uint16_t kNumberOfValidBytes = 10; |
rpsi.WithPictureId(kPictureId); |
- rtc::scoped_ptr<RawPacket> packet(rpsi.Build()); |
- RtcpPacketParser parser; |
- parser.Parse(packet->Buffer(), packet->Length()); |
- EXPECT_EQ(kNumberOfValidBytes * 8, parser.rpsi()->NumberOfValidBits()); |
- EXPECT_EQ(kPictureId, parser.rpsi()->PictureId()); |
-} |
+ rtc::scoped_ptr<RawPacket> packet = rpsi.Build(); |
+ EXPECT_EQ(kNumberOfValidBytes, UsedBytes(*packet)); |
+ Rpsi parsed; |
+ EXPECT_TRUE(ParseRpsi(packet->Buffer(), packet->Length(), &parsed)); |
+ EXPECT_EQ(kPictureId, parsed.picture_id()); |
+} |
} // namespace webrtc |