public async Task ItShouldLogErrorWhenUnableToDoLookupForPtr(string ipAddress)
        {
            ReverseDnsQueryResponse response = new ReverseDnsQueryResponse(true, "Something has gone wrong!", null);

            A.CallTo(() => _dnsResolver.QueryPtrAsync(A <IPAddress> ._)).Returns(response);

            var reverseDnsLookup = new ReverseDnsLookup(_dnsResolver, _log);

            ReverseDnsResult result = await reverseDnsLookup.Lookup(ipAddress);

            Assert.That(_log.Warnings.Count, Is.EqualTo(1));
            Assert.That(result.ForwardResponses.Count, Is.EqualTo(0));
            Assert.IsNull(result.OriginalIpAddress);
        }
        private async Task <ReverseDnsResult> GetReverseDnsResult(IPAddress originalAddress)
        {
            int attempt     = 0;
            int maxAttempts = 5;

            while (attempt < maxAttempts)
            {
                await Task.Delay(attempt *attempt * 1000);

                attempt++;

                try
                {
                    ReverseDnsQueryResponse response = await _dnsResolver.QueryPtrAsync(originalAddress);

                    if (response.HasError && attempt < maxAttempts)
                    {
                        continue;
                    }

                    if (response.HasError)
                    {
                        _log.LogWarning("Failed to do PTR look up for {IpAddress} with error: {Error}.", originalAddress, response.ErrorMessage ?? "Unknown error");
                        return(ReverseDnsResult.InvalidReverseDnsResult);
                    }

                    List <string> hosts = response.Results;

                    List <ReverseDnsResponse> forwardResponses = originalAddress.AddressFamily == AddressFamily.InterNetwork
                        ? await GetDnsResponses <ARecord>(hosts, QueryType.A)
                        : await GetDnsResponses <AaaaRecord>(hosts, QueryType.AAAA);

                    return(new ReverseDnsResult(originalAddress.ToString(), forwardResponses));
                }
                catch (Exception e)
                {
                    string errorMessage = $"Error occured performing PTR lookup for {originalAddress} (attempt {attempt} of {maxAttempts})";

                    if (attempt == maxAttempts)
                    {
                        _log.LogError(e, errorMessage);
                    }
                    else
                    {
                        _log.LogWarning(e, errorMessage);
                    }
                }
            }
            return(ReverseDnsResult.InvalidReverseDnsResult);
        }