Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(939)

Unified Diff: webrtc/api/peerconnection_unittest.cc

Issue 1999853002: Forward the SignalFirstPacketReceived to RtpReceiver. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Make the destructor of RtpReceiverObserverInterface virtual. Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/api/peerconnection_unittest.cc
diff --git a/webrtc/api/peerconnection_unittest.cc b/webrtc/api/peerconnection_unittest.cc
index 24411ab729060c09c9658aab987b49e0b9db85f5..03c0624c99237041eb28aeaf6070adca2c938769 100644
--- a/webrtc/api/peerconnection_unittest.cc
+++ b/webrtc/api/peerconnection_unittest.cc
@@ -146,6 +146,37 @@ class SignalingMessageReceiver {
virtual ~SignalingMessageReceiver() {}
};
+class MockRtpReceiverObserver : public webrtc::RtpReceiverObserverInterface {
+ public:
+ MockRtpReceiverObserver()
+ : is_first_audio_packet_recevied_(false),
+ is_first_video_packet_recevied_(false),
+ kind_("unset") {}
+
+ void onFirstPacketReceived(cricket::MediaType media_type) override {
pthatcher2 2016/05/20 20:23:13 OnFirstPacketReceived
+ if (media_type == cricket::MEDIA_TYPE_AUDIO) {
+ is_first_audio_packet_recevied_ = true;
+ } else if (media_type == cricket::MEDIA_TYPE_VIDEO) {
+ is_first_video_packet_recevied_ = true;
+ }
+ }
+
+ void SetKind(std::string kind) { kind_ = kind; }
+
+ std::string kind() { return kind_; }
+
+ bool IsFirstAudioPacketReceived() { return is_first_audio_packet_recevied_; }
+
+ bool IsFirstVideoPacketReceived() { return is_first_video_packet_recevied_; }
+
+ virtual ~MockRtpReceiverObserver() {}
+
+ private:
+ bool is_first_audio_packet_recevied_;
+ bool is_first_video_packet_recevied_;
+ std::string kind_;
+};
+
class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
public SignalingMessageReceiver,
public ObserverInterface {
@@ -777,6 +808,11 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
return pc()->ice_gathering_state();
}
+ std::vector<rtc::scoped_refptr<MockRtpReceiverObserver>>
+ RtpReceiverObservers() {
pthatcher2 2016/05/20 20:23:13 rtp_receiver_observers()
zhihuang1 2016/05/24 01:01:44 Done.
+ return rtp_receiver_observers_;
+ }
+
private:
class DummyDtmfObserver : public DtmfSenderObserverInterface {
public:
@@ -867,6 +903,8 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
std::unique_ptr<SessionDescriptionInterface> desc(
webrtc::CreateSessionDescription("offer", msg, nullptr));
EXPECT_TRUE(DoSetRemoteDescription(desc.release()));
+ // Register the RtpReceiverObserver after receivers are created.
+ DoRegisterRtpReceiverObservers();
pthatcher2 2016/05/20 20:23:13 Why not just RegisterRtpReceiverObservers()?
zhihuang1 2016/05/24 01:01:44 Done.
std::unique_ptr<SessionDescriptionInterface> answer;
EXPECT_TRUE(DoCreateAnswer(&answer));
std::string sdp;
@@ -940,6 +978,16 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
return true;
}
+ void DoRegisterRtpReceiverObservers() {
+ for (auto receiver : pc()->GetReceivers()) {
+ rtc::scoped_refptr<MockRtpReceiverObserver> observer(
+ new rtc::RefCountedObject<MockRtpReceiverObserver>());
+ observer->SetKind(receiver->track()->kind());
+ receiver->RegisterRtpReceiverObserver(observer);
+ rtp_receiver_observers_.push_back(observer);
+ }
+ }
+
bool DoSetRemoteDescription(SessionDescriptionInterface* desc) {
rtc::scoped_refptr<MockSetSessionDescriptionObserver>
observer(new rtc::RefCountedObject<
@@ -1023,6 +1071,9 @@ class PeerConnectionTestClient : public webrtc::PeerConnectionObserver,
rtc::scoped_refptr<DataChannelInterface> data_channel_;
std::unique_ptr<MockDataChannelObserver> data_observer_;
+
+ std::vector<rtc::scoped_refptr<MockRtpReceiverObserver>>
+ rtp_receiver_observers_;
};
class P2PTestConductor : public testing::Test {
@@ -1312,6 +1363,25 @@ class P2PTestConductor : public testing::Test {
return old;
}
+ // Only check the callee side because only callee can guarantee to register
+ // the observer before sending the data.
pthatcher2 2016/05/20 20:23:13 Here's a simple solution: whenever an observer is
zhihuang1 2016/05/24 01:01:44 This is a nice and easy solution.
+ void CheckRtpReceiverObserverAreCalled() {
+ for (auto observer : receiving_client_->RtpReceiverObservers()) {
+ if (observer->kind() == webrtc::MediaStreamTrackInterface::kAudioKind) {
+ EXPECT_TRUE_WAIT(observer->IsFirstAudioPacketReceived(),
+ kMaxWaitForFramesMs);
+ EXPECT_FALSE(observer->IsFirstVideoPacketReceived());
+ } else if (observer->kind() ==
+ webrtc::MediaStreamTrackInterface::kVideoKind) {
+ EXPECT_FALSE(observer->IsFirstAudioPacketReceived());
+ EXPECT_TRUE_WAIT(observer->IsFirstVideoPacketReceived(),
+ kMaxWaitForFramesMs);
+ } else {
+ EXPECT_TRUE(false);
pthatcher2 2016/05/20 20:23:13 I think you can add a message to the EXPECT, like
zhihuang1 2016/05/24 01:01:44 Done.
+ }
+ }
+ }
+
private:
// |worker_thread_| is used by both |initiating_client_| and
// |receiving_client_|. Must be destroyed last.
@@ -1329,6 +1399,12 @@ class P2PTestConductor : public testing::Test {
// https://code.google.com/p/webrtc/issues/detail?id=1205 for details.
#if !defined(THREAD_SANITIZER)
+TEST_F(P2PTestConductor, TestRtpReceiverObserverCallbackFunction) {
+ ASSERT_TRUE(CreateTestClients());
+ LocalP2PTest();
+ CheckRtpReceiverObserverAreCalled();
pthatcher2 2016/05/20 20:23:13 If it's only called once, just put the code inline
zhihuang1 2016/05/24 01:01:44 I will make it a helper function to check both the
+}
+
// This test sets up a Jsep call between two parties and test Dtmf.
// TODO(holmer): Disabled due to sometimes crashing on buildbots.
// See issue webrtc/2378.

Powered by Google App Engine
This is Rietveld 408576698