mirror of
				https://github.com/nsnail/Ocelot.git
				synced 2025-11-04 15:50:49 +08:00 
			
		
		
		
	+semver: breaking PRs merged from Develop, Eureka honour scheme, don't crash on dispose and validate duplicate placeholders in UpstreamPathTemplate
* initial commit for new feature #1077 allow to limit the number of concurrent tcp connection to a downstream service * protect code against value not in accurate range add unit test * Do not crash host on Dispose * Add test * Pin GitVersion.CommandLine package version * #683 validate if there are duplicated placeholders in UpstreamPathTemplate * Use registered scheme from Eureka (#1087) * extra test * very brief mention MaxConnectionsPerServer in docs * build develop like a PR * more docs Co-authored-by: jlukawska <56401969+jlukawska@users.noreply.github.com> Co-authored-by: buretjph <58700930+buretjph@users.noreply.github.com> Co-authored-by: Jonathan Mezach <jonathanmezach@gmail.com> Co-authored-by: 彭伟 <pengweiqhca@sina.com>
This commit is contained in:
		@@ -41,14 +41,14 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
            _internalConfigCreator = new Mock<IInternalConfigurationCreator>();
 | 
			
		||||
            _internalConfigCreator.Setup(x => x.Create(It.IsAny<FileConfiguration>())).ReturnsAsync(new OkResponse<IInternalConfiguration>(_internalConfig));
 | 
			
		||||
            _poller = new FileConfigurationPoller(_factory.Object, _repo.Object, _config.Object, _internalConfigRepo.Object, _internalConfigCreator.Object);
 | 
			
		||||
            _poller.StartAsync(new CancellationToken());
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_start()
 | 
			
		||||
        {
 | 
			
		||||
            this.Given(x => ThenTheSetterIsCalled(_fileConfig, 1))
 | 
			
		||||
                 .BDDfy();
 | 
			
		||||
            this.Given(x => GivenPollerHasStarted())
 | 
			
		||||
                .Given(x => ThenTheSetterIsCalled(_fileConfig, 1))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
@@ -71,7 +71,8 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(x => WhenTheConfigIsChanged(newConfig, 0))
 | 
			
		||||
            this.Given(x => GivenPollerHasStarted())
 | 
			
		||||
                .Given(x => WhenTheConfigIsChanged(newConfig, 0))
 | 
			
		||||
                .Then(x => ThenTheSetterIsCalledAtLeast(newConfig, 1))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
@@ -96,7 +97,8 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(x => WhenTheConfigIsChanged(newConfig, 10))
 | 
			
		||||
            this.Given(x => GivenPollerHasStarted())
 | 
			
		||||
                .Given(x => WhenTheConfigIsChanged(newConfig, 10))
 | 
			
		||||
                .Then(x => ThenTheSetterIsCalled(newConfig, 1))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
@@ -121,11 +123,24 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            this.Given(x => WhenProviderErrors())
 | 
			
		||||
            this.Given(x => GivenPollerHasStarted())
 | 
			
		||||
                .Given(x => WhenProviderErrors())
 | 
			
		||||
                .Then(x => ThenTheSetterIsCalled(newConfig, 0))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_dispose_cleanly_without_starting()
 | 
			
		||||
        {
 | 
			
		||||
            this.When(x => WhenPollerIsDisposed())
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenPollerHasStarted()
 | 
			
		||||
        {
 | 
			
		||||
            _poller.StartAsync(CancellationToken.None);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenProviderErrors()
 | 
			
		||||
        {
 | 
			
		||||
            _repo
 | 
			
		||||
@@ -141,6 +156,11 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                .ReturnsAsync(new OkResponse<FileConfiguration>(newConfig));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void WhenPollerIsDisposed()
 | 
			
		||||
        {
 | 
			
		||||
            _poller.Dispose();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void ThenTheSetterIsCalled(FileConfiguration fileConfig, int times)
 | 
			
		||||
        {
 | 
			
		||||
            var result = WaitFor(4000).Until(() =>
 | 
			
		||||
 
 | 
			
		||||
@@ -41,7 +41,7 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true);
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true, int.MaxValue);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .When(x => WhenICreateHttpHandlerOptions())
 | 
			
		||||
@@ -60,7 +60,7 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, true, true);
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, true, true, int.MaxValue);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .And(x => GivenARealTracer())
 | 
			
		||||
@@ -73,7 +73,7 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
        public void should_create_options_with_useCookie_false_and_allowAutoRedirect_true_as_default()
 | 
			
		||||
        {
 | 
			
		||||
            var fileReRoute = new FileReRoute();
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true);
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true, int.MaxValue);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .When(x => WhenICreateHttpHandlerOptions())
 | 
			
		||||
@@ -94,7 +94,7 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true);
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true, int.MaxValue);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .When(x => WhenICreateHttpHandlerOptions())
 | 
			
		||||
