/* * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #include "modules/rtp_rtcp/source/contributing_sources.h" #include "rtc_base/time_utils.h" #include "test/gmock.h" #include "test/gtest.h" namespace webrtc { namespace { using ::testing::UnorderedElementsAre; constexpr uint32_t kCsrc1 = 111; constexpr uint32_t kCsrc2 = 222; constexpr uint32_t kCsrc3 = 333; } // namespace TEST(ContributingSourcesTest, RecordSources) { ContributingSources csrcs; constexpr uint32_t kCsrcs[] = {kCsrc1, kCsrc2}; constexpr int64_t kTime1 = 10; csrcs.Update(kTime1, kCsrcs, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime1), UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC), RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC))); } TEST(ContributingSourcesTest, UpdateSources) { ContributingSources csrcs; // TODO(nisse): When migrating to absl::Span, the named constant arrays should // be replaced by unnamed literals where they are passed to csrcs.Update(...). constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2}; constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3}; constexpr int64_t kTime1 = 10; constexpr int64_t kTime2 = kTime1 + 5 * rtc::kNumMillisecsPerSec; csrcs.Update(kTime1, kCsrcs1, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime1), UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC), RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC))); csrcs.Update(kTime2, kCsrcs2, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime2), UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC), RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC), RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC))); } TEST(ContributingSourcesTest, ReturnRecentOnly) { ContributingSources csrcs; constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2}; constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3}; constexpr int64_t kTime1 = 10; constexpr int64_t kTime2 = kTime1 + 5 * rtc::kNumMillisecsPerSec; constexpr int64_t kTime3 = kTime1 + 12 * rtc::kNumMillisecsPerSec; csrcs.Update(kTime1, kCsrcs1, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime1), UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC), RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC))); csrcs.Update(kTime2, kCsrcs2, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime3), UnorderedElementsAre(RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC), RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC))); } TEST(ContributingSourcesTest, PurgeOldSources) { ContributingSources csrcs; constexpr uint32_t kCsrcs1[] = {kCsrc1, kCsrc2}; constexpr uint32_t kCsrcs2[] = {kCsrc2, kCsrc3}; constexpr int64_t kTime1 = 10; constexpr int64_t kTime2 = kTime1 + 10 * rtc::kNumMillisecsPerSec; constexpr int64_t kTime3 = kTime1 + 20 * rtc::kNumMillisecsPerSec; csrcs.Update(kTime1, kCsrcs1, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime2), UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC), RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC))); csrcs.Update(kTime2, kCsrcs2, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime2), UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC), RtpSource(kTime2, kCsrc2, RtpSourceType::CSRC), RtpSource(kTime2, kCsrc3, RtpSourceType::CSRC))); csrcs.Update(kTime3, kCsrcs2, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime3), UnorderedElementsAre(RtpSource(kTime3, kCsrc2, RtpSourceType::CSRC), RtpSource(kTime3, kCsrc3, RtpSourceType::CSRC))); // Query at an earlier time; check that old sources really have been purged // and don't reappear. EXPECT_THAT( csrcs.GetSources(kTime2), UnorderedElementsAre(RtpSource(kTime3, kCsrc2, RtpSourceType::CSRC), RtpSource(kTime3, kCsrc3, RtpSourceType::CSRC))); } TEST(ContributingSourcesTest, AudioLevel) { ContributingSources csrcs; constexpr uint32_t kCsrcs[] = {kCsrc1, kCsrc2}; constexpr int64_t kTime1 = 10; csrcs.Update(kTime1, kCsrcs, 47); EXPECT_THAT( csrcs.GetSources(kTime1), UnorderedElementsAre(RtpSource(kTime1, kCsrc1, RtpSourceType::CSRC, 47), RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, 47))); constexpr uint32_t kCsrcsSubset[] = {kCsrc1}; csrcs.Update(kTime1 + 1, kCsrcsSubset, absl::nullopt); EXPECT_THAT( csrcs.GetSources(kTime1 + 1), UnorderedElementsAre(RtpSource(kTime1 + 1, kCsrc1, RtpSourceType::CSRC), RtpSource(kTime1, kCsrc2, RtpSourceType::CSRC, 47))); } } // namespace webrtc