This is a follow up to https://codereview.webrtc.org/1859933002 to change this test also to use a separate worker thread. PeerConnectionEndToEndTest currently use the current thread both as a signaling thread and a worker thread. Although convenient while debugging, it can also hide real bugs. An example is https://codereview.webrtc.org/1766653002/#ps420001 where the worker thread is deadlocked in the track proxy due to that the worker thread waits for the signaling thread but the proxy in turns invokes the worker thread..... That bug was only discovered on Android. BUG= webrtc:5426 Review URL: https://codereview.webrtc.org/1860423002 Cr-Commit-Position: refs/heads/master@{#12295}
101 lines
4.2 KiB
C++
101 lines
4.2 KiB
C++
/*
|
|
* Copyright 2013 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef WEBRTC_API_TEST_PEERCONNECTIONTESTWRAPPER_H_
|
|
#define WEBRTC_API_TEST_PEERCONNECTIONTESTWRAPPER_H_
|
|
|
|
#include "webrtc/api/peerconnectioninterface.h"
|
|
#include "webrtc/api/test/fakeaudiocapturemodule.h"
|
|
#include "webrtc/api/test/fakeconstraints.h"
|
|
#include "webrtc/api/test/fakevideotrackrenderer.h"
|
|
#include "webrtc/base/sigslot.h"
|
|
|
|
class PeerConnectionTestWrapper
|
|
: public webrtc::PeerConnectionObserver,
|
|
public webrtc::CreateSessionDescriptionObserver,
|
|
public sigslot::has_slots<> {
|
|
public:
|
|
static void Connect(PeerConnectionTestWrapper* caller,
|
|
PeerConnectionTestWrapper* callee);
|
|
|
|
explicit PeerConnectionTestWrapper(const std::string& name,
|
|
rtc::Thread* worker_thread);
|
|
virtual ~PeerConnectionTestWrapper();
|
|
|
|
bool CreatePc(const webrtc::MediaConstraintsInterface* constraints);
|
|
|
|
rtc::scoped_refptr<webrtc::DataChannelInterface> CreateDataChannel(
|
|
const std::string& label,
|
|
const webrtc::DataChannelInit& init);
|
|
|
|
// Implements PeerConnectionObserver.
|
|
virtual void OnSignalingChange(
|
|
webrtc::PeerConnectionInterface::SignalingState new_state) {}
|
|
virtual void OnStateChange(
|
|
webrtc::PeerConnectionObserver::StateType state_changed) {}
|
|
virtual void OnAddStream(webrtc::MediaStreamInterface* stream);
|
|
virtual void OnRemoveStream(webrtc::MediaStreamInterface* stream) {}
|
|
virtual void OnDataChannel(webrtc::DataChannelInterface* data_channel);
|
|
virtual void OnRenegotiationNeeded() {}
|
|
virtual void OnIceConnectionChange(
|
|
webrtc::PeerConnectionInterface::IceConnectionState new_state) {}
|
|
virtual void OnIceGatheringChange(
|
|
webrtc::PeerConnectionInterface::IceGatheringState new_state) {}
|
|
virtual void OnIceCandidate(const webrtc::IceCandidateInterface* candidate);
|
|
virtual void OnIceComplete() {}
|
|
|
|
// Implements CreateSessionDescriptionObserver.
|
|
virtual void OnSuccess(webrtc::SessionDescriptionInterface* desc);
|
|
virtual void OnFailure(const std::string& error) {}
|
|
|
|
void CreateOffer(const webrtc::MediaConstraintsInterface* constraints);
|
|
void CreateAnswer(const webrtc::MediaConstraintsInterface* constraints);
|
|
void ReceiveOfferSdp(const std::string& sdp);
|
|
void ReceiveAnswerSdp(const std::string& sdp);
|
|
void AddIceCandidate(const std::string& sdp_mid, int sdp_mline_index,
|
|
const std::string& candidate);
|
|
void WaitForCallEstablished();
|
|
void WaitForConnection();
|
|
void WaitForAudio();
|
|
void WaitForVideo();
|
|
void GetAndAddUserMedia(
|
|
bool audio, const webrtc::FakeConstraints& audio_constraints,
|
|
bool video, const webrtc::FakeConstraints& video_constraints);
|
|
|
|
// sigslots
|
|
sigslot::signal1<std::string*> SignalOnIceCandidateCreated;
|
|
sigslot::signal3<const std::string&,
|
|
int,
|
|
const std::string&> SignalOnIceCandidateReady;
|
|
sigslot::signal1<std::string*> SignalOnSdpCreated;
|
|
sigslot::signal1<const std::string&> SignalOnSdpReady;
|
|
sigslot::signal1<webrtc::DataChannelInterface*> SignalOnDataChannel;
|
|
|
|
private:
|
|
void SetLocalDescription(const std::string& type, const std::string& sdp);
|
|
void SetRemoteDescription(const std::string& type, const std::string& sdp);
|
|
bool CheckForConnection();
|
|
bool CheckForAudio();
|
|
bool CheckForVideo();
|
|
rtc::scoped_refptr<webrtc::MediaStreamInterface> GetUserMedia(
|
|
bool audio, const webrtc::FakeConstraints& audio_constraints,
|
|
bool video, const webrtc::FakeConstraints& video_constraints);
|
|
|
|
std::string name_;
|
|
rtc::Thread* worker_thread_;
|
|
rtc::scoped_refptr<webrtc::PeerConnectionInterface> peer_connection_;
|
|
rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface>
|
|
peer_connection_factory_;
|
|
rtc::scoped_refptr<FakeAudioCaptureModule> fake_audio_capture_module_;
|
|
rtc::scoped_ptr<webrtc::FakeVideoTrackRenderer> renderer_;
|
|
};
|
|
|
|
#endif // WEBRTC_API_TEST_PEERCONNECTIONTESTWRAPPER_H_
|