@@ -110,7 +110,7 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                HttpHandlerOptions = new FileHttpHandlerOptions()
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true);
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true, int.MaxValue);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .When(x => WhenICreateHttpHandlerOptions())
 | 
			
		||||
@@ -129,7 +129,64 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, false);
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, false, int.MaxValue);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .When(x => WhenICreateHttpHandlerOptions())
 | 
			
		||||
                .Then(x => ThenTheFollowingOptionsReturned(expectedOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_options_with_specified_MaxConnectionsPerServer()
 | 
			
		||||
        {
 | 
			
		||||
            var fileReRoute = new FileReRoute
 | 
			
		||||
            {
 | 
			
		||||
                HttpHandlerOptions = new FileHttpHandlerOptions
 | 
			
		||||
                {
 | 
			
		||||
                    MaxConnectionsPerServer = 10
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true, 10);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .When(x => WhenICreateHttpHandlerOptions())
 | 
			
		||||
                .Then(x => ThenTheFollowingOptionsReturned(expectedOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_options_fixing_specified_MaxConnectionsPerServer_range()
 | 
			
		||||
        {
 | 
			
		||||
            var fileReRoute = new FileReRoute
 | 
			
		||||
            {
 | 
			
		||||
                HttpHandlerOptions = new FileHttpHandlerOptions
 | 
			
		||||
                {
 | 
			
		||||
                    MaxConnectionsPerServer = -1
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true, int.MaxValue);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .When(x => WhenICreateHttpHandlerOptions())
 | 
			
		||||
                .Then(x => ThenTheFollowingOptionsReturned(expectedOptions))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void should_create_options_fixing_specified_MaxConnectionsPerServer_range_when_zero()
 | 
			
		||||
        {
 | 
			
		||||
            var fileReRoute = new FileReRoute
 | 
			
		||||
            {
 | 
			
		||||
                HttpHandlerOptions = new FileHttpHandlerOptions
 | 
			
		||||
                {
 | 
			
		||||
                    MaxConnectionsPerServer = 0
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var expectedOptions = new HttpHandlerOptions(false, false, false, true, int.MaxValue);
 | 
			
		||||
 | 
			
		||||
            this.Given(x => GivenTheFollowing(fileReRoute))
 | 
			
		||||
                .When(x => WhenICreateHttpHandlerOptions())
 | 
			
		||||
@@ -154,6 +211,7 @@ namespace Ocelot.UnitTests.Configuration
 | 
			
		||||
            _httpHandlerOptions.UseCookieContainer.ShouldBe(expected.UseCookieContainer);
 | 
			
		||||
            _httpHandlerOptions.UseTracing.ShouldBe(expected.UseTracing);
 | 
			
		||||
            _httpHandlerOptions.UseProxy.ShouldBe(expected.UseProxy);
 | 
			
		||||
            _httpHandlerOptions.MaxConnectionsPerServer.ShouldBe(expected.MaxConnectionsPerServer);
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenARealTracer()
 | 
			
		||||
 
 | 
			
		||||
@@ -1341,6 +1341,32 @@
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        [Fact]
 | 
			
		||||
        public void configuration_is_invalid_when_placeholder_is_used_twice_in_upstream_path_template()
 | 
			
		||||
        {
 | 
			
		||||
            this.Given(x => x.GivenAConfiguration(new FileConfiguration
 | 
			
		||||
            {
 | 
			
		||||
                ReRoutes = new List<FileReRoute>
 | 
			
		||||
                {
 | 
			
		||||
                    new FileReRoute
 | 
			
		||||
                    {
 | 
			
		||||
                        DownstreamPathTemplate = "/bar/{everything}",
 | 
			
		||||
                        DownstreamScheme = "http",
 | 
			
		||||
                        DownstreamHostAndPorts = new List<FileHostAndPort> 
 | 
			
		||||
                        { 
 | 
			
		||||
                            new FileHostAndPort() { Host = "a.b.cd" },
 | 
			
		||||
                        },
 | 
			
		||||
                        UpstreamPathTemplate = "/foo/bar/{everything}/{everything}",
 | 
			
		||||
                        UpstreamHttpMethod = new List<string> { "Get" },
 | 
			
		||||
                    },
 | 
			
		||||
                },
 | 
			
		||||
            }))
 | 
			
		||||
                .When(x => x.WhenIValidateTheConfiguration())
 | 
			
		||||
                .Then(x => x.ThenTheResultIsNotValid())
 | 
			
		||||
                .And(x => x.ThenTheErrorMessageAtPositionIs(0, "reRoute /foo/bar/{everything}/{everything} has duplicated placeholder"))
 | 
			
		||||
                .BDDfy();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void GivenAConfiguration(FileConfiguration fileConfiguration)
 | 
			
		||||
        {
 | 
			
		||||
            _fileConfiguration = fileConfiguration;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user