public void WhenDnsServerFailsToStart_ThenDnsFeatureRetries() { // Arrange. Mock <IDnsServer> dnsServer = new Mock <IDnsServer>(); Action <int, CancellationToken> action = (port, token) => { throw new ArgumentException("Bad port"); }; dnsServer.Setup(s => s.ListenAsync(It.IsAny <int>(), It.IsAny <CancellationToken>())).Callback(action); Mock <IWhitelistManager> mockWhitelistManager = new Mock <IWhitelistManager>(); IWhitelistManager whitelistManager = mockWhitelistManager.Object; CancellationTokenSource source = new CancellationTokenSource(3000); Mock <INodeLifetime> nodeLifetime = new Mock <INodeLifetime>(); nodeLifetime.Setup(n => n.StopApplication()).Callback(() => source.Cancel()); nodeLifetime.Setup(n => n.ApplicationStopping).Returns(source.Token); INodeLifetime nodeLifetimeObject = nodeLifetime.Object; NodeSettings nodeSettings = NodeSettings.Default(); nodeSettings.DataDir = Directory.GetCurrentDirectory(); DataFolder dataFolder = CreateDataFolder(this); Mock <ILogger> logger = new Mock <ILogger>(); bool serverError = false; logger.Setup(l => l.Log(LogLevel.Error, It.IsAny <EventId>(), It.IsAny <FormattedLogValues>(), It.IsAny <Exception>(), It.IsAny <Func <object, Exception, string> >())).Callback <LogLevel, EventId, object, Exception, Func <object, Exception, string> >((level, id, state, e, f) => serverError = state.ToString().StartsWith("Failed whilst running the DNS server")); Mock <ILoggerFactory> loggerFactory = new Mock <ILoggerFactory>(); loggerFactory.Setup <ILogger>(f => f.CreateLogger(It.IsAny <string>())).Returns(logger.Object); IAsyncLoopFactory asyncLoopFactory = new AsyncLoopFactory(loggerFactory.Object); // Act. DnsFeature feature = new DnsFeature(dnsServer.Object, whitelistManager, loggerFactory.Object, nodeLifetimeObject, new DnsSettings().Load(nodeSettings), nodeSettings, dataFolder, asyncLoopFactory); feature.Initialize(); bool waited = source.Token.WaitHandle.WaitOne(5000); // Assert. feature.Should().NotBeNull(); waited.Should().BeTrue(); dnsServer.Verify(s => s.ListenAsync(It.IsAny <int>(), It.IsAny <CancellationToken>()), Times.AtLeastOnce); serverError.Should().BeTrue(); }
public void WhenDnsFeatureStopped_ThenDnsServerSuccessfullyStops() { // Arrange. Mock <IDnsServer> dnsServer = new Mock <IDnsServer>(); Action <int, CancellationToken> action = (port, token) => { while (true) { token.ThrowIfCancellationRequested(); Thread.Sleep(50); } }; dnsServer.Setup(s => s.ListenAsync(It.IsAny <int>(), It.IsAny <CancellationToken>())).Callback(action); Mock <IWhitelistManager> mockWhitelistManager = new Mock <IWhitelistManager>(); IWhitelistManager whitelistManager = mockWhitelistManager.Object; CancellationTokenSource source = new CancellationTokenSource(); Mock <INodeLifetime> nodeLifetime = new Mock <INodeLifetime>(); nodeLifetime.Setup(n => n.StopApplication()).Callback(() => source.Cancel()); nodeLifetime.Setup(n => n.ApplicationStopping).Returns(source.Token); INodeLifetime nodeLifetimeObject = nodeLifetime.Object; NodeSettings nodeSettings = new NodeSettings(args: new string[] { $"-datadir={ Directory.GetCurrentDirectory() }" }); DataFolder dataFolder = CreateDataFolder(this); Mock <ILogger> logger = new Mock <ILogger>(MockBehavior.Loose); Mock <ILoggerFactory> loggerFactory = new Mock <ILoggerFactory>(); loggerFactory.Setup <ILogger>(f => f.CreateLogger(It.IsAny <string>())).Returns(logger.Object); IAsyncLoopFactory asyncLoopFactory = new AsyncLoopFactory(loggerFactory.Object); // Act. DnsFeature feature = new DnsFeature(dnsServer.Object, whitelistManager, loggerFactory.Object, nodeLifetimeObject, new DnsSettings().Load(nodeSettings), nodeSettings, dataFolder, asyncLoopFactory); feature.Initialize(); nodeLifetimeObject.StopApplication(); bool waited = source.Token.WaitHandle.WaitOne(5000); // Assert. feature.Should().NotBeNull(); waited.Should().BeTrue(); dnsServer.Verify(s => s.ListenAsync(It.IsAny <int>(), It.IsAny <CancellationToken>()), Times.Once); }
public void WhenInitialize_ThenRefreshLoopIsStarted() { // Arrange. Mock <IWhitelistManager> mockWhitelistManager = new Mock <IWhitelistManager>(); mockWhitelistManager.Setup(w => w.RefreshWhitelist()).Verifiable("the RefreshWhitelist method should be called on the WhitelistManager"); IWhitelistManager whitelistManager = mockWhitelistManager.Object; Mock <ILogger> mockLogger = new Mock <ILogger>(); Mock <ILoggerFactory> mockLoggerFactory = new Mock <ILoggerFactory>(); mockLoggerFactory.Setup(l => l.CreateLogger(It.IsAny <string>())).Returns(mockLogger.Object); ILoggerFactory loggerFactory = mockLoggerFactory.Object; IAsyncLoopFactory asyncLoopFactory = new AsyncLoopFactory(loggerFactory); INodeLifetime nodeLifeTime = new NodeLifetime(); IDnsServer dnsServer = new Mock <IDnsServer>().Object; CancellationTokenSource source = new CancellationTokenSource(3000); Mock <INodeLifetime> nodeLifetime = new Mock <INodeLifetime>(); nodeLifetime.Setup(n => n.StopApplication()).Callback(() => source.Cancel()); nodeLifetime.Setup(n => n.ApplicationStopping).Returns(source.Token); INodeLifetime nodeLifetimeObject = nodeLifetime.Object; NodeSettings nodeSettings = NodeSettings.Default(); nodeSettings.DataDir = Directory.GetCurrentDirectory(); DataFolder dataFolder = CreateDataFolder(this); using (DnsFeature feature = new DnsFeature(dnsServer, whitelistManager, loggerFactory, nodeLifetimeObject, DnsSettings.Load(nodeSettings), nodeSettings, dataFolder, asyncLoopFactory)) { // Act. feature.Initialize(); bool waited = source.Token.WaitHandle.WaitOne(5000); // Assert. feature.Should().NotBeNull(); waited.Should().BeTrue(); mockWhitelistManager.Verify(); } }
public void WhenDnsServerInitialized_ThenSaveMasterfileLoopStarted() { // Arrange. Mock <IUdpClient> udpClient = new Mock <IUdpClient>(); Mock <IMasterFile> masterFile = new Mock <IMasterFile>(); masterFile.Setup(m => m.Get(It.IsAny <Question>())).Returns(new List <IResourceRecord>()); masterFile.Setup(m => m.Save(It.IsAny <Stream>())).Verifiable(); CancellationTokenSource source = new CancellationTokenSource(5000); Mock <INodeLifetime> nodeLifetime = new Mock <INodeLifetime>(); nodeLifetime.Setup(n => n.ApplicationStopping).Returns(source.Token); Mock <ILogger> logger = new Mock <ILogger>(); Mock <ILoggerFactory> loggerFactory = new Mock <ILoggerFactory>(); loggerFactory.Setup <ILogger>(f => f.CreateLogger(It.IsAny <string>())).Returns(logger.Object); IAsyncLoopFactory asyncLoopFactory = new AsyncLoopFactory(loggerFactory.Object); IDateTimeProvider dateTimeProvider = new Mock <IDateTimeProvider>().Object; NodeSettings nodeSettings = NodeSettings.Default(); nodeSettings.DataDir = Directory.GetCurrentDirectory(); DnsSettings dnsSettings = new Mock <DnsSettings>().Object; dnsSettings.DnsHostName = "host.example.com"; dnsSettings.DnsNameServer = "ns1.host.example.com"; dnsSettings.DnsMailBox = "*****@*****.**"; DataFolder dataFolders = new Mock <DataFolder>(nodeSettings).Object; // Act. DnsSeedServer server = new DnsSeedServer(udpClient.Object, masterFile.Object, asyncLoopFactory, nodeLifetime.Object, loggerFactory.Object, dateTimeProvider, dnsSettings, dataFolders); server.Initialize(); bool waited = source.Token.WaitHandle.WaitOne(); // Assert. server.Should().NotBeNull(); waited.Should().BeTrue(); masterFile.Verify(m => m.Save(It.IsAny <Stream>()), Times.AtLeastOnce); }
public void WhenDnsFeatureInitialized_ThenDnsServerSuccessfullyStarts() { // Arrange. Mock <IDnsServer> dnsServer = new Mock <IDnsServer>(); ManualResetEventSlim waitObject = new ManualResetEventSlim(false); Action <int, CancellationToken> action = (port, token) => { waitObject.Set(); throw new OperationCanceledException(); }; dnsServer.Setup(s => s.ListenAsync(It.IsAny <int>(), It.IsAny <CancellationToken>())).Callback(action); Mock <IWhitelistManager> whitelistManager = new Mock <IWhitelistManager>(); Mock <INodeLifetime> nodeLifetime = new Mock <INodeLifetime>(); NodeSettings nodeSettings = NodeSettings.Default(); nodeSettings.DataDir = Directory.GetCurrentDirectory(); DataFolder dataFolder = CreateDataFolder(this); Mock <ILogger> logger = new Mock <ILogger>(MockBehavior.Loose); Mock <ILoggerFactory> loggerFactory = new Mock <ILoggerFactory>(); loggerFactory.Setup <ILogger>(f => f.CreateLogger(It.IsAny <string>())).Returns(logger.Object); IAsyncLoopFactory asyncLoopFactory = new AsyncLoopFactory(loggerFactory.Object); // Act. DnsFeature feature = new DnsFeature(dnsServer.Object, whitelistManager.Object, loggerFactory.Object, nodeLifetime.Object, DnsSettings.Load(nodeSettings), nodeSettings, dataFolder, asyncLoopFactory); feature.Initialize(); bool waited = waitObject.Wait(5000); // Assert. feature.Should().NotBeNull(); waited.Should().BeTrue(); dnsServer.Verify(s => s.ListenAsync(It.IsAny <int>(), It.IsAny <CancellationToken>()), Times.Once); }
public void AddTimeData_WithSmallSampleSet_TurnsWarningOnAndSwitchesSyncOff() { // Samples to be inserted to the state. // Columns meanings: isInbound, isUsed, isWarningOn, isSyncOff, timeOffsetSample, peerAddress var samples = new List <object[]> { // First group of samples does not affect adjusted time, so difference should be ~0 ms. new object[] { false, true, false, false, TimeSpan.FromSeconds(TimeSyncBehaviorState.TimeOffsetWarningThresholdSeconds + 1), IPAddress.Parse("1.2.3.41"), }, new object[] { false, true, false, false, TimeSpan.FromSeconds(TimeSyncBehaviorState.TimeOffsetWarningThresholdSeconds + 2), IPAddress.Parse("1.2.3.42"), }, new object[] { false, true, false, false, TimeSpan.FromSeconds(TimeSyncBehaviorState.TimeOffsetWarningThresholdSeconds + 3), IPAddress.Parse("1.2.3.43"), }, // The next sample turns on the warning. new object[] { false, true, true, false, TimeSpan.FromSeconds(TimeSyncBehaviorState.TimeOffsetWarningThresholdSeconds + 4), IPAddress.Parse("1.2.3.44"), }, // It can't be turned off. new object[] { false, true, true, false, TimeSpan.FromSeconds(3), IPAddress.Parse("1.2.3.45"), }, new object[] { false, true, true, false, TimeSpan.FromSeconds(4), IPAddress.Parse("1.2.3.46"), }, // Add more samples. new object[] { false, true, true, false, TimeSpan.FromSeconds(-TimeSyncBehaviorState.MaxTimeOffsetSeconds - 10), IPAddress.Parse("1.2.3.47"), }, new object[] { false, true, true, false, TimeSpan.FromSeconds(-TimeSyncBehaviorState.MaxTimeOffsetSeconds - 11), IPAddress.Parse("1.2.3.48"), }, new object[] { false, true, true, false, TimeSpan.FromSeconds(-TimeSyncBehaviorState.MaxTimeOffsetSeconds - 12), IPAddress.Parse("1.2.3.49"), }, new object[] { false, true, true, false, TimeSpan.FromSeconds(-TimeSyncBehaviorState.MaxTimeOffsetSeconds - 13), IPAddress.Parse("1.2.31.4"), }, new object[] { false, true, true, false, TimeSpan.FromSeconds(-TimeSyncBehaviorState.MaxTimeOffsetSeconds - 14), IPAddress.Parse("1.2.32.4"), }, new object[] { false, true, true, false, TimeSpan.FromSeconds(-TimeSyncBehaviorState.MaxTimeOffsetSeconds - 15), IPAddress.Parse("1.2.33.4"), }, // Now the feature should be turned off. new object[] { true, true, true, true, TimeSpan.FromSeconds(-TimeSyncBehaviorState.MaxTimeOffsetSeconds - 16), IPAddress.Parse("1.2.33.4"), }, // No more samples should be accepted now. new object[] { false, false, true, true, TimeSpan.FromSeconds(2), IPAddress.Parse("1.2.34.4"), }, new object[] { false, false, true, true, TimeSpan.FromSeconds(1), IPAddress.Parse("1.2.35.4"), }, }; var dateTimeProvider = DateTimeProvider.Default; var lifetime = new NodeLifetime(); var loggerFactory = new LoggerFactory(); var asyncLoopFactory = new AsyncLoopFactory(loggerFactory); var state = new TimeSyncBehaviorState(dateTimeProvider, lifetime, asyncLoopFactory, loggerFactory); for (int i = 0; i < samples.Count; i++) { bool isInbound = (bool)samples[i][0]; bool isUsed = (bool)samples[i][1]; bool isWarningOn = (bool)samples[i][2]; bool isSyncOff = (bool)samples[i][3]; TimeSpan timeOffsetSample = (TimeSpan)samples[i][4]; IPAddress peerAddress = (IPAddress)samples[i][5]; bool used = state.AddTimeData(peerAddress, timeOffsetSample, isInbound); Assert.Equal(isUsed, used); Assert.Equal(isWarningOn, state.IsSystemTimeOutOfSync); Assert.Equal(isSyncOff, state.SwitchedOffLimitReached); Assert.Equal(isSyncOff, state.SwitchedOff); if (state.SwitchedOff) { DateTime adjustedTime = dateTimeProvider.GetAdjustedTime(); DateTime normalTime = dateTimeProvider.GetUtcNow(); TimeSpan diff = adjustedTime - normalTime; Assert.True(Math.Abs(diff.TotalMilliseconds) < TimeEpsilonMs); } } }