1 /*
2 * Copyright (c) 2018 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 #include "modules/rtp_rtcp/source/rtp_header_extension_size.h"
11
12 #include "modules/rtp_rtcp/source/rtp_header_extensions.h"
13 #include "test/gtest.h"
14
15 namespace {
16
17 using ::webrtc::RtpExtensionSize;
18 using ::webrtc::RtpHeaderExtensionMap;
19 using ::webrtc::RtpHeaderExtensionSize;
20 using ::webrtc::RtpMid;
21 using ::webrtc::RtpStreamId;
22
23 // id for 1-byte header extension. actual value is irrelevant for these tests.
24 constexpr int kId = 1;
25 // id that forces to use 2-byte header extension.
26 constexpr int kIdForceTwoByteHeader = 15;
27
TEST(RtpHeaderExtensionSizeTest,ReturnsZeroIfNoExtensionsAreRegistered)28 TEST(RtpHeaderExtensionSizeTest, ReturnsZeroIfNoExtensionsAreRegistered) {
29 constexpr RtpExtensionSize kExtensionSizes[] = {{RtpMid::kId, 3}};
30 // Register different extension than ask size for.
31 RtpHeaderExtensionMap registered;
32 registered.Register<RtpStreamId>(kId);
33
34 EXPECT_EQ(RtpHeaderExtensionSize(kExtensionSizes, registered), 0);
35 }
36
TEST(RtpHeaderExtensionSizeTest,IncludesSizeOfExtensionHeaders)37 TEST(RtpHeaderExtensionSizeTest, IncludesSizeOfExtensionHeaders) {
38 constexpr RtpExtensionSize kExtensionSizes[] = {{RtpMid::kId, 3}};
39 RtpHeaderExtensionMap registered;
40 registered.Register<RtpMid>(kId);
41
42 // 4 bytes for extension block header + 1 byte for individual extension header
43 // + 3 bytes for the value.
44 EXPECT_EQ(RtpHeaderExtensionSize(kExtensionSizes, registered), 8);
45 }
46
TEST(RtpHeaderExtensionSizeTest,RoundsUpTo32bitAlignmant)47 TEST(RtpHeaderExtensionSizeTest, RoundsUpTo32bitAlignmant) {
48 constexpr RtpExtensionSize kExtensionSizes[] = {{RtpMid::kId, 5}};
49 RtpHeaderExtensionMap registered;
50 registered.Register<RtpMid>(kId);
51
52 // 10 bytes of data including headers + 2 bytes of padding.
53 EXPECT_EQ(RtpHeaderExtensionSize(kExtensionSizes, registered), 12);
54 }
55
TEST(RtpHeaderExtensionSizeTest,SumsSeveralExtensions)56 TEST(RtpHeaderExtensionSizeTest, SumsSeveralExtensions) {
57 constexpr RtpExtensionSize kExtensionSizes[] = {{RtpMid::kId, 16},
58 {RtpStreamId::kId, 2}};
59 RtpHeaderExtensionMap registered;
60 registered.Register<RtpMid>(kId);
61 registered.Register<RtpStreamId>(14);
62
63 // 4 bytes for extension block header + 18 bytes of value +
64 // 2 bytes for two headers
65 EXPECT_EQ(RtpHeaderExtensionSize(kExtensionSizes, registered), 24);
66 }
67
TEST(RtpHeaderExtensionSizeTest,LargeIdForce2BytesHeader)68 TEST(RtpHeaderExtensionSizeTest, LargeIdForce2BytesHeader) {
69 constexpr RtpExtensionSize kExtensionSizes[] = {{RtpMid::kId, 3},
70 {RtpStreamId::kId, 2}};
71 RtpHeaderExtensionMap registered;
72 registered.Register<RtpMid>(kId);
73 registered.Register<RtpStreamId>(kIdForceTwoByteHeader);
74
75 // 4 bytes for extension block header + 5 bytes of value +
76 // 2*2 bytes for two headers + 3 bytes of padding.
77 EXPECT_EQ(RtpHeaderExtensionSize(kExtensionSizes, registered), 16);
78 }
79
TEST(RtpHeaderExtensionSizeTest,LargeValueForce2BytesHeader)80 TEST(RtpHeaderExtensionSizeTest, LargeValueForce2BytesHeader) {
81 constexpr RtpExtensionSize kExtensionSizes[] = {{RtpMid::kId, 17},
82 {RtpStreamId::kId, 4}};
83 RtpHeaderExtensionMap registered;
84 registered.Register<RtpMid>(1);
85 registered.Register<RtpStreamId>(2);
86
87 // 4 bytes for extension block header + 21 bytes of value +
88 // 2*2 bytes for two headers + 3 byte of padding.
89 EXPECT_EQ(RtpHeaderExtensionSize(kExtensionSizes, registered), 32);
90 }
91
92 } // namespace
93