public void MessageRouteRegistrations_AreGroupedByDomainWhenRegisteredAtCluster()
        {
            var routeRegistration = new InternalRouteRegistration
            {
                ReceiverIdentifier = ReceiverIdentities.CreateForActor(),
                MessageContracts   = EnumerableExtensions.Produce(Randomizer.Int32(5, 15),
                                                                  i => new MessageContract
                {
                    Message = new MessageIdentifier(Guid.NewGuid().ToByteArray(),
                                                    Randomizer.UInt16(),
                                                    Guid.NewGuid().ToByteArray())
                }),
                DestinationSocket = destinationSocket.Object
            };
            var secondDomain = Guid.NewGuid().ToString();

            securityProvider.Setup(m => m.GetDomain(routeRegistration.MessageContracts.First().Message.Identity)).Returns(secondDomain);
            var allowedDomains = new[] { domain, secondDomain };

            //
            handler.Handle(routeRegistration);
            //
            Func <IEnumerable <MessageRoute>, bool> areGlobalMessageRoutes = mrs =>
            {
                CollectionAssert.IsSupersetOf(routeRegistration.MessageContracts
                                              .Select(mc => mc.Message),
                                              mrs.Select(mr => mr.Message));
                return(true);
            };

            internalRoutingTable.Verify(m => m.AddMessageRoute(routeRegistration), Times.Once);
            clusterMonitor.Verify(m => m.RegisterSelf(It.Is <IEnumerable <MessageRoute> >(mrs => areGlobalMessageRoutes(mrs)),
                                                      It.Is <string>(d => allowedDomains.Contains(d))),
                                  Times.Exactly(allowedDomains.Length));
        }
        public void OnlyGlobalyRegisteredMessageRoutes_AreRegisteredInLocalRoutingTableButAndCluster()
        {
            var routeRegistration = new InternalRouteRegistration
            {
                ReceiverIdentifier = ReceiverIdentities.CreateForActor(),
                MessageContracts   = EnumerableExtensions.Produce(Randomizer.Int32(5, 15),
                                                                  i => new MessageContract
                {
                    Message = new MessageIdentifier(Guid.NewGuid().ToByteArray(),
                                                    Randomizer.UInt16(),
                                                    Guid.NewGuid().ToByteArray()),
                    KeepRegistrationLocal = i % 2 == 0
                }),
                DestinationSocket = destinationSocket.Object
            };

            //
            handler.Handle(routeRegistration);
            //
            Func <IEnumerable <MessageRoute>, bool> areGlobalMessageRoutes = mrs =>
            {
                CollectionAssert.AreEquivalent(routeRegistration.MessageContracts
                                               .Where(mc => !mc.KeepRegistrationLocal)
                                               .Select(mc => mc.Message),
                                               mrs.Select(mr => mr.Message));
                return(true);
            };

            internalRoutingTable.Verify(m => m.AddMessageRoute(routeRegistration), Times.Once);
            clusterMonitor.Verify(m => m.RegisterSelf(It.Is <IEnumerable <MessageRoute> >(mrs => areGlobalMessageRoutes(mrs)), domain), Times.Once);
        }
Ejemplo n.º 3
0
        private void RegisterMessageHub()
        {
            var registration = new InternalRouteRegistration
            {
                ReceiverIdentifier    = ReceiverIdentifier,
                KeepRegistrationLocal = keepRegistrationLocal,
                DestinationSocket     = receivingSocket
            };

            internalRegistrationsSender.Send(registration);
        }
 private IEnumerable <MessageRouteDomainMap> GetMessageHubs(InternalRouteRegistration routeRegistration)
 => routeRegistration.ToEnumerable()
 .Where(r => !r.KeepRegistrationLocal && r.ReceiverIdentifier.IsMessageHub())
 .SelectMany(r => securityProvider.GetAllowedDomains()
             .Select(dom => new MessageRouteDomainMap
 {
     MessageRoute = new Cluster.MessageRoute
     {
         Receiver = r.ReceiverIdentifier
     },
     Domain = dom
 }));
Ejemplo n.º 5
0
        public void IfReceiverIdentifierIsNeitherActorNorMessageHub_MessageRouteIsNotAdded()
        {
            var routeRegistration = new InternalRouteRegistration
            {
                ReceiverIdentifier = new ReceiverIdentifier(Guid.NewGuid().ToByteArray())
            };

            //
            handler.Handle(routeRegistration);
            //
            internalRoutingTable.Verify(m => m.AddMessageRoute(It.IsAny <InternalRouteRegistration>()), Times.Never);
        }
Ejemplo n.º 6
0
        public void IfReceiverIdentifierNeitherMessageHubNorActor_AddMessageRouteThrowsException()
        {
            var receiverIdentity = new ReceiverIdentifier(Guid.NewGuid().ToByteArray());
            var localSocket      = new LocalSocket <IMessage>();
            var registration     = new InternalRouteRegistration
            {
                ReceiverIdentifier = receiverIdentity,
                DestinationSocket  = localSocket
            };

            //
            Assert.Throws <ArgumentException>(() => internalRoutingTable.AddMessageRoute(registration));
        }
 private IEnumerable <MessageRouteDomainMap> GetActors(InternalRouteRegistration routeRegistration)
 => routeRegistration.ToEnumerable()
 .Where(r => r.ReceiverIdentifier.IsActor())
 .SelectMany(a => a.MessageContracts
             .Where(mc => !mc.KeepRegistrationLocal)
             .Select(mc => new MessageRouteDomainMap
 {
     MessageRoute = new Cluster.MessageRoute
     {
         Receiver = a.ReceiverIdentifier,
         Message  = mc.Message
     },
     Domain = securityProvider.GetDomain(mc.Message.Identity)
 }));
 public void Handle(InternalRouteRegistration routeRegistration)
 {
     if (routeRegistration.ReceiverIdentifier.IsMessageHub() ||
         routeRegistration.ReceiverIdentifier.IsActor() && routeRegistration.MessageContracts?.Any() == true)
     {
         internalRoutingTable.AddMessageRoute(routeRegistration);
         var routesByDomain = GetActors(routeRegistration).Concat(GetMessageHubs(routeRegistration))
                              .GroupBy(mh => mh.Domain);
         foreach (var route in routesByDomain)
         {
             clusterMonitor.RegisterSelf(route.Select(r => r.MessageRoute), route.Key);
         }
     }
 }
Ejemplo n.º 9
0
        public void IfInternalRegistrationMessageIsNull_InternalRegistrationHandlerIsNotCalled()
        {
            var internalRouteRegistration = new InternalRouteRegistration();

            internalRegistrationsReceiver.Setup(m => m.TryReceive()).Returns(() =>
            {
                internalRegistrationsReceiverWaitHandle.Reset();
                return(null);
            });
            messageRouter.Start();
            //
            internalRegistrationsReceiverWaitHandle.Set();
            messageRouter.Stop();
            //
            internalRegistrationHandler.Verify(m => m.Handle(internalRouteRegistration), Times.Never);
        }
Ejemplo n.º 10
0
        public void LocalyRegisteredMessageHub_IsRegisteredInLocalRoutingTableButNotInCluster()
        {
            var routeRegistration = new InternalRouteRegistration
            {
                ReceiverIdentifier    = ReceiverIdentities.CreateForMessageHub(),
                KeepRegistrationLocal = true,
                DestinationSocket     = destinationSocket.Object
            };

            //
            handler.Handle(routeRegistration);
            //
            internalRoutingTable.Verify(m => m.AddMessageRoute(routeRegistration), Times.Once);
            clusterMonitor.Verify(m => m.RegisterSelf(It.IsAny <IEnumerable <MessageRoute> >(), It.IsAny <string>()),
                                  Times.Never);
        }
Ejemplo n.º 11
0
        public void RemoveReceiverRoute_RemoveAllMessageHubRegistrations()
        {
            var registration = new InternalRouteRegistration
            {
                ReceiverIdentifier = ReceiverIdentities.CreateForMessageHub(),
                DestinationSocket  = new LocalSocket <IMessage>()
            };

            internalRoutingTable.AddMessageRoute(registration);
            //
            var route = internalRoutingTable.RemoveReceiverRoute(registration.DestinationSocket)
                        .First();

            //
            Assert.AreEqual(registration.ReceiverIdentifier, route.Receiver);
        }
Ejemplo n.º 12
0
        public void IfInternalRegistrationMessageIsReceived_InternalRegistrationHandlerIsCalled()
        {
            var internalRouteRegistration = new InternalRouteRegistration();

            internalRegistrationsReceiver.Setup(m => m.TryReceive()).Returns(() =>
            {
                internalRegistrationsReceiverWaitHandle.Reset();
                return(internalRouteRegistration);
            });
            messageRouter.Start();
            //
            internalRegistrationsReceiverWaitHandle.Set();
            AsyncOpCompletionDelay.Sleep();
            messageRouter.Stop();
            //
            internalRegistrationHandler.Verify(m => m.Handle(internalRouteRegistration), Times.Once);
        }
Ejemplo n.º 13
0
        public void GlobalyRegisteredMessageHub_IsRegisteredInLocalRoutingTableAndCluster()
        {
            var routeRegistration = new InternalRouteRegistration
            {
                ReceiverIdentifier    = ReceiverIdentities.CreateForMessageHub(),
                KeepRegistrationLocal = false,
                DestinationSocket     = destinationSocket.Object
            };

            //
            handler.Handle(routeRegistration);
            //
            internalRoutingTable.Verify(m => m.AddMessageRoute(routeRegistration), Times.Once);
            clusterMonitor.Verify(m => m.RegisterSelf(It.Is <IEnumerable <MessageRoute> >(routes => routes.Any(r => r.Receiver == routeRegistration.ReceiverIdentifier)),
                                                      domain),
                                  Times.Once);
        }
Ejemplo n.º 14
0
        private void SendActorRegistrationMessage(ActorRegistration registration)
        {
            var routeReg = new InternalRouteRegistration
            {
                ReceiverIdentifier = registration.ActorIdentifier,
                MessageContracts   = registration.MessageHandlers
                                     .Select(mh => new MessageContract
                {
                    Message = mh.Identifier,
                    KeepRegistrationLocal = mh.KeepRegistrationLocal
                })
                                     .ToArray(),
                DestinationSocket = receivingSocket
            };

            internalRegistrationsSender.Send(routeReg);
        }
Ejemplo n.º 15
0
        public void AddMessageRoute_AddsLocalOrExternalMessageHubRoute(bool keepLocal)
        {
            var messageHub   = ReceiverIdentities.CreateForMessageHub();
            var localSocket  = new LocalSocket <IMessage>();
            var registration = new InternalRouteRegistration
            {
                ReceiverIdentifier    = messageHub,
                DestinationSocket     = localSocket,
                KeepRegistrationLocal = keepLocal
            };

            //
            internalRoutingTable.AddMessageRoute(registration);
            //
            var route = internalRoutingTable.GetAllRoutes().MessageHubs.First();

            Assert.AreEqual(keepLocal, route.LocalRegistration);
            Assert.AreEqual(messageHub, route.MessageHub);
        }
Ejemplo n.º 16
0
        public void GlobalyRegisteredMessageHub_IsRegisteredInClusterOncePerEachDomain()
        {
            var allowedDomains = Randomizer.Int32(2, 5)
                                 .Produce(() => Guid.NewGuid().ToString());

            securityProvider.Setup(m => m.GetAllowedDomains()).Returns(allowedDomains);
            var routeRegistration = new InternalRouteRegistration
            {
                ReceiverIdentifier    = ReceiverIdentities.CreateForMessageHub(),
                KeepRegistrationLocal = false,
                DestinationSocket     = destinationSocket.Object
            };

            //
            handler.Handle(routeRegistration);
            //
            internalRoutingTable.Verify(m => m.AddMessageRoute(routeRegistration), Times.Once);
            clusterMonitor.Verify(m => m.RegisterSelf(It.Is <IEnumerable <MessageRoute> >(routes => routes.Any(r => r.Receiver == routeRegistration.ReceiverIdentifier)),
                                                      It.Is <string>(d => allowedDomains.Contains(d))),
                                  Times.Exactly(allowedDomains.Count()));
        }
Ejemplo n.º 17
0
        public void AddMessageRoute_AddsMessageHubRoute()
        {
            var messageHub   = ReceiverIdentities.CreateForMessageHub();
            var localSocket  = new LocalSocket <IMessage>();
            var registration = new InternalRouteRegistration
            {
                ReceiverIdentifier = messageHub,
                DestinationSocket  = localSocket
            };

            //
            internalRoutingTable.AddMessageRoute(registration);
            //
            var lookupRequest = new InternalRouteLookupRequest
            {
                ReceiverIdentity = messageHub
            };
            var socket = internalRoutingTable.FindRoutes(lookupRequest).First();

            Assert.AreEqual(localSocket, socket);
        }
Ejemplo n.º 18
0
        public void LocalyRegisteredMessageRoutes_AreRegisteredInLocalRoutingTableButNotInCluster()
        {
            var routeRegistration = new InternalRouteRegistration
            {
                ReceiverIdentifier = ReceiverIdentities.CreateForActor(),
                MessageContracts   = Randomizer.Int32(2, 5)
                                     .Produce(() => new MessageContract
                {
                    Message = new MessageIdentifier(Guid.NewGuid().ToByteArray(),
                                                    Randomizer.UInt16(),
                                                    Guid.NewGuid().ToByteArray()),
                    KeepRegistrationLocal = true
                }),
                DestinationSocket = destinationSocket.Object
            };

            //
            handler.Handle(routeRegistration);
            //
            internalRoutingTable.Verify(m => m.AddMessageRoute(routeRegistration), Times.Once);
            clusterMonitor.Verify(m => m.RegisterSelf(It.IsAny <IEnumerable <MessageRoute> >(), It.IsAny <string>()), Times.Never);
        }
Ejemplo n.º 19
0
        public void RemoveReceiverRoute_RemoveAllActorRegistrations()
        {
            var registration = new InternalRouteRegistration
            {
                ReceiverIdentifier = ReceiverIdentities.CreateForActor(),
                DestinationSocket  = new LocalSocket <IMessage>(),
                MessageContracts   = EnumerableExtensions.Produce(Randomizer.Int32(4, 14),
                                                                  () => new MessageContract
                {
                    Message = new MessageIdentifier(Guid.NewGuid().ToByteArray(),
                                                    Randomizer.UInt16(),
                                                    Guid.NewGuid().ToByteArray())
                })
            };

            internalRoutingTable.AddMessageRoute(registration);
            //
            var routes = internalRoutingTable.RemoveReceiverRoute(registration.DestinationSocket);

            //
            CollectionAssert.AreEquivalent(registration.MessageContracts.Select(mc => mc.Message), routes.Select(r => r.Message));
            CollectionAssert.IsEmpty(internalRoutingTable.GetAllRoutes().Actors);
        }