CoroutineRunner.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. using System;
  2. using System.Collections;
  3. using NUnit.Framework.Internal;
  4. using UnityEngine.TestRunner.NUnitExtensions.Runner;
  5. namespace UnityEngine.TestTools.Utils
  6. {
  7. internal class CoroutineRunner
  8. {
  9. private bool m_Running;
  10. private bool m_TestFailed;
  11. private bool m_Timeout;
  12. private readonly MonoBehaviour m_Controller;
  13. private readonly UnityTestExecutionContext m_Context;
  14. private Coroutine m_TimeOutCoroutine;
  15. private IEnumerator m_TestCoroutine;
  16. internal const int k_DefaultTimeout = 1000 * 180;
  17. public CoroutineRunner(MonoBehaviour playmodeTestsController, UnityTestExecutionContext context)
  18. {
  19. m_Controller = playmodeTestsController;
  20. m_Context = context;
  21. }
  22. public IEnumerator HandleEnumerableTest(IEnumerator testEnumerator)
  23. {
  24. if (m_Context.TestCaseTimeout == 0)
  25. {
  26. m_Context.TestCaseTimeout = k_DefaultTimeout;
  27. }
  28. do
  29. {
  30. if (!m_Running)
  31. {
  32. m_Running = true;
  33. m_TestCoroutine = ExMethod(testEnumerator, m_Context.TestCaseTimeout);
  34. m_Controller.StartCoroutine(m_TestCoroutine);
  35. }
  36. if (m_TestFailed)
  37. {
  38. StopAllRunningCoroutines();
  39. yield break;
  40. }
  41. if (m_Context.ExecutionStatus == TestExecutionStatus.StopRequested || m_Context.ExecutionStatus == TestExecutionStatus.AbortRequested)
  42. {
  43. StopAllRunningCoroutines();
  44. yield break;
  45. }
  46. yield return null;
  47. }
  48. while (m_Running);
  49. }
  50. private void StopAllRunningCoroutines()
  51. {
  52. if (m_TimeOutCoroutine != null)
  53. {
  54. m_Controller.StopCoroutine(m_TimeOutCoroutine);
  55. }
  56. if (m_TestCoroutine != null)
  57. {
  58. m_Controller.StopCoroutine(m_TestCoroutine);
  59. }
  60. }
  61. private IEnumerator ExMethod(IEnumerator e, int timeout)
  62. {
  63. m_TimeOutCoroutine = m_Controller.StartCoroutine(StartTimer(e, timeout,
  64. () =>
  65. {
  66. m_TestFailed = true;
  67. m_Timeout = true;
  68. m_Running = false;
  69. }));
  70. yield return m_Controller.StartCoroutine(e);
  71. m_Controller.StopCoroutine(m_TimeOutCoroutine);
  72. m_Running = false;
  73. }
  74. private IEnumerator StartTimer(IEnumerator coroutineToBeKilled, int timeout, Action onTimeout)
  75. {
  76. yield return new WaitForSecondsRealtime(timeout / 1000f);
  77. if (coroutineToBeKilled != null)
  78. m_Controller.StopCoroutine(coroutineToBeKilled);
  79. if (onTimeout != null)
  80. onTimeout();
  81. }
  82. public bool HasFailedWithTimeout()
  83. {
  84. return m_Timeout;
  85. }
  86. public int GetDefaultTimeout()
  87. {
  88. return k_DefaultTimeout;
  89. }
  90. }
  91. }