예제 #1
0
        public async Task TestBrokerDisconnectAndCloneTakeCharge()
        {
            var container = new Container(new TestCloneRegistry());

            var broker1 = ActorFactory.GetBroker <MarketStateDto>
                              (getUpdatesEndpoint1, sendUpdatesEndpoint1, stateRequestEndpoint1, brokerHeartbeatEndpoint1, container);


            var broker2 = ActorFactory.GetBroker <MarketStateDto>
                              (getUpdatesEndpoint2, sendUpdatesEndpoint2, stateRequestEndpoint2, brokerHeartbeatEndpoint2, container);

            var brokerDescriptors = new List <BrokerDescriptor>()
            {
                new BrokerDescriptor()
                {
                    Name = "B1",
                    BrokerHeartbeatEndpoint    = brokerHeartbeatEndpoint1,
                    GetStateEndpoint           = stateRequestEndpoint1,
                    PublishUpdateEndpoint      = sendUpdatesEndpoint1,
                    SubscribeToUpdatesEndpoint = getUpdatesEndpoint1
                },
                new BrokerDescriptor()
                {
                    Name = "B2",
                    BrokerHeartbeatEndpoint    = brokerHeartbeatEndpoint2,
                    GetStateEndpoint           = stateRequestEndpoint2,
                    PublishUpdateEndpoint      = sendUpdatesEndpoint2,
                    SubscribeToUpdatesEndpoint = getUpdatesEndpoint2
                }
            };


            var marketsTasks = new string[] { "AAPL", "MSFT", "GOOG", "FB" }.Select(async ticker =>
            {
                return(await ActorFactory.GetClient <MarketStateDto>(ticker, TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(1000), brokerDescriptors, container));
            }).ToList();

            var markets = await Task.WhenAll(marketsTasks);

            var msft = markets.First(market => market.Name == "MSFT");
            var goog = markets.First(market => market.Name == "GOOG");
            var fb   = markets.First(market => market.Name == "FB");
            var appl = markets.First(market => market.Name == "AAPL");

            Assert.IsTrue(markets.All(market => market.Broker.Name == "B1"));

            fb.Push(MarketStateDto.Random("FB"));
            msft.Push(MarketStateDto.Random("MSFT"));

            //should not have to wait...
            await Task.Delay(1000);

            Assert.IsTrue(markets.All(market => market.Updates.Count == 2));

            broker1.Stop();

            await Task.Delay(2000);

            Assert.IsTrue(markets.All(market => market.Broker != null && market.Broker.Name == "B2"));

            fb.Push(MarketStateDto.Random("FB"));
            msft.Push(MarketStateDto.Random("MSFT"));

            await Task.Delay(1000);

            Assert.IsTrue(markets.All(market => market.Updates.Count == 4));

            broker2.Stop();

            foreach (var market in markets)
            {
                await market.Stop();
            }
        }
예제 #2
0
        public async Task TestE2E()
        {
            var container = new Container(new TestCloneRegistry());

            var broker = ActorFactory.GetBroker <MarketStateDto>
                             (getUpdatesEndpoint1, sendUpdatesEndpoint1, stateRequestEndpoint1, brokerHeartbeatEndpoint1, container);

            var brokerDescriptors = new List <BrokerDescriptor>()
            {
                new BrokerDescriptor()
                {
                    Name = "B1",
                    BrokerHeartbeatEndpoint    = brokerHeartbeatEndpoint1,
                    GetStateEndpoint           = stateRequestEndpoint1,
                    PublishUpdateEndpoint      = sendUpdatesEndpoint1,
                    SubscribeToUpdatesEndpoint = getUpdatesEndpoint1
                }
            };


            var marketsTasks = new string[] { "AAPL", "MSFT", "GOOG", "FB" }.Select(async ticker =>
            {
                return(await ActorFactory.GetClient <MarketStateDto>(
                           ticker, TimeSpan.FromMilliseconds(500), TimeSpan.FromMilliseconds(1000), brokerDescriptors, container));
            }).ToList();

            var markets = await Task.WhenAll(marketsTasks);

            var msft = markets.First(market => market.Name == "MSFT");
            var goog = markets.First(market => market.Name == "GOOG");
            var fb   = markets.First(market => market.Name == "FB");

            msft.Push(MarketStateDto.Random("MSFT"));

            //should not have to wait...
            await Task.Delay(1000);

            Assert.IsTrue(broker.Updates.Count == 1);

            Assert.IsTrue(markets.All(
                              market => market.Updates.Count == 1 &&
                              market.Updates.First().Key == 0 &&
                              market.Updates.First().Value.UpdateDto.Subject == msft.Name));

            goog.Push(MarketStateDto.Random("GOOG"));

            await Task.Delay(100);

            Assert.IsTrue(broker.Updates.Count == 2);

            Assert.IsTrue(markets.All(
                              market => market.Updates.Count == 2 &&
                              market.Updates.ElementAt(1).Key == 1 &&
                              market.Updates.ElementAt(1).Value.UpdateDto.Subject == goog.Name));

            fb.Push(MarketStateDto.Random("FB"));
            fb.Push(MarketStateDto.Random("FB"));
            fb.Push(MarketStateDto.Random("FB"));
            msft.Push(MarketStateDto.Random("MSFT"));

            await Task.Delay(1000);

            var amzConfig = new ClientConfiguration()
            {
                BrokerDescriptors = new List <BrokerDescriptor>()
                {
                    new BrokerDescriptor()
                    {
                        Name = "B1",
                        BrokerHeartbeatEndpoint    = brokerHeartbeatEndpoint1,
                        GetStateEndpoint           = stateRequestEndpoint1,
                        PublishUpdateEndpoint      = sendUpdatesEndpoint1,
                        SubscribeToUpdatesEndpoint = getUpdatesEndpoint1
                    }
                },

                Name             = "AMZ",
                HearbeatDelay    = TimeSpan.FromMilliseconds(250),
                HearbeatMaxDelay = TimeSpan.FromSeconds(1)
            };

            var amz = new Client <MarketStateDto>(amzConfig);
            await amz.Start();

            Assert.IsTrue(amz.Updates.Count == 6);

            broker.Stop();

            await amz.Stop();

            foreach (var market in markets)
            {
                await market.Stop();
            }
        }