< Summary

Class:MessagingBusTest.MainMessagingBusTest
Assembly:PerformanceTests
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Scene/PerformanceTests/MessagingBusTest.cs
Covered lines:0
Uncovered lines:73
Coverable lines:73
Total lines:210
Line coverage:0% (0 of 73)
Covered branches:0
Total branches:0

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
MainMessagingBusTest()0%2100%
SetupTests()0%12300%
MeasureTimeToEnqueueThousandMessages()0%2100%
MeasureTimeToProcessThousandMessages()0%2100%
EnqueueNextMessage()0%2100%
SceneMessagesPath()0%2100%
SetupDataFile()0%6200%
ParseMessagesFromDataFile()0%20400%
GetNextSceneMessage()0%12300%
ParseRawIntoQueuedMessage(...)0%6200%
LossyMessageIsReplaced()0%2100%
RemoveEntityShouldClearLossyMessages()0%2100%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/Controllers/Scene/PerformanceTests/MessagingBusTest.cs

#LineLine coverage
 1using DCL;
 2using NUnit.Framework;
 3using System.Collections.Generic;
 4using System.IO;
 5using DCL.Models;
 6using Unity.PerformanceTesting;
 7using UnityEngine;
 8using QueueMode = DCL.QueueMode;
 9
 10namespace MessagingBusTest
 11{
 12    public class MainMessagingBusTest
 13    {
 14        private const string SEND_SCENE_MESSAGE = "SceneController.SendSceneMessage";
 15        private const int SEND_SCENE_UNUSED_CHARS = 3;
 16        protected string[] dataAsJson;
 017        protected LinkedList<QueuedSceneMessage_Scene> queuedMessages = new LinkedList<QueuedSceneMessage_Scene>();
 018        protected string dataSource = "../TestResources/SceneMessages/SceneMessagesDump.RealData.txt";
 019        protected IMessageProcessHandler dummyHandler = new DummyMessageHandler();
 20        protected IEnumerator<QueuedSceneMessage_Scene> nextQueueMessage;
 21
 22        // protected MessagingBus bus;
 23        protected MessagingController controller;
 24
 25        public void SetupTests()
 26        {
 027            if (controller == null)
 28            {
 029                controller = new MessagingController(dummyHandler);
 30            }
 31
 032            if (nextQueueMessage == null)
 33            {
 034                SetupDataFile();
 035                nextQueueMessage = queuedMessages.GetEnumerator();
 36            }
 037        }
 38
 39        [Test, Performance]
 40        public void MeasureTimeToEnqueueThousandMessages()
 41        {
 042            Measure.Method(() =>
 43                   {
 044                       for (var i = 0; i < 1000; i++)
 45                       {
 046                           EnqueueNextMessage();
 47                       }
 048                   })
 049                   .SetUp(() => SetupTests())
 50                   .WarmupCount(3)
 51                   .MeasurementCount(10)
 52                   .IterationsPerMeasurement(10)
 53                   .GC()
 54                   .Run();
 055        }
 56
 57        [Test, Performance]
 58        public void MeasureTimeToProcessThousandMessages()
 59        {
 060            controller.StartBus(MessagingBusType.INIT);
 61
 062            Measure.Method(() =>
 63                   {
 064                       var processed = controller.initBus.processedMessagesCount;
 065                       Assert.IsTrue(controller.initBus.pendingMessagesCount > 1000);
 066                       while (controller.initBus.processedMessagesCount < processed + 1000)
 67                       {
 068                           controller.initBus.ProcessQueue(0.1f, out _);
 69                       }
 070                   })
 71                   .SetUp(() =>
 72                   {
 073                       SetupTests();
 074                       for (var i = 0; i < 1001; i++)
 75                       {
 076                           EnqueueNextMessage();
 77                       }
 078                   })
 79                   .WarmupCount(3)
 80                   .MeasurementCount(10)
 81                   .IterationsPerMeasurement(10)
 82                   .GC()
 83                   .Run();
 084        }
 85
 86        private void EnqueueNextMessage()
 87        {
 088            var queuedMessage = GetNextSceneMessage();
 089            controller.Enqueue(false, queuedMessage, out _);
 090        }
 91
 092        private string SceneMessagesPath() { return Application.dataPath + "/" + dataSource; }
 93
 94        private void SetupDataFile()
 95        {
 096            if (!File.Exists(SceneMessagesPath()))
 97            {
 098                throw new InvalidDataException("The file " + SceneMessagesPath() + " doesn't exist!");
 99            }
 100
 0101            var source = new StreamReader(SceneMessagesPath());
 0102            var fileContents = source.ReadToEnd();
 0103            source.Close();
 0104            dataAsJson = fileContents.Split('\n');
 105
 0106            ParseMessagesFromDataFile();
 0107        }
 108
 109        private void ParseMessagesFromDataFile()
 110        {
 0111            for (var i = 0; i < dataAsJson.Length; i++)
 112            {
 113                string message, locator, raw;
 114                int separator;
 115
 0116                message = dataAsJson[i];
 0117                separator = message.IndexOf(' ');
 0118                locator = "";
 119
 0120                if (separator != -1)
 0121                    locator = message.Substring(0, separator);
 122
 0123                if (locator == SEND_SCENE_MESSAGE)
 124                {
 0125                    raw = message.Substring(separator + 2, message.Length - SEND_SCENE_MESSAGE.Length - SEND_SCENE_UNUSE
 0126                    queuedMessages.AddLast(ParseRawIntoQueuedMessage(raw));
 127                }
 128            }
 0129        }
 130
 131        public QueuedSceneMessage_Scene GetNextSceneMessage()
 132        {
 0133            var currentMessage = nextQueueMessage.Current;
 0134            while (currentMessage == null)
 135            {
 0136                if (!nextQueueMessage.MoveNext())
 137                {
 0138                    nextQueueMessage = queuedMessages.GetEnumerator();
 139                }
 140
 0141                currentMessage = nextQueueMessage.Current;
 142            }
 143
 0144            return currentMessage;
 145        }
 146
 147        public static QueuedSceneMessage_Scene ParseRawIntoQueuedMessage(string raw)
 148        {
 0149            if (!SceneMessageUtilities.DecodePayloadChunk(raw, out string sceneId, out string message, out string tag))
 150            {
 0151                throw new InvalidDataException("Could not decode: " + raw);
 152            }
 153
 0154            return SceneMessageUtilities.DecodeSceneMessage(sceneId, message, tag);
 155        }
 156
 157        [Test]
 158        public void LossyMessageIsReplaced()
 159        {
 0160            string entityId = "entity";
 0161            MessagingBus bus = new MessagingBus(MessagingBusType.SYSTEM, new DummyMessageHandler(), null);
 162
 0163            bus.Enqueue(new QueuedSceneMessage_Scene
 164            {
 165                payload = new Protocol.CreateEntity { entityId = entityId },
 166                message = QueuedSceneMessage.Type.SCENE_MESSAGE.ToString(),
 167                tag = "entity_1"
 168            }, QueueMode.Lossy);
 0169            bus.Enqueue(new QueuedSceneMessage_Scene
 170            {
 171                payload = new Protocol.CreateEntity { entityId = entityId },
 172                message = QueuedSceneMessage.Type.SCENE_MESSAGE.ToString(),
 173                tag = "entity_1"
 174            }, QueueMode.Lossy);
 175
 0176            Assert.AreEqual(1, bus.unreliableMessagesReplaced);
 0177            Assert.AreEqual(1, bus.pendingMessagesCount);
 0178        }
 179
 180        [Test]
 181        public void RemoveEntityShouldClearLossyMessages()
 182        {
 0183            string entityId = "entity";
 0184            MessagingBus bus = new MessagingBus(MessagingBusType.SYSTEM, new DummyMessageHandler(), null);
 185
 0186            bus.Enqueue(new QueuedSceneMessage_Scene
 187            {
 188                payload = new Protocol.CreateEntity { entityId = entityId },
 189                message = QueuedSceneMessage.Type.SCENE_MESSAGE.ToString(),
 190                tag = "entity_1"
 191            }, QueueMode.Lossy);
 0192            bus.Enqueue(new QueuedSceneMessage_Scene
 193            {
 194                payload = new Protocol.RemoveEntity() { entityId = entityId },
 195                type = QueuedSceneMessage.Type.SCENE_MESSAGE,
 196                method = MessagingTypes.ENTITY_DESTROY,
 197                message = QueuedSceneMessage.Type.SCENE_MESSAGE.ToString(),
 198            });
 0199            bus.Enqueue(new QueuedSceneMessage_Scene
 200            {
 201                payload = new Protocol.CreateEntity { entityId = entityId },
 202                message = QueuedSceneMessage.Type.SCENE_MESSAGE.ToString(),
 203                tag = "entity_1"
 204            }, QueueMode.Lossy);
 205
 0206            Assert.AreEqual(0, bus.unreliableMessagesReplaced);
 0207            Assert.AreEqual(3, bus.pendingMessagesCount);
 0208        }
 209    }
 210}