diff --git a/media/base/media_engine_unittest.cc b/media/base/media_engine_unittest.cc index 83f80c4669..23203d110e 100644 --- a/media/base/media_engine_unittest.cc +++ b/media/base/media_engine_unittest.cc @@ -11,6 +11,7 @@ #include "media/base/media_engine.h" #include "test/gmock.h" +#include "test/gtest.h" using ::testing::ElementsAre; using ::testing::Field; @@ -55,4 +56,95 @@ TEST(MediaEngineTest, ReturnsNotStoppedHeaderExtensions) { Field(&RtpExtension::uri, StrEq("uri5")))); } +// This class mocks methods declared as pure virtual in the interface. +// Since the tests are aiming to check the patterns of overrides, the +// functions with default implementations are not mocked. +class MostlyMockVoiceEngineInterface : public VoiceEngineInterface { + public: + MOCK_METHOD(std::vector, + GetRtpHeaderExtensions, + (), + (const, override)); + MOCK_METHOD(void, Init, (), (override)); + MOCK_METHOD(rtc::scoped_refptr, + GetAudioState, + (), + (const, override)); + MOCK_METHOD(std::vector&, send_codecs, (), (const, override)); + MOCK_METHOD(std::vector&, recv_codecs, (), (const, override)); + MOCK_METHOD(bool, + StartAecDump, + (webrtc::FileWrapper file, int64_t max_size_bytes), + (override)); + MOCK_METHOD(void, StopAecDump, (), (override)); + MOCK_METHOD(absl::optional, + GetAudioDeviceStats, + (), + (override)); +}; + +class OldStyleVoiceEngineInterface : public MostlyMockVoiceEngineInterface { + public: + using MostlyMockVoiceEngineInterface::CreateMediaChannel; + // Old style overrides the deprecated API only. + VoiceMediaChannel* CreateMediaChannel( + webrtc::Call* call, + const MediaConfig& config, + const AudioOptions& options, + const webrtc::CryptoOptions& crypto_options) override { + ++call_count; + return nullptr; + } + int call_count = 0; +}; + +class NewStyleVoiceEngineInterface : public MostlyMockVoiceEngineInterface { + // New style overrides the non-deprecated API. + VoiceMediaChannel* CreateMediaChannel( + MediaChannel::Role role, + webrtc::Call* call, + const MediaConfig& config, + const AudioOptions& options, + const webrtc::CryptoOptions& crypto_options, + webrtc::AudioCodecPairId codec_pair_id) override { + return nullptr; + } +}; + +TEST(MediaEngineTest, NewStyleApiCallsOldIfOverridden) { + OldStyleVoiceEngineInterface implementation_under_test; + MediaConfig config; + AudioOptions options; + webrtc::CryptoOptions crypto_options; + // Calling the old-style interface. + implementation_under_test.CreateMediaChannel(nullptr, config, options, + crypto_options); + EXPECT_EQ(implementation_under_test.call_count, 1); + // Calling the new-style interface redirects to the old-style interface. + implementation_under_test.CreateMediaChannel( + MediaChannel::Role::kBoth, nullptr, config, options, crypto_options, + webrtc::AudioCodecPairId::Create()); + EXPECT_EQ(implementation_under_test.call_count, 2); +} + +#if RTC_DCHECK_IS_ON && GTEST_HAS_DEATH_TEST && !defined(WEBRTC_ANDROID) +TEST(MediaEngineTest, NoOverrideOfCreateCausesCrash) { + MostlyMockVoiceEngineInterface implementation_under_test; + MediaConfig config; + AudioOptions options; + webrtc::CryptoOptions crypto_options; +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + + EXPECT_DEATH(implementation_under_test.CreateMediaChannel( + nullptr, config, options, crypto_options), + "Check failed: !recursion_guard_"); +#pragma clang diagnostic pop + EXPECT_DEATH(implementation_under_test.CreateMediaChannel( + MediaChannel::Role::kBoth, nullptr, config, options, + crypto_options, webrtc::AudioCodecPairId::Create()), + "Check failed: !recursion_guard_"); +} +#endif + } // namespace cricket