public async Task PublicIPResolverOverDns_ResolveIPv6_ReturnsNullWhenDnsLookupThrowsAnException()
        {
            // Given
            var mockResponse = new Mock <IDnsQueryResponse>();
            var addresses    = new List <IPAddress> {
                IPAddress.Parse("2606:4700:4700::1111")
            };
            var options = new PublicIPResolverOverDnsOptions("myip.test.com", QueryType.TXT, QueryClass.IN, addresses, addresses);

            mockResponse
            .SetupGet(r => r.Answers)
            .Throws(new Exception("Some exception"));

            _mockLookupClient
            .Setup(dns => dns.QueryAsync(It.IsAny <DnsQuestion>(), It.IsAny <DnsQueryAndServerOptions>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(mockResponse.Object);

            // When
            var resolver = new PublicIPResolverOverDns(_mockLookupClient.Object, _mockLogger.Object, options);
            var ip       = await resolver.ResolveIPv6();

            // Then
            _mockLogger.Verify(l => l.Verbose("Error resolving {ip} over dns: {message}", "ipv6", "Some exception"));
            Assert.Null(ip);
        }
        public async Task PublicIPResolverOverDns_ResolveIPv4_ReturnsAnIPv4Address()
        {
            // Given
            var mockResponse = new Mock <IDnsQueryResponse>();
            var addresses    = new List <IPAddress> {
                IPAddress.Parse("1.1.1.1")
            };
            var options = new PublicIPResolverOverDnsOptions("myip.test.com", QueryType.TXT, QueryClass.CH, addresses, addresses);

            mockResponse
            .SetupGet(r => r.Answers)
            .Returns(new List <DnsResourceRecord>
            {
                new TxtRecord(
                    info: new ResourceRecordInfo("myip.test.com", ResourceRecordType.TXT, QueryClass.CH, 5000, 0),
                    values: Array.Empty <string>(),
                    utf8Values: new string[] { "10.0.0.1" }
                    )
            });

            _mockLookupClient
            .Setup(dns => dns.QueryAsync(It.IsAny <DnsQuestion>(), It.IsAny <DnsQueryAndServerOptions>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(mockResponse.Object);

            // When
            var resolver = new PublicIPResolverOverDns(_mockLookupClient.Object, _mockLogger.Object, options);
            var ip       = await resolver.ResolveIPv4();

            // Then
            ip.Should().BeEquivalentTo(IPAddress.Parse("10.0.0.1"));
        }
        public async Task PublicIPResolverOverDns_ResolveIPv4_ReturnsNullWhenNoTxtRecordsAreReturned()
        {
            // Given
            var mockResponse = new Mock <IDnsQueryResponse>();
            var addresses    = new List <IPAddress> {
                IPAddress.Parse("1.1.1.1")
            };
            var options = new PublicIPResolverOverDnsOptions("myip.test.com", QueryType.TXT, QueryClass.CH, addresses, addresses);

            mockResponse
            .SetupGet(r => r.Answers)
            .Returns(new List <DnsResourceRecord>
            {
            });

            _mockLookupClient
            .Setup(dns => dns.QueryAsync(It.IsAny <DnsQuestion>(), It.IsAny <DnsQueryAndServerOptions>(), It.IsAny <CancellationToken>()))
            .ReturnsAsync(mockResponse.Object);

            // When
            var resolver = new PublicIPResolverOverDns(_mockLookupClient.Object, _mockLogger.Object, options);
            var ip       = await resolver.ResolveIPv4();

            // Then
            Assert.Null(ip);
        }