blob: fa8b97b9e4dc2a2b11db235417344ea1e235276e [file] [log] [blame]
Niels Mölleraf175952018-08-13 13:23:08 +02001/*
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
11#include "modules/rtp_rtcp/source/contributing_sources.h"
12
Steve Anton10542f22019-01-11 09:11:00 -080013#include "rtc_base/time_utils.h"
Niels Mölleraf175952018-08-13 13:23:08 +020014#include "test/gmock.h"
15#include "test/gtest.h"
16
17namespace webrtc {
18namespace {
19
20using ::testing::UnorderedElementsAre;
21
22constexpr uint32_t kCsrc1 = 111;
23constexpr uint32_t kCsrc2 = 222;
24constexpr uint32_t kCsrc3 = 333;
Johannes Kronb5d91832019-05-21 13:19:22 +020025constexpr uint32_t kRtpTimestamp1 = 314;
26constexpr uint32_t kRtpTimestamp2 = 315;
27constexpr uint32_t kRtpTimestamp3 = 316;
Niels Mölleraf175952018-08-13 13:23:08 +020028
29} // namespace
30
31TEST(ContributingSourcesTest, RecordSources) {
32 ContributingSources csrcs;
33 constexpr uint32_t kCsrcs[] = {kCsrc1, kCsrc2};
34 constexpr int64_t kTime1 = 10;
Johannes Kronb5d91832019-05-21 13:19:22 +020035 csrcs.Update(kTime1, kCsrcs, absl::nullopt, kRtpTimestamp1);
Niels Mölleraf175952018-08-13 13:23:08 +020036 EXPECT_THAT(
37 csrcs.GetSources(kTime1),
Johannes Kronb5d91832019-05-21 13:19:22 +020038 UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC,
39 absl::nullopt, kRtpTimestamp1),
40 RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC,
41 absl::nullopt, kRtpTimestamp1)));
Niels Mölleraf175952018-08-13 13:23:08 +020042}
43
44TEST(ContributingSourcesTest, UpdateSources) {
45 ContributingSources csrcs;
46 // TODO(nisse): When migrating to absl::Span, the named constant arrays should
47 // be replaced by unnamed literals where they are passed to csrcs.Update(...).
48 constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2};
49 constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3};
50 constexpr int64_t kTime1 = 10;
51 constexpr int64_t kTime2 = kTime1 + 5 * rtc::kNumMillisecsPerSec;
Johannes Kronb5d91832019-05-21 13:19:22 +020052 csrcs.Update(kTime1, kCsrcs1, absl::nullopt, kRtpTimestamp1);
Niels Mölleraf175952018-08-13 13:23:08 +020053 EXPECT_THAT(
54 csrcs.GetSources(kTime1),
Johannes Kronb5d91832019-05-21 13:19:22 +020055 UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC,
56 absl::nullopt, kRtpTimestamp1),
57 RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC,
58 absl::nullopt, kRtpTimestamp1)));
59 csrcs.Update(kTime2, kCsrcs2, absl::nullopt, kRtpTimestamp2);
Niels Mölleraf175952018-08-13 13:23:08 +020060 EXPECT_THAT(
61 csrcs.GetSources(kTime2),
Johannes Kronb5d91832019-05-21 13:19:22 +020062 UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC,
63 absl::nullopt, kRtpTimestamp1),
64 RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC,
65 absl::nullopt, kRtpTimestamp2),
66 RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC,
67 absl::nullopt, kRtpTimestamp2)));
Niels Mölleraf175952018-08-13 13:23:08 +020068}
69
70TEST(ContributingSourcesTest, ReturnRecentOnly) {
71 ContributingSources csrcs;
72 constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2};
73 constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3};
74 constexpr int64_t kTime1 = 10;
75 constexpr int64_t kTime2 = kTime1 + 5 * rtc::kNumMillisecsPerSec;
76 constexpr int64_t kTime3 = kTime1 + 12 * rtc::kNumMillisecsPerSec;
Johannes Kronb5d91832019-05-21 13:19:22 +020077 csrcs.Update(kTime1, kCsrcs1, absl::nullopt, kRtpTimestamp1);
Niels Mölleraf175952018-08-13 13:23:08 +020078 EXPECT_THAT(
79 csrcs.GetSources(kTime1),
Johannes Kronb5d91832019-05-21 13:19:22 +020080 UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC,
81 absl::nullopt, kRtpTimestamp1),
82 RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC,
83 absl::nullopt, kRtpTimestamp1)));
84 csrcs.Update(kTime2, kCsrcs2, absl::nullopt, kRtpTimestamp2);
Niels Mölleraf175952018-08-13 13:23:08 +020085 EXPECT_THAT(
86 csrcs.GetSources(kTime3),
Johannes Kronb5d91832019-05-21 13:19:22 +020087 UnorderedElementsAre(RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC,
88 absl::nullopt, kRtpTimestamp2),
89 RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC,
90 absl::nullopt, kRtpTimestamp2)));
Niels Mölleraf175952018-08-13 13:23:08 +020091}
92
93TEST(ContributingSourcesTest, PurgeOldSources) {
94 ContributingSources csrcs;
95 constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2};
96 constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3};
97 constexpr int64_t kTime1 = 10;
98 constexpr int64_t kTime2 = kTime1 + 10 * rtc::kNumMillisecsPerSec;
99 constexpr int64_t kTime3 = kTime1 + 20 * rtc::kNumMillisecsPerSec;
Johannes Kronb5d91832019-05-21 13:19:22 +0200100 csrcs.Update(kTime1, kCsrcs1, absl::nullopt, kRtpTimestamp1);
Niels Mölleraf175952018-08-13 13:23:08 +0200101 EXPECT_THAT(
102 csrcs.GetSources(kTime2),
Johannes Kronb5d91832019-05-21 13:19:22 +0200103 UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC,
104 absl::nullopt, kRtpTimestamp1),
105 RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC,
106 absl::nullopt, kRtpTimestamp1)));
107 csrcs.Update(kTime2, kCsrcs2, absl::nullopt, kRtpTimestamp2);
Niels Mölleraf175952018-08-13 13:23:08 +0200108 EXPECT_THAT(
109 csrcs.GetSources(kTime2),
Johannes Kronb5d91832019-05-21 13:19:22 +0200110 UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC,
111 absl::nullopt, kRtpTimestamp1),
112 RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC,
113 absl::nullopt, kRtpTimestamp2),
114 RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC,
115 absl::nullopt, kRtpTimestamp2)));
116 csrcs.Update(kTime3, kCsrcs2, absl::nullopt, kRtpTimestamp3);
Niels Mölleraf175952018-08-13 13:23:08 +0200117 EXPECT_THAT(
118 csrcs.GetSources(kTime3),
Johannes Kronb5d91832019-05-21 13:19:22 +0200119 UnorderedElementsAre(RtpSource(kTime3, kCsrc2, RtpSourceType::CSRC,
120 absl::nullopt, kRtpTimestamp3),
121 RtpSource(kTime3, kCsrc3, RtpSourceType::CSRC,
122 absl::nullopt, kRtpTimestamp3)));
Niels Mölleraf175952018-08-13 13:23:08 +0200123 // Query at an earlier time; check that old sources really have been purged
124 // and don't reappear.
125 EXPECT_THAT(
126 csrcs.GetSources(kTime2),
Johannes Kronb5d91832019-05-21 13:19:22 +0200127 UnorderedElementsAre(RtpSource(kTime3, kCsrc2, RtpSourceType::CSRC,
128 absl::nullopt, kRtpTimestamp3),
129 RtpSource(kTime3, kCsrc3, RtpSourceType::CSRC,
130 absl::nullopt, kRtpTimestamp3)));
Niels Mölleraf175952018-08-13 13:23:08 +0200131}
132
Jonas Oreland967f7d52018-11-06 07:35:06 +0100133TEST(ContributingSourcesTest, AudioLevel) {
134 ContributingSources csrcs;
135 constexpr uint32_t kCsrcs[] = {kCsrc1, kCsrc2};
136 constexpr int64_t kTime1 = 10;
Johannes Kronb5d91832019-05-21 13:19:22 +0200137 csrcs.Update(kTime1, kCsrcs, 47, kRtpTimestamp1);
Jonas Oreland967f7d52018-11-06 07:35:06 +0100138 EXPECT_THAT(
139 csrcs.GetSources(kTime1),
Johannes Kronb5d91832019-05-21 13:19:22 +0200140 UnorderedElementsAre(
141 RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, 47, kRtpTimestamp1),
142 RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, 47, kRtpTimestamp1)));
Jonas Oreland967f7d52018-11-06 07:35:06 +0100143
144 constexpr uint32_t kCsrcsSubset[] = {kCsrc1};
Johannes Kronb5d91832019-05-21 13:19:22 +0200145 csrcs.Update(kTime1 + 1, kCsrcsSubset, absl::nullopt, kRtpTimestamp2);
Jonas Oreland967f7d52018-11-06 07:35:06 +0100146 EXPECT_THAT(
147 csrcs.GetSources(kTime1 + 1),
Johannes Kronb5d91832019-05-21 13:19:22 +0200148 UnorderedElementsAre(
149 RtpSource(kTime1 + 1, kCsrc1, RtpSourceType::CSRC, absl::nullopt,
150 kRtpTimestamp2),
151 RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, 47, kRtpTimestamp1)));
Jonas Oreland967f7d52018-11-06 07:35:06 +0100152}
153
Niels Mölleraf175952018-08-13 13:23:08 +0200154} // namespace webrtc