MediaStreamTrackTest.cs 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.TestTools;
  4. using NUnit.Framework;
  5. using System.Linq;
  6. using System.Collections;
  7. using Object = UnityEngine.Object;
  8. namespace Unity.WebRTC.RuntimeTest
  9. {
  10. class MediaStreamTrackTest
  11. {
  12. [SetUp]
  13. public void SetUp()
  14. {
  15. WebRTC.Initialize(true);
  16. }
  17. [TearDown]
  18. public void TearDown()
  19. {
  20. WebRTC.Dispose();
  21. }
  22. [Test]
  23. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  24. public void Constructor()
  25. {
  26. var width = 256;
  27. var height = 256;
  28. var format = WebRTC.GetSupportedRenderTextureFormat(SystemInfo.graphicsDeviceType);
  29. var rt = new RenderTexture(width, height, 0, format);
  30. rt.Create();
  31. var track = new VideoStreamTrack(rt);
  32. Assert.That(track, Is.Not.Null);
  33. track.Dispose();
  34. Object.DestroyImmediate(rt);
  35. }
  36. [Test]
  37. public void ConstructorThrowException()
  38. {
  39. if(VideoStreamTrack.IsSupported(Application.platform, SystemInfo.graphicsDeviceType))
  40. Assert.Ignore();
  41. var width = 256;
  42. var height = 256;
  43. var format = WebRTC.GetSupportedRenderTextureFormat(SystemInfo.graphicsDeviceType);
  44. var rt = new RenderTexture(width, height, 0, format);
  45. rt.Create();
  46. Assert.That(() => { var track = new VideoStreamTrack(rt); }, Throws.TypeOf<NotSupportedException>());
  47. Object.DestroyImmediate(rt);
  48. }
  49. [Test]
  50. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  51. public void EqualIdWithAudioTrack()
  52. {
  53. var guid = Guid.NewGuid().ToString();
  54. var source = new AudioTrackSource();
  55. var track = new AudioStreamTrack(WebRTC.Context.CreateAudioTrack(guid, source.self));
  56. Assert.That(track, Is.Not.Null);
  57. Assert.That(track.Id, Is.EqualTo(guid));
  58. track.Dispose();
  59. source.Dispose();
  60. }
  61. [Test]
  62. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  63. public void EqualIdWithVideoTrack()
  64. {
  65. var guid = Guid.NewGuid().ToString();
  66. var source = new VideoTrackSource();
  67. var track = new VideoStreamTrack(WebRTC.Context.CreateVideoTrack(guid, source.self));
  68. Assert.That(track, Is.Not.Null);
  69. Assert.That(track.Id, Is.EqualTo(guid));
  70. track.Dispose();
  71. source.Dispose();
  72. }
  73. [Test]
  74. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  75. public void AccessAfterDisposed()
  76. {
  77. var width = 256;
  78. var height = 256;
  79. var format = WebRTC.GetSupportedRenderTextureFormat(SystemInfo.graphicsDeviceType);
  80. var rt = new RenderTexture(width, height, 0, format);
  81. rt.Create();
  82. var track = new VideoStreamTrack(rt);
  83. Assert.That(track, Is.Not.Null);
  84. track.Dispose();
  85. Assert.That(() => { var id = track.Id; }, Throws.TypeOf<ObjectDisposedException>());
  86. Object.DestroyImmediate(rt);
  87. }
  88. [Test]
  89. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  90. public void ConstructorThrowsExceptionWhenInvalidGraphicsFormat()
  91. {
  92. var width = 256;
  93. var height = 256;
  94. var format = RenderTextureFormat.R8;
  95. var rt = new RenderTexture(width, height, 0, format);
  96. rt.Create();
  97. Assert.That(() => { new VideoStreamTrack(rt); }, Throws.TypeOf<ArgumentException>());
  98. Object.DestroyImmediate(rt);
  99. }
  100. [Test]
  101. [UnityPlatform(RuntimePlatform.Android)]
  102. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  103. public void ConstructThrowsExceptionWhenSmallTexture()
  104. {
  105. var width = 50;
  106. var height = 50;
  107. var format = WebRTC.GetSupportedRenderTextureFormat(SystemInfo.graphicsDeviceType);
  108. var rt = new RenderTexture(width, height, 0, format);
  109. rt.Create();
  110. Assert.That(() => { new VideoStreamTrack(rt); }, Throws.TypeOf<ArgumentException>());
  111. Object.DestroyImmediate(rt);
  112. }
  113. // todo(kazuki): Crash on windows standalone player
  114. [UnityTest]
  115. [Timeout(5000)]
  116. [UnityPlatform(exclude = new[] { RuntimePlatform.LinuxPlayer, RuntimePlatform.WindowsPlayer })]
  117. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  118. public IEnumerator VideoStreamTrackEnabled()
  119. {
  120. var width = 256;
  121. var height = 256;
  122. var format = WebRTC.GetSupportedRenderTextureFormat(SystemInfo.graphicsDeviceType);
  123. var rt = new RenderTexture(width, height, 0, format);
  124. rt.Create();
  125. var track = new VideoStreamTrack(rt);
  126. Assert.NotNull(track);
  127. // wait for the end of the initialization for encoder on the render thread.
  128. yield return 0;
  129. // todo:: returns always false.
  130. // Assert.True(track.IsInitialized);
  131. // Enabled property
  132. Assert.True(track.Enabled);
  133. track.Enabled = false;
  134. Assert.False(track.Enabled);
  135. // ReadyState property
  136. Assert.That(track.ReadyState, Is.EqualTo(TrackState.Live));
  137. track.Dispose();
  138. // wait for disposing video track.
  139. yield return 0;
  140. Object.DestroyImmediate(rt);
  141. }
  142. // todo::(kazuki) Test execution timed out on linux standalone
  143. [UnityTest]
  144. [Timeout(5000)]
  145. [UnityPlatform(exclude = new[] { RuntimePlatform.LinuxPlayer })]
  146. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  147. public IEnumerator CaptureStreamTrack()
  148. {
  149. var camObj = new GameObject("Camera");
  150. var cam = camObj.AddComponent<Camera>();
  151. var track = cam.CaptureStreamTrack(1280, 720);
  152. Assert.That(track, Is.Not.Null);
  153. yield return new WaitForSeconds(0.1f);
  154. track.Dispose();
  155. // wait for disposing video track.
  156. yield return 0;
  157. Object.DestroyImmediate(camObj);
  158. }
  159. [Test]
  160. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  161. public void CaptureStreamTrackThrowExeption()
  162. {
  163. var camObj = new GameObject("Camera");
  164. var cam = camObj.AddComponent<Camera>();
  165. Assert.That(() => cam.CaptureStreamTrack(0, 0), Throws.ArgumentException);
  166. Object.DestroyImmediate(camObj);
  167. }
  168. [Test]
  169. public void AddAndRemoveAudioStreamTrack()
  170. {
  171. GameObject obj = new GameObject("audio");
  172. AudioSource source = obj.AddComponent<AudioSource>();
  173. source.clip = AudioClip.Create("test", 480, 2, 48000, false);
  174. var stream = new MediaStream();
  175. var track = new AudioStreamTrack(source);
  176. Assert.AreEqual(TrackKind.Audio, track.Kind);
  177. Assert.AreEqual(0, stream.GetAudioTracks().Count());
  178. Assert.True(stream.AddTrack(track));
  179. Assert.AreEqual(1, stream.GetAudioTracks().Count());
  180. Assert.NotNull(stream.GetAudioTracks().First());
  181. Assert.True(stream.RemoveTrack(track));
  182. Assert.AreEqual(0, stream.GetAudioTracks().Count());
  183. track.Dispose();
  184. stream.Dispose();
  185. Object.DestroyImmediate(source.clip);
  186. Object.DestroyImmediate(obj);
  187. }
  188. [Test]
  189. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  190. public void VideoStreamTrackDisposeImmediately()
  191. {
  192. var width = 256;
  193. var height = 256;
  194. var format = WebRTC.GetSupportedRenderTextureFormat(UnityEngine.SystemInfo.graphicsDeviceType);
  195. var rt = new UnityEngine.RenderTexture(width, height, 0, format);
  196. rt.Create();
  197. var track = new VideoStreamTrack(rt);
  198. track.Dispose();
  199. Object.DestroyImmediate(rt);
  200. }
  201. [UnityTest, LongRunning]
  202. [Timeout(5000)]
  203. [UnityPlatform(exclude = new[] { RuntimePlatform.LinuxPlayer })]
  204. [ConditionalIgnore(ConditionalIgnore.UnsupportedPlatformOpenGL, "Not support VideoStreamTrack for OpenGL")]
  205. public IEnumerator VideoStreamTrackInstantiateMultiple()
  206. {
  207. var width = 256;
  208. var height = 256;
  209. var format = WebRTC.GetSupportedRenderTextureFormat(UnityEngine.SystemInfo.graphicsDeviceType);
  210. var rt1 = new UnityEngine.RenderTexture(width, height, 0, format);
  211. rt1.Create();
  212. var track1 = new VideoStreamTrack(rt1);
  213. var rt2 = new UnityEngine.RenderTexture(width, height, 0, format);
  214. rt2.Create();
  215. var track2 = new VideoStreamTrack(rt2);
  216. // wait for initialization encoder on render thread.
  217. yield return new WaitForSeconds(0.1f);
  218. track1.Dispose();
  219. track2.Dispose();
  220. Object.DestroyImmediate(rt1);
  221. Object.DestroyImmediate(rt2);
  222. }
  223. }
  224. }