blob: cb8a092616a45ce8bd70bdf83c43abd20adaef0e [file] [log] [blame]
eladalona52722f2017-06-26 11:23:54 -07001/*
2 * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#include <cstdio>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "call/rtp_rtcp_demuxer_helper.h"
eladalona52722f2017-06-26 11:23:54 -070014
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "modules/rtp_rtcp/source/rtcp_packet/bye.h"
16#include "modules/rtp_rtcp/source/rtcp_packet/extended_jitter_report.h"
17#include "modules/rtp_rtcp/source/rtcp_packet/extended_reports.h"
18#include "modules/rtp_rtcp/source/rtcp_packet/pli.h"
19#include "modules/rtp_rtcp/source/rtcp_packet/rapid_resync_request.h"
20#include "modules/rtp_rtcp/source/rtcp_packet/receiver_report.h"
21#include "modules/rtp_rtcp/source/rtcp_packet/sender_report.h"
22#include "rtc_base/arraysize.h"
23#include "rtc_base/basictypes.h"
24#include "rtc_base/buffer.h"
25#include "test/gtest.h"
eladalona52722f2017-06-26 11:23:54 -070026
27namespace webrtc {
28
29namespace {
30constexpr uint32_t kSsrc = 8374;
31} // namespace
32
33TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_ByePacket) {
34 webrtc::rtcp::Bye rtcp_packet;
35 rtcp_packet.SetSenderSsrc(kSsrc);
36 rtc::Buffer raw_packet = rtcp_packet.Build();
37
38 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
39 EXPECT_EQ(ssrc, kSsrc);
40}
41
42TEST(RtpRtcpDemuxerHelperTest,
43 ParseRtcpPacketSenderSsrc_ExtendedReportsPacket) {
44 webrtc::rtcp::ExtendedReports rtcp_packet;
45 rtcp_packet.SetSenderSsrc(kSsrc);
46 rtc::Buffer raw_packet = rtcp_packet.Build();
47
48 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
49 EXPECT_EQ(ssrc, kSsrc);
50}
51
52TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_PsfbPacket) {
53 webrtc::rtcp::Pli rtcp_packet; // Psfb is abstract; use a subclass.
54 rtcp_packet.SetSenderSsrc(kSsrc);
55 rtc::Buffer raw_packet = rtcp_packet.Build();
56
57 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
58 EXPECT_EQ(ssrc, kSsrc);
59}
60
61TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_ReceiverReportPacket) {
62 webrtc::rtcp::ReceiverReport rtcp_packet;
63 rtcp_packet.SetSenderSsrc(kSsrc);
64 rtc::Buffer raw_packet = rtcp_packet.Build();
65
66 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
67 EXPECT_EQ(ssrc, kSsrc);
68}
69
70TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_RtpfbPacket) {
71 // Rtpfb is abstract; use a subclass.
72 webrtc::rtcp::RapidResyncRequest rtcp_packet;
73 rtcp_packet.SetSenderSsrc(kSsrc);
74 rtc::Buffer raw_packet = rtcp_packet.Build();
75
76 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
77 EXPECT_EQ(ssrc, kSsrc);
78}
79
80TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_SenderReportPacket) {
81 webrtc::rtcp::SenderReport rtcp_packet;
82 rtcp_packet.SetSenderSsrc(kSsrc);
83 rtc::Buffer raw_packet = rtcp_packet.Build();
84
85 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
86 EXPECT_EQ(ssrc, kSsrc);
87}
88
89TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_MalformedRtcpPacket) {
90 uint8_t garbage[100];
91 memset(&garbage[0], 0, arraysize(garbage));
92
93 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(garbage);
94 EXPECT_FALSE(ssrc);
95}
96
97TEST(RtpRtcpDemuxerHelperTest,
98 ParseRtcpPacketSenderSsrc_RtcpMessageWithoutSenderSsrc) {
99 webrtc::rtcp::ExtendedJitterReport rtcp_packet; // Has no sender SSRC.
100 rtc::Buffer raw_packet = rtcp_packet.Build();
101
102 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(raw_packet);
103 EXPECT_FALSE(ssrc);
104}
105
106TEST(RtpRtcpDemuxerHelperTest, ParseRtcpPacketSenderSsrc_TruncatedRtcpMessage) {
107 webrtc::rtcp::Bye rtcp_packet;
108 rtcp_packet.SetSenderSsrc(kSsrc);
109 rtc::Buffer raw_packet = rtcp_packet.Build();
110
111 constexpr size_t rtcp_length_bytes = 8;
112 ASSERT_EQ(rtcp_length_bytes, raw_packet.size());
113
114 rtc::Optional<uint32_t> ssrc = ParseRtcpPacketSenderSsrc(
115 rtc::ArrayView<const uint8_t>(raw_packet.data(), rtcp_length_bytes - 1));
116 EXPECT_FALSE(ssrc);
117}
118
119} // namespace webrtc