private ProxyFactoryBag CreateProxyFactory() { ProxyFactoryBag result = new ProxyFactoryBag(); var request = new Mock <ICobRequest>(); request.Setup(m => m.DoRequest(It.IsAny <CobRequestContext>(), It.IsAny <object>())).Callback <CobRequestContext, object>((ctx, s) => { result.Context = ctx; result.State = s; result.InvokeCount++; }).Returns <CobRequestContext, object>((ctx, s) => { var typed = ctx as TypedCobRequestContext; var service = new ServiceA(); object value = null; switch (typed.Method.Name) { case nameof(ContractA.GetName): value = service.GetName(ctx.Parameters["id"].ToString()).Result; break; case nameof(ContractA.GetScore): value = service.GetScore((int)ctx.Parameters["id"]); break; case nameof(ContractA.SaveChanged): value = service.SaveChanged((Dto)ctx.Parameters["dto"]).Result; break; } return(Task.FromResult(value)); }); var requestResovler = new Mock <ICobRequestResolver>(); requestResovler.Setup(m => m.Get(It.IsAny <string>())).Returns(request.Object); var contextAccessor = new CobMvcContextAccessor(); var serviceRegistration = new InMemoryServiceRegistration(); serviceRegistration.Register(new Core.Service.ServiceInfo { ID = "a", Name = nameof(ContractA), Address = "http://cobmvc.test", Status = Core.Service.ServiceInfoStatus.Healthy }); var requestOptions = Options.Create(new CobMvcRequestOptions()); result.Factory = new CobClientProxyFactory( requestResovler.Object, serviceRegistration, new CobServiceDescriptionGenerator(requestOptions, new ConfigurationBuilder().Build()), new LoggerFactory(), contextAccessor, requestOptions); return(result); }
public void TestSelector() { var registration = new InMemoryServiceRegistration(); var a = new Core.Service.ServiceInfo { Name = "name", Address = "http:/a.com", ID = "a", Status = Core.Service.ServiceInfoStatus.Healthy }; registration.Register(a); var b = new Core.Service.ServiceInfo { Name = "name", Address = "http:/b.com", ID = "b", Status = Core.Service.ServiceInfoStatus.Healthy }; registration.Register(b); var selector = new DefaultServiceSelector(registration, "name", new LoggerFactory().CreateLogger <DefaultServiceSelector>()); var last = selector.GetOne(); last.ShouldNotBeNull(); var service = selector.GetOne(); service.ID.ShouldNotBe(last.ID); last = service; service = selector.GetOne(); service.ID.ShouldNotBe(last.ID); last = service; var failed = service.ID == b.ID ? a : b; while (failed.Status == Core.Service.ServiceInfoStatus.Healthy) { selector.MarkServiceFailed(failed, true); } selector.GetOne().ID.ShouldBe(last.ID); selector.GetOne().ID.ShouldBe(last.ID); selector.MarkServiceHealthy(failed, TimeSpan.FromSeconds(0)); failed.Status = Core.Service.ServiceInfoStatus.Healthy; service = selector.GetOne(); if (service.ID == last.ID) { service = selector.GetOne(); } service.ID.ShouldNotBe(last.ID); last = service; service = selector.GetOne(); service.ID.ShouldNotBe(last.ID); last = service; while (a.Status == Core.Service.ServiceInfoStatus.Healthy) { selector.MarkServiceFailed(a, true); } while (b.Status == Core.Service.ServiceInfoStatus.Healthy) { selector.MarkServiceFailed(b, true); } selector.GetOne().ShouldBeNull(); selector.MarkServiceHealthy(failed, TimeSpan.FromSeconds(0)); failed.Status = Core.Service.ServiceInfoStatus.Healthy; selector.GetOne().ShouldNotBeNull(); }