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)); }
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()); }
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()); }
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); }
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); }
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()); }