public async Task TestWorkerDisconnectAndReconnect() { var gateway = new Gateway(DefaultGatewayConfiguration); await gateway.Start(); await Task.Delay(500); var client = new Client(DefaultClientConfiguration); await client.Start(); await Task.Delay(500); var worker = new BeerBrewer(DefaultWorkerConfiguration); await worker.Start(); await Task.Delay(500); BrewBeerResult result = null; Assert.DoesNotThrowAsync(async() => { result = await client.Send <BrewBeer, BrewBeerResult>(new BrewBeer()); }); Assert.IsNotNull(result); await worker.Stop(); //ensure all heartbeats are run await Task.Delay(2000); Assert.ThrowsAsync <TaskCanceledException>(async() => { await client.Send <BrewBeer, BrewBeerResult>(new BrewBeer()); }); worker = new BeerBrewer(DefaultWorkerConfiguration); await worker.Start(); //ensure all heartbeats are run await Task.Delay(2000); Assert.DoesNotThrowAsync(async() => { result = await client.Send <BrewBeer, BrewBeerResult>(new BrewBeer()); }); Assert.IsNotNull(result); var stop = new[] { gateway.Stop(), client.Stop(), worker.Stop() }; await Task.WhenAll(stop); }
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); }