Index: talk/app/webrtc/peerconnection_unittest.cc |
diff --git a/talk/app/webrtc/peerconnection_unittest.cc b/talk/app/webrtc/peerconnection_unittest.cc |
index 6307bfc6d88d45819d8ad731d2e1b76a0aeb5625..5aba2460c5e7125cecdd5e5cc5d1e70a452cce3a 100644 |
--- a/talk/app/webrtc/peerconnection_unittest.cc |
+++ b/talk/app/webrtc/peerconnection_unittest.cc |
@@ -98,6 +98,7 @@ static const int kMaxWaitMs = 10000; |
#if !defined(THREAD_SANITIZER) |
static const int kMaxWaitForStatsMs = 3000; |
#endif |
+static const int kMaxWaitForActivationMs = 5000; |
static const int kMaxWaitForFramesMs = 10000; |
static const int kEndAudioFrameCount = 3; |
static const int kEndVideoFrameCount = 3; |
@@ -288,18 +289,7 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, |
peer_connection_factory_->CreateLocalMediaStream(stream_label); |
if (audio && can_receive_audio()) { |
- FakeConstraints constraints; |
- // Disable highpass filter so that we can get all the test audio frames. |
- constraints.AddMandatory( |
- MediaConstraintsInterface::kHighpassFilter, false); |
- rtc::scoped_refptr<webrtc::AudioSourceInterface> source = |
- peer_connection_factory_->CreateAudioSource(&constraints); |
- // TODO(perkj): Test audio source when it is implemented. Currently audio |
- // always use the default input. |
- std::string label = stream_label + kAudioTrackLabelBase; |
- rtc::scoped_refptr<webrtc::AudioTrackInterface> audio_track( |
- peer_connection_factory_->CreateAudioTrack(label, source)); |
- stream->AddTrack(audio_track); |
+ stream->AddTrack(CreateLocalAudioTrack(stream_label)); |
} |
if (video && can_receive_video()) { |
stream->AddTrack(CreateLocalVideoTrack(stream_label)); |
@@ -401,6 +391,35 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, |
data_observer_.reset(new MockDataChannelObserver(data_channel_)); |
} |
+ rtc::scoped_refptr<webrtc::AudioTrackInterface> CreateLocalAudioTrack( |
+ const std::string& stream_label) { |
+ FakeConstraints constraints; |
+ // Disable highpass filter so that we can get all the test audio frames. |
+ constraints.AddMandatory(MediaConstraintsInterface::kHighpassFilter, false); |
+ rtc::scoped_refptr<webrtc::AudioSourceInterface> source = |
+ peer_connection_factory_->CreateAudioSource(&constraints); |
+ // TODO(perkj): Test audio source when it is implemented. Currently audio |
+ // always use the default input. |
+ std::string label = stream_label + kAudioTrackLabelBase; |
+ return peer_connection_factory_->CreateAudioTrack(label, source); |
+ } |
+ |
+ rtc::scoped_refptr<webrtc::VideoTrackInterface> CreateLocalVideoTrack( |
+ const std::string& stream_label) { |
+ // Set max frame rate to 10fps to reduce the risk of the tests to be flaky. |
+ FakeConstraints source_constraints = video_constraints_; |
+ source_constraints.SetMandatoryMaxFrameRate(10); |
+ |
+ cricket::FakeVideoCapturer* fake_capturer = |
+ new webrtc::FakePeriodicVideoCapturer(); |
+ video_capturers_.push_back(fake_capturer); |
+ rtc::scoped_refptr<webrtc::VideoSourceInterface> source = |
+ peer_connection_factory_->CreateVideoSource(fake_capturer, |
+ &source_constraints); |
+ std::string label = stream_label + kVideoTrackLabelBase; |
+ return peer_connection_factory_->CreateVideoTrack(label, source); |
+ } |
+ |
DataChannelInterface* data_channel() { return data_channel_; } |
const MockDataChannelObserver* data_observer() const { |
return data_observer_.get(); |
@@ -715,22 +734,6 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver, |
return peer_connection_.get() != nullptr; |
} |
- rtc::scoped_refptr<webrtc::VideoTrackInterface> |
- CreateLocalVideoTrack(const std::string stream_label) { |
- // Set max frame rate to 10fps to reduce the risk of the tests to be flaky. |
- FakeConstraints source_constraints = video_constraints_; |
- source_constraints.SetMandatoryMaxFrameRate(10); |
- |
- cricket::FakeVideoCapturer* fake_capturer = |
- new webrtc::FakePeriodicVideoCapturer(); |
- video_capturers_.push_back(fake_capturer); |
- rtc::scoped_refptr<webrtc::VideoSourceInterface> source = |
- peer_connection_factory_->CreateVideoSource( |
- fake_capturer, &source_constraints); |
- std::string label = stream_label + kVideoTrackLabelBase; |
- return peer_connection_factory_->CreateVideoTrack(label, source); |
- } |
- |
rtc::scoped_refptr<webrtc::PeerConnectionInterface> CreatePeerConnection( |
webrtc::PortAllocatorFactoryInterface* factory, |
const MediaConstraintsInterface* constraints) { |
@@ -1011,7 +1014,6 @@ class MAYBE_JsepPeerConnectionP2PTestClient : public testing::Test { |
initiating_client_->AddMediaStream(true, true); |
} |
initiating_client_->Negotiate(); |
- const int kMaxWaitForActivationMs = 5000; |
// Assert true is used here since next tests are guaranteed to fail and |
// would eat up 5 seconds. |
ASSERT_TRUE_WAIT(SessionActive(), kMaxWaitForActivationMs); |
@@ -1653,6 +1655,34 @@ TEST_F(MAYBE_JsepPeerConnectionP2PTestClient, |
LocalP2PTest(); |
} |
+// This tests that if we negotiate after calling CreateSender but before we |
+// have a track, then set a track later, frames from the newly-set track are |
+// received end-to-end. |
+TEST_F(MAYBE_JsepPeerConnectionP2PTestClient, EarlyWarmupTest) { |
+ ASSERT_TRUE(CreateTestClients()); |
+ auto audio_sender = initializing_client()->pc()->CreateSender("audio"); |
+ auto video_sender = initializing_client()->pc()->CreateSender("video"); |
+ initializing_client()->Negotiate(); |
+ // Wait for ICE connection to complete, without any tracks. |
+ // Note that the receiving client WILL (in HandleIncomingOffer) create |
+ // tracks, so it's only the initiator here that's doing early warmup. |
+ ASSERT_TRUE_WAIT(SessionActive(), kMaxWaitForActivationMs); |
+ VerifySessionDescriptions(); |
+ EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionCompleted, |
+ initializing_client()->ice_connection_state(), |
+ kMaxWaitForFramesMs); |
+ EXPECT_EQ_WAIT(webrtc::PeerConnectionInterface::kIceConnectionConnected, |
+ receiving_client()->ice_connection_state(), |
+ kMaxWaitForFramesMs); |
+ // Now set the tracks, and expect frames to immediately start flowing. |
+ EXPECT_TRUE( |
+ audio_sender->SetTrack(initializing_client()->CreateLocalAudioTrack(""))); |
+ EXPECT_TRUE( |
+ video_sender->SetTrack(initializing_client()->CreateLocalVideoTrack(""))); |
+ EXPECT_TRUE_WAIT(FramesNotPending(kEndAudioFrameCount, kEndVideoFrameCount), |
+ kMaxWaitForFramesMs); |
+} |
+ |
class IceServerParsingTest : public testing::Test { |
public: |
// Convenience for parsing a single URL. |