Пример #1
0
    public void ProbingCompleted_EmptyProbingResultList_DoNothing()
    {
        var options = Options.Create(new ConsecutiveFailuresHealthPolicyOptions {
            DefaultThreshold = 2
        });
        var policy  = new ConsecutiveFailuresHealthPolicy(options, new DestinationHealthUpdaterStub());
        var cluster = GetClusterInfo("cluster0", destinationCount: 2);

        var probingResults = new[] {
            new DestinationProbingResult(cluster.Destinations.Values.First(), new HttpResponseMessage(HttpStatusCode.InternalServerError), null),
            new DestinationProbingResult(cluster.Destinations.Values.Skip(1).First(), new HttpResponseMessage(HttpStatusCode.OK), null)
        };

        for (var i = 0; i < 2; i++)
        {
            policy.ProbingCompleted(cluster, probingResults);
        }

        Assert.Equal(DestinationHealth.Unhealthy, cluster.Destinations.Values.First().Health.Active);
        Assert.Equal(DestinationHealth.Healthy, cluster.Destinations.Values.Skip(1).First().Health.Active);

        policy.ProbingCompleted(cluster, new DestinationProbingResult[0]);

        Assert.Equal(DestinationHealth.Unhealthy, cluster.Destinations.Values.First().Health.Active);
        Assert.Equal(DestinationHealth.Healthy, cluster.Destinations.Values.Skip(1).First().Health.Active);
    }
Пример #2
0
    public void ProbingCompleted_FailureThresholdExceeded_MarkDestinationUnhealthy()
    {
        var options = Options.Create(new ConsecutiveFailuresHealthPolicyOptions {
            DefaultThreshold = 2
        });
        var policy   = new ConsecutiveFailuresHealthPolicy(options, new DestinationHealthUpdaterStub());
        var cluster0 = GetClusterInfo("cluster0", destinationCount: 2);
        var cluster1 = GetClusterInfo("cluster0", destinationCount: 2, failureThreshold: 3);

        var probingResults0 = new[] {
            new DestinationProbingResult(cluster0.Destinations.Values.First(), new HttpResponseMessage(HttpStatusCode.InternalServerError), null),
            new DestinationProbingResult(cluster0.Destinations.Values.Skip(1).First(), new HttpResponseMessage(HttpStatusCode.OK), null)
        };
        var probingResults1 = new[] {
            new DestinationProbingResult(cluster1.Destinations.Values.First(), new HttpResponseMessage(HttpStatusCode.OK), null),
            new DestinationProbingResult(cluster1.Destinations.Values.Skip(1).First(), null, new InvalidOperationException())
        };

        Assert.Equal(HealthCheckConstants.ActivePolicy.ConsecutiveFailures, policy.Name);

        // Initial state
        Assert.All(cluster0.Destinations.Values, d => Assert.Equal(DestinationHealth.Unknown, d.Health.Active));
        Assert.All(cluster1.Destinations.Values, d => Assert.Equal(DestinationHealth.Unknown, d.Health.Active));

        // First probing attempt
        policy.ProbingCompleted(cluster0, probingResults0);
        Assert.All(cluster0.Destinations.Values, d => Assert.Equal(DestinationHealth.Healthy, d.Health.Active));
        policy.ProbingCompleted(cluster1, probingResults1);
        Assert.All(cluster1.Destinations.Values, d => Assert.Equal(DestinationHealth.Healthy, d.Health.Active));

        // Second probing attempt
        policy.ProbingCompleted(cluster0, probingResults0);
        Assert.Equal(DestinationHealth.Unhealthy, cluster0.Destinations.Values.First().Health.Active);
        Assert.Equal(DestinationHealth.Healthy, cluster0.Destinations.Values.Skip(1).First().Health.Active);
        policy.ProbingCompleted(cluster1, probingResults1);
        Assert.All(cluster1.Destinations.Values, d => Assert.Equal(DestinationHealth.Healthy, d.Health.Active));

        // Third probing attempt
        policy.ProbingCompleted(cluster0, probingResults0);
        Assert.Equal(DestinationHealth.Unhealthy, cluster0.Destinations.Values.First().Health.Active);
        Assert.Equal(DestinationHealth.Healthy, cluster0.Destinations.Values.Skip(1).First().Health.Active);
        policy.ProbingCompleted(cluster1, probingResults1);
        Assert.Equal(DestinationHealth.Healthy, cluster1.Destinations.Values.First().Health.Active);
        Assert.Equal(DestinationHealth.Unhealthy, cluster1.Destinations.Values.Skip(1).First().Health.Active);

        Assert.All(cluster0.Destinations.Values, d => Assert.Equal(DestinationHealth.Unknown, d.Health.Passive));
        Assert.All(cluster1.Destinations.Values, d => Assert.Equal(DestinationHealth.Unknown, d.Health.Passive));
    }