SignalingPeers.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. using UnityEngine;
  2. using UnityEngine.TestTools;
  3. using NUnit.Framework;
  4. using System.Linq;
  5. using System.Collections;
  6. using System.Collections.Generic;
  7. namespace Unity.WebRTC.RuntimeTest
  8. {
  9. class SignalingPeers : MonoBehaviour, IMonoBehaviourTest
  10. {
  11. RTCPeerConnection[] peers = new RTCPeerConnection[2];
  12. Dictionary<RTCPeerConnection, List<RTCDataChannel>> dataChannels
  13. = new Dictionary<RTCPeerConnection, List<RTCDataChannel>>();
  14. public bool IsTestFinished { get; private set; }
  15. bool negotiating = false;
  16. public void AddStream(int indexPeer, MediaStream stream)
  17. {
  18. foreach (var track in stream.GetTracks())
  19. {
  20. peers[indexPeer].AddTrack(track, stream);
  21. }
  22. }
  23. public RTCRtpTransceiver AddTransceiver(int indexPeer, MediaStreamTrack track)
  24. {
  25. return peers[indexPeer].AddTransceiver(track);
  26. }
  27. public RTCRtpSender AddTrack(int indexPeer, MediaStreamTrack track)
  28. {
  29. return peers[indexPeer].AddTrack(track);
  30. }
  31. public RTCErrorType RemoveTrack(int indexPeer, RTCRtpSender sender)
  32. {
  33. return peers[indexPeer].RemoveTrack(sender);
  34. }
  35. public RTCDataChannel CreateDataChannel(int indexPeer, string label, RTCDataChannelInit option = null)
  36. {
  37. RTCDataChannel channel = peers[indexPeer].CreateDataChannel(label, option);
  38. dataChannels[peers[indexPeer]].Add(channel);
  39. return channel;
  40. }
  41. public List<RTCDataChannel> GetDataChannelList(int indexPeer)
  42. {
  43. return dataChannels[peers[indexPeer]];
  44. }
  45. public RTCStatsReportAsyncOperation GetPeerStats(int indexPeer)
  46. {
  47. return peers[indexPeer].GetStats();
  48. }
  49. public RTCStatsReportAsyncOperation GetSenderStats(int indexPeer, int indexSender)
  50. {
  51. return GetPeerSenders(indexPeer).ElementAt(indexSender).GetStats();
  52. }
  53. public RTCStatsReportAsyncOperation GetReceiverStats(int indexPeer, int indexReceiver)
  54. {
  55. return GetPeerReceivers(indexPeer).ElementAt(indexReceiver).GetStats();
  56. }
  57. public IEnumerable<RTCRtpSender> GetPeerSenders(int indexPeer)
  58. {
  59. return peers[indexPeer].GetSenders();
  60. }
  61. public IEnumerable<RTCRtpReceiver> GetPeerReceivers(int indexPeer)
  62. {
  63. return peers[indexPeer].GetReceivers();
  64. }
  65. public IEnumerable<RTCRtpTransceiver> GetPeerTransceivers(int indexPeer)
  66. {
  67. return peers[indexPeer].GetTransceivers();
  68. }
  69. public Coroutine CoroutineUpdate()
  70. {
  71. return StartCoroutine(WebRTC.Update());
  72. }
  73. void Awake()
  74. {
  75. RTCConfiguration config = default;
  76. config.iceServers = new[]
  77. {
  78. new RTCIceServer {urls = new[] {"stun:stun.l.google.com:19302"}}
  79. };
  80. peers[0] = new RTCPeerConnection(ref config);
  81. peers[1] = new RTCPeerConnection(ref config);
  82. dataChannels[peers[0]] = new List<RTCDataChannel>();
  83. dataChannels[peers[1]] = new List<RTCDataChannel>();
  84. peers[0].OnIceCandidate = candidate =>
  85. {
  86. Assert.That(candidate, Is.Not.Null);
  87. Assert.That(candidate, Is.Not.Null);
  88. peers[1].AddIceCandidate(candidate);
  89. };
  90. peers[1].OnIceCandidate = candidate =>
  91. {
  92. Assert.That(candidate, Is.Not.Null);
  93. Assert.That(candidate.Candidate, Is.Not.Null);
  94. peers[0].AddIceCandidate(candidate);
  95. };
  96. peers[1].OnTrack = e =>
  97. {
  98. Assert.That(e, Is.Not.Null);
  99. Assert.That(e.Track, Is.Not.Null);
  100. Assert.That(e.Receiver, Is.Not.Null);
  101. Assert.That(e.Transceiver, Is.Not.Null);
  102. };
  103. peers[0].OnDataChannel = e =>
  104. {
  105. if (peers[0].ConnectionState == RTCPeerConnectionState.Connected)
  106. dataChannels[peers[0]].Add(e);
  107. };
  108. peers[1].OnDataChannel = e =>
  109. {
  110. if (peers[1].ConnectionState == RTCPeerConnectionState.Connected)
  111. dataChannels[peers[1]].Add(e);
  112. };
  113. peers[0].OnNegotiationNeeded = () =>
  114. {
  115. IsTestFinished = false;
  116. StartCoroutine(Negotiate(peers[0], peers[1]));
  117. };
  118. peers[1].OnNegotiationNeeded = () =>
  119. {
  120. IsTestFinished = false;
  121. StartCoroutine(Negotiate(peers[1], peers[0]));
  122. };
  123. }
  124. IEnumerator Negotiate(RTCPeerConnection peer1, RTCPeerConnection peer2)
  125. {
  126. if (negotiating)
  127. {
  128. Debug.LogError("Negotiating");
  129. yield break;
  130. }
  131. negotiating = true;
  132. var op1 = peer1.CreateOffer();
  133. yield return op1;
  134. Assert.That(op1.IsError, Is.False, op1.Error.message);
  135. var desc = op1.Desc;
  136. var op2 = peer1.SetLocalDescription(ref desc);
  137. yield return op2;
  138. Assert.That(op2.IsError, Is.False, op2.Error.message);
  139. var op3 = peer2.SetRemoteDescription(ref desc);
  140. yield return op3;
  141. Assert.That(op3.IsError, Is.False, op3.Error.message);
  142. var op4 = peer2.CreateAnswer();
  143. yield return op4;
  144. Assert.That(op4.IsError, Is.False, op4.Error.message);
  145. desc = op4.Desc;
  146. var op5 = peer2.SetLocalDescription(ref desc);
  147. yield return op5;
  148. Assert.That(op5.IsError, Is.False, op5.Error.message);
  149. var op6 = peer1.SetRemoteDescription(ref desc);
  150. yield return op6;
  151. Assert.That(op6.IsError, Is.False, op6.Error.message);
  152. var op7 = new WaitUntilWithTimeout(() =>
  153. peers[0].SignalingState == RTCSignalingState.Stable &&
  154. peers[1].SignalingState == RTCSignalingState.Stable, 5000);
  155. yield return op7;
  156. Assert.That(op7.IsCompleted, Is.True);
  157. IsTestFinished = true;
  158. negotiating = false;
  159. }
  160. public bool NegotiationCompleted()
  161. {
  162. return !negotiating &&
  163. peers[0].SignalingState == RTCSignalingState.Stable && peers[1].SignalingState == RTCSignalingState.Stable;
  164. }
  165. public void Dispose()
  166. {
  167. dataChannels.Clear();
  168. peers[0].Close();
  169. peers[1].Close();
  170. }
  171. }
  172. }