コード例 #1
0
        static void Main(string[] args)
        {
            var teaMaker = new TeaMaker();
            var teaShop  = new TeaShop(teaMaker);

            teaShop.TakeOrder("less sugar", 1);
            teaShop.TakeOrder("more milk", 2);
            teaShop.TakeOrder("without sugar", 5);

            teaShop.Serve();
            Console.ReadLine();
        }
コード例 #2
0
 public TeaShop(TeaMaker teaMaker)
 {
     mTeaMaker = teaMaker ?? throw new ArgumentNullException("teaMaker", "teaMaker cannot be null");
 }
コード例 #3
0
        public async Task TestE2E()
        {
            var gateway = new Gateway(DefaultGatewayConfiguration);

            await gateway.Start();

            await Task.Delay(500);

            //2 clients
            var clients = Enumerable.Range(0, 2)
                          .Select(_ =>
            {
                var client = new Client(DefaultClientConfiguration);
                client.Start().Wait();
                return(client);
            })
                          .ToList();


            //2*worker by service
            var workers = Enumerable.Range(0, 2)
                          .SelectMany(_ =>
            {
                IWorker makeTea  = new TeaMaker(DefaultWorkerConfiguration);
                IWorker brewBeer = new BeerBrewer(DefaultWorkerConfiguration);
                makeTea.Start().Wait();
                brewBeer.Start().Wait();
                return(new IWorker[] { makeTea, brewBeer });
            })
                          .ToList();

            var gatewayHeartbeats = clients.Select(client => client.IsConnected)
                                    .Concat(workers.Select(worker => worker.IsConnected));

            var isGatewayUp = false;

            var isGatewayUpObservable = Observable.Merge(gatewayHeartbeats)
                                        .Subscribe(heartbeat =>
            {
                isGatewayUp = heartbeat;
            });

            //ensure all heartbeats are fired...
            await Task.Delay(2000);

            Assert.IsTrue(isGatewayUp);

            var teaWorks = clients.SelectMany(client => Enumerable.Range(0, 3).Select(async _ =>
                                                                                      await client.Send <MakeTea, MakeTeaResult>(new MakeTea())
                                                                                      )).ToList();

            var bearWorks = clients.SelectMany(client => Enumerable.Range(0, 3).Select(async _ =>
                                                                                       await client.Send <BrewBeer, BrewBeerResult>(new BrewBeer())
                                                                                       )).ToList();

            var teaResults = await Task.WhenAll(teaWorks);

            var beerResults = await Task.WhenAll(bearWorks);

            Assert.IsTrue(teaResults.All(work => null != work));
            Assert.IsTrue(beerResults.All(work => null != work));

            //all workers should have get at least a job
            Assert.AreEqual(2, teaResults.Select(result => result.WorkerId).Distinct().Count());
            Assert.AreEqual(2, beerResults.Select(result => result.WorkerId).Distinct().Count());

            Assert.IsTrue(isGatewayUp);

            await gateway.Stop();

            //ensure all heartbeats are fired...
            await Task.Delay(2500);

            Assert.IsFalse(isGatewayUp);

            gateway = new Gateway(DefaultGatewayConfiguration);
            await gateway.Start();

            //ensure all heartbeats are fired...
            await Task.Delay(2500);

            Assert.IsTrue(isGatewayUp);

            //all commands should be handled
            Assert.DoesNotThrowAsync(async() =>
            {
                var works = clients.SelectMany(client => Enumerable.Range(0, 3)
                                               .Select(async _ => await client.Send <MakeTea, MakeTeaResult>(new MakeTea()))).ToList();


                var results = await Task.WhenAll(works);
            });

            var stop = new[] { gateway.Stop() }.Concat(workers.Select(worker => worker.Stop())).Concat(clients.Select(client => client.Stop()));

            await Task.WhenAll(stop);
        }