xref: /aosp_15_r20/external/webrtc/media/base/rtp_utils_unittest.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright (c) 2004 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #include "media/base/rtp_utils.h"
12*d9f75844SAndroid Build Coastguard Worker 
13*d9f75844SAndroid Build Coastguard Worker #include <string.h>
14*d9f75844SAndroid Build Coastguard Worker 
15*d9f75844SAndroid Build Coastguard Worker #include <cstdint>
16*d9f75844SAndroid Build Coastguard Worker #include <vector>
17*d9f75844SAndroid Build Coastguard Worker 
18*d9f75844SAndroid Build Coastguard Worker #include "media/base/fake_rtp.h"
19*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/async_packet_socket.h"
20*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
21*d9f75844SAndroid Build Coastguard Worker 
22*d9f75844SAndroid Build Coastguard Worker namespace cricket {
23*d9f75844SAndroid Build Coastguard Worker 
24*d9f75844SAndroid Build Coastguard Worker static const uint8_t kInvalidPacket[] = {0x80, 0x00};
25*d9f75844SAndroid Build Coastguard Worker 
26*d9f75844SAndroid Build Coastguard Worker // PT = 206, FMT = 1, Sender SSRC  = 0x1111, Media SSRC = 0x1111
27*d9f75844SAndroid Build Coastguard Worker // No FCI information is needed for PLI.
28*d9f75844SAndroid Build Coastguard Worker static const uint8_t kNonCompoundRtcpPliFeedbackPacket[] = {
29*d9f75844SAndroid Build Coastguard Worker     0x81, 0xCE, 0x00, 0x0C, 0x00, 0x00, 0x11, 0x11, 0x00, 0x00, 0x11, 0x11};
30*d9f75844SAndroid Build Coastguard Worker 
31*d9f75844SAndroid Build Coastguard Worker // Packet has only mandatory fixed RTCP header
32*d9f75844SAndroid Build Coastguard Worker // PT = 204, SSRC = 0x1111
33*d9f75844SAndroid Build Coastguard Worker static const uint8_t kNonCompoundRtcpAppPacket[] = {0x81, 0xCC, 0x00, 0x0C,
34*d9f75844SAndroid Build Coastguard Worker                                                     0x00, 0x00, 0x11, 0x11};
35*d9f75844SAndroid Build Coastguard Worker 
36*d9f75844SAndroid Build Coastguard Worker // PT = 202, Source count = 0
37*d9f75844SAndroid Build Coastguard Worker static const uint8_t kNonCompoundRtcpSDESPacket[] = {0x80, 0xCA, 0x00, 0x00};
38*d9f75844SAndroid Build Coastguard Worker 
39*d9f75844SAndroid Build Coastguard Worker static uint8_t kFakeTag[4] = {0xba, 0xdd, 0xba, 0xdd};
40*d9f75844SAndroid Build Coastguard Worker static uint8_t kTestKey[] = "12345678901234567890";
41*d9f75844SAndroid Build Coastguard Worker static uint8_t kTestAstValue[3] = {0xaa, 0xbb, 0xcc};
42*d9f75844SAndroid Build Coastguard Worker 
43*d9f75844SAndroid Build Coastguard Worker // Valid rtp Message with 2 byte header extension.
44*d9f75844SAndroid Build Coastguard Worker static uint8_t kRtpMsgWith2ByteExtnHeader[] = {
45*d9f75844SAndroid Build Coastguard Worker     // clang-format off
46*d9f75844SAndroid Build Coastguard Worker     // clang formatting doesn't respect inline comments.
47*d9f75844SAndroid Build Coastguard Worker   0x90, 0x00, 0x00, 0x00,
48*d9f75844SAndroid Build Coastguard Worker   0x00, 0x00, 0x00, 0x00,
49*d9f75844SAndroid Build Coastguard Worker   0xAA, 0xBB, 0xCC, 0XDD,  // SSRC
50*d9f75844SAndroid Build Coastguard Worker   0x10, 0x00, 0x00, 0x01,  // 2 Byte header extension
51*d9f75844SAndroid Build Coastguard Worker   0x01, 0x00, 0x00, 0x00
52*d9f75844SAndroid Build Coastguard Worker     // clang-format on
53*d9f75844SAndroid Build Coastguard Worker };
54*d9f75844SAndroid Build Coastguard Worker 
55*d9f75844SAndroid Build Coastguard Worker // RTP packet with two one-byte header extensions. The last 4 bytes consist of
56*d9f75844SAndroid Build Coastguard Worker // abs-send-time with extension id = 3 and length = 3.
57*d9f75844SAndroid Build Coastguard Worker static uint8_t kRtpMsgWithOneByteAbsSendTimeExtension[] = {
58*d9f75844SAndroid Build Coastguard Worker     0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59*d9f75844SAndroid Build Coastguard Worker     0xBE, 0xDE, 0x00, 0x02, 0x22, 0x00, 0x02, 0x1c, 0x32, 0xaa, 0xbb, 0xcc,
60*d9f75844SAndroid Build Coastguard Worker };
61*d9f75844SAndroid Build Coastguard Worker 
62*d9f75844SAndroid Build Coastguard Worker // RTP packet with two two-byte header extensions. The last 5 bytes consist of
63*d9f75844SAndroid Build Coastguard Worker // abs-send-time with extension id = 3 and length = 3.
64*d9f75844SAndroid Build Coastguard Worker static uint8_t kRtpMsgWithTwoByteAbsSendTimeExtension[] = {
65*d9f75844SAndroid Build Coastguard Worker     0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
66*d9f75844SAndroid Build Coastguard Worker     0x10, 0x00, 0x00, 0x02, 0x02, 0x01, 0x02, 0x03, 0x03, 0xaa, 0xbb, 0xcc,
67*d9f75844SAndroid Build Coastguard Worker };
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker // Index of AbsSendTimeExtn data in message
70*d9f75844SAndroid Build Coastguard Worker // `kRtpMsgWithOneByteAbsSendTimeExtension`.
71*d9f75844SAndroid Build Coastguard Worker static const int kAstIndexInOneByteRtpMsg = 21;
72*d9f75844SAndroid Build Coastguard Worker // and in message `kRtpMsgWithTwoByteAbsSendTimeExtension`.
73*d9f75844SAndroid Build Coastguard Worker static const int kAstIndexInTwoByteRtpMsg = 21;
74*d9f75844SAndroid Build Coastguard Worker 
75*d9f75844SAndroid Build Coastguard Worker static const rtc::ArrayView<const char> kPcmuFrameArrayView =
76*d9f75844SAndroid Build Coastguard Worker     rtc::MakeArrayView(reinterpret_cast<const char*>(kPcmuFrame),
77*d9f75844SAndroid Build Coastguard Worker                        sizeof(kPcmuFrame));
78*d9f75844SAndroid Build Coastguard Worker static const rtc::ArrayView<const char> kRtcpReportArrayView =
79*d9f75844SAndroid Build Coastguard Worker     rtc::MakeArrayView(reinterpret_cast<const char*>(kRtcpReport),
80*d9f75844SAndroid Build Coastguard Worker                        sizeof(kRtcpReport));
81*d9f75844SAndroid Build Coastguard Worker static const rtc::ArrayView<const char> kInvalidPacketArrayView =
82*d9f75844SAndroid Build Coastguard Worker     rtc::MakeArrayView(reinterpret_cast<const char*>(kInvalidPacket),
83*d9f75844SAndroid Build Coastguard Worker                        sizeof(kInvalidPacket));
84*d9f75844SAndroid Build Coastguard Worker 
TEST(RtpUtilsTest,GetRtcp)85*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, GetRtcp) {
86*d9f75844SAndroid Build Coastguard Worker   int pt;
87*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(GetRtcpType(kRtcpReport, sizeof(kRtcpReport), &pt));
88*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0xc9, pt);
89*d9f75844SAndroid Build Coastguard Worker 
90*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(GetRtcpType(kInvalidPacket, sizeof(kInvalidPacket), &pt));
91*d9f75844SAndroid Build Coastguard Worker 
92*d9f75844SAndroid Build Coastguard Worker   uint32_t ssrc;
93*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(GetRtcpSsrc(kNonCompoundRtcpPliFeedbackPacket,
94*d9f75844SAndroid Build Coastguard Worker                           sizeof(kNonCompoundRtcpPliFeedbackPacket), &ssrc));
95*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(GetRtcpSsrc(kNonCompoundRtcpAppPacket,
96*d9f75844SAndroid Build Coastguard Worker                           sizeof(kNonCompoundRtcpAppPacket), &ssrc));
97*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(GetRtcpSsrc(kNonCompoundRtcpSDESPacket,
98*d9f75844SAndroid Build Coastguard Worker                            sizeof(kNonCompoundRtcpSDESPacket), &ssrc));
99*d9f75844SAndroid Build Coastguard Worker }
100*d9f75844SAndroid Build Coastguard Worker 
101*d9f75844SAndroid Build Coastguard Worker // Invalid RTP packets.
TEST(RtpUtilsTest,InvalidRtpHeader)102*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, InvalidRtpHeader) {
103*d9f75844SAndroid Build Coastguard Worker   // Rtp message with invalid length.
104*d9f75844SAndroid Build Coastguard Worker   const uint8_t kRtpMsgWithInvalidLength[] = {
105*d9f75844SAndroid Build Coastguard Worker       // clang-format off
106*d9f75844SAndroid Build Coastguard Worker       // clang formatting doesn't respect inline comments.
107*d9f75844SAndroid Build Coastguard Worker       0x94, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108*d9f75844SAndroid Build Coastguard Worker       0xAA, 0xBB, 0xCC, 0XDD,  // SSRC
109*d9f75844SAndroid Build Coastguard Worker       0xDD, 0xCC, 0xBB, 0xAA,  // Only 1 CSRC, but CC count is 4.
110*d9f75844SAndroid Build Coastguard Worker       // clang-format on
111*d9f75844SAndroid Build Coastguard Worker   };
112*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(ValidateRtpHeader(kRtpMsgWithInvalidLength,
113*d9f75844SAndroid Build Coastguard Worker                                  sizeof(kRtpMsgWithInvalidLength), nullptr));
114*d9f75844SAndroid Build Coastguard Worker 
115*d9f75844SAndroid Build Coastguard Worker   // Rtp message with single byte header extension, invalid extension length.
116*d9f75844SAndroid Build Coastguard Worker   const uint8_t kRtpMsgWithInvalidExtnLength[] = {
117*d9f75844SAndroid Build Coastguard Worker       0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00, 0xBE, 0xDE, 0x0A, 0x00,  // Extn length - 0x0A00
119*d9f75844SAndroid Build Coastguard Worker   };
120*d9f75844SAndroid Build Coastguard Worker   EXPECT_FALSE(ValidateRtpHeader(kRtpMsgWithInvalidExtnLength,
121*d9f75844SAndroid Build Coastguard Worker                                  sizeof(kRtpMsgWithInvalidExtnLength),
122*d9f75844SAndroid Build Coastguard Worker                                  nullptr));
123*d9f75844SAndroid Build Coastguard Worker }
124*d9f75844SAndroid Build Coastguard Worker 
125*d9f75844SAndroid Build Coastguard Worker // Valid RTP packet with a 2byte header extension.
TEST(RtpUtilsTest,Valid2ByteExtnHdrRtpMessage)126*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, Valid2ByteExtnHdrRtpMessage) {
127*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(ValidateRtpHeader(kRtpMsgWith2ByteExtnHeader,
128*d9f75844SAndroid Build Coastguard Worker                                 sizeof(kRtpMsgWith2ByteExtnHeader), nullptr));
129*d9f75844SAndroid Build Coastguard Worker }
130*d9f75844SAndroid Build Coastguard Worker 
131*d9f75844SAndroid Build Coastguard Worker // Valid RTP packet which has 1 byte header AbsSendTime extension in it.
TEST(RtpUtilsTest,ValidRtpPacketWithOneByteAbsSendTimeExtension)132*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, ValidRtpPacketWithOneByteAbsSendTimeExtension) {
133*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(ValidateRtpHeader(kRtpMsgWithOneByteAbsSendTimeExtension,
134*d9f75844SAndroid Build Coastguard Worker                                 sizeof(kRtpMsgWithOneByteAbsSendTimeExtension),
135*d9f75844SAndroid Build Coastguard Worker                                 nullptr));
136*d9f75844SAndroid Build Coastguard Worker }
137*d9f75844SAndroid Build Coastguard Worker 
138*d9f75844SAndroid Build Coastguard Worker // Valid RTP packet which has 2 byte header AbsSendTime extension in it.
TEST(RtpUtilsTest,ValidRtpPacketWithTwoByteAbsSendTimeExtension)139*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, ValidRtpPacketWithTwoByteAbsSendTimeExtension) {
140*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(ValidateRtpHeader(kRtpMsgWithTwoByteAbsSendTimeExtension,
141*d9f75844SAndroid Build Coastguard Worker                                 sizeof(kRtpMsgWithTwoByteAbsSendTimeExtension),
142*d9f75844SAndroid Build Coastguard Worker                                 nullptr));
143*d9f75844SAndroid Build Coastguard Worker }
144*d9f75844SAndroid Build Coastguard Worker 
145*d9f75844SAndroid Build Coastguard Worker // Verify finding an extension ID in the TURN send indication message.
TEST(RtpUtilsTest,UpdateAbsSendTimeExtensionInTurnSendIndication)146*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, UpdateAbsSendTimeExtensionInTurnSendIndication) {
147*d9f75844SAndroid Build Coastguard Worker   // A valid STUN indication message with a valid RTP header in data attribute
148*d9f75844SAndroid Build Coastguard Worker   // payload field and no extension bit set.
149*d9f75844SAndroid Build Coastguard Worker   uint8_t message_without_extension[] = {
150*d9f75844SAndroid Build Coastguard Worker       // clang-format off
151*d9f75844SAndroid Build Coastguard Worker       // clang formatting doesn't respect inline comments.
152*d9f75844SAndroid Build Coastguard Worker       0x00, 0x16, 0x00, 0x18,  // length of
153*d9f75844SAndroid Build Coastguard Worker       0x21, 0x12, 0xA4, 0x42,  // magic cookie
154*d9f75844SAndroid Build Coastguard Worker       '0',  '1',  '2',  '3',   // transaction id
155*d9f75844SAndroid Build Coastguard Worker       '4',  '5',  '6',  '7',
156*d9f75844SAndroid Build Coastguard Worker       '8',  '9',  'a',  'b',
157*d9f75844SAndroid Build Coastguard Worker       0x00, 0x20, 0x00, 0x04,  // Mapped address.
158*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00,
159*d9f75844SAndroid Build Coastguard Worker       0x00, 0x13, 0x00, 0x0C,  // Data attribute.
160*d9f75844SAndroid Build Coastguard Worker       0x80, 0x00, 0x00, 0x00,  // RTP packet.
161*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00,
162*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00,
163*d9f75844SAndroid Build Coastguard Worker       // clang-format on
164*d9f75844SAndroid Build Coastguard Worker   };
165*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(UpdateRtpAbsSendTimeExtension(
166*d9f75844SAndroid Build Coastguard Worker       message_without_extension, sizeof(message_without_extension), 3, 0));
167*d9f75844SAndroid Build Coastguard Worker 
168*d9f75844SAndroid Build Coastguard Worker   // A valid STUN indication message with a valid RTP header and a extension
169*d9f75844SAndroid Build Coastguard Worker   // header.
170*d9f75844SAndroid Build Coastguard Worker   uint8_t message[] = {
171*d9f75844SAndroid Build Coastguard Worker       // clang-format off
172*d9f75844SAndroid Build Coastguard Worker       // clang formatting doesn't respect inline comments.
173*d9f75844SAndroid Build Coastguard Worker       0x00, 0x16, 0x00, 0x24,  // length of
174*d9f75844SAndroid Build Coastguard Worker       0x21, 0x12, 0xA4, 0x42,  // magic cookie
175*d9f75844SAndroid Build Coastguard Worker       '0',  '1',  '2',  '3',   // transaction id
176*d9f75844SAndroid Build Coastguard Worker       '4',  '5',  '6',  '7',
177*d9f75844SAndroid Build Coastguard Worker       '8',  '9',  'a',  'b',
178*d9f75844SAndroid Build Coastguard Worker       0x00, 0x20, 0x00, 0x04,  // Mapped address.
179*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00,
180*d9f75844SAndroid Build Coastguard Worker       0x00, 0x13, 0x00, 0x18,  // Data attribute.
181*d9f75844SAndroid Build Coastguard Worker       0x90, 0x00, 0x00, 0x00,  // RTP packet.
182*d9f75844SAndroid Build Coastguard Worker       0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBE, 0xDE,
183*d9f75844SAndroid Build Coastguard Worker       0x00, 0x02, 0x22, 0xaa, 0xbb, 0xcc, 0x32, 0xaa, 0xbb, 0xcc,
184*d9f75844SAndroid Build Coastguard Worker       // clang-format on
185*d9f75844SAndroid Build Coastguard Worker   };
186*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(UpdateRtpAbsSendTimeExtension(message, sizeof(message), 3, 0));
187*d9f75844SAndroid Build Coastguard Worker }
188*d9f75844SAndroid Build Coastguard Worker 
189*d9f75844SAndroid Build Coastguard Worker // Test without any packet options variables set. This method should return
190*d9f75844SAndroid Build Coastguard Worker // without HMAC value in the packet.
TEST(RtpUtilsTest,ApplyPacketOptionsWithDefaultValues)191*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, ApplyPacketOptionsWithDefaultValues) {
192*d9f75844SAndroid Build Coastguard Worker   rtc::PacketTimeUpdateParams packet_time_params;
193*d9f75844SAndroid Build Coastguard Worker   std::vector<uint8_t> rtp_packet(
194*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithOneByteAbsSendTimeExtension,
195*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithOneByteAbsSendTimeExtension +
196*d9f75844SAndroid Build Coastguard Worker           sizeof(kRtpMsgWithOneByteAbsSendTimeExtension));
197*d9f75844SAndroid Build Coastguard Worker   rtp_packet.insert(rtp_packet.end(), kFakeTag, kFakeTag + sizeof(kFakeTag));
198*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(ApplyPacketOptions(&rtp_packet[0], rtp_packet.size(),
199*d9f75844SAndroid Build Coastguard Worker                                  packet_time_params, 0));
200*d9f75844SAndroid Build Coastguard Worker 
201*d9f75844SAndroid Build Coastguard Worker   // Making sure HMAC wasn't updated..
202*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0,
203*d9f75844SAndroid Build Coastguard Worker             memcmp(&rtp_packet[sizeof(kRtpMsgWithOneByteAbsSendTimeExtension)],
204*d9f75844SAndroid Build Coastguard Worker                    kFakeTag, 4));
205*d9f75844SAndroid Build Coastguard Worker 
206*d9f75844SAndroid Build Coastguard Worker   // Verify AbsouluteSendTime extension field wasn't modified.
207*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInOneByteRtpMsg], kTestAstValue,
208*d9f75844SAndroid Build Coastguard Worker                       sizeof(kTestAstValue)));
209*d9f75844SAndroid Build Coastguard Worker }
210*d9f75844SAndroid Build Coastguard Worker 
211*d9f75844SAndroid Build Coastguard Worker // Veirfy HMAC is updated when packet option parameters are set.
TEST(RtpUtilsTest,ApplyPacketOptionsWithAuthParams)212*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, ApplyPacketOptionsWithAuthParams) {
213*d9f75844SAndroid Build Coastguard Worker   rtc::PacketTimeUpdateParams packet_time_params;
214*d9f75844SAndroid Build Coastguard Worker   packet_time_params.srtp_auth_key.assign(kTestKey,
215*d9f75844SAndroid Build Coastguard Worker                                           kTestKey + sizeof(kTestKey));
216*d9f75844SAndroid Build Coastguard Worker   packet_time_params.srtp_auth_tag_len = 4;
217*d9f75844SAndroid Build Coastguard Worker 
218*d9f75844SAndroid Build Coastguard Worker   std::vector<uint8_t> rtp_packet(
219*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithOneByteAbsSendTimeExtension,
220*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithOneByteAbsSendTimeExtension +
221*d9f75844SAndroid Build Coastguard Worker           sizeof(kRtpMsgWithOneByteAbsSendTimeExtension));
222*d9f75844SAndroid Build Coastguard Worker   rtp_packet.insert(rtp_packet.end(), kFakeTag, kFakeTag + sizeof(kFakeTag));
223*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(ApplyPacketOptions(&rtp_packet[0], rtp_packet.size(),
224*d9f75844SAndroid Build Coastguard Worker                                  packet_time_params, 0));
225*d9f75844SAndroid Build Coastguard Worker 
226*d9f75844SAndroid Build Coastguard Worker   uint8_t kExpectedTag[] = {0xc1, 0x7a, 0x8c, 0xa0};
227*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0,
228*d9f75844SAndroid Build Coastguard Worker             memcmp(&rtp_packet[sizeof(kRtpMsgWithOneByteAbsSendTimeExtension)],
229*d9f75844SAndroid Build Coastguard Worker                    kExpectedTag, sizeof(kExpectedTag)));
230*d9f75844SAndroid Build Coastguard Worker 
231*d9f75844SAndroid Build Coastguard Worker   // Verify AbsouluteSendTime extension field is not modified.
232*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInOneByteRtpMsg], kTestAstValue,
233*d9f75844SAndroid Build Coastguard Worker                       sizeof(kTestAstValue)));
234*d9f75844SAndroid Build Coastguard Worker }
235*d9f75844SAndroid Build Coastguard Worker 
236*d9f75844SAndroid Build Coastguard Worker // Verify finding an extension ID in a raw rtp message.
TEST(RtpUtilsTest,UpdateOneByteAbsSendTimeExtensionInRtpPacket)237*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, UpdateOneByteAbsSendTimeExtensionInRtpPacket) {
238*d9f75844SAndroid Build Coastguard Worker   std::vector<uint8_t> rtp_packet(
239*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithOneByteAbsSendTimeExtension,
240*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithOneByteAbsSendTimeExtension +
241*d9f75844SAndroid Build Coastguard Worker           sizeof(kRtpMsgWithOneByteAbsSendTimeExtension));
242*d9f75844SAndroid Build Coastguard Worker 
243*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(UpdateRtpAbsSendTimeExtension(&rtp_packet[0], rtp_packet.size(),
244*d9f75844SAndroid Build Coastguard Worker                                             3, 51183266));
245*d9f75844SAndroid Build Coastguard Worker 
246*d9f75844SAndroid Build Coastguard Worker   // Verify that the timestamp was updated.
247*d9f75844SAndroid Build Coastguard Worker   const uint8_t kExpectedTimestamp[3] = {0xcc, 0xbb, 0xaa};
248*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInOneByteRtpMsg], kExpectedTimestamp,
249*d9f75844SAndroid Build Coastguard Worker                       sizeof(kExpectedTimestamp)));
250*d9f75844SAndroid Build Coastguard Worker }
251*d9f75844SAndroid Build Coastguard Worker 
252*d9f75844SAndroid Build Coastguard Worker // Verify finding an extension ID in a raw rtp message.
TEST(RtpUtilsTest,UpdateTwoByteAbsSendTimeExtensionInRtpPacket)253*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, UpdateTwoByteAbsSendTimeExtensionInRtpPacket) {
254*d9f75844SAndroid Build Coastguard Worker   std::vector<uint8_t> rtp_packet(
255*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithTwoByteAbsSendTimeExtension,
256*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithTwoByteAbsSendTimeExtension +
257*d9f75844SAndroid Build Coastguard Worker           sizeof(kRtpMsgWithTwoByteAbsSendTimeExtension));
258*d9f75844SAndroid Build Coastguard Worker 
259*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(UpdateRtpAbsSendTimeExtension(&rtp_packet[0], rtp_packet.size(),
260*d9f75844SAndroid Build Coastguard Worker                                             3, 51183266));
261*d9f75844SAndroid Build Coastguard Worker 
262*d9f75844SAndroid Build Coastguard Worker   // Verify that the timestamp was updated.
263*d9f75844SAndroid Build Coastguard Worker   const uint8_t kExpectedTimestamp[3] = {0xcc, 0xbb, 0xaa};
264*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInTwoByteRtpMsg], kExpectedTimestamp,
265*d9f75844SAndroid Build Coastguard Worker                       sizeof(kExpectedTimestamp)));
266*d9f75844SAndroid Build Coastguard Worker }
267*d9f75844SAndroid Build Coastguard Worker 
268*d9f75844SAndroid Build Coastguard Worker // Verify we update both AbsSendTime extension header and HMAC.
TEST(RtpUtilsTest,ApplyPacketOptionsWithAuthParamsAndAbsSendTime)269*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, ApplyPacketOptionsWithAuthParamsAndAbsSendTime) {
270*d9f75844SAndroid Build Coastguard Worker   rtc::PacketTimeUpdateParams packet_time_params;
271*d9f75844SAndroid Build Coastguard Worker   packet_time_params.srtp_auth_key.assign(kTestKey,
272*d9f75844SAndroid Build Coastguard Worker                                           kTestKey + sizeof(kTestKey));
273*d9f75844SAndroid Build Coastguard Worker   packet_time_params.srtp_auth_tag_len = 4;
274*d9f75844SAndroid Build Coastguard Worker   packet_time_params.rtp_sendtime_extension_id = 3;
275*d9f75844SAndroid Build Coastguard Worker   // 3 is also present in the test message.
276*d9f75844SAndroid Build Coastguard Worker 
277*d9f75844SAndroid Build Coastguard Worker   std::vector<uint8_t> rtp_packet(
278*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithOneByteAbsSendTimeExtension,
279*d9f75844SAndroid Build Coastguard Worker       kRtpMsgWithOneByteAbsSendTimeExtension +
280*d9f75844SAndroid Build Coastguard Worker           sizeof(kRtpMsgWithOneByteAbsSendTimeExtension));
281*d9f75844SAndroid Build Coastguard Worker   rtp_packet.insert(rtp_packet.end(), kFakeTag, kFakeTag + sizeof(kFakeTag));
282*d9f75844SAndroid Build Coastguard Worker   EXPECT_TRUE(ApplyPacketOptions(&rtp_packet[0], rtp_packet.size(),
283*d9f75844SAndroid Build Coastguard Worker                                  packet_time_params, 51183266));
284*d9f75844SAndroid Build Coastguard Worker 
285*d9f75844SAndroid Build Coastguard Worker   const uint8_t kExpectedTag[] = {0x81, 0xd1, 0x2c, 0x0e};
286*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0,
287*d9f75844SAndroid Build Coastguard Worker             memcmp(&rtp_packet[sizeof(kRtpMsgWithOneByteAbsSendTimeExtension)],
288*d9f75844SAndroid Build Coastguard Worker                    kExpectedTag, sizeof(kExpectedTag)));
289*d9f75844SAndroid Build Coastguard Worker 
290*d9f75844SAndroid Build Coastguard Worker   // Verify that the timestamp was updated.
291*d9f75844SAndroid Build Coastguard Worker   const uint8_t kExpectedTimestamp[3] = {0xcc, 0xbb, 0xaa};
292*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(0, memcmp(&rtp_packet[kAstIndexInOneByteRtpMsg], kExpectedTimestamp,
293*d9f75844SAndroid Build Coastguard Worker                       sizeof(kExpectedTimestamp)));
294*d9f75844SAndroid Build Coastguard Worker }
295*d9f75844SAndroid Build Coastguard Worker 
TEST(RtpUtilsTest,InferRtpPacketType)296*d9f75844SAndroid Build Coastguard Worker TEST(RtpUtilsTest, InferRtpPacketType) {
297*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(RtpPacketType::kRtp, InferRtpPacketType(kPcmuFrameArrayView));
298*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(RtpPacketType::kRtcp, InferRtpPacketType(kRtcpReportArrayView));
299*d9f75844SAndroid Build Coastguard Worker   EXPECT_EQ(RtpPacketType::kUnknown,
300*d9f75844SAndroid Build Coastguard Worker             InferRtpPacketType(kInvalidPacketArrayView));
301*d9f75844SAndroid Build Coastguard Worker }
302*d9f75844SAndroid Build Coastguard Worker 
303*d9f75844SAndroid Build Coastguard Worker }  // namespace cricket
304