diff --git a/test/pc/e2e/BUILD.gn b/test/pc/e2e/BUILD.gn index 471ac3cdb3..aef52506d5 100644 --- a/test/pc/e2e/BUILD.gn +++ b/test/pc/e2e/BUILD.gn @@ -226,10 +226,15 @@ if (!build_with_chromium) { ":peer_configurer", ":peer_connection_quality_test_params", "../../../api:frame_generator_api", + "../../../api:function_view", + "../../../api:libjingle_peerconnection_api", "../../../api:peer_connection_quality_test_fixture_api", "../../../api:scoped_refptr", + "../../../api:sequence_checker", "../../../modules/audio_processing:api", "../../../pc:peerconnection_wrapper", + "../../../rtc_base:logging", + "../../../rtc_base:refcount", ] absl_deps = [ "//third_party/abseil-cpp/absl/memory", diff --git a/test/pc/e2e/test_peer.cc b/test/pc/e2e/test_peer.cc index 942bedfba3..322bb78e49 100644 --- a/test/pc/e2e/test_peer.cc +++ b/test/pc/e2e/test_peer.cc @@ -18,6 +18,45 @@ namespace webrtc { namespace webrtc_pc_e2e { +namespace { + +class SetRemoteDescriptionCallback + : public webrtc::SetRemoteDescriptionObserverInterface { + public: + void OnSetRemoteDescriptionComplete(webrtc::RTCError error) override { + is_called_ = true; + error_ = error; + } + + bool is_called() const { return is_called_; } + + webrtc::RTCError error() const { return error_; } + + private: + bool is_called_ = false; + webrtc::RTCError error_; +}; + +} // namespace + +bool TestPeer::SetRemoteDescription( + std::unique_ptr desc, + std::string* error_out) { + RTC_CHECK(wrapper_) << "TestPeer is already closed"; + + auto observer = rtc::make_ref_counted(); + // We're assuming (and asserting) that the PeerConnection implementation of + // SetRemoteDescription is synchronous when called on the signaling thread. + pc()->SetRemoteDescription(std::move(desc), observer); + RTC_CHECK(observer->is_called()); + if (!observer->error().ok()) { + RTC_LOG(LS_ERROR) << *params_->name + << ": Failed to set remote description: " + << observer->error().message(); + *error_out = observer->error().message(); + } + return observer->error().ok(); +} bool TestPeer::AddIceCandidates( std::vector> candidates) { diff --git a/test/pc/e2e/test_peer.h b/test/pc/e2e/test_peer.h index 44f55517fa..9858ff389d 100644 --- a/test/pc/e2e/test_peer.h +++ b/test/pc/e2e/test_peer.h @@ -15,10 +15,15 @@ #include #include "absl/memory/memory.h" -#include "absl/types/variant.h" +#include "api/function_view.h" +#include "api/scoped_refptr.h" +#include "api/sequence_checker.h" +#include "api/set_remote_description_observer_interface.h" #include "api/test/frame_generator_interface.h" #include "api/test/peerconnection_quality_test_fixture.h" #include "pc/peer_connection_wrapper.h" +#include "rtc_base/logging.h" +#include "rtc_base/ref_counted_object.h" #include "test/pc/e2e/peer_configurer.h" #include "test/pc/e2e/peer_connection_quality_test_params.h" @@ -47,6 +52,14 @@ class TestPeer final { return wrapper_->observer(); } + // Tell underlying `PeerConnection` to create an Offer. + // `observer` will be invoked on the signaling thread when offer is created. + void CreateOffer( + rtc::scoped_refptr observer) { + RTC_CHECK(wrapper_) << "TestPeer is already closed"; + pc()->CreateOffer(observer.release(), + webrtc::PeerConnectionInterface::RTCOfferAnswerOptions()); + } std::unique_ptr CreateOffer() { RTC_CHECK(wrapper_) << "TestPeer is already closed"; return wrapper_->CreateOffer(); @@ -63,11 +76,9 @@ class TestPeer final { return wrapper_->SetLocalDescription(std::move(desc), error_out); } + // `error_out` will be set only if returned value is false. bool SetRemoteDescription(std::unique_ptr desc, - std::string* error_out = nullptr) { - RTC_CHECK(wrapper_) << "TestPeer is already closed"; - return wrapper_->SetRemoteDescription(std::move(desc), error_out); - } + std::string* error_out = nullptr); rtc::scoped_refptr AddTransceiver( cricket::MediaType media_type,