145 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using NUnit.Framework.Interfaces;
 | |
| using UnityEngine.Networking.PlayerConnection;
 | |
| using UnityEngine.TestRunner.TestLaunchers;
 | |
| 
 | |
| namespace UnityEngine.TestTools.TestRunner.Callbacks
 | |
| {
 | |
|     [AddComponentMenu("")]
 | |
|     internal class RemoteTestResultSender : MonoBehaviour, ITestRunnerListener
 | |
|     {
 | |
|         private class QueueData
 | |
|         {
 | |
|             public Guid id { get; set; }
 | |
|             public byte[] data { get; set; }
 | |
|         }
 | |
| 
 | |
|         private const int k_aliveMessageFrequency = 120;
 | |
|         private float m_NextliveMessage = k_aliveMessageFrequency;
 | |
|         private readonly Queue<QueueData> m_SendQueue = new Queue<QueueData>();
 | |
|         private readonly object m_LockQueue = new object();
 | |
|         private readonly IRemoteTestResultDataFactory m_TestResultDataFactory = new RemoteTestResultDataFactory();
 | |
| 
 | |
|         public void Start()
 | |
|         {
 | |
|             StartCoroutine(SendDataRoutine());
 | |
|         }
 | |
| 
 | |
|         private byte[] SerializeObject(object objectToSerialize)
 | |
|         {
 | |
|             return Encoding.UTF8.GetBytes(JsonUtility.ToJson(objectToSerialize));
 | |
|         }
 | |
| 
 | |
|         public void RunStarted(ITest testsToRun)
 | |
|         {
 | |
|             var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(testsToRun));
 | |
|             lock (m_LockQueue)
 | |
|             {
 | |
|                 m_SendQueue.Enqueue(new QueueData
 | |
|                 {
 | |
|                     id = PlayerConnectionMessageIds.runStartedMessageId,
 | |
|                     data = data
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public int QueueSize
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 lock (m_LockQueue)
 | |
|                 {
 | |
|                     return m_SendQueue.Count;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void RunFinished(ITestResult testResults)
 | |
|         {
 | |
|             var data = SerializeObject(m_TestResultDataFactory.CreateFromTestResult(testResults));
 | |
|             lock (m_LockQueue)
 | |
|             {
 | |
|                 m_SendQueue.Enqueue(new QueueData { id = PlayerConnectionMessageIds.runFinishedMessageId, data = data, });
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void TestStarted(ITest test)
 | |
|         {
 | |
|             var data = SerializeObject(m_TestResultDataFactory.CreateFromTest(test));
 | |
|             lock (m_LockQueue)
 | |
|             {
 | |
|                 m_SendQueue.Enqueue(new QueueData
 | |
|                 {
 | |
|                     id = PlayerConnectionMessageIds.testStartedMessageId,
 | |
|                     data = data
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public void TestFinished(ITestResult result)
 | |
|         {
 | |
|             var testRunnerResultForApi = m_TestResultDataFactory.CreateFromTestResult(result);
 | |
|             var resultData = SerializeObject(testRunnerResultForApi);
 | |
|             lock (m_LockQueue)
 | |
|             {
 | |
|                 m_SendQueue.Enqueue(new QueueData
 | |
|                 {
 | |
|                     id = PlayerConnectionMessageIds.testFinishedMessageId,
 | |
|                     data = resultData,
 | |
|                 });
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         public IEnumerator SendDataRoutine()
 | |
|         {
 | |
|             while (!PlayerConnection.instance.isConnected)
 | |
|             {
 | |
|                 yield return new WaitForSeconds(1);
 | |
|             }
 | |
| 
 | |
|             while (true)
 | |
|             {
 | |
|                 lock (m_LockQueue)
 | |
|                 {
 | |
|                     if (m_SendQueue.Count > 0)
 | |
|                     {
 | |
|                         if (PlayerConnection.instance.isConnected)
 | |
|                         {
 | |
|                             ResetNextPlayerAliveMessageTime();
 | |
|                             var queueData = m_SendQueue.Dequeue();
 | |
|                             PlayerConnection.instance.Send(queueData.id, queueData.data);
 | |
|                         }
 | |
| 
 | |
|                         yield return null;
 | |
|                     }
 | |
|                     else //This is needed so we dont stall the player totally
 | |
|                     {
 | |
|                         SendAliveMessageIfNeeded();
 | |
|                         yield return new WaitForSeconds(0.02f);
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private void SendAliveMessageIfNeeded()
 | |
|         {
 | |
|             if (Time.timeSinceLevelLoad < m_NextliveMessage)
 | |
|             {
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             Debug.Log("Sending player alive message back to editor.");
 | |
|             ResetNextPlayerAliveMessageTime();
 | |
|             PlayerConnection.instance.Send(PlayerConnectionMessageIds.playerAliveHeartbeat, new byte[0]);
 | |
|         }
 | |
| 
 | |
|         private void ResetNextPlayerAliveMessageTime()
 | |
|         {
 | |
|             m_NextliveMessage = Time.timeSinceLevelLoad + k_aliveMessageFrequency;
 | |
|         }
 | |
|     }
 | |
| }
 |