Keine Beschreibung
Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

RemoteTestResultSender.cs 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5. using NUnit.Framework.Interfaces;
  6. using UnityEngine.Networking.PlayerConnection;
  7. using UnityEngine.TestRunner.TestLaunchers;
  8. namespace UnityEngine.TestTools.TestRunner.Callbacks
  9. {
  10. [AddComponentMenu("")]
  11. internal class RemoteTestResultSender : MonoBehaviour, ITestRunnerListener
  12. {
  13. private class QueueData
  14. {
  15. public Guid id { get; set; }
  16. public byte[] data { get; set; }
  17. }
  18. private const int k_aliveMessageFrequency = 120;
  19. private float m_NextliveMessage = k_aliveMessageFrequency;
  20. private readonly Queue<QueueData> m_SendQueue = new Queue<QueueData>();
  21. private readonly object m_LockQueue = new object();
  22. private readonly IRemoteTestResultDataFactory m_TestResultDataFactory = new RemoteTestResultDataFactory();
  23. public void Start()
  24. {
  25. StartCoroutine(SendDataRoutine());
  26. }
  27. private byte[] SerializeObject(object objectToSerialize)
  28. {
  29. return Encoding.UTF8.GetBytes(JsonUtility.ToJson(objectToSerialize));
  30. }
  31. public void RunStarted(ITest testsToRun)
  32. {
  33. var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(testsToRun));
  34. lock (m_LockQueue)
  35. {
  36. m_SendQueue.Enqueue(new QueueData
  37. {
  38. id = PlayerConnectionMessageIds.runStartedMessageId,
  39. data = data
  40. });
  41. }
  42. }
  43. public void RunFinished(ITestResult testResults)
  44. {
  45. var data = SerializeObject(m_TestResultDataFactory.CreateFromTestResult(testResults));
  46. lock (m_LockQueue)
  47. {
  48. m_SendQueue.Enqueue(new QueueData { id = PlayerConnectionMessageIds.runFinishedMessageId, data = data, });
  49. }
  50. }
  51. public void TestStarted(ITest test)
  52. {
  53. var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(test));
  54. lock (m_LockQueue)
  55. {
  56. m_SendQueue.Enqueue(new QueueData
  57. {
  58. id = PlayerConnectionMessageIds.testStartedMessageId,
  59. data = data
  60. });
  61. }
  62. }
  63. public void TestFinished(ITestResult result)
  64. {
  65. var testRunnerResultForApi = m_TestResultDataFactory.CreateFromTestResult(result);
  66. var resultData = SerializeObject(testRunnerResultForApi);
  67. lock (m_LockQueue)
  68. {
  69. m_SendQueue.Enqueue(new QueueData
  70. {
  71. id = PlayerConnectionMessageIds.testFinishedMessageId,
  72. data = resultData,
  73. });
  74. }
  75. }
  76. public IEnumerator SendDataRoutine()
  77. {
  78. while (!PlayerConnection.instance.isConnected)
  79. {
  80. yield return new WaitForSeconds(1);
  81. }
  82. while (true)
  83. {
  84. lock (m_LockQueue)
  85. {
  86. if (m_SendQueue.Count > 0)
  87. {
  88. if (PlayerConnection.instance.isConnected)
  89. {
  90. ResetNextPlayerAliveMessageTime();
  91. var queueData = m_SendQueue.Dequeue();
  92. PlayerConnection.instance.Send(queueData.id, queueData.data);
  93. }
  94. yield return null;
  95. }
  96. else //This is needed so we dont stall the player totally
  97. {
  98. SendAliveMessageIfNeeded();
  99. yield return new WaitForSeconds(0.02f);
  100. }
  101. }
  102. }
  103. }
  104. private void SendAliveMessageIfNeeded()
  105. {
  106. if (Time.timeSinceLevelLoad < m_NextliveMessage)
  107. {
  108. return;
  109. }
  110. Debug.Log("Sending player alive message back to editor.");
  111. ResetNextPlayerAliveMessageTime();
  112. PlayerConnection.instance.Send(PlayerConnectionMessageIds.playerAliveHeartbeat, new byte[0]);
  113. }
  114. private void ResetNextPlayerAliveMessageTime()
  115. {
  116. m_NextliveMessage = Time.timeSinceLevelLoad + k_aliveMessageFrequency;
  117. }
  118. }
  119. }