RemotePlayerTestController.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. using System;
  2. using UnityEditor.Networking.PlayerConnection;
  3. using UnityEditor.TestTools.TestRunner;
  4. using UnityEditor.TestTools.TestRunner.Api;
  5. using UnityEditor.TestTools.TestRunner.UnityTestProtocol;
  6. using UnityEngine;
  7. using UnityEngine.Networking.PlayerConnection;
  8. using UnityEngine.TestRunner.TestLaunchers;
  9. namespace UnityEditor.TestRunner.TestLaunchers
  10. {
  11. [Serializable]
  12. internal class RemoteTestRunController : ScriptableSingleton<RemoteTestRunController>
  13. {
  14. internal const int k_HeartbeatTimeout = 60 * 10;
  15. [SerializeField]
  16. private RemoteTestResultReciever m_RemoteTestResultReciever;
  17. [SerializeField]
  18. private PlatformSpecificSetup m_PlatformSpecificSetup;
  19. [SerializeField]
  20. private bool m_RegisteredConnectionCallbacks;
  21. [SerializeField]
  22. private int m_HearbeatTimeOut;
  23. private UnityEditor.TestTools.TestRunner.DelayedCallback m_TimeoutCallback;
  24. public void Init(BuildTarget buildTarget, int heartbeatTimeout)
  25. {
  26. m_HearbeatTimeOut = heartbeatTimeout;
  27. m_PlatformSpecificSetup = new PlatformSpecificSetup(buildTarget);
  28. m_PlatformSpecificSetup.Setup();
  29. m_RemoteTestResultReciever = new RemoteTestResultReciever();
  30. EditorConnection.instance.Initialize();
  31. if (!m_RegisteredConnectionCallbacks)
  32. {
  33. EditorConnection.instance.Initialize();
  34. DelegateEditorConnectionEvents();
  35. }
  36. }
  37. private void DelegateEditorConnectionEvents()
  38. {
  39. m_RegisteredConnectionCallbacks = true;
  40. //This is needed because RemoteTestResultReceiver is not a ScriptableObject
  41. EditorConnection.instance.Register(PlayerConnectionMessageIds.runStartedMessageId, RunStarted);
  42. EditorConnection.instance.Register(PlayerConnectionMessageIds.runFinishedMessageId, RunFinished);
  43. EditorConnection.instance.Register(PlayerConnectionMessageIds.testStartedMessageId, TestStarted);
  44. EditorConnection.instance.Register(PlayerConnectionMessageIds.testFinishedMessageId, TestFinished);
  45. EditorConnection.instance.Register(PlayerConnectionMessageIds.playerAliveHeartbeat, PlayerAliveHeartbeat);
  46. }
  47. private void RunStarted(MessageEventArgs messageEventArgs)
  48. {
  49. m_TimeoutCallback?.Reset();
  50. m_RemoteTestResultReciever.RunStarted(messageEventArgs);
  51. CallbacksDelegator.instance.RunStartedRemotely(messageEventArgs.data);
  52. }
  53. private void RunFinished(MessageEventArgs messageEventArgs)
  54. {
  55. m_TimeoutCallback?.Clear();
  56. m_RemoteTestResultReciever.RunFinished(messageEventArgs);
  57. m_PlatformSpecificSetup.CleanUp();
  58. CallbacksDelegator.instance.RunFinishedRemotely(messageEventArgs.data);
  59. }
  60. private void TestStarted(MessageEventArgs messageEventArgs)
  61. {
  62. m_TimeoutCallback?.Reset();
  63. CallbacksDelegator.instance.TestStartedRemotely(messageEventArgs.data);
  64. }
  65. private void TestFinished(MessageEventArgs messageEventArgs)
  66. {
  67. m_TimeoutCallback?.Reset();
  68. CallbacksDelegator.instance.TestFinishedRemotely(messageEventArgs.data);
  69. }
  70. private void PlayerAliveHeartbeat(MessageEventArgs messageEventArgs)
  71. {
  72. m_TimeoutCallback?.Reset();
  73. }
  74. private void TimeoutCallback()
  75. {
  76. CallbacksDelegator.instance.RunFailed($"Test execution timed out. No activity received from the player in {m_HearbeatTimeOut} seconds.");
  77. }
  78. public void PostBuildAction()
  79. {
  80. m_PlatformSpecificSetup.PostBuildAction();
  81. }
  82. public void PostSuccessfulBuildAction()
  83. {
  84. m_PlatformSpecificSetup.PostSuccessfulBuildAction();
  85. m_TimeoutCallback = new UnityEditor.TestTools.TestRunner.DelayedCallback(TimeoutCallback, m_HearbeatTimeOut);
  86. }
  87. public void PostSuccessfulLaunchAction()
  88. {
  89. m_PlatformSpecificSetup.PostSuccessfulLaunchAction();
  90. }
  91. }
  92. }