mirror of
https://github.com/nsnail/Ocelot.git
synced 2025-05-01 12:52:51 +08:00

* started messing around with this on the train last night * mega hacking away to change middleware into Ocelot iddleware * scoped data repo back in * broken commit getting tests working * another broken commit farting around with tests * all unit tests passing again * mw pipeline for ocelot...still loads of hacks but getting there now to get acceptance tests working, then fix config so you can have aggregate and then imlement multiplexer, then mapping to response...loads to do * all tests passing before aggregation feature implemented * removed all the request middleware stuff we dont need it * updated how errors work...tho i think there could be edge case here when aggregating because one downstream could error and this would effect another * removed multiplexer so you dont have to send route down, this isnt very thread safe...sigh * hacking around getting the config for aggregates in, this might change * refactored builder and unit tests passing now * Updated a bunch of ports for tests * plugged in code to create reroutes that are aggregates * made multiplexer a class * hacked test to death * simple aggregator done, initial validation done * removed request id from context, it is still specific for http request * now aggregates to json always * docs for aggregate reroutes * Updated docs
166 lines
6.2 KiB
C#
166 lines
6.2 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using Moq;
|
|
using Ocelot.Configuration;
|
|
using Ocelot.Configuration.Builder;
|
|
using Ocelot.LoadBalancer.LoadBalancers;
|
|
using Ocelot.Responses;
|
|
using Ocelot.Values;
|
|
using Shouldly;
|
|
using TestStack.BDDfy;
|
|
using Xunit;
|
|
|
|
namespace Ocelot.UnitTests.LoadBalancer
|
|
{
|
|
public class LoadBalancerHouseTests
|
|
{
|
|
private DownstreamReRoute _reRoute;
|
|
private ILoadBalancer _loadBalancer;
|
|
private readonly LoadBalancerHouse _loadBalancerHouse;
|
|
private Response _addResult;
|
|
private Response<ILoadBalancer> _getResult;
|
|
private string _key;
|
|
private readonly Mock<ILoadBalancerFactory> _factory;
|
|
private ServiceProviderConfiguration _serviceProviderConfig;
|
|
|
|
public LoadBalancerHouseTests()
|
|
{
|
|
_factory = new Mock<ILoadBalancerFactory>();
|
|
_loadBalancerHouse = new LoadBalancerHouse(_factory.Object);
|
|
}
|
|
|
|
[Fact]
|
|
public void should_store_load_balancer_on_first_request()
|
|
{
|
|
var reRoute = new DownstreamReRouteBuilder().WithReRouteKey("test").Build();
|
|
|
|
this.Given(x => x.GivenThereIsALoadBalancer(reRoute, new FakeLoadBalancer()))
|
|
.Then(x => x.ThenItIsAdded())
|
|
.BDDfy();
|
|
}
|
|
|
|
[Fact]
|
|
public void should_not_store_load_balancer_on_second_request()
|
|
{
|
|
var reRoute = new DownstreamReRouteBuilder().WithLoadBalancer("FakeLoadBalancer").WithReRouteKey("test").Build();
|
|
|
|
this.Given(x => x.GivenThereIsALoadBalancer(reRoute, new FakeLoadBalancer()))
|
|
.When(x => x.WhenWeGetTheLoadBalancer(reRoute))
|
|
.Then(x => x.ThenItIsReturned())
|
|
.BDDfy();
|
|
}
|
|
|
|
[Fact]
|
|
public void should_store_load_balancers_by_key()
|
|
{
|
|
var reRoute = new DownstreamReRouteBuilder().WithLoadBalancer("FakeLoadBalancer").WithReRouteKey("test").Build();
|
|
var reRouteTwo = new DownstreamReRouteBuilder().WithLoadBalancer("FakeRoundRobinLoadBalancer").WithReRouteKey("testtwo").Build();
|
|
|
|
this.Given(x => x.GivenThereIsALoadBalancer(reRoute, new FakeLoadBalancer()))
|
|
.And(x => x.GivenThereIsALoadBalancer(reRouteTwo, new FakeRoundRobinLoadBalancer()))
|
|
.When(x => x.WhenWeGetTheLoadBalancer(reRoute))
|
|
.Then(x => x.ThenTheLoadBalancerIs<FakeLoadBalancer>())
|
|
.When(x => x.WhenWeGetTheLoadBalancer(reRouteTwo))
|
|
.Then(x => x.ThenTheLoadBalancerIs<FakeRoundRobinLoadBalancer>())
|
|
.BDDfy();
|
|
}
|
|
|
|
[Fact]
|
|
public void should_return_error_if_exception()
|
|
{
|
|
var reRoute = new DownstreamReRouteBuilder().Build();
|
|
|
|
this.When(x => x.WhenWeGetTheLoadBalancer(reRoute))
|
|
.Then(x => x.ThenAnErrorIsReturned())
|
|
.BDDfy();
|
|
}
|
|
|
|
[Fact]
|
|
public void should_get_new_load_balancer_if_reroute_load_balancer_has_changed()
|
|
{
|
|
var reRoute = new DownstreamReRouteBuilder().WithLoadBalancer("FakeLoadBalancer").WithReRouteKey("test").Build();
|
|
|
|
var reRouteTwo = new DownstreamReRouteBuilder().WithLoadBalancer("LeastConnection").WithReRouteKey("test").Build();
|
|
|
|
this.Given(x => x.GivenThereIsALoadBalancer(reRoute, new FakeLoadBalancer()))
|
|
.When(x => x.WhenWeGetTheLoadBalancer(reRoute))
|
|
.Then(x => x.ThenTheLoadBalancerIs<FakeLoadBalancer>())
|
|
.When(x => x.WhenIGetTheReRouteWithTheSameKeyButDifferentLoadBalancer(reRouteTwo))
|
|
.Then(x => x.ThenTheLoadBalancerIs<LeastConnection>())
|
|
.BDDfy();
|
|
}
|
|
|
|
private void WhenIGetTheReRouteWithTheSameKeyButDifferentLoadBalancer(DownstreamReRoute reRoute)
|
|
{
|
|
_reRoute = reRoute;
|
|
_factory.Setup(x => x.Get(_reRoute, _serviceProviderConfig)).ReturnsAsync(new LeastConnection(null, null));
|
|
_getResult = _loadBalancerHouse.Get(_reRoute, _serviceProviderConfig).Result;
|
|
}
|
|
|
|
private void ThenAnErrorIsReturned()
|
|
{
|
|
_getResult.IsError.ShouldBeTrue();
|
|
_getResult.Errors[0].ShouldBeOfType<UnableToFindLoadBalancerError>();
|
|
}
|
|
|
|
private void ThenTheLoadBalancerIs<T>()
|
|
{
|
|
_getResult.Data.ShouldBeOfType<T>();
|
|
}
|
|
|
|
private void ThenItIsAdded()
|
|
{
|
|
_getResult.IsError.ShouldBe(false);
|
|
_getResult.ShouldBeOfType<OkResponse<ILoadBalancer>>();
|
|
_getResult.Data.ShouldBe(_loadBalancer);
|
|
_factory.Verify(x => x.Get(_reRoute, _serviceProviderConfig), Times.Once);
|
|
}
|
|
|
|
|
|
private void GivenThereIsALoadBalancer(DownstreamReRoute reRoute, ILoadBalancer loadBalancer)
|
|
{
|
|
_reRoute = reRoute;
|
|
_loadBalancer = loadBalancer;
|
|
_factory.Setup(x => x.Get(_reRoute, _serviceProviderConfig)).ReturnsAsync(loadBalancer);
|
|
_getResult = _loadBalancerHouse.Get(reRoute, _serviceProviderConfig).Result;
|
|
}
|
|
|
|
private void WhenWeGetTheLoadBalancer(DownstreamReRoute reRoute)
|
|
{
|
|
_getResult = _loadBalancerHouse.Get(reRoute, _serviceProviderConfig).Result;
|
|
}
|
|
|
|
private void ThenItIsReturned()
|
|
{
|
|
_getResult.Data.ShouldBe(_loadBalancer);
|
|
_factory.Verify(x => x.Get(_reRoute, _serviceProviderConfig), Times.Once);
|
|
}
|
|
|
|
class FakeLoadBalancer : ILoadBalancer
|
|
{
|
|
public Task<Response<ServiceHostAndPort>> Lease()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public void Release(ServiceHostAndPort hostAndPort)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
class FakeRoundRobinLoadBalancer : ILoadBalancer
|
|
{
|
|
public Task<Response<ServiceHostAndPort>> Lease()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
public void Release(ServiceHostAndPort hostAndPort)
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
}
|
|
}
|