< Summary - Combined Code Coverage

Information
Class: NLightning.Daemon.Extensions.NodeConfigurationExtensions
Assembly: NLightning.Daemon
File(s): /home/runner/work/NLightning/NLightning/src/NLightning.Daemon/Extensions/NodeConfigurationExtensions.cs
Tag: 57_24045730253
Line coverage
0%
Covered lines: 0
Uncovered lines: 130
Coverable lines: 130
Total lines: 194
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 18
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ConfigureNltg(...)100%210%
ConfigureNltg(...)100%210%
ReadInitialConfiguration(...)0%342180%
CreateDefaultConfigJson()100%210%

File(s)

/home/runner/work/NLightning/NLightning/src/NLightning.Daemon/Extensions/NodeConfigurationExtensions.cs

#LineLine coverage
 1using Microsoft.Extensions.Configuration;
 2using Microsoft.Extensions.Hosting;
 3using Serilog;
 4
 5namespace NLightning.Daemon.Extensions;
 6
 7using Helpers;
 8
 9public static class NodeConfigurationExtensions
 10{
 11    /// <summary>
 12    /// Configures the host builder with NLTG configuration and Serilog
 13    /// </summary>
 14    public static IHostBuilder ConfigureNltg(this IHostBuilder hostBuilder, IConfiguration configuration)
 15    {
 16        // Configure the host builder
 017        return hostBuilder
 018              .ConfigureAppConfiguration(builder =>
 019               {
 020                   builder.AddConfiguration(configuration);
 021               })
 022              .UseSerilog((_, _, loggerConfig) =>
 023               {
 024                   // Read from the current configuration
 025                   loggerConfig
 026                      .ReadFrom.Configuration(configuration)
 027                      .Enrich.With<ClassNameEnricher>();
 028               });
 29    }
 30
 31    /// <summary>
 32    /// Configures the host builder with NLTG configuration and Serilog
 33    /// </summary>
 34    public static IHostBuilder ConfigureNltg(this IHostBuilder hostBuilder, string[] args)
 35    {
 036        var (config, _, _) = ReadInitialConfiguration(args);
 37
 38        // Configure the host builder
 039        return hostBuilder
 040              .ConfigureAppConfiguration(builder =>
 041               {
 042                   builder.AddConfiguration(config);
 043               })
 044              .UseSerilog((_, _, loggerConfig) =>
 045               {
 046                   // Read from the current configuration
 047                   loggerConfig
 048                      .ReadFrom.Configuration(config)
 049                      .Enrich.With<ClassNameEnricher>();
 050               });
 51    }
 52
 53    public static (IConfiguration, string, string) ReadInitialConfiguration(string[] args)
 54    {
 55        // Get network from the command line or environment variable first
 056        var initialConfig = new ConfigurationBuilder()
 057                           .AddCommandLine(args)
 058                           .AddEnvironmentVariables("NLTG_")
 059                           .Build();
 060        var network = initialConfig["network"] ?? initialConfig["n"] ?? "mainnet";
 61
 62        // Check for a custom config path first
 063        var configPath = initialConfig["config"] ?? initialConfig["c"];
 064        var configFile = configPath;
 065        var usingCustomConfig = !string.IsNullOrEmpty(configPath);
 66
 067        if (usingCustomConfig)
 68        {
 069            configPath = Path.GetFullPath(configPath!);
 070            if (!configPath.EndsWith("json", StringComparison.OrdinalIgnoreCase))
 071                configFile = Path.Combine(configPath, "appsettings.json");
 72            else
 073                configPath = Path.GetDirectoryName(configPath);
 74
 075            if (!File.Exists(configFile))
 76            {
 077                Log.Warning("Custom configuration file not found at {configFile}", configFile);
 078                usingCustomConfig = false;
 79            }
 80
 081            initialConfig = new ConfigurationBuilder()
 082                           .AddJsonFile(configFile!, optional: false, reloadOnChange: false)
 083                           .Build();
 84
 085            network = initialConfig["Node:Network"] ?? "mainnet";
 86        }
 87
 88        // If no custom path, use default ~/.nltg/{network}/appsettings.json
 089        if (!usingCustomConfig)
 90        {
 091            var homeDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
 092            configPath = Path.Combine(homeDir, ".nltg", network);
 093            configFile = Path.Combine(configPath, "appsettings.json");
 94
 95            // Ensure directory exists
 096            Directory.CreateDirectory(configPath);
 97
 98            // Create default config if none exists
 099            if (!File.Exists(configFile))
 0100                File.WriteAllText(configFile, CreateDefaultConfigJson());
 101        }
 102
 103        // Log startup info using bootstrap logger
 0104        Log.Information("Starting NLTG with configuration from {ConfigPath} (Network: {Network})", configPath, network);
 105
 106        // Build configuration with proper precedence
 0107        var config = new ConfigurationBuilder();
 0108        config.Sources.Clear();
 109
 0110        var configuration = config
 0111                           .AddJsonFile(configFile!, optional: false, reloadOnChange: false)
 0112                           .AddEnvironmentVariables("NLTG_")
 0113                           .AddCommandLine(args)
 0114                           .Build();
 115
 0116        return (configuration, network, configPath!);
 117    }
 118
 119    /// <summary>
 120    /// Creates default configuration JSON
 121    /// </summary>
 122    private static string CreateDefaultConfigJson()
 123    {
 0124        return """
 0125               {
 0126                 "Serilog": {
 0127                   "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
 0128                   "MinimumLevel": {
 0129                     "Default": "Error",
 0130                     "Override": {
 0131                       "NLightning": "Information",
 0132                       "System": "Warning"
 0133                     }
 0134                   },
 0135                   "WriteTo": [
 0136                     {
 0137                       "Name": "Console",
 0138                       "Args": {
 0139                         "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{ClassName}] {Message:lj}{NewL
 0140                       }
 0141                     },
 0142                     {
 0143                       "Name": "File",
 0144                       "Args": {
 0145                         "path": "logs/log-.txt",
 0146                         "rollingInterval": "Month",
 0147                         "retainedFileCountLimit": 12,
 0148                         "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{ClassName}] {Message:lj}{NewL
 0149                       }
 0150                     }
 0151                   ],
 0152                   "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "ClassName" ]
 0153                 },
 0154                 "Node": {
 0155                   "Network": "regtest",
 0156                   "Daemon": false,
 0157                   "DnsSeedServers": [
 0158                     "nlseed.nlightn.ing",
 0159                     "nodes.lightning.directory",
 0160                     "lseed.bitcoinstats.com"
 0161                   ],
 0162                   "ListenAddresses": [
 0163                     "0.0.0.0:9735"
 0164                   ],
 0165                   "Features": {
 0166                   }
 0167                 },
 0168                 "FeeEstimation": {
 0169                   "Url": "https://mempool.space/api/v1/fees/recommended",
 0170                   "Method": "GET",
 0171                   "ContentType": "application/json",
 0172                   "PreferredFeeRate": "fastestFee",
 0173                   "CacheExpiration": "5m",
 0174                   "RateMultiplier": 1000,
 0175                   "CacheFile": "fee_estimation_cache.bin"
 0176                 },
 0177                 "Database": {
 0178                   "Provider": "Sqlite",
 0179                   "ConnectionString": "Data Source=nltg.db;Cache=Shared",
 0180                   "RunMigrations": false,
 0181                   "EnableSensitiveQueryLogging": false
 0182                 },
 0183                 "Bitcoin": {
 0184                   "RpcEndpoint": "http://localhost:8332",
 0185                   "RpcUser": "bitcoinrpc",
 0186                   "RpcPassword": "your_rpc_password",
 0187                   "ZmqHost": "bitcoinzmq",
 0188                   "ZmqBlockPort": 8334,
 0189                   "ZmqTxPort": 8335
 0190                 }
 0191               }
 0192               """;
 193    }
 194}