예제 #1
0
        public void ShouldMatchSubscription()
        {
            var allowed = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                FailureType    = "Oh no!"
            };

            var notAllowed = new DatabaseStatus()
            {
                DatacenterName = "London",
                FailureType    = "Oh no!"
            };

            var key = BindingKey.Create(allowed);

            var subscription = Subscription.Matching <DatabaseStatus>(x => x.DatacenterName == "Paris");

            var allowedMessageBinding    = MessageBinding.FromMessage(allowed);
            var notAllowedMessageBinding = MessageBinding.FromMessage(notAllowed);

            Assert.IsTrue(subscription.Matches(allowedMessageBinding));

            Assert.IsFalse(subscription.Matches(notAllowedMessageBinding));
        }
예제 #2
0
        public void ShouldRetrieveClients()
        {
            var logger          = new MockLogger();
            var directoryClient = new PeerDirectoryClient(logger);

            var messageParisKo = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                Status         = "Ko"
            };

            var messageParisOk = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                Status         = "Ok"
            };

            var messageLondonKo = new DatabaseStatus()
            {
                DatacenterName = "London",
                Status         = "Ko"
            };

            var messageLondonOk = new DatabaseStatus()
            {
                DatacenterName = "London",
                Status         = "Ok"
            };

            var peer1 = new Peer(new PeerId("Abc.Testing." + Guid.NewGuid()), "tcp://localhost:8080");
            var peer2 = new Peer(new PeerId("Abc.Testing." + Guid.NewGuid()), "tcp://localhost:8181");

            var allParisKo = Subscription.Matching <DatabaseStatus>(x => x.DatacenterName == "Paris" && x.Status == "Ko");
            var allParis   = Subscription.Matching <DatabaseStatus>(x => x.DatacenterName == "Paris");
            var allKo      = Subscription.Matching <DatabaseStatus>(x => x.Status == "Ko");

            var peer1Descriptor = new PeerDescriptor(peer1.Id, peer1.EndPoint, false, true, DateTime.Now, allParisKo, allParis);
            var peer2Descriptor = new PeerDescriptor(peer2.Id, peer2.EndPoint, false, true, DateTime.Now, allKo);

            directoryClient.Handle(new PeerActivated(peer1Descriptor));
            directoryClient.Handle(new PeerActivated(peer2Descriptor));

            var peers = directoryClient.GetPeersHandlingMessage(messageParisKo);

            Assert.AreEqual(2, peers.Count());

            peers = directoryClient.GetPeersHandlingMessage(messageParisOk);

            Assert.AreEqual(1, peers.Count());

            peers = directoryClient.GetPeersHandlingMessage(messageLondonKo);

            Assert.AreEqual(1, peers.Count());

            peers = directoryClient.GetPeersHandlingMessage(messageLondonOk);

            Assert.AreEqual(0, peers.Count());
        }
예제 #3
0
        public void ShouldParseCommand()
        {
            var message = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                FailureType    = "Oh no!"
            };

            var key = BindingKey.Create(message);

            Assert.AreEqual($"{message.DatacenterName}.{message.Status}", key.ToString());
        }
예제 #4
0
        public void ShouldBuildSubscriptionTree()
        {
            var peer1 = new Peer(new PeerId("Abc.Testing." + Guid.NewGuid()), "tcp://localhost:8080");
            var peer2 = new Peer(new PeerId("Abc.Testing." + Guid.NewGuid()), "tcp://localhost:8181");

            var messageKo = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                Status         = "Ko"
            };

            var messageOk = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                Status         = "Ok"
            };

            var koParis = BindingKey.Create(messageKo);
            var okParis = BindingKey.Create(messageOk);

            var allParisKo = Subscription.Matching <DatabaseStatus>(x => x.DatacenterName == "Paris" && x.Status == "Ko");

            var allParis = Subscription.Matching <DatabaseStatus>(x => x.DatacenterName == "Paris");

            var allKo = Subscription.Matching <DatabaseStatus>(x => x.Status == "Ko");

            var subscriptionTree = new PeerSubscriptionTree();

            subscriptionTree.Add(peer1, allParisKo.BindingKey);
            subscriptionTree.Add(peer2, allParis.BindingKey);


            var matchedPeers = subscriptionTree.GetPeers(allParis.BindingKey);

            Assert.AreEqual(1, matchedPeers.Count);

            matchedPeers = subscriptionTree.GetPeers(allKo.BindingKey);

            Assert.AreEqual(0, matchedPeers.Count);

            matchedPeers = subscriptionTree.GetPeers(allParisKo.BindingKey);

            Assert.AreEqual(2, matchedPeers.Count);
        }
예제 #5
0
        public async Task ShouldMakeSubscription()
        {
            var subscription1 = Subscription.Matching <DatabaseStatus>(status => status.DatacenterName == "Paris" && status.Status == "Ko");
            var subscription2 = Subscription.Any <DoSomething>();

            var command = new DoSomething();

            Assert.AreEqual(0, GlobalTestContext.Get());

            var @event = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                Status         = "Ko"
            };

            _bus.Start();

            //registration
            Assert.AreEqual(1, TestBusTransportTestContext.TransportHitCounter);

            await _bus.Subscribe(new SubscriptionRequest(subscription1));

            Assert.AreEqual(2, TestBusTransportTestContext.TransportHitCounter);

            await _bus.Subscribe(new SubscriptionRequest(subscription2));

            Assert.AreEqual(3, TestBusTransportTestContext.TransportHitCounter);

            //as the transport is mocked, register manually
            await _directory.RegisterAsync(_bus.Self, _bus.GetSubscriptions());

            //register directory transport call
            Assert.AreEqual(4, TestBusTransportTestContext.TransportHitCounter);

            _bus.Publish(@event);

            Assert.AreEqual(5, TestBusTransportTestContext.TransportHitCounter);

            await _bus.Send(command);

            Assert.AreEqual(6, TestBusTransportTestContext.TransportHitCounter);
        }
예제 #6
0
        public async Task ShouldTestE2E()
        {
            GlobalTestContext.Reset();

            var subscription1 = Subscription.Matching <DatabaseStatus>(status => status.DatacenterName == "Paris" && status.Status == "Ko");
            var subscription2 = Subscription.Any <DoSomething>();

            Assert.AreEqual(0, GlobalTestContext.Get());

            await _bus.Subscribe(new SubscriptionRequest(subscription1));

            await Task.Delay(50);

            await _bus.Subscribe(new SubscriptionRequest(subscription2));

            await Task.Delay(50);

            //should be consumed
            var command = new DoSomething();

            await _bus.Send(command);

            await Task.Delay(50);

            Assert.AreEqual(1, GlobalTestContext.Get());

            //should be consumed
            var @event = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                Status         = "Ko"
            };

            _bus.Publish(@event);

            await Task.Delay(50);

            Assert.AreEqual(2, GlobalTestContext.Get());

            //should be consumed
            @event = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                Status         = "Ko"
            };

            _bus.Publish(@event);

            await Task.Delay(50);

            Assert.AreEqual(3, GlobalTestContext.Get());

            //should not be consumed
            @event = new DatabaseStatus()
            {
                DatacenterName = "Paris",
                Status         = "Ok"
            };

            _bus.Publish(@event);

            await Task.Delay(50);

            Assert.AreEqual(3, GlobalTestContext.Get());
        }