< Summary

Class:DCL.MessagingController
Assembly:DCL.Runtime
File(s):/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/Messaging/MessagingController.cs
Covered lines:47
Uncovered lines:19
Coverable lines:66
Total lines:170
Line coverage:71.2% (47 of 66)
Covered branches:0
Total branches:0
Covered methods:8
Total methods:9
Method coverage:88.8% (8 of 9)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
MessagingController(...)0%110100%
AddMessageBus(...)0%110100%
StartBus(...)0%220100%
StopBus(...)0%220100%
Stop()0%220100%
Dispose()0%220100%
ForceEnqueue(...)0%110100%
Enqueue(...)0%20.9410052.17%
GetEntityIdAndClassIdFromTag(...)0%20400%

File(s)

/tmp/workspace/unity-renderer/unity-renderer/Assets/Scripts/MainScripts/DCL/WorldRuntime/Messaging/MessagingController.cs

#LineLine coverage
 1using DCL.Controllers;
 2using DCL.Models;
 3using System;
 4using System.Collections.Generic;
 5using UnityEngine;
 6using UnityEngine.Profiling;
 7
 8namespace DCL
 9{
 10    public class MessagingController : IDisposable
 11    {
 12        const char SEPARATOR = '_';
 13
 14        public enum QueueState
 15        {
 16            Init,
 17            Systems,
 18        }
 19
 47320        public Dictionary<MessagingBusType, MessagingBus> messagingBuses =
 21            new Dictionary<MessagingBusType, MessagingBus>();
 22
 23        public IMessageProcessHandler messageHandler;
 24        public int debugSceneNumber;
 47325        public bool enabled = true;
 26
 27        private QueueState currentQueueState;
 28
 29        public readonly MessagingBus initBus;
 30        public readonly MessagingBus systemBus;
 31        public readonly MessagingBus uiBus;
 32
 33        public IMessagingControllersManager messagingManager;
 34
 47335        public MessagingController(IMessagingControllersManager messagingManager, IMessageProcessHandler messageHandler,
 36            int debugSceneNumber = -1)
 37        {
 47338            this.messagingManager = messagingManager;
 47339            this.debugSceneNumber = debugSceneNumber;
 47340            this.messageHandler = messageHandler;
 41
 42            //TODO(Brian): This is too hacky, most of the controllers won't be using this system. Refactor this in the f
 47343            uiBus = AddMessageBus(MessagingBusType.UI);
 47344            initBus = AddMessageBus(MessagingBusType.INIT);
 47345            systemBus = AddMessageBus(MessagingBusType.SYSTEM);
 46
 47347            currentQueueState = QueueState.Init;
 48
 47349            StartBus(MessagingBusType.INIT);
 47350            StartBus(MessagingBusType.UI);
 47351        }
 52
 53        private MessagingBus AddMessageBus(MessagingBusType type)
 54        {
 141955            var newMessagingBus = new MessagingBus(type, messageHandler, this);
 141956            newMessagingBus.debugSceneNumber = debugSceneNumber;
 57
 141958            messagingBuses.Add(type, newMessagingBus);
 141959            return newMessagingBus;
 60        }
 61
 62        public void StartBus(MessagingBusType busType)
 63        {
 94864            if (messagingBuses.ContainsKey(busType))
 65            {
 94866                messagingBuses[busType].Start();
 67            }
 94868        }
 69
 70        public void StopBus(MessagingBusType busType)
 71        {
 172            if (messagingBuses.ContainsKey(busType))
 73            {
 174                messagingBuses[busType].Stop();
 75            }
 176        }
 77
 78        public void Stop()
 79        {
 89180            using (var iterator = messagingBuses.GetEnumerator())
 81            {
 356482                while (iterator.MoveNext())
 83                {
 267384                    iterator.Current.Value.Stop();
 85                }
 89186            }
 89187        }
 88
 89        public void Dispose()
 90        {
 46691            using (var iterator = messagingBuses.GetEnumerator())
 92            {
 186493                while (iterator.MoveNext())
 94                {
 139895                    iterator.Current.Value.Dispose();
 96                }
 46697            }
 46698        }
 99
 100        public void ForceEnqueue(MessagingBusType busType, QueuedSceneMessage queuedMessage)
 101        {
 30102            messagingBuses[busType].Enqueue(queuedMessage);
 30103        }
 104
 105        public void Enqueue(bool isUiBus, QueuedSceneMessage_Scene queuedMessage, out MessagingBusType busType)
 106        {
 1107            busType = MessagingBusType.NONE;
 108
 1109            QueueMode queueMode = QueueMode.Reliable;
 110
 111            // If current scene is the Global Scene, the bus id should be UI
 1112            if (isUiBus)
 0113                busType = MessagingBusType.UI;
 1114            else if (currentQueueState == QueueState.Init)
 1115                busType = MessagingBusType.INIT;
 116            else
 0117                busType = MessagingBusType.SYSTEM;
 118
 119            // Check if the message type is an EntityComponentCreateOrUpdate
 1120            if (queuedMessage.payload is Protocol.EntityComponentCreateOrUpdate)
 121            {
 122                // We need to extract the entityId and the classId from the tag.
 123                // The tag format is "entityId_classId", i.e: "E1_2".
 0124                GetEntityIdAndClassIdFromTag(queuedMessage.tag, out int classId);
 125
 126                // If it is a transform update, the queue mode is Lossy
 0127                if (classId == (int) CLASS_ID_COMPONENT.TRANSFORM)
 0128                    queueMode = QueueMode.Lossy;
 129            }
 1130            else if (queuedMessage.payload is Protocol.QueryPayload)
 131            {
 0132                busType = MessagingBusType.UI;
 0133                queueMode = QueueMode.Lossy;
 134            }
 1135            else if (queuedMessage.payload is Protocol.SceneReady)
 136            {
 137                // When a INIT DONE message is enqueued, the next messages should be
 138                // enqueued in SYSTEM message bus, but we don't process them until
 139                // scene started has been processed
 1140                currentQueueState = QueueState.Systems;
 141            }
 142
 1143            switch (busType)
 144            {
 145                case MessagingBusType.INIT:
 1146                    initBus.Enqueue(queuedMessage, queueMode);
 1147                    break;
 148                case MessagingBusType.SYSTEM:
 0149                    systemBus.Enqueue(queuedMessage, queueMode);
 0150                    break;
 151                case MessagingBusType.UI:
 0152                    uiBus.Enqueue(queuedMessage, queueMode);
 153                    break;
 154            }
 0155        }
 156
 157        private void GetEntityIdAndClassIdFromTag(string tag, out int classId)
 158        {
 0159            int lastSeparator = -1;
 0160            for (int i = tag.Length - 1; i >= 0; i--)
 161            {
 0162                if (tag[i] != '_') continue;
 0163                lastSeparator = i;
 0164                break;
 165            }
 0166            if (!int.TryParse(tag.AsSpan(lastSeparator + 1), out classId))
 0167                Debug.LogError("Couldn't parse classId string to int");
 0168        }
 169    }
 170}