public async Task ItShouldReturnEmptyListForBadIpAddress(string ipAddress)
        {
            var reverseDnsLookup    = new ReverseDnsLookup(_dnsResolver, _log);
            ReverseDnsResult result = await reverseDnsLookup.Lookup(ipAddress);

            Assert.That(result.ForwardResponses.Count, Is.EqualTo(0));
            Assert.IsNull(result.OriginalIpAddress);
        }
        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);
        }
        public async Task ItShouldProcessAllValidLookups(string ipAddress)
        {
            string googleHostName = "google.com";
            string googleIp1      = "192.168.0.1";
            string googleIp2      = "192.168.0.2";

            string yahooHostName = "yahoo.com";
            string yahooIp1      = "192.168.1.1";

            ReverseDnsQueryResponse ptrDnsQueryResponse = new ReverseDnsQueryResponse(false, string.Empty, new List <string>()
            {
                googleHostName, yahooHostName
            });
            ReverseDnsQueryResponse googleAddressDnsQueryResponse = new ReverseDnsQueryResponse(false, string.Empty, new List <string>()
            {
                googleIp1, googleIp2
            });
            ReverseDnsQueryResponse yahooAddressDnsQueryResponse = new ReverseDnsQueryResponse(false, string.Empty, new List <string>()
            {
                yahooIp1
            });

            A.CallTo(() => _dnsResolver.QueryPtrAsync(A <IPAddress> ._)).Returns(ptrDnsQueryResponse);
            A.CallTo(() => _dnsResolver.QueryAddressAsync <ARecord>(googleHostName, QueryType.A)).Returns(googleAddressDnsQueryResponse);
            A.CallTo(() => _dnsResolver.QueryAddressAsync <AaaaRecord>(googleHostName, QueryType.AAAA)).Returns(googleAddressDnsQueryResponse);
            A.CallTo(() => _dnsResolver.QueryAddressAsync <ARecord>(yahooHostName, QueryType.A)).Returns(yahooAddressDnsQueryResponse);
            A.CallTo(() => _dnsResolver.QueryAddressAsync <AaaaRecord>(yahooHostName, QueryType.AAAA)).Returns(yahooAddressDnsQueryResponse);

            var reverseDnsLookup = new ReverseDnsLookup(_dnsResolver, _log);

            ReverseDnsResult reverseDnsResult = await reverseDnsLookup.Lookup(ipAddress);

            Assert.That(_log.Errors.Count, Is.EqualTo(0));
            Assert.That(_log.Warnings.Count, Is.EqualTo(0));

            Assert.That(reverseDnsResult.ForwardResponses.Count, Is.EqualTo(2));
            Assert.That(reverseDnsResult.ForwardResponses[0].Host, Is.EqualTo(googleHostName));
            Assert.That(reverseDnsResult.ForwardResponses[0].IpAddresses.Count, Is.EqualTo(2));
            Assert.That(reverseDnsResult.ForwardResponses[0].IpAddresses[0], Is.EqualTo(googleIp1));
            Assert.That(reverseDnsResult.ForwardResponses[0].IpAddresses[1], Is.EqualTo(googleIp2));
            Assert.That(reverseDnsResult.ForwardResponses[1].Host, Is.EqualTo(yahooHostName));
            Assert.That(reverseDnsResult.ForwardResponses[1].IpAddresses.Count, Is.EqualTo(1));
            Assert.That(reverseDnsResult.ForwardResponses[1].IpAddresses[0], Is.EqualTo(yahooIp1));
        }
        public async Task ItShouldLogErrorWhenValidPtrButFailsOnForwardLookup(string ipAddress)
        {
            ReverseDnsQueryResponse ptrDnsQueryResponse = new ReverseDnsQueryResponse(false, string.Empty, new List <string>()
            {
                "google.com"
            });
            ReverseDnsQueryResponse addressDnsQueryResponse = new ReverseDnsQueryResponse(true, "Something has gone wrong!", null);

            A.CallTo(() => _dnsResolver.QueryPtrAsync(A <IPAddress> ._)).Returns(ptrDnsQueryResponse);
            A.CallTo(() => _dnsResolver.QueryAddressAsync <ARecord>(A <string> ._, QueryType.A)).Returns(addressDnsQueryResponse);
            A.CallTo(() => _dnsResolver.QueryAddressAsync <AaaaRecord>(A <string> ._, QueryType.AAAA)).Returns(addressDnsQueryResponse);

            var reverseDnsLookup = new ReverseDnsLookup(_dnsResolver, _log);

            ReverseDnsResult reverseDnsResult = await reverseDnsLookup.Lookup(ipAddress);

            Assert.That(_log.Warnings.Count, Is.EqualTo(1));
            Assert.That(reverseDnsResult.ForwardResponses.Count, Is.EqualTo(0));
        }
        public async Task ItShouldOnlyProcessValidLookupsAndNotStopWhenInvalid(string ipAddress)
        {
            string googleHostName = "google.com";
            string googleIp1      = "192.168.0.1";
            string yahooHostName  = "yahoo.com";

            ReverseDnsQueryResponse ptrDnsQueryResponse = new ReverseDnsQueryResponse(false, string.Empty, new List <string>()
            {
                googleHostName, yahooHostName
            });
            ReverseDnsQueryResponse host1AddressDnsQueryResponse = new ReverseDnsQueryResponse(false, string.Empty, new List <string>()
            {
                googleIp1
            });
            ReverseDnsQueryResponse host2AaddressDnsQueryResponse = new ReverseDnsQueryResponse(true, "Something has gone wrong!", null);

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

            //setup for only host1
            A.CallTo(() => _dnsResolver.QueryAddressAsync <ARecord>(googleHostName, QueryType.A)).Returns(host1AddressDnsQueryResponse);
            A.CallTo(() => _dnsResolver.QueryAddressAsync <AaaaRecord>(googleHostName, QueryType.AAAA)).Returns(host1AddressDnsQueryResponse);

            //setup for only host1
            A.CallTo(() => _dnsResolver.QueryAddressAsync <ARecord>(yahooHostName, QueryType.A)).Returns(host2AaddressDnsQueryResponse);
            A.CallTo(() => _dnsResolver.QueryAddressAsync <AaaaRecord>(yahooHostName, QueryType.AAAA)).Returns(host2AaddressDnsQueryResponse);

            var reverseDnsLookup = new ReverseDnsLookup(_dnsResolver, _log);

            ReverseDnsResult reverseDnsResults = await reverseDnsLookup.Lookup(ipAddress);

            Assert.That(_log.Warnings.Count, Is.EqualTo(1));

            Assert.That(reverseDnsResults.ForwardResponses.Count, Is.EqualTo(1));
            Assert.That(reverseDnsResults.ForwardResponses[0].Host, Is.EqualTo(googleHostName));
            Assert.That(reverseDnsResults.ForwardResponses[0].IpAddresses.Count, Is.EqualTo(1));
            Assert.That(reverseDnsResults.ForwardResponses[0].IpAddresses[0], Is.EqualTo(googleIp1));
        }