Chromium Code Reviews| Index: webrtc/pc/peerconnectionendtoend_unittest.cc |
| diff --git a/webrtc/pc/peerconnectionendtoend_unittest.cc b/webrtc/pc/peerconnectionendtoend_unittest.cc |
| index df41dac2a8c0fedbd31c010c01a6c79e8aa45682..f2a9641c11714cef3faa89b6e6e5db9d6e893bf0 100644 |
| --- a/webrtc/pc/peerconnectionendtoend_unittest.cc |
| +++ b/webrtc/pc/peerconnectionendtoend_unittest.cc |
| @@ -10,19 +10,28 @@ |
| #include <memory> |
| +#include "webrtc/api/audio_codecs/builtin_audio_decoder_factory.h" |
| #include "webrtc/base/gunit.h" |
| #include "webrtc/base/logging.h" |
| +#include "webrtc/base/ptr_util.h" |
| #include "webrtc/base/ssladapter.h" |
| -#include "webrtc/base/thread.h" |
| #include "webrtc/base/sslstreamadapter.h" |
| #include "webrtc/base/stringencode.h" |
| #include "webrtc/base/stringutils.h" |
| +#include "webrtc/base/thread.h" |
| #ifdef WEBRTC_ANDROID |
| #include "webrtc/pc/test/androidtestinitializer.h" |
| #endif |
| #include "webrtc/pc/test/peerconnectiontestwrapper.h" |
| // Notice that mockpeerconnectionobservers.h must be included after the above! |
| #include "webrtc/pc/test/mockpeerconnectionobservers.h" |
| +#include "webrtc/test/mock_audio_decoder.h" |
| +#include "webrtc/test/mock_audio_decoder_factory.h" |
| + |
| +using testing::AtLeast; |
| +using testing::Invoke; |
| +using testing::StrictMock; |
| +using testing::_; |
| using webrtc::DataChannelInterface; |
| using webrtc::FakeConstraints; |
| @@ -59,13 +68,14 @@ class PeerConnectionEndToEndTest |
| #endif |
| } |
| - void CreatePcs() { |
| - CreatePcs(NULL); |
| - } |
| - |
| - void CreatePcs(const MediaConstraintsInterface* pc_constraints) { |
| - EXPECT_TRUE(caller_->CreatePc(pc_constraints, config_)); |
| - EXPECT_TRUE(callee_->CreatePc(pc_constraints, config_)); |
| + void CreatePcs( |
| + const MediaConstraintsInterface* pc_constraints, |
| + rtc::scoped_refptr<webrtc::AudioEncoderFactory> audio_encoder_factory, |
| + rtc::scoped_refptr<webrtc::AudioDecoderFactory> audio_decoder_factory) { |
| + EXPECT_TRUE(caller_->CreatePc( |
| + pc_constraints, config_, audio_encoder_factory, audio_decoder_factory)); |
| + EXPECT_TRUE(callee_->CreatePc( |
| + pc_constraints, config_, audio_encoder_factory, audio_decoder_factory)); |
| PeerConnectionTestWrapper::Connect(caller_.get(), callee_.get()); |
| caller_->SignalOnDataChannel.connect( |
| @@ -163,13 +173,99 @@ class PeerConnectionEndToEndTest |
| webrtc::PeerConnectionInterface::RTCConfiguration config_; |
| }; |
| +std::unique_ptr<webrtc::AudioDecoder> CreateForwardingMockDecoder( |
| + std::unique_ptr<webrtc::AudioDecoder> real_decoder) { |
| + class ForwardingMockDecoder : public StrictMock<webrtc::MockAudioDecoder> { |
| + public: |
| + ForwardingMockDecoder(std::unique_ptr<AudioDecoder> decoder) |
| + : decoder_(std::move(decoder)) {} |
| + |
| + private: |
| + std::unique_ptr<AudioDecoder> decoder_; |
| + }; |
| + |
| + const auto dec = real_decoder.get(); // For lambda capturing. |
| + auto mock_decoder = |
| + rtc::MakeUnique<ForwardingMockDecoder>(std::move(real_decoder)); |
| + EXPECT_CALL(*mock_decoder, Channels()) |
| + .Times(AtLeast(1)) |
| + .WillRepeatedly(Invoke([dec] { return dec->Channels(); })); |
| + EXPECT_CALL(*mock_decoder, DecodeInternal(_, _, _, _, _)) |
| + .Times(AtLeast(1)) |
| + .WillRepeatedly( |
| + Invoke([dec](const uint8_t* encoded, size_t encoded_len, |
| + int sample_rate_hz, int16_t* decoded, |
| + webrtc::AudioDecoder::SpeechType* speech_type) { |
| + return dec->Decode(encoded, encoded_len, sample_rate_hz, |
| + std::numeric_limits<size_t>::max(), decoded, |
| + speech_type); |
| + })); |
| + EXPECT_CALL(*mock_decoder, Die()); |
| + EXPECT_CALL(*mock_decoder, HasDecodePlc()).WillRepeatedly(Invoke([dec] { |
| + return dec->HasDecodePlc(); |
| + })); |
| + EXPECT_CALL(*mock_decoder, IncomingPacket(_, _, _, _, _)) |
| + .Times(AtLeast(1)) |
| + .WillRepeatedly(Invoke([dec](const uint8_t* payload, size_t payload_len, |
| + uint16_t rtp_sequence_number, |
| + uint32_t rtp_timestamp, |
| + uint32_t arrival_timestamp) { |
| + return dec->IncomingPacket(payload, payload_len, rtp_sequence_number, |
| + rtp_timestamp, arrival_timestamp); |
| + })); |
| + EXPECT_CALL(*mock_decoder, PacketDuration(_, _)) |
| + .Times(AtLeast(1)) |
| + .WillRepeatedly(Invoke([dec](const uint8_t* encoded, size_t encoded_len) { |
| + return dec->PacketDuration(encoded, encoded_len); |
| + })); |
| + EXPECT_CALL(*mock_decoder, SampleRateHz()) |
| + .Times(AtLeast(1)) |
| + .WillRepeatedly(Invoke([dec] { return dec->SampleRateHz(); })); |
| + |
| + return std::move(mock_decoder); |
| +} |
| + |
| +rtc::scoped_refptr<webrtc::AudioDecoderFactory> |
| +CreateForwardingMockDecoderFactory( |
| + webrtc::AudioDecoderFactory* real_decoder_factory) { |
| + rtc::scoped_refptr<webrtc::MockAudioDecoderFactory> mock_decoder_factory = |
| + new rtc::RefCountedObject<StrictMock<webrtc::MockAudioDecoderFactory>>; |
| + EXPECT_CALL(*mock_decoder_factory, GetSupportedDecoders()) |
| + .Times(AtLeast(1)) |
| + .WillRepeatedly(Invoke([real_decoder_factory] { |
| + return real_decoder_factory->GetSupportedDecoders(); |
| + })); |
| + EXPECT_CALL(*mock_decoder_factory, IsSupportedDecoder(_)) |
| + .Times(AtLeast(1)) |
| + .WillRepeatedly( |
| + Invoke([real_decoder_factory](const webrtc::SdpAudioFormat& format) { |
| + return real_decoder_factory->IsSupportedDecoder(format); |
| + })); |
| + EXPECT_CALL(*mock_decoder_factory, MakeAudioDecoderMock(_, _)) |
| + .Times(AtLeast(2)) |
| + .WillRepeatedly( |
| + Invoke([real_decoder_factory]( |
| + const webrtc::SdpAudioFormat& format, |
| + std::unique_ptr<webrtc::AudioDecoder>* return_value) { |
| + auto real_decoder = real_decoder_factory->MakeAudioDecoder(format); |
| + *return_value = |
| + real_decoder |
| + ? CreateForwardingMockDecoder(std::move(real_decoder)) |
| + : nullptr; |
| + })); |
| + return mock_decoder_factory; |
| +} |
| + |
| // Disabled for TSan v2, see |
| // https://bugs.chromium.org/p/webrtc/issues/detail?id=4719 for details. |
| // Disabled for Mac, see |
| // https://bugs.chromium.org/p/webrtc/issues/detail?id=5231 for details. |
| #if !defined(THREAD_SANITIZER) && !defined(WEBRTC_MAC) |
| TEST_F(PeerConnectionEndToEndTest, Call) { |
| - CreatePcs(); |
| + rtc::scoped_refptr<webrtc::AudioDecoderFactory> real_decoder_factory = |
| + webrtc::CreateBuiltinAudioDecoderFactory(); |
| + CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(), |
| + CreateForwardingMockDecoderFactory(real_decoder_factory.get())); |
|
the sun
2017/04/18 10:38:21
What's the rationale for only using the mocks here
kwiberg-webrtc
2017/04/18 10:56:08
IIRC only the two Call* tests actually decode audi
|
| GetAndAddUserMedia(); |
| Negotiate(); |
| WaitForCallEstablished(); |
| @@ -181,7 +277,8 @@ TEST_F(PeerConnectionEndToEndTest, CallWithLegacySdp) { |
| FakeConstraints pc_constraints; |
| pc_constraints.AddMandatory(MediaConstraintsInterface::kEnableDtlsSrtp, |
| false); |
| - CreatePcs(&pc_constraints); |
| + CreatePcs(&pc_constraints, webrtc::CreateBuiltinAudioEncoderFactory(), |
| + webrtc::CreateBuiltinAudioDecoderFactory()); |
| GetAndAddUserMedia(); |
| Negotiate(); |
| WaitForCallEstablished(); |
| @@ -192,7 +289,8 @@ TEST_F(PeerConnectionEndToEndTest, CallWithLegacySdp) { |
| // Verifies that a DataChannel created before the negotiation can transition to |
| // "OPEN" and transfer data. |
| TEST_F(PeerConnectionEndToEndTest, CreateDataChannelBeforeNegotiate) { |
| - CreatePcs(); |
| + CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(), |
| + webrtc::CreateBuiltinAudioDecoderFactory()); |
| webrtc::DataChannelInit init; |
| rtc::scoped_refptr<DataChannelInterface> caller_dc( |
| @@ -216,7 +314,8 @@ TEST_F(PeerConnectionEndToEndTest, CreateDataChannelBeforeNegotiate) { |
| // Verifies that a DataChannel created after the negotiation can transition to |
| // "OPEN" and transfer data. |
| TEST_F(PeerConnectionEndToEndTest, CreateDataChannelAfterNegotiate) { |
| - CreatePcs(); |
| + CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(), |
| + webrtc::CreateBuiltinAudioDecoderFactory()); |
| webrtc::DataChannelInit init; |
| @@ -247,7 +346,8 @@ TEST_F(PeerConnectionEndToEndTest, CreateDataChannelAfterNegotiate) { |
| // Verifies that DataChannel IDs are even/odd based on the DTLS roles. |
| TEST_F(PeerConnectionEndToEndTest, DataChannelIdAssignment) { |
| - CreatePcs(); |
| + CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(), |
| + webrtc::CreateBuiltinAudioDecoderFactory()); |
| webrtc::DataChannelInit init; |
| rtc::scoped_refptr<DataChannelInterface> caller_dc_1( |
| @@ -274,7 +374,8 @@ TEST_F(PeerConnectionEndToEndTest, DataChannelIdAssignment) { |
| // there are multiple DataChannels. |
| TEST_F(PeerConnectionEndToEndTest, |
| MessageTransferBetweenTwoPairsOfDataChannels) { |
| - CreatePcs(); |
| + CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(), |
| + webrtc::CreateBuiltinAudioDecoderFactory()); |
| webrtc::DataChannelInit init; |
| @@ -395,7 +496,8 @@ TEST_F(PeerConnectionEndToEndTest, MessageTransferBetweenQuicDataChannels) { |
| // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=4453 |
| TEST_F(PeerConnectionEndToEndTest, |
| DISABLED_DataChannelFromOpenWorksAfterClose) { |
| - CreatePcs(); |
| + CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(), |
| + webrtc::CreateBuiltinAudioDecoderFactory()); |
| webrtc::DataChannelInit init; |
| rtc::scoped_refptr<DataChannelInterface> caller_dc( |
| @@ -421,7 +523,8 @@ TEST_F(PeerConnectionEndToEndTest, |
| // reference count), no memory access violation will occur. |
| // See: https://code.google.com/p/chromium/issues/detail?id=565048 |
| TEST_F(PeerConnectionEndToEndTest, CloseDataChannelRemotelyWhileNotReferenced) { |
| - CreatePcs(); |
| + CreatePcs(nullptr, webrtc::CreateBuiltinAudioEncoderFactory(), |
| + webrtc::CreateBuiltinAudioDecoderFactory()); |
| webrtc::DataChannelInit init; |
| rtc::scoped_refptr<DataChannelInterface> caller_dc( |