No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CallbacksDelegator.cs 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. using System;
  2. using System.Linq;
  3. using System.Text;
  4. using NUnit.Framework.Interfaces;
  5. using Unity.Profiling;
  6. using UnityEngine;
  7. using UnityEngine.TestRunner.TestLaunchers;
  8. namespace UnityEditor.TestTools.TestRunner.Api
  9. {
  10. internal class CallbacksDelegator : ICallbacksDelegator
  11. {
  12. private static CallbacksDelegator s_instance;
  13. public static CallbacksDelegator instance
  14. {
  15. get
  16. {
  17. if (s_instance == null)
  18. {
  19. s_instance = new CallbacksDelegator(CallbacksHolder.instance.GetAll, new TestAdaptorFactory());
  20. }
  21. return s_instance;
  22. }
  23. }
  24. private readonly Func<ICallbacks[]> m_CallbacksProvider;
  25. private readonly ITestAdaptorFactory m_AdaptorFactory;
  26. // Note that in the event of a domain reload the filter is not reapplied and will be null
  27. private ITestFilter m_TestRunFilter;
  28. public CallbacksDelegator(Func<ICallbacks[]> callbacksProvider, ITestAdaptorFactory adaptorFactory)
  29. {
  30. m_CallbacksProvider = callbacksProvider;
  31. m_AdaptorFactory = adaptorFactory;
  32. }
  33. public void RunStarted(ITest testsToRun)
  34. {
  35. m_AdaptorFactory.ClearResultsCache();
  36. var testRunnerTestsToRun = m_AdaptorFactory.Create(testsToRun, m_TestRunFilter);
  37. TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testRunnerTestsToRun));
  38. }
  39. public void RunStartedRemotely(byte[] testsToRunData)
  40. {
  41. var testData = Deserialize<RemoteTestResultDataWithTestData>(testsToRunData);
  42. var testsToRun = m_AdaptorFactory.BuildTree(testData);
  43. TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testsToRun));
  44. }
  45. public void RunFinished(ITestResult testResults)
  46. {
  47. var testResult = m_AdaptorFactory.Create(testResults);
  48. TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult));
  49. }
  50. public void RunFinishedRemotely(byte[] testResultsData)
  51. {
  52. var remoteTestResult = Deserialize<RemoteTestResultDataWithTestData>(testResultsData);
  53. var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult);
  54. TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult));
  55. }
  56. public void RunFailed(string failureMessage)
  57. {
  58. Debug.LogError(failureMessage);
  59. TryInvokeAllCallbacks(callbacks =>
  60. {
  61. var errorCallback = callbacks as IErrorCallbacks;
  62. if (errorCallback != null)
  63. {
  64. errorCallback.OnError(failureMessage);
  65. }
  66. });
  67. }
  68. public void TestStarted(ITest test)
  69. {
  70. var testRunnerTest = m_AdaptorFactory.Create(test);
  71. TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testRunnerTest));
  72. }
  73. public void TestStartedRemotely(byte[] testStartedData)
  74. {
  75. var testData = Deserialize<RemoteTestResultDataWithTestData>(testStartedData);
  76. var testsToRun = m_AdaptorFactory.BuildTree(testData);
  77. TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testsToRun));
  78. }
  79. public void TestFinished(ITestResult result)
  80. {
  81. var testResult = m_AdaptorFactory.Create(result);
  82. TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult));
  83. }
  84. public void TestFinishedRemotely(byte[] testResultsData)
  85. {
  86. var remoteTestResult = Deserialize<RemoteTestResultDataWithTestData>(testResultsData);
  87. var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult);
  88. TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult));
  89. }
  90. public void TestTreeRebuild(ITest test)
  91. {
  92. using (new ProfilerMarker(nameof(TestTreeRebuild)).Auto())
  93. {
  94. m_AdaptorFactory.ClearTestsCache();
  95. ITestAdaptor testAdaptor;
  96. using (new ProfilerMarker("CreateTestAdaptors").Auto())
  97. testAdaptor = m_AdaptorFactory.Create(test);
  98. TryInvokeAllCallbacks(callbacks =>
  99. {
  100. var rebuildCallbacks = callbacks as ITestTreeRebuildCallbacks;
  101. if (rebuildCallbacks != null)
  102. {
  103. rebuildCallbacks.TestTreeRebuild(testAdaptor);
  104. }
  105. });
  106. }
  107. }
  108. public void SetTestRunFilter(ITestFilter filter)
  109. {
  110. m_TestRunFilter = filter;
  111. }
  112. private void TryInvokeAllCallbacks(Action<ICallbacks> callbackAction)
  113. {
  114. foreach (var testRunnerApiCallback in m_CallbacksProvider())
  115. {
  116. try
  117. {
  118. callbackAction(testRunnerApiCallback);
  119. }
  120. catch (Exception ex)
  121. {
  122. Debug.LogException(ex);
  123. }
  124. }
  125. }
  126. private static T Deserialize<T>(byte[] data)
  127. {
  128. return JsonUtility.FromJson<T>(Encoding.UTF8.GetString(data));
  129. }
  130. }
  131. }