CallbacksDelegator.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. using System;
  2. using System.Linq;
  3. using System.Text;
  4. using NUnit.Framework.Interfaces;
  5. using NUnit.Framework.Internal;
  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. public CallbacksDelegator(Func<ICallbacks[]> callbacksProvider, ITestAdaptorFactory adaptorFactory)
  27. {
  28. m_CallbacksProvider = callbacksProvider;
  29. m_AdaptorFactory = adaptorFactory;
  30. }
  31. public void RunStarted(ITest testsToRun)
  32. {
  33. m_AdaptorFactory.ClearResultsCache();
  34. var testRunnerTestsToRun = m_AdaptorFactory.Create(testsToRun);
  35. TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testRunnerTestsToRun));
  36. }
  37. public void RunStartedRemotely(byte[] testsToRunData)
  38. {
  39. var testData = Deserialize<RemoteTestResultDataWithTestData>(testsToRunData);
  40. var testsToRun = m_AdaptorFactory.BuildTree(testData);
  41. TryInvokeAllCallbacks(callbacks => callbacks.RunStarted(testsToRun));
  42. }
  43. public void RunFinished(ITestResult testResults)
  44. {
  45. var testResult = m_AdaptorFactory.Create(testResults);
  46. TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult));
  47. }
  48. public void RunFinishedRemotely(byte[] testResultsData)
  49. {
  50. var remoteTestResult = Deserialize<RemoteTestResultDataWithTestData>(testResultsData);
  51. var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult);
  52. TryInvokeAllCallbacks(callbacks => callbacks.RunFinished(testResult));
  53. }
  54. public void RunFailed(string failureMessage)
  55. {
  56. Debug.LogError(failureMessage);
  57. TryInvokeAllCallbacks(callbacks =>
  58. {
  59. var errorCallback = callbacks as IErrorCallbacks;
  60. if (errorCallback != null)
  61. {
  62. errorCallback.OnError(failureMessage);
  63. }
  64. });
  65. }
  66. public void TestStarted(ITest test)
  67. {
  68. var testRunnerTest = m_AdaptorFactory.Create(test);
  69. TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testRunnerTest));
  70. }
  71. public void TestStartedRemotely(byte[] testStartedData)
  72. {
  73. var testData = Deserialize<RemoteTestResultDataWithTestData>(testStartedData);
  74. var testsToRun = m_AdaptorFactory.BuildTree(testData);
  75. TryInvokeAllCallbacks(callbacks => callbacks.TestStarted(testsToRun));
  76. }
  77. public void TestFinished(ITestResult result)
  78. {
  79. var testResult = m_AdaptorFactory.Create(result);
  80. TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult));
  81. }
  82. public void TestFinishedRemotely(byte[] testResultsData)
  83. {
  84. var remoteTestResult = Deserialize<RemoteTestResultDataWithTestData>(testResultsData);
  85. var testResult = m_AdaptorFactory.Create(remoteTestResult.results.First(), remoteTestResult);
  86. TryInvokeAllCallbacks(callbacks => callbacks.TestFinished(testResult));
  87. }
  88. public void TestTreeRebuild(ITest test)
  89. {
  90. m_AdaptorFactory.ClearTestsCache();
  91. var testAdaptor = m_AdaptorFactory.Create(test);
  92. TryInvokeAllCallbacks(callbacks =>
  93. {
  94. var rebuildCallbacks = callbacks as ITestTreeRebuildCallbacks;
  95. if (rebuildCallbacks != null)
  96. {
  97. rebuildCallbacks.TestTreeRebuild(testAdaptor);
  98. }
  99. });
  100. }
  101. private void TryInvokeAllCallbacks(Action<ICallbacks> callbackAction)
  102. {
  103. foreach (var testRunnerApiCallback in m_CallbacksProvider())
  104. {
  105. try
  106. {
  107. callbackAction(testRunnerApiCallback);
  108. }
  109. catch (Exception ex)
  110. {
  111. Debug.LogException(ex);
  112. }
  113. }
  114. }
  115. private static T Deserialize<T>(byte[] data)
  116. {
  117. return JsonUtility.FromJson<T>(Encoding.UTF8.GetString(data));
  118. }
  119. }
  120. }