Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(63)

Unified Diff: webrtc/modules/rtp_rtcp/source/rtcp_packet/rpsi_unittest.cc

Issue 1550293003: [rtp_rtcp] rtcp::Rpsi cleaned and got Parse function (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698