mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-06-19 00:58:15 +08:00
Feature/re route specific handlers (#269)
* #264 added handlers to config * #264 added global handlers object and defaut param for method, not sure this is correct api for users yet * #264 Can now add all sorts of delegating handlers in all sorts of ways * +semver: breaking #264
This commit is contained in:
@ -19,18 +19,179 @@ namespace Ocelot.UnitTests.Requester
|
||||
public class DelegatingHandlerHandlerProviderFactoryTests
|
||||
{
|
||||
private DelegatingHandlerHandlerFactory _factory;
|
||||
private Mock<IOcelotLoggerFactory> _loggerFactory;
|
||||
private readonly Mock<IOcelotLoggerFactory> _loggerFactory;
|
||||
private DownstreamReRoute _request;
|
||||
private Response<List<Func<DelegatingHandler>>> _provider;
|
||||
private Response<List<Func<DelegatingHandler>>> _result;
|
||||
private readonly Mock<IQosProviderHouse> _qosProviderHouse;
|
||||
private readonly Mock<ITracingHandlerFactory> _tracingFactory;
|
||||
private IServiceProvider _serviceProvider;
|
||||
private readonly IServiceCollection _services;
|
||||
|
||||
public DelegatingHandlerHandlerProviderFactoryTests()
|
||||
{
|
||||
_tracingFactory = new Mock<ITracingHandlerFactory>();
|
||||
_qosProviderHouse = new Mock<IQosProviderHouse>();
|
||||
_loggerFactory = new Mock<IOcelotLoggerFactory>();
|
||||
_services = new ServiceCollection();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void should_follow_ordering_add_specifics()
|
||||
{
|
||||
var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
|
||||
.WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
|
||||
.WithDelegatingHandlers(new List<string>
|
||||
{
|
||||
"FakeDelegatingHandler",
|
||||
"FakeDelegatingHandlerTwo"
|
||||
})
|
||||
.WithReRouteKey("")
|
||||
.Build();
|
||||
|
||||
this.Given(x => GivenTheFollowingRequest(reRoute))
|
||||
.And(x => GivenTheTracingFactoryReturns())
|
||||
.And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
|
||||
.And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandlerThree, FakeDelegatingHandlerFour>())
|
||||
.And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.When(x => WhenIGet())
|
||||
.Then(x => ThenThereIsDelegatesInProvider(6))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerThree>(0))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerFour>(1))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(2))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerTwo>(3))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(4))
|
||||
.And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(5))
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void should_follow_ordering_order_specifics_and_globals()
|
||||
{
|
||||
var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
|
||||
.WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
|
||||
.WithDelegatingHandlers(new List<string>
|
||||
{
|
||||
"FakeDelegatingHandlerTwo",
|
||||
"FakeDelegatingHandler",
|
||||
"FakeDelegatingHandlerFour"
|
||||
})
|
||||
.WithReRouteKey("")
|
||||
.Build();
|
||||
|
||||
this.Given(x => GivenTheFollowingRequest(reRoute))
|
||||
.And(x => GivenTheTracingFactoryReturns())
|
||||
.And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
|
||||
.And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandlerFour, FakeDelegatingHandlerThree>())
|
||||
.And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.When(x => WhenIGet())
|
||||
.Then(x => ThenThereIsDelegatesInProvider(6))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerThree>(0)) //first because global not in config
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerTwo>(1)) //first from config
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(2)) //second from config
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerFour>(3)) //third from config (global)
|
||||
.And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(4))
|
||||
.And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(5))
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void should_follow_ordering_order_specifics()
|
||||
{
|
||||
var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
|
||||
.WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
|
||||
.WithDelegatingHandlers(new List<string>
|
||||
{
|
||||
"FakeDelegatingHandlerTwo",
|
||||
"FakeDelegatingHandler"
|
||||
})
|
||||
.WithReRouteKey("")
|
||||
.Build();
|
||||
|
||||
this.Given(x => GivenTheFollowingRequest(reRoute))
|
||||
.And(x => GivenTheTracingFactoryReturns())
|
||||
.And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
|
||||
.And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandlerThree, FakeDelegatingHandlerFour>())
|
||||
.And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.When(x => WhenIGet())
|
||||
.Then(x => ThenThereIsDelegatesInProvider(6))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerThree>(0))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerFour>(1))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerTwo>(2))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(3))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(4))
|
||||
.And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(5))
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void should_follow_ordering_order_and_only_add_specifics_in_config()
|
||||
{
|
||||
var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
|
||||
.WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
|
||||
.WithDelegatingHandlers(new List<string>
|
||||
{
|
||||
"FakeDelegatingHandler",
|
||||
})
|
||||
.WithReRouteKey("")
|
||||
.Build();
|
||||
|
||||
this.Given(x => GivenTheFollowingRequest(reRoute))
|
||||
.And(x => GivenTheTracingFactoryReturns())
|
||||
.And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
|
||||
.And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandlerThree, FakeDelegatingHandlerFour>())
|
||||
.And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.When(x => WhenIGet())
|
||||
.Then(x => ThenThereIsDelegatesInProvider(5))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerThree>(0))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerFour>(1))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(2))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(3))
|
||||
.And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(4))
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void should_follow_ordering_dont_add_specifics()
|
||||
{
|
||||
var reRoute = new DownstreamReRouteBuilder().WithIsQos(true)
|
||||
.WithHttpHandlerOptions(new HttpHandlerOptions(true, true, true))
|
||||
.WithReRouteKey("")
|
||||
.Build();
|
||||
|
||||
this.Given(x => GivenTheFollowingRequest(reRoute))
|
||||
.And(x => GivenTheTracingFactoryReturns())
|
||||
.And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
|
||||
.And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.When(x => WhenIGet())
|
||||
.Then(x => ThenThereIsDelegatesInProvider(4))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandler>(0))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeDelegatingHandlerTwo>(1))
|
||||
.And(x => ThenHandlerAtPositionIs<FakeTracingHandler>(2))
|
||||
.And(x => ThenHandlerAtPositionIs<PollyCircuitBreakingDelegatingHandler>(3))
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void should_apply_re_route_specific()
|
||||
{
|
||||
var reRoute = new DownstreamReRouteBuilder()
|
||||
.WithHttpHandlerOptions(new HttpHandlerOptions(true, true, false))
|
||||
.WithDelegatingHandlers(new List<string>
|
||||
{
|
||||
"FakeDelegatingHandler",
|
||||
"FakeDelegatingHandlerTwo"
|
||||
})
|
||||
.WithReRouteKey("")
|
||||
.Build();
|
||||
|
||||
this.Given(x => GivenTheFollowingRequest(reRoute))
|
||||
.And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
|
||||
.And(x => GivenTheServiceProviderReturnsSpecificDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.When(x => WhenIGet())
|
||||
.Then(x => ThenThereIsDelegatesInProvider(2))
|
||||
.And(x => ThenTheDelegatesAreAddedCorrectly())
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
[Fact]
|
||||
@ -41,7 +202,7 @@ namespace Ocelot.UnitTests.Requester
|
||||
|
||||
this.Given(x => GivenTheFollowingRequest(reRoute))
|
||||
.And(x => GivenTheQosProviderHouseReturns(new OkResponse<IQoSProvider>(It.IsAny<PollyQoSProvider>())))
|
||||
.And(x => GivenTheServiceProviderReturns<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.And(x => GivenTheServiceProviderReturnsGlobalDelegatingHandlers<FakeDelegatingHandler, FakeDelegatingHandlerTwo>())
|
||||
.When(x => WhenIGet())
|
||||
.Then(x => ThenThereIsDelegatesInProvider(3))
|
||||
.And(x => ThenTheDelegatesAreAddedCorrectly())
|
||||
@ -91,30 +252,58 @@ namespace Ocelot.UnitTests.Requester
|
||||
.BDDfy();
|
||||
}
|
||||
|
||||
private void GivenTheServiceProviderReturns<TOne, TTwo>()
|
||||
private void ThenHandlerAtPositionIs<T>(int pos)
|
||||
where T : DelegatingHandler
|
||||
{
|
||||
var delegates = _result.Data;
|
||||
var del = delegates[pos].Invoke();
|
||||
del.ShouldBeOfType<T>();
|
||||
}
|
||||
|
||||
private void GivenTheTracingFactoryReturns()
|
||||
{
|
||||
_tracingFactory
|
||||
.Setup(x => x.Get())
|
||||
.Returns(new FakeTracingHandler());
|
||||
}
|
||||
|
||||
private void GivenTheServiceProviderReturnsGlobalDelegatingHandlers<TOne, TTwo>()
|
||||
where TOne : DelegatingHandler
|
||||
where TTwo : DelegatingHandler
|
||||
{
|
||||
IServiceCollection services = new ServiceCollection();
|
||||
services.AddSingleton<DelegatingHandler, TOne>();
|
||||
services.AddSingleton<DelegatingHandler, TTwo>();
|
||||
_serviceProvider = services.BuildServiceProvider();
|
||||
_services.AddTransient<TOne>();
|
||||
_services.AddTransient<GlobalDelegatingHandler>(s => {
|
||||
var service = s.GetService<TOne>();
|
||||
return new GlobalDelegatingHandler(service);
|
||||
});
|
||||
_services.AddTransient<TTwo>();
|
||||
_services.AddTransient<GlobalDelegatingHandler>(s => {
|
||||
var service = s.GetService<TTwo>();
|
||||
return new GlobalDelegatingHandler(service);
|
||||
});
|
||||
}
|
||||
|
||||
private void GivenTheServiceProviderReturnsNothing()
|
||||
private void GivenTheServiceProviderReturnsSpecificDelegatingHandlers<TOne, TTwo>()
|
||||
where TOne : DelegatingHandler
|
||||
where TTwo : DelegatingHandler
|
||||
{
|
||||
IServiceCollection services = new ServiceCollection();
|
||||
_serviceProvider = services.BuildServiceProvider();
|
||||
_services.AddTransient<DelegatingHandler, TOne>();
|
||||
_services.AddTransient<DelegatingHandler, TTwo>();
|
||||
}
|
||||
|
||||
private void GivenTheServiceProviderReturnsNothing()
|
||||
{
|
||||
_serviceProvider = _services.BuildServiceProvider();
|
||||
}
|
||||
|
||||
private void ThenAnErrorIsReturned()
|
||||
{
|
||||
_provider.IsError.ShouldBeTrue();
|
||||
_result.IsError.ShouldBeTrue();
|
||||
}
|
||||
|
||||
private void ThenTheDelegatesAreAddedCorrectly()
|
||||
{
|
||||
var delegates = _provider.Data;
|
||||
var delegates = _result.Data;
|
||||
|
||||
var del = delegates[0].Invoke();
|
||||
var handler = (FakeDelegatingHandler) del;
|
||||
@ -134,15 +323,15 @@ namespace Ocelot.UnitTests.Requester
|
||||
|
||||
private void ThenItIsPolly(int i)
|
||||
{
|
||||
var delegates = _provider.Data;
|
||||
var delegates = _result.Data;
|
||||
var del = delegates[i].Invoke();
|
||||
del.ShouldBeOfType<PollyCircuitBreakingDelegatingHandler>();
|
||||
}
|
||||
|
||||
private void ThenThereIsDelegatesInProvider(int count)
|
||||
{
|
||||
_provider.ShouldNotBeNull();
|
||||
_provider.Data.Count.ShouldBe(count);
|
||||
_result.ShouldNotBeNull();
|
||||
_result.Data.Count.ShouldBe(count);
|
||||
}
|
||||
|
||||
private void GivenTheFollowingRequest(DownstreamReRoute request)
|
||||
@ -152,14 +341,19 @@ namespace Ocelot.UnitTests.Requester
|
||||
|
||||
private void WhenIGet()
|
||||
{
|
||||
_serviceProvider = _services.BuildServiceProvider();
|
||||
_factory = new DelegatingHandlerHandlerFactory(_loggerFactory.Object, _tracingFactory.Object, _qosProviderHouse.Object, _serviceProvider);
|
||||
_provider = _factory.Get(_request);
|
||||
_result = _factory.Get(_request);
|
||||
}
|
||||
|
||||
private void ThenNoDelegatesAreInTheProvider()
|
||||
{
|
||||
_provider.ShouldNotBeNull();
|
||||
_provider.Data.Count.ShouldBe(0);
|
||||
_result.ShouldNotBeNull();
|
||||
_result.Data.Count.ShouldBe(0);
|
||||
}
|
||||
}
|
||||
|
||||
internal class FakeTracingHandler : DelegatingHandler, ITracingHandler
|
||||
{
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user