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}