1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2013 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 "test/rtp_file_reader.h"
12*d9f75844SAndroid Build Coastguard Worker
13*d9f75844SAndroid Build Coastguard Worker #include <map>
14*d9f75844SAndroid Build Coastguard Worker #include <memory>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
17*d9f75844SAndroid Build Coastguard Worker #include "modules/rtp_rtcp/source/rtp_util.h"
18*d9f75844SAndroid Build Coastguard Worker #include "test/gtest.h"
19*d9f75844SAndroid Build Coastguard Worker #include "test/testsupport/file_utils.h"
20*d9f75844SAndroid Build Coastguard Worker
21*d9f75844SAndroid Build Coastguard Worker namespace webrtc {
22*d9f75844SAndroid Build Coastguard Worker
23*d9f75844SAndroid Build Coastguard Worker class TestRtpFileReader : public ::testing::Test {
24*d9f75844SAndroid Build Coastguard Worker public:
Init(const std::string & filename,bool headers_only_file)25*d9f75844SAndroid Build Coastguard Worker void Init(const std::string& filename, bool headers_only_file) {
26*d9f75844SAndroid Build Coastguard Worker std::string filepath =
27*d9f75844SAndroid Build Coastguard Worker test::ResourcePath("video_coding/" + filename, "rtp");
28*d9f75844SAndroid Build Coastguard Worker rtp_packet_source_.reset(
29*d9f75844SAndroid Build Coastguard Worker test::RtpFileReader::Create(test::RtpFileReader::kRtpDump, filepath));
30*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(rtp_packet_source_.get() != NULL);
31*d9f75844SAndroid Build Coastguard Worker headers_only_file_ = headers_only_file;
32*d9f75844SAndroid Build Coastguard Worker }
33*d9f75844SAndroid Build Coastguard Worker
CountRtpPackets()34*d9f75844SAndroid Build Coastguard Worker int CountRtpPackets() {
35*d9f75844SAndroid Build Coastguard Worker test::RtpPacket packet;
36*d9f75844SAndroid Build Coastguard Worker int c = 0;
37*d9f75844SAndroid Build Coastguard Worker while (rtp_packet_source_->NextPacket(&packet)) {
38*d9f75844SAndroid Build Coastguard Worker if (headers_only_file_)
39*d9f75844SAndroid Build Coastguard Worker EXPECT_LT(packet.length, packet.original_length);
40*d9f75844SAndroid Build Coastguard Worker else
41*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(packet.length, packet.original_length);
42*d9f75844SAndroid Build Coastguard Worker c++;
43*d9f75844SAndroid Build Coastguard Worker }
44*d9f75844SAndroid Build Coastguard Worker return c;
45*d9f75844SAndroid Build Coastguard Worker }
46*d9f75844SAndroid Build Coastguard Worker
47*d9f75844SAndroid Build Coastguard Worker private:
48*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<test::RtpFileReader> rtp_packet_source_;
49*d9f75844SAndroid Build Coastguard Worker bool headers_only_file_;
50*d9f75844SAndroid Build Coastguard Worker };
51*d9f75844SAndroid Build Coastguard Worker
TEST_F(TestRtpFileReader,Test60Packets)52*d9f75844SAndroid Build Coastguard Worker TEST_F(TestRtpFileReader, Test60Packets) {
53*d9f75844SAndroid Build Coastguard Worker Init("pltype103", false);
54*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(60, CountRtpPackets());
55*d9f75844SAndroid Build Coastguard Worker }
56*d9f75844SAndroid Build Coastguard Worker
TEST_F(TestRtpFileReader,Test60PacketsHeaderOnly)57*d9f75844SAndroid Build Coastguard Worker TEST_F(TestRtpFileReader, Test60PacketsHeaderOnly) {
58*d9f75844SAndroid Build Coastguard Worker Init("pltype103_header_only", true);
59*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(60, CountRtpPackets());
60*d9f75844SAndroid Build Coastguard Worker }
61*d9f75844SAndroid Build Coastguard Worker
62*d9f75844SAndroid Build Coastguard Worker typedef std::map<uint32_t, int> PacketsPerSsrc;
63*d9f75844SAndroid Build Coastguard Worker
64*d9f75844SAndroid Build Coastguard Worker class TestPcapFileReader : public ::testing::Test {
65*d9f75844SAndroid Build Coastguard Worker public:
Init(const std::string & filename)66*d9f75844SAndroid Build Coastguard Worker void Init(const std::string& filename) {
67*d9f75844SAndroid Build Coastguard Worker std::string filepath =
68*d9f75844SAndroid Build Coastguard Worker test::ResourcePath("video_coding/" + filename, "pcap");
69*d9f75844SAndroid Build Coastguard Worker rtp_packet_source_.reset(
70*d9f75844SAndroid Build Coastguard Worker test::RtpFileReader::Create(test::RtpFileReader::kPcap, filepath));
71*d9f75844SAndroid Build Coastguard Worker ASSERT_TRUE(rtp_packet_source_.get() != NULL);
72*d9f75844SAndroid Build Coastguard Worker }
73*d9f75844SAndroid Build Coastguard Worker
CountRtpPackets()74*d9f75844SAndroid Build Coastguard Worker int CountRtpPackets() {
75*d9f75844SAndroid Build Coastguard Worker int c = 0;
76*d9f75844SAndroid Build Coastguard Worker test::RtpPacket packet;
77*d9f75844SAndroid Build Coastguard Worker while (rtp_packet_source_->NextPacket(&packet)) {
78*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(packet.length, packet.original_length);
79*d9f75844SAndroid Build Coastguard Worker c++;
80*d9f75844SAndroid Build Coastguard Worker }
81*d9f75844SAndroid Build Coastguard Worker return c;
82*d9f75844SAndroid Build Coastguard Worker }
83*d9f75844SAndroid Build Coastguard Worker
CountRtpPacketsPerSsrc()84*d9f75844SAndroid Build Coastguard Worker PacketsPerSsrc CountRtpPacketsPerSsrc() {
85*d9f75844SAndroid Build Coastguard Worker PacketsPerSsrc pps;
86*d9f75844SAndroid Build Coastguard Worker test::RtpPacket packet;
87*d9f75844SAndroid Build Coastguard Worker while (rtp_packet_source_->NextPacket(&packet)) {
88*d9f75844SAndroid Build Coastguard Worker rtc::ArrayView<const uint8_t> raw(packet.data, packet.length);
89*d9f75844SAndroid Build Coastguard Worker if (IsRtpPacket(raw)) {
90*d9f75844SAndroid Build Coastguard Worker pps[ParseRtpSsrc(raw)]++;
91*d9f75844SAndroid Build Coastguard Worker }
92*d9f75844SAndroid Build Coastguard Worker }
93*d9f75844SAndroid Build Coastguard Worker return pps;
94*d9f75844SAndroid Build Coastguard Worker }
95*d9f75844SAndroid Build Coastguard Worker
96*d9f75844SAndroid Build Coastguard Worker private:
97*d9f75844SAndroid Build Coastguard Worker std::unique_ptr<test::RtpFileReader> rtp_packet_source_;
98*d9f75844SAndroid Build Coastguard Worker };
99*d9f75844SAndroid Build Coastguard Worker
TEST_F(TestPcapFileReader,TestEthernetIIFrame)100*d9f75844SAndroid Build Coastguard Worker TEST_F(TestPcapFileReader, TestEthernetIIFrame) {
101*d9f75844SAndroid Build Coastguard Worker Init("frame-ethernet-ii");
102*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(368, CountRtpPackets());
103*d9f75844SAndroid Build Coastguard Worker }
104*d9f75844SAndroid Build Coastguard Worker
TEST_F(TestPcapFileReader,TestLoopbackFrame)105*d9f75844SAndroid Build Coastguard Worker TEST_F(TestPcapFileReader, TestLoopbackFrame) {
106*d9f75844SAndroid Build Coastguard Worker Init("frame-loopback");
107*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(491, CountRtpPackets());
108*d9f75844SAndroid Build Coastguard Worker }
109*d9f75844SAndroid Build Coastguard Worker
TEST_F(TestPcapFileReader,TestTwoSsrc)110*d9f75844SAndroid Build Coastguard Worker TEST_F(TestPcapFileReader, TestTwoSsrc) {
111*d9f75844SAndroid Build Coastguard Worker Init("ssrcs-2");
112*d9f75844SAndroid Build Coastguard Worker PacketsPerSsrc pps = CountRtpPacketsPerSsrc();
113*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(2UL, pps.size());
114*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(370, pps[0x78d48f61]);
115*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(60, pps[0xae94130b]);
116*d9f75844SAndroid Build Coastguard Worker }
117*d9f75844SAndroid Build Coastguard Worker
TEST_F(TestPcapFileReader,TestThreeSsrc)118*d9f75844SAndroid Build Coastguard Worker TEST_F(TestPcapFileReader, TestThreeSsrc) {
119*d9f75844SAndroid Build Coastguard Worker Init("ssrcs-3");
120*d9f75844SAndroid Build Coastguard Worker PacketsPerSsrc pps = CountRtpPacketsPerSsrc();
121*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(3UL, pps.size());
122*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(162, pps[0x938c5eaa]);
123*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(113, pps[0x59fe6ef0]);
124*d9f75844SAndroid Build Coastguard Worker EXPECT_EQ(61, pps[0xed2bd2ac]);
125*d9f75844SAndroid Build Coastguard Worker }
126*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc
127