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 = 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, loggerFactory.Object, nodeLifetimeObject, 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 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, 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(); }
/// <summary> /// Initializes a new instance of the <see cref="DnsFeature"/> class. /// </summary> /// <param name="dnsServer">The DNS server.</param> /// <param name="whitelistManager">The whitelist manager.</param> /// <param name="loggerFactory">The factory to create the logger.</param> /// <param name="nodeLifetime">The node lifetime object used for graceful shutdown.</param> /// <param name="nodeSettings">The node settings object containing node configuration.</param> /// <param name="dataFolders">The data folders of the system.</param> /// <param name="asyncLoopFactory">The asynchronous loop factory.</param> public DnsFeature(IDnsServer dnsServer, IWhitelistManager whitelistManager, ILoggerFactory loggerFactory, INodeLifetime nodeLifetime, NodeSettings nodeSettings, DataFolder dataFolders, IAsyncLoopFactory asyncLoopFactory) { Guard.NotNull(dnsServer, nameof(dnsServer)); Guard.NotNull(whitelistManager, nameof(whitelistManager)); Guard.NotNull(loggerFactory, nameof(loggerFactory)); Guard.NotNull(nodeLifetime, nameof(nodeLifetime)); Guard.NotNull(nodeSettings, nameof(nodeSettings)); Guard.NotNull(dataFolders, nameof(dataFolders)); Guard.NotNull(asyncLoopFactory, nameof(asyncLoopFactory)); this.dnsServer = dnsServer; this.whitelistManager = whitelistManager; this.logger = loggerFactory.CreateLogger(this.GetType().FullName); this.asyncLoopFactory = asyncLoopFactory; this.nodeLifetime = nodeLifetime; this.nodeSettings = nodeSettings; this.dataFolders = dataFolders; }
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(); } }
/// <summary> /// Initializes a new instance of the <see cref="DnsFeature"/> class. /// </summary> /// <param name="dnsServer">The DNS server.</param> /// <param name="whitelistManager">The whitelist manager.</param> /// <param name="loggerFactory">The factory to create the logger.</param> /// <param name="nodeLifetime">The node lifetime object used for graceful shutdown.</param> /// <param name="nodeSettings">The node settings object containing node configuration.</param> /// <param name="dnsSettings">Defines the DNS settings for the node</param> /// <param name="dataFolders">The data folders of the system.</param> /// <param name="asyncLoopFactory">The asynchronous loop factory.</param> /// <param name="connectionManager">Manager of node's network connections.</param> /// <param name="unreliablePeerBehavior">Instance of the UnreliablePeerBehavior that will be added to the connectionManager Template.</param> public DnsFeature(IDnsServer dnsServer, IWhitelistManager whitelistManager, ILoggerFactory loggerFactory, INodeLifetime nodeLifetime, DnsSettings dnsSettings, NodeSettings nodeSettings, DataFolder dataFolders, IAsyncLoopFactory asyncLoopFactory, IConnectionManager connectionManager, UnreliablePeerBehavior unreliablePeerBehavior) { Guard.NotNull(dnsServer, nameof(dnsServer)); Guard.NotNull(whitelistManager, nameof(whitelistManager)); Guard.NotNull(loggerFactory, nameof(loggerFactory)); Guard.NotNull(nodeLifetime, nameof(nodeLifetime)); Guard.NotNull(nodeSettings, nameof(nodeSettings)); Guard.NotNull(dataFolders, nameof(dataFolders)); Guard.NotNull(asyncLoopFactory, nameof(asyncLoopFactory)); Guard.NotNull(connectionManager, nameof(connectionManager)); Guard.NotNull(unreliablePeerBehavior, nameof(unreliablePeerBehavior)); this.dnsServer = dnsServer; this.whitelistManager = whitelistManager; this.logger = loggerFactory.CreateLogger("Impleum.Bitcoin.FullNode"); this.asyncLoopFactory = asyncLoopFactory; this.nodeLifetime = nodeLifetime; this.nodeSettings = nodeSettings; this.dnsSettings = dnsSettings; this.dataFolders = dataFolders; this.connectionManager = connectionManager; this.unreliablePeerBehavior = unreliablePeerBehavior; }