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