зеркало из https://github.com/mozilla/gecko-dev.git
Bug 819549 - Signaling unittests should dispatch to main thread when calling PC. r=jesup
This commit is contained in:
Родитель
fa66f8ae6a
Коммит
2e714cf592
|
@ -371,6 +371,7 @@ TestObserver::OnStateChange(PCObserverStateType state_type, ER&, void*)
|
||||||
switch (state_type)
|
switch (state_type)
|
||||||
{
|
{
|
||||||
case PCObserverStateType::ReadyState:
|
case PCObserverStateType::ReadyState:
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
rv = pc->ReadyState(&gotready);
|
rv = pc->ReadyState(&gotready);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
std::cout << "Ready State: "
|
std::cout << "Ready State: "
|
||||||
|
@ -378,6 +379,7 @@ TestObserver::OnStateChange(PCObserverStateType state_type, ER&, void*)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
break;
|
break;
|
||||||
case PCObserverStateType::IceConnectionState:
|
case PCObserverStateType::IceConnectionState:
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
rv = pc->IceConnectionState(&gotice);
|
rv = pc->IceConnectionState(&gotice);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
std::cout << "ICE Connection State: "
|
std::cout << "ICE Connection State: "
|
||||||
|
@ -385,6 +387,7 @@ TestObserver::OnStateChange(PCObserverStateType state_type, ER&, void*)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
break;
|
break;
|
||||||
case PCObserverStateType::IceGatheringState:
|
case PCObserverStateType::IceGatheringState:
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
rv = pc->IceGatheringState(&goticegathering);
|
rv = pc->IceGatheringState(&goticegathering);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
std::cout
|
std::cout
|
||||||
|
@ -397,6 +400,7 @@ TestObserver::OnStateChange(PCObserverStateType state_type, ER&, void*)
|
||||||
// NS_ENSURE_SUCCESS(rv, rv);
|
// NS_ENSURE_SUCCESS(rv, rv);
|
||||||
break;
|
break;
|
||||||
case PCObserverStateType::SipccState:
|
case PCObserverStateType::SipccState:
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
rv = pc->SipccState(&gotsipcc);
|
rv = pc->SipccState(&gotsipcc);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
std::cout << "SIPCC State: "
|
std::cout << "SIPCC State: "
|
||||||
|
@ -404,6 +408,7 @@ TestObserver::OnStateChange(PCObserverStateType state_type, ER&, void*)
|
||||||
<< std::endl;
|
<< std::endl;
|
||||||
break;
|
break;
|
||||||
case PCObserverStateType::SignalingState:
|
case PCObserverStateType::SignalingState:
|
||||||
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
rv = pc->SignalingState(&gotsignaling);
|
rv = pc->SignalingState(&gotsignaling);
|
||||||
NS_ENSURE_SUCCESS(rv, rv);
|
NS_ENSURE_SUCCESS(rv, rv);
|
||||||
std::cout << "Signaling State: "
|
std::cout << "Signaling State: "
|
||||||
|
@ -673,21 +678,282 @@ class ParsedSDP {
|
||||||
int num_lines;
|
int num_lines;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SignalingAgent {
|
|
||||||
public:
|
|
||||||
SignalingAgent(const std::string &aName) : pc(nullptr), name(aName) {
|
|
||||||
cfg_.addStunServer(g_stun_server_address, g_stun_server_port);
|
|
||||||
|
|
||||||
pc = sipcc::PeerConnectionImpl::CreatePeerConnection();
|
// This class wraps the PeerConnection object and ensures that all calls
|
||||||
EXPECT_TRUE(pc);
|
// into it happen on the main thread.
|
||||||
|
class PCDispatchWrapper : public nsSupportsWeakReference
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PCDispatchWrapper(sipcc::PeerConnectionImpl *peerConnection) {
|
||||||
|
pc_ = peerConnection;
|
||||||
}
|
}
|
||||||
|
|
||||||
SignalingAgent(const std::string &aName, const std::string stun_addr,
|
virtual ~PCDispatchWrapper() {}
|
||||||
uint16_t stun_port) : pc(nullptr), name(aName) {
|
|
||||||
|
NS_DECL_THREADSAFE_ISUPPORTS
|
||||||
|
|
||||||
|
sipcc::PeerConnectionImpl *pcImpl() const {
|
||||||
|
return pc_;
|
||||||
|
}
|
||||||
|
|
||||||
|
const nsRefPtr<sipcc::PeerConnectionMedia>& media() const {
|
||||||
|
return pc_->media();
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP Initialize(TestObserver* aObserver,
|
||||||
|
nsGlobalWindow* aWindow,
|
||||||
|
const sipcc::IceConfiguration& aConfiguration,
|
||||||
|
nsIThread* aThread) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->Initialize(*aObserver, aWindow, aConfiguration, aThread);
|
||||||
|
} else {
|
||||||
|
// It would have been preferable here to dispatch directly to
|
||||||
|
// PeerConnectionImpl::Initialize but since all the PC methods
|
||||||
|
// have overrides clang will throw a 'couldn't infer template
|
||||||
|
// argument' error.
|
||||||
|
// Instead we are dispatching back to the same method for
|
||||||
|
// all of these.
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::Initialize,
|
||||||
|
aObserver, aWindow, aConfiguration, aThread, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
rv = NS_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP CreateOffer(const MediaConstraintsExternal& aConstraints) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->CreateOffer(aConstraints);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::CreateOffer,
|
||||||
|
aConstraints, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP CreateAnswer(const MediaConstraintsExternal& aConstraints) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->CreateAnswer(aConstraints);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::CreateAnswer,
|
||||||
|
aConstraints, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP SetLocalDescription (int32_t aAction, const char* aSDP) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->SetLocalDescription(aAction, aSDP);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::SetLocalDescription,
|
||||||
|
aAction, aSDP, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP SetRemoteDescription (int32_t aAction, const char* aSDP) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->SetRemoteDescription(aAction, aSDP);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::SetRemoteDescription,
|
||||||
|
aAction, aSDP, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP AddIceCandidate(const char* aCandidate, const char* aMid,
|
||||||
|
unsigned short aLevel) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->AddIceCandidate(aCandidate, aMid, aLevel);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::AddIceCandidate,
|
||||||
|
aCandidate, aMid, aLevel, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP AddStream(DOMMediaStream *aMediaStream,
|
||||||
|
const MediaConstraintsExternal& aConstraints) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->AddStream(*aMediaStream, aConstraints);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::AddStream,
|
||||||
|
aMediaStream, aConstraints, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP RemoveStream(DOMMediaStream *aMediaStream) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->RemoveStream(*aMediaStream);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::RemoveStream,
|
||||||
|
aMediaStream, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP GetLocalDescription(char** aSDP) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->GetLocalDescription(aSDP);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::GetLocalDescription,
|
||||||
|
aSDP, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP GetRemoteDescription(char** aSDP) {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->GetRemoteDescription(aSDP);
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::GetRemoteDescription,
|
||||||
|
aSDP, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
mozilla::dom::PCImplSignalingState SignalingState() {
|
||||||
|
mozilla::dom::PCImplSignalingState result;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
result = pc_->SignalingState();
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::SignalingState,
|
||||||
|
&result),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
mozilla::dom::PCImplSipccState SipccState() {
|
||||||
|
mozilla::dom::PCImplSipccState result;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
result = pc_->SipccState();
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::SipccState,
|
||||||
|
&result),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
mozilla::dom::PCImplIceConnectionState IceConnectionState() {
|
||||||
|
mozilla::dom::PCImplIceConnectionState result;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
result = pc_->IceConnectionState();
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::IceConnectionState,
|
||||||
|
&result),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
mozilla::dom::PCImplIceGatheringState IceGatheringState() {
|
||||||
|
mozilla::dom::PCImplIceGatheringState result;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
result = pc_->IceGatheringState();
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::IceGatheringState,
|
||||||
|
&result),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
NS_IMETHODIMP Close() {
|
||||||
|
nsresult rv;
|
||||||
|
|
||||||
|
if (NS_IsMainThread()) {
|
||||||
|
rv = pc_->Close();
|
||||||
|
} else {
|
||||||
|
gMainThread->Dispatch(
|
||||||
|
WrapRunnableRet(this, &PCDispatchWrapper::Close, &rv),
|
||||||
|
NS_DISPATCH_SYNC);
|
||||||
|
}
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
mozilla::RefPtr<sipcc::PeerConnectionImpl> pc_;
|
||||||
|
};
|
||||||
|
|
||||||
|
NS_IMPL_ISUPPORTS(PCDispatchWrapper, nsISupportsWeakReference)
|
||||||
|
|
||||||
|
|
||||||
|
class SignalingAgent {
|
||||||
|
public:
|
||||||
|
SignalingAgent(const std::string &aName,
|
||||||
|
const std::string stun_addr = g_stun_server_address,
|
||||||
|
uint16_t stun_port = g_stun_server_port) : pc(nullptr), name(aName) {
|
||||||
cfg_.addStunServer(stun_addr, stun_port);
|
cfg_.addStunServer(stun_addr, stun_port);
|
||||||
|
|
||||||
pc = sipcc::PeerConnectionImpl::CreatePeerConnection();
|
sipcc::PeerConnectionImpl *pcImpl =
|
||||||
EXPECT_TRUE(pc);
|
sipcc::PeerConnectionImpl::CreatePeerConnection();
|
||||||
|
EXPECT_TRUE(pcImpl);
|
||||||
|
|
||||||
|
pc = new PCDispatchWrapper(pcImpl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -698,10 +964,10 @@ class SignalingAgent {
|
||||||
|
|
||||||
void Init_m(nsCOMPtr<nsIThread> thread)
|
void Init_m(nsCOMPtr<nsIThread> thread)
|
||||||
{
|
{
|
||||||
pObserver = new TestObserver(pc, name);
|
pObserver = new TestObserver(pc->pcImpl(), name);
|
||||||
ASSERT_TRUE(pObserver);
|
ASSERT_TRUE(pObserver);
|
||||||
|
|
||||||
ASSERT_EQ(pc->Initialize(*pObserver, nullptr, cfg_, thread), NS_OK);
|
ASSERT_EQ(pc->Initialize(pObserver, nullptr, cfg_, thread), NS_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Init(nsCOMPtr<nsIThread> thread)
|
void Init(nsCOMPtr<nsIThread> thread)
|
||||||
|
@ -827,7 +1093,7 @@ class SignalingAgent {
|
||||||
}
|
}
|
||||||
|
|
||||||
domMediaStream->SetHintContents(hint);
|
domMediaStream->SetHintContents(hint);
|
||||||
ASSERT_EQ(pc->AddStream(*domMediaStream, *constraints), NS_OK);
|
ASSERT_EQ(pc->AddStream(domMediaStream, *constraints), NS_OK);
|
||||||
domMediaStream_ = domMediaStream;
|
domMediaStream_ = domMediaStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -836,7 +1102,7 @@ class SignalingAgent {
|
||||||
// parameter is absent, removes the stream that was most
|
// parameter is absent, removes the stream that was most
|
||||||
// recently added to the PeerConnection.
|
// recently added to the PeerConnection.
|
||||||
void RemoveLastStreamAdded() {
|
void RemoveLastStreamAdded() {
|
||||||
ASSERT_EQ(pc->RemoveStream(*domMediaStream_), NS_OK);
|
ASSERT_EQ(pc->RemoveStream(domMediaStream_), NS_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CreateOffer(sipcc::MediaConstraints& constraints,
|
void CreateOffer(sipcc::MediaConstraints& constraints,
|
||||||
|
@ -919,7 +1185,7 @@ void CreateAnswer(sipcc::MediaConstraints& constraints, std::string offer,
|
||||||
// hints as were passed in.
|
// hints as were passed in.
|
||||||
// When complete RemoveStream will remove and entire stream and its tracks
|
// When complete RemoveStream will remove and entire stream and its tracks
|
||||||
// not just disable a track as this is currently doing
|
// not just disable a track as this is currently doing
|
||||||
ASSERT_EQ(pc->RemoveStream(*domMediaStream_), NS_OK);
|
ASSERT_EQ(pc->RemoveStream(domMediaStream_), NS_OK);
|
||||||
|
|
||||||
// Now call CreateOffer as JS would
|
// Now call CreateOffer as JS would
|
||||||
pObserver->state = TestObserver::stateNoResponse;
|
pObserver->state = TestObserver::stateNoResponse;
|
||||||
|
@ -1131,7 +1397,7 @@ void CreateAnswer(sipcc::MediaConstraints& constraints, std::string offer,
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
mozilla::RefPtr<sipcc::PeerConnectionImpl> pc;
|
nsRefPtr<PCDispatchWrapper> pc;
|
||||||
nsRefPtr<TestObserver> pObserver;
|
nsRefPtr<TestObserver> pObserver;
|
||||||
char* offer_;
|
char* offer_;
|
||||||
char* answer_;
|
char* answer_;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче