public void WhenSave_AndMasterListContainsMailExchangeResourceRecord_ThenEntryIsSaved() { // Arrange var domain = new Domain("stratis.test.com"); var exchangeDomain = new Domain("mail.stratis.test.com"); int preference = 10; var testResourceRecord = new MailExchangeResourceRecord(domain, preference, exchangeDomain); var masterFile = new DnsSeedMasterFile(new List <IResourceRecord> { testResourceRecord }); using (var stream = new MemoryStream()) { // Act. masterFile.Save(stream); // Assert. stream.Should().NotBeNull(); IList <IResourceRecord> resourceRecords = this.ReadResourceRecords(stream); resourceRecords.Should().NotBeNull(); resourceRecords.Should().NotBeNullOrEmpty(); IList <MailExchangeResourceRecord> mailExchangeResourceRecords = resourceRecords.OfType <MailExchangeResourceRecord>().ToList(); mailExchangeResourceRecords.Should().HaveCount(1); mailExchangeResourceRecords[0].Name.ToString().Should().Be(domain.ToString()); mailExchangeResourceRecords[0].ExchangeDomainName.ToString().Should().Be(testResourceRecord.ExchangeDomainName.ToString()); mailExchangeResourceRecords[0].Preference.Should().Be(preference); } }
private IList <IResourceRecord> WhenLoad_AndStreamContainsEntry_ThenEntryIsPopulated(IResourceRecord testResourceRecord, Question question) { // Arrange. using (var stream = new MemoryStream()) { var masterFile = new DnsSeedMasterFile(); IList <IResourceRecord> testResourceRecords = new List <IResourceRecord>() { testResourceRecord }; JsonSerializer serializer = this.CreateSerializer(); using (var streamWriter = new StreamWriter(stream)) { using (var jsonTextWriter = new JsonTextWriter(streamWriter)) { serializer.Serialize(jsonTextWriter, testResourceRecords); jsonTextWriter.Flush(); stream.Seek(0, SeekOrigin.Begin); // Act. masterFile.Load(stream); } } // Assert. return(masterFile.Get(question)); } }
public void WhenSave_AndMasterListContainsEntries_ThenEntriesAreSaved() { // Arrange. string domainName = "stratis.test.com"; IList <IResourceRecord> testResourceRecords = new List <IResourceRecord>() { new IPAddressResourceRecord(new Domain(domainName), IPAddress.Parse("192.168.100.1")), new IPAddressResourceRecord(new Domain(domainName), IPAddress.Parse("192.168.100.2")), new IPAddressResourceRecord(new Domain(domainName), IPAddress.Parse("192.168.100.3")), new IPAddressResourceRecord(new Domain(domainName), IPAddress.Parse("192.168.100.4")) }; var masterFile = new DnsSeedMasterFile(testResourceRecords); using (var stream = new MemoryStream()) { // Act. masterFile.Save(stream); // Assert. stream.Should().NotBeNull(); IList <IResourceRecord> resourceRecords = this.ReadResourceRecords(stream); resourceRecords.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords = resourceRecords.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords.Should().HaveSameCount(testResourceRecords); foreach (IPAddressResourceRecord testResourceRecord in testResourceRecords) { ipAddressResourceRecords.SingleOrDefault(i => i.IPAddress.Equals(testResourceRecord.IPAddress)).Should().NotBeNull(); } } }
public void WhenSave_AndMasterListContainsPointerResourceRecord_ThenEntryIsSaved() { // Arrange var domain = new Domain("stratis.test.com"); var nsDomain = new Domain("pointer.stratis.test.com"); var testResourceRecord = new PointerResourceRecord(domain, nsDomain); var masterFile = new DnsSeedMasterFile(new List <IResourceRecord> { testResourceRecord }); using (var stream = new MemoryStream()) { // Act. masterFile.Save(stream); // Assert. stream.Should().NotBeNull(); IList <IResourceRecord> resourceRecords = this.ReadResourceRecords(stream); resourceRecords.Should().NotBeNull(); resourceRecords.Should().NotBeNullOrEmpty(); IList <PointerResourceRecord> pointerResourceRecord = resourceRecords.OfType <PointerResourceRecord>().ToList(); pointerResourceRecord.Should().HaveCount(1); pointerResourceRecord[0].Name.ToString().Should().Be(domain.ToString()); pointerResourceRecord[0].PointerDomainName.ToString().Should().Be(testResourceRecord.PointerDomainName.ToString()); } }
public void WhenSave_AndMasterListContainsCanonicalNameResourceRecord_ThenEntryIsSaved() { // Arrange var domain = new Domain("stratis.test.com"); var cNameDomain = new Domain("www.stratis.test.com"); var testResourceRecord = new CanonicalNameResourceRecord(domain, cNameDomain); var masterFile = new DnsSeedMasterFile(new List <IResourceRecord> { testResourceRecord }); using (var stream = new MemoryStream()) { // Act. masterFile.Save(stream); // Assert. stream.Should().NotBeNull(); IList <IResourceRecord> resourceRecords = this.ReadResourceRecords(stream); resourceRecords.Should().NotBeNull(); resourceRecords.Should().NotBeNullOrEmpty(); IList <CanonicalNameResourceRecord> canonicalResourceRecords = resourceRecords.OfType <CanonicalNameResourceRecord>().ToList(); canonicalResourceRecords.Should().HaveCount(1); canonicalResourceRecords[0].Name.ToString().Should().Be(domain.ToString()); canonicalResourceRecords[0].CanonicalDomainName.ToString().Should().Be(testResourceRecord.CanonicalDomainName.ToString()); } }
public void WhenSave_AndMasterListContainsIPAddressResourceRecord_AndIsIPv6_ThenEntryIsSaved() { // Arrange var domain = new Domain("stratis.test.com"); var testResourceRecord = new IPAddressResourceRecord(domain, IPAddress.Parse("2001:db8:85a3:0:0:8a2e:370:7334")); var masterFile = new DnsSeedMasterFile(new List <IResourceRecord> { testResourceRecord }); using (var stream = new MemoryStream()) { // Act. masterFile.Save(stream); // Assert. stream.Should().NotBeNull(); IList <IResourceRecord> resourceRecords = this.ReadResourceRecords(stream); resourceRecords.Should().NotBeNull(); resourceRecords.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords = resourceRecords.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords.Should().HaveCount(1); ipAddressResourceRecords[0].Name.ToString().Should().Be(domain.ToString()); ipAddressResourceRecords[0].IPAddress.Equals(testResourceRecord.IPAddress); } }
public void WhenSave_AndMasterListContainsNameServerResourceRecord_ThenEntryIsSaved() { // Arrange Domain domain = new Domain("xels.test.com"); Domain nsDomain = new Domain("ns"); NameServerResourceRecord testResourceRecord = new NameServerResourceRecord(domain, nsDomain); DnsSeedMasterFile masterFile = new DnsSeedMasterFile(); masterFile.Add(testResourceRecord); using (MemoryStream stream = new MemoryStream()) { // Act. masterFile.Save(stream); // Assert. stream.Should().NotBeNull(); IList <IResourceRecord> resourceRecords = this.ReadResourceRecords(stream); resourceRecords.Should().NotBeNull(); resourceRecords.Should().NotBeNullOrEmpty(); IList <NameServerResourceRecord> nameServerResourceRecord = resourceRecords.OfType <NameServerResourceRecord>().ToList(); nameServerResourceRecord.Should().HaveCount(1); nameServerResourceRecord[0].Name.ToString().Should().Be(domain.ToString()); nameServerResourceRecord[0].NSDomainName.ToString().Should().Be(testResourceRecord.NSDomainName.ToString()); } }
public void WhenSave_AndMasterListContainsIPAddressResourceRecord_AndIsIPv4_ThenEntryIsSaved() { // Arrange Domain domain = new Domain("xels.test.com"); IPAddressResourceRecord testResourceRecord = new IPAddressResourceRecord(domain, IPAddress.Parse("192.168.0.1")); DnsSeedMasterFile masterFile = new DnsSeedMasterFile(); masterFile.Add(testResourceRecord); using (MemoryStream stream = new MemoryStream()) { // Act. masterFile.Save(stream); // Assert. stream.Should().NotBeNull(); IList <IResourceRecord> resourceRecords = this.ReadResourceRecords(stream); resourceRecords.Should().NotBeNull(); resourceRecords.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords = resourceRecords.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords.Should().HaveCount(1); ipAddressResourceRecords[0].Name.ToString().Should().Be(domain.ToString()); ipAddressResourceRecords[0].IPAddress.Equals(testResourceRecord.IPAddress); } }
public void WhenSave_AndStreamIsNull_ThenArgumentNullExceptionIsThrown() { // Arrange. var masterFile = new DnsSeedMasterFile(); Action a = () => { masterFile.Save(null); }; // Act and assert. a.Should().Throw <ArgumentNullException>().Which.Message.Should().Contain("stream"); }
public void WhenSave_AndMasterListContainsStartOfAuthorityResourceRecord_ThenEntryIsSaved() { // Arrange var domain = new Domain("stratis.test.com"); var masterDomain = new Domain("master.test.com"); var responsibleDomain = new Domain("responsible.test.com"); long serialNumber = 12121212; var refreshInterval = new TimeSpan(1111111111); var retryInterval = new TimeSpan(2222222222); var expireInterval = new TimeSpan(3333333333); var minimumTimeToLive = new TimeSpan(4444444444); var testResourceRecord = new StartOfAuthorityResourceRecord( domain, masterDomain, responsibleDomain, serialNumber, refreshInterval, retryInterval, expireInterval, minimumTimeToLive); var masterFile = new DnsSeedMasterFile(new List <IResourceRecord> { testResourceRecord }); using (var stream = new MemoryStream()) { // Act. masterFile.Save(stream); // Assert. stream.Should().NotBeNull(); IList <IResourceRecord> resourceRecords = this.ReadResourceRecords(stream); resourceRecords.Should().NotBeNull(); resourceRecords.Should().NotBeNullOrEmpty(); IList <StartOfAuthorityResourceRecord> startOfAuthorityResourceRecord = resourceRecords.OfType <StartOfAuthorityResourceRecord>().ToList(); startOfAuthorityResourceRecord.Should().HaveCount(1); startOfAuthorityResourceRecord[0].Name.ToString().Should().Be(domain.ToString()); startOfAuthorityResourceRecord[0].MasterDomainName.ToString().Should().Be(masterDomain.ToString()); startOfAuthorityResourceRecord[0].ResponsibleDomainName.ToString().Should().Be(responsibleDomain.ToString()); startOfAuthorityResourceRecord[0].SerialNumber.Should().Be(serialNumber); startOfAuthorityResourceRecord[0].RefreshInterval.Should().Be(refreshInterval); startOfAuthorityResourceRecord[0].RetryInterval.Should().Be(retryInterval); startOfAuthorityResourceRecord[0].ExpireInterval.Should().Be(expireInterval); startOfAuthorityResourceRecord[0].MinimumTimeToLive.Should().Be(minimumTimeToLive); } }
public void WhenLoad_AndStreamContainsEntries_ThenEntriesArePopulated() { // Arrange. using (var stream = new MemoryStream()) { string domainName = "stratis.test.com"; var masterFile = new DnsSeedMasterFile(); IList <IResourceRecord> testResourceRecords = new List <IResourceRecord>() { new IPAddressResourceRecord(new Domain(domainName), IPAddress.Parse("192.168.0.1")), new IPAddressResourceRecord(new Domain(domainName), IPAddress.Parse("192.168.0.2")), new IPAddressResourceRecord(new Domain(domainName), IPAddress.Parse("192.168.0.3")), new IPAddressResourceRecord(new Domain(domainName), IPAddress.Parse("192.168.0.4")) }; JsonSerializer serializer = this.CreateSerializer(); using (var streamWriter = new StreamWriter(stream)) { using (var jsonTextWriter = new JsonTextWriter(streamWriter)) { serializer.Serialize(jsonTextWriter, testResourceRecords); jsonTextWriter.Flush(); stream.Seek(0, SeekOrigin.Begin); // Act. masterFile.Load(stream); } } // Assert. var domain = new Domain(domainName); var question = new Question(domain, RecordType.A); IList <IResourceRecord> resourceRecords = masterFile.Get(question); resourceRecords.Should().NotBeNullOrEmpty(); IList <IPAddressResourceRecord> ipAddressResourceRecords = resourceRecords.OfType <IPAddressResourceRecord>().ToList(); ipAddressResourceRecords.Should().HaveSameCount(testResourceRecords); foreach (IPAddressResourceRecord testResourceRecord in testResourceRecords) { ipAddressResourceRecords.SingleOrDefault(i => i.IPAddress.Equals(testResourceRecord.IPAddress)).Should().NotBeNull(); } } }
public async Task WhenDnsServerListening_AndDnsRequestReceivedRepeatedly_ThenResponsesReturnedInRoundRobinOrder_Async() { // Arrange. Queue <CancellationTokenSource> sources = new Queue <CancellationTokenSource>(); Queue <byte[]> responses = new Queue <byte[]>(); Mock <IUdpClient> udpClient = new Mock <IUdpClient>(); udpClient.Setup(c => c.ReceiveAsync()).ReturnsAsync(new Tuple <IPEndPoint, byte[]>(new IPEndPoint(IPAddress.Loopback, 80), this.GetDnsRequest())); udpClient.Setup(c => c.SendAsync(It.IsAny <byte[]>(), It.IsAny <int>(), It.IsAny <IPEndPoint>())).Callback <byte[], int, IPEndPoint>((p, s, ip) => { // One response at a time. responses.Enqueue(p); CancellationTokenSource source = sources.Dequeue(); source.Cancel(); }).ReturnsAsync(1); DnsSeedMasterFile masterFile = new DnsSeedMasterFile(); masterFile.Add(new IPAddressResourceRecord(new Domain("google.com"), IPAddress.Parse("192.168.0.1"))); masterFile.Add(new IPAddressResourceRecord(new Domain("google.com"), IPAddress.Parse("192.168.0.2"))); masterFile.Add(new IPAddressResourceRecord(new Domain("google.com"), IPAddress.Parse("192.168.0.3"))); masterFile.Add(new IPAddressResourceRecord(new Domain("google.com"), IPAddress.Parse("192.168.0.4"))); IAsyncLoopFactory asyncLoopFactory = new Mock <IAsyncLoopFactory>().Object; INodeLifetime nodeLifetime = new Mock <INodeLifetime>().Object; DnsSettings dnsSettings = new Mock <DnsSettings>().Object; dnsSettings.DnsHostName = "host.example.com"; dnsSettings.DnsNameServer = "ns1.host.example.com"; dnsSettings.DnsMailBox = "*****@*****.**"; DataFolder dataFolder = CreateDataFolder(this); Mock <ILogger> logger = new Mock <ILogger>(); Mock <ILoggerFactory> loggerFactory = new Mock <ILoggerFactory>(); loggerFactory.Setup <ILogger>(f => f.CreateLogger(It.IsAny <string>())).Returns(logger.Object); IDateTimeProvider dateTimeProvider = new Mock <IDateTimeProvider>().Object; // Act (Part 1). DnsSeedServer server = new DnsSeedServer(udpClient.Object, masterFile, asyncLoopFactory, nodeLifetime, loggerFactory.Object, dateTimeProvider, dnsSettings, dataFolder); try { CancellationTokenSource source = new CancellationTokenSource(); sources.Enqueue(source); await server.ListenAsync(53, source.Token); } catch (OperationCanceledException) { // Expected. } // Assert (Part 1). responses.Count.Should().Be(1); byte[] response = responses.Dequeue(); IResponse dnsResponse = Response.FromArray(response); dnsResponse.AnswerRecords.Count.Should().Be(4); dnsResponse.AnswerRecords[0].Should().BeOfType <IPAddressResourceRecord>(); ((IPAddressResourceRecord)dnsResponse.AnswerRecords[0]).IPAddress.ToString().Should().Be("192.168.0.1"); while (responses.Count > 0) { // Consume queue completely. responses.Dequeue(); } // Act (Part 2). try { CancellationTokenSource source = new CancellationTokenSource(); sources.Enqueue(source); await server.ListenAsync(53, source.Token); } catch (OperationCanceledException) { // Expected. } // Assert (Part 2). responses.Count.Should().Be(1); response = responses.Dequeue(); dnsResponse = Response.FromArray(response); dnsResponse.AnswerRecords.Count.Should().Be(4); dnsResponse.AnswerRecords[0].Should().BeOfType <IPAddressResourceRecord>(); ((IPAddressResourceRecord)dnsResponse.AnswerRecords[0]).IPAddress.ToString().Should().Be("192.168.0.2"); while (responses.Count > 0) { // Consume queue completely. responses.Dequeue(); } // Act (Part 3). try { CancellationTokenSource source = new CancellationTokenSource(); sources.Enqueue(source); await server.ListenAsync(53, source.Token); } catch (OperationCanceledException) { // Expected. } // Assert (Part 3). responses.Count.Should().Be(1); response = responses.Dequeue(); dnsResponse = Response.FromArray(response); dnsResponse.AnswerRecords.Count.Should().Be(4); dnsResponse.AnswerRecords[0].Should().BeOfType <IPAddressResourceRecord>(); ((IPAddressResourceRecord)dnsResponse.AnswerRecords[0]).IPAddress.ToString().Should().Be("192.168.0.3"); while (responses.Count > 0) { // Consume queue completely. responses.Dequeue(); } // Act (Part 4). try { CancellationTokenSource source = new CancellationTokenSource(); sources.Enqueue(source); await server.ListenAsync(53, source.Token); } catch (OperationCanceledException) { // Expected. } // Assert (Part 4). responses.Count.Should().Be(1); response = responses.Dequeue(); dnsResponse = Response.FromArray(response); dnsResponse.AnswerRecords.Count.Should().Be(4); dnsResponse.AnswerRecords[0].Should().BeOfType <IPAddressResourceRecord>(); ((IPAddressResourceRecord)dnsResponse.AnswerRecords[0]).IPAddress.ToString().Should().Be("192.168.0.4"); while (responses.Count > 0) { // Consume queue completely. responses.Dequeue(); } // Act (Part 5). try { CancellationTokenSource source = new CancellationTokenSource(); sources.Enqueue(source); await server.ListenAsync(53, source.Token); } catch (OperationCanceledException) { // Expected. } // Assert (Part 5). responses.Count.Should().Be(1); response = responses.Dequeue(); dnsResponse = Response.FromArray(response); dnsResponse.AnswerRecords.Count.Should().Be(4); dnsResponse.AnswerRecords[0].Should().BeOfType <IPAddressResourceRecord>(); // This should start back at the beginning again. ((IPAddressResourceRecord)dnsResponse.AnswerRecords[0]).IPAddress.ToString().Should().Be("192.168.0.1"); while (responses.Count > 0) { // Consume queue completely. responses.Dequeue(); } }