diff --git a/report_coverage_l3_attackmitigator.sh b/report_coverage_l3_attackmitigator.sh
old mode 100644
new mode 100755
diff --git a/report_coverage_l3_centralizedattackdetector.sh b/report_coverage_l3_centralizedattackdetector.sh
old mode 100644
new mode 100755
diff --git a/report_coverage_l3_distributedattackdetector.sh b/report_coverage_l3_distributedattackdetector.sh
old mode 100644
new mode 100755
diff --git a/src/context/tests/test_unitary.py b/src/context/tests/test_unitary.py
index 5836511e1fe6057a55ee714d1b0e9a905f638660..092418ec4f11358686e3af509eb1e772ecaa3264 100644
--- a/src/context/tests/test_unitary.py
+++ b/src/context/tests/test_unitary.py
@@ -1,5 +1,5 @@
 import copy, grpc, logging, os, pytest, requests, threading, time, urllib
-from queue import Queue
+from queue import Queue, Empty
 from typing import Tuple
 from common.Constants import DEFAULT_CONTEXT_UUID, DEFAULT_TOPOLOGY_UUID
 from common.orm.Database import Database
@@ -128,6 +128,22 @@ class EventsCollector:
     def get_event(self, block : bool = True, timeout : float = 0.1):
         return self._events_queue.get(block=block, timeout=timeout)
 
+    def get_events(self, block : bool = True, timeout : float = 0.1, count : int = None):
+        events = []
+        if count is None:
+            while True:
+                try:
+                    events.append(self.get_event(block=block, timeout=timeout))
+                except Empty: # pylint: disable=catching-non-exception
+                    break
+        else:
+            for _ in range(count):
+                try:
+                    events.append(self.get_event(block=block, timeout=timeout))
+                except Empty: # pylint: disable=catching-non-exception
+                    pass
+        return sorted(events, key=lambda e: e.event.timestamp)
+
     def stop(self):
         self._context_stream.cancel()
         self._topology_stream.cancel()
@@ -145,7 +161,7 @@ class EventsCollector:
 # ----- Test gRPC methods ----------------------------------------------------------------------------------------------
 
 def test_grpc_context(
-    context_client_grpc : ContextClient,                     # pylint: disable=redefined-outer-name
+    context_client_grpc : ContextClient,                # pylint: disable=redefined-outer-name
     context_db_mb : Tuple[Database, MessageBroker]):    # pylint: disable=redefined-outer-name
     context_database = context_db_mb[0]
 
@@ -266,7 +282,7 @@ def test_grpc_context(
 
 
 def test_grpc_topology(
-    context_client_grpc : ContextClient,                     # pylint: disable=redefined-outer-name
+    context_client_grpc : ContextClient,                # pylint: disable=redefined-outer-name
     context_db_mb : Tuple[Database, MessageBroker]):    # pylint: disable=redefined-outer-name
     context_database = context_db_mb[0]
 
@@ -318,22 +334,16 @@ def test_grpc_topology(
     assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
     # ----- Check create event -----------------------------------------------------------------------------------------
-    context_event = None
-    topology_event = None
-    for _ in range(2):
-        event = events_collector.get_event(block=True)
-        assert isinstance(event, (ContextEvent, TopologyEvent))
-        if isinstance(event, ContextEvent): context_event = event
-        if isinstance(event, TopologyEvent): topology_event = event
-
-    assert context_event is not None
-    assert context_event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
-    assert context_event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-
-    assert topology_event is not None
-    assert topology_event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert topology_event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert topology_event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+    events = events_collector.get_events(block=True, count=2)
+
+    assert isinstance(events[0], TopologyEvent)
+    assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[0].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[0].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+
+    assert isinstance(events[1], ContextEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
+    assert events[1].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
     # ----- Update the object ------------------------------------------------------------------------------------------
     response = context_client_grpc.SetTopology(Topology(**TOPOLOGY))
@@ -380,16 +390,16 @@ def test_grpc_topology(
     context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
 
     # ----- Check remove event -----------------------------------------------------------------------------------------
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, TopologyEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+    events = events_collector.get_events(block=True, count=2)
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ContextEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert isinstance(events[0], TopologyEvent)
+    assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[0].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[0].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+
+    assert isinstance(events[1], ContextEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[1].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
     # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
     events_collector.stop()
@@ -404,7 +414,7 @@ def test_grpc_topology(
 
 
 def test_grpc_device(
-    context_client_grpc : ContextClient,                     # pylint: disable=redefined-outer-name
+    context_client_grpc : ContextClient,                # pylint: disable=redefined-outer-name
     context_db_mb : Tuple[Database, MessageBroker]):    # pylint: disable=redefined-outer-name
     context_database = context_db_mb[0]
 
@@ -423,16 +433,16 @@ def test_grpc_device(
     assert response.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
     assert response.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ContextEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    events = events_collector.get_events(block=True, count=2)
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, TopologyEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+    assert isinstance(events[0], ContextEvent)
+    assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+
+    assert isinstance(events[1], TopologyEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[1].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[1].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
 
     # ----- Get when the object does not exist -------------------------------------------------------------------------
     with pytest.raises(grpc.RpcError) as e:
@@ -551,21 +561,20 @@ def test_grpc_device(
     context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
 
     # ----- Check remove event -----------------------------------------------------------------------------------------
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.device_id.device_uuid.uuid == DEVICE1_UUID
+    events = events_collector.get_events(block=True, count=3)
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, TopologyEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+    assert isinstance(events[0], DeviceEvent)
+    assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[0].device_id.device_uuid.uuid == DEVICE1_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ContextEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert isinstance(events[1], TopologyEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[1].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[1].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+
+    assert isinstance(events[2], ContextEvent)
+    assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[2].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
     # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
     events_collector.stop()
@@ -580,7 +589,7 @@ def test_grpc_device(
 
 
 def test_grpc_link(
-    context_client_grpc : ContextClient,                     # pylint: disable=redefined-outer-name
+    context_client_grpc : ContextClient,                # pylint: disable=redefined-outer-name
     context_db_mb : Tuple[Database, MessageBroker]):    # pylint: disable=redefined-outer-name
     context_database = context_db_mb[0]
 
@@ -605,26 +614,24 @@ def test_grpc_link(
     response = context_client_grpc.SetDevice(Device(**DEVICE2))
     assert response.device_uuid.uuid == DEVICE2_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ContextEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    events = events_collector.get_events(block=True, count=4)
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, TopologyEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+    assert isinstance(events[0], ContextEvent)
+    assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.device_id.device_uuid.uuid == DEVICE1_UUID
+    assert isinstance(events[1], TopologyEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[1].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[1].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.device_id.device_uuid.uuid == DEVICE2_UUID
+    assert isinstance(events[2], DeviceEvent)
+    assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[2].device_id.device_uuid.uuid == DEVICE1_UUID
+
+    assert isinstance(events[3], DeviceEvent)
+    assert events[3].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[3].device_id.device_uuid.uuid == DEVICE2_UUID
 
     # ----- Get when the object does not exist -------------------------------------------------------------------------
     with pytest.raises(grpc.RpcError) as e:
@@ -729,31 +736,28 @@ def test_grpc_link(
     context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
 
     # ----- Check remove event -----------------------------------------------------------------------------------------
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, LinkEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.link_id.link_uuid.uuid == LINK_DEV1_DEV2_UUID
+    events = events_collector.get_events(block=True, count=5)
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.device_id.device_uuid.uuid == DEVICE1_UUID
+    assert isinstance(events[0], LinkEvent)
+    assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[0].link_id.link_uuid.uuid == LINK_DEV1_DEV2_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.device_id.device_uuid.uuid == DEVICE2_UUID
+    assert isinstance(events[1], DeviceEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[1].device_id.device_uuid.uuid == DEVICE1_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, TopologyEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+    assert isinstance(events[2], DeviceEvent)
+    assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[2].device_id.device_uuid.uuid == DEVICE2_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ContextEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert isinstance(events[3], TopologyEvent)
+    assert events[3].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[3].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[3].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+
+    assert isinstance(events[4], ContextEvent)
+    assert events[4].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[4].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
     # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
     events_collector.stop()
@@ -768,7 +772,7 @@ def test_grpc_link(
 
 
 def test_grpc_service(
-    context_client_grpc : ContextClient,                     # pylint: disable=redefined-outer-name
+    context_client_grpc : ContextClient,                # pylint: disable=redefined-outer-name
     context_db_mb : Tuple[Database, MessageBroker]):    # pylint: disable=redefined-outer-name
     context_database = context_db_mb[0]
 
@@ -793,26 +797,24 @@ def test_grpc_service(
     response = context_client_grpc.SetDevice(Device(**DEVICE2))
     assert response.device_uuid.uuid == DEVICE2_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ContextEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    events = events_collector.get_events(block=True, count=4)
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, TopologyEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+    assert isinstance(events[0], ContextEvent)
+    assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[0].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.device_id.device_uuid.uuid == DEVICE1_UUID
+    assert isinstance(events[1], TopologyEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[1].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[1].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.device_id.device_uuid.uuid == DEVICE2_UUID
+    assert isinstance(events[2], DeviceEvent)
+    assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[2].device_id.device_uuid.uuid == DEVICE1_UUID
+
+    assert isinstance(events[3], DeviceEvent)
+    assert events[3].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[3].device_id.device_uuid.uuid == DEVICE2_UUID
 
     # ----- Get when the object does not exist -------------------------------------------------------------------------
     with pytest.raises(grpc.RpcError) as e:
@@ -856,16 +858,16 @@ def test_grpc_service(
     assert response.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
     # ----- Check create event -----------------------------------------------------------------------------------------
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ServiceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_CREATE
-    assert event.service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.service_id.service_uuid.uuid == SERVICE_DEV1_DEV2_UUID
+    events = events_collector.get_events(block=True, count=2)
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ContextEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
-    assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert isinstance(events[0], ServiceEvent)
+    assert events[0].event.event_type == EventTypeEnum.EVENTTYPE_CREATE
+    assert events[0].service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[0].service_id.service_uuid.uuid == SERVICE_DEV1_DEV2_UUID
+
+    assert isinstance(events[1], ContextEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_UPDATE
+    assert events[1].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
     # ----- Update the object ------------------------------------------------------------------------------------------
     response = context_client_grpc.SetService(Service(**SERVICE_DEV1_DEV2))
@@ -921,31 +923,28 @@ def test_grpc_service(
     context_client_grpc.RemoveContext(ContextId(**CONTEXT_ID))
 
     # ----- Check remove event -----------------------------------------------------------------------------------------
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ServiceEvent)
-    assert event.service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.service_id.service_uuid.uuid == SERVICE_DEV1_DEV2_UUID
+    events = events_collector.get_events(block=True, count=5)
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.device_id.device_uuid.uuid == DEVICE1_UUID
+    assert isinstance(events[0], ServiceEvent)
+    assert events[0].service_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[0].service_id.service_uuid.uuid == SERVICE_DEV1_DEV2_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, DeviceEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.device_id.device_uuid.uuid == DEVICE2_UUID
+    assert isinstance(events[1], DeviceEvent)
+    assert events[1].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[1].device_id.device_uuid.uuid == DEVICE1_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, TopologyEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
-    assert event.topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+    assert isinstance(events[2], DeviceEvent)
+    assert events[2].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[2].device_id.device_uuid.uuid == DEVICE2_UUID
 
-    event = events_collector.get_event(block=True)
-    assert isinstance(event, ContextEvent)
-    assert event.event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
-    assert event.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert isinstance(events[3], TopologyEvent)
+    assert events[3].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[3].topology_id.context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
+    assert events[3].topology_id.topology_uuid.uuid == DEFAULT_TOPOLOGY_UUID
+
+    assert isinstance(events[4], ContextEvent)
+    assert events[4].event.event_type == EventTypeEnum.EVENTTYPE_REMOVE
+    assert events[4].context_id.context_uuid.uuid == DEFAULT_CONTEXT_UUID
 
     # ----- Stop the EventsCollector -----------------------------------------------------------------------------------
     events_collector.stop()