< Summary

Class:Mailbox
Assembly:bamlab.micromissiles
File(s):/github/workspace/Assets/Scripts/Communication/Mailbox.cs
Covered lines:6
Uncovered lines:42
Coverable lines:48
Total lines:79
Line coverage:12.5% (6 of 48)
Covered branches:0
Total branches:0
Covered methods:2
Total methods:6
Method coverage:33.3% (2 of 6)

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity NPath complexity Sequence coverage
Mailbox()0%2100%
Mailbox()0%2100%
Send(...)0%42600%
Deliver()0%9.494030%
Clear()0%110100%
GetLinkConfig(...)0%90900%

File(s)

/github/workspace/Assets/Scripts/Communication/Mailbox.cs

#LineLine coverage
 1using System;
 2using UnityEngine;
 3
 4// The mailbox handles the communication latencies for agent-to-agent communication. The mailbox
 5// owns the message queue and releases messages to be delivered after a set latency.
 6public class Mailbox {
 07  private static readonly Configs.LinkConfig _defaultLinkConfig = new Configs.LinkConfig {
 8    PacketDeliveryRatio = 1f,
 9  };
 10
 11  // Message queue.
 012  private readonly PriorityQueue<PendingMessage> _messageQueue =
 13      new PriorityQueue<PendingMessage>();
 14
 15  // Enqueue a message to be delivered after a set latency.
 016  public void Send(Message message) {
 017    if (message == null) {
 018      return;
 19    }
 20
 021    if (CommsManager.Instance.ContainsNode(message.Receiver)) {
 022      Configs.LinkConfig config = GetLinkConfig(message);
 23
 24      // TODO(Joseph0120): Set the packet delivery ratio to config.PacketDeliveryRatio.
 025      float packetDeliveryRatio = Mathf.Clamp01(1);
 026      if (UnityEngine.Random.value >= packetDeliveryRatio) {
 027        return;
 28      }
 29
 030      float latency = config.LatencySeconds;
 031      float jitter = Utilities.SampleStandardNormal() * config.LatencyStdSeconds;
 032      float totalLatency = Math.Max(0f, latency + jitter);
 033      float deliverAt = SimManager.Instance.ElapsedTime + totalLatency;
 34
 35      // Deliver the message immediately if it is already due.
 036      if (deliverAt <= SimManager.Instance.ElapsedTime) {
 037        if (CommsManager.Instance.ContainsNode(message.Receiver)) {
 038          message.Receiver.Receive(message);
 039        }
 040      } else {
 041        var pendingMessage = new PendingMessage(message, deliverAt);
 042        _messageQueue.Enqueue(pendingMessage, pendingMessage.DeliverAt);
 043      }
 044    }
 045  }
 46
 47  // Deliver should be called at every fixed update to check for due messages to be delivered.
 7748  public void Deliver() {
 7749    while (!_messageQueue.IsEmpty() &&
 050           _messageQueue.Peek().DeliverAt <= SimManager.Instance.ElapsedTime) {
 051      PendingMessage pendingMessage = _messageQueue.Dequeue();
 052      if (CommsManager.Instance.ContainsNode(pendingMessage.Receiver)) {
 053        pendingMessage.Receiver.Receive(pendingMessage.Message);
 054      }
 055    }
 7756  }
 57
 58  // Clear all pending messages.
 2359  public void Clear() {
 2360    _messageQueue.Clear();
 2361  }
 62
 063  private Configs.LinkConfig GetLinkConfig(Message message) {
 064    Configs.CommunicationConfig communicationConfig =
 65        SimManager.Instance.SimulationConfig?.CommunicationConfig;
 066    if (communicationConfig == null) {
 067      return _defaultLinkConfig;
 68    }
 69
 070    Configs.AgentType senderType = message.Sender.EndpointType;
 071    Configs.AgentType receiverType = message.Receiver.EndpointType;
 072    foreach (Configs.LinkOverride linkOverride in communicationConfig.LinkOverrides) {
 073      if (linkOverride.From == senderType && linkOverride.To == receiverType) {
 074        return linkOverride.LinkConfig;
 75      }
 076    }
 077    return communicationConfig.LinkConfig ?? _defaultLinkConfig;
 078  }
 79}