< Summary - Combined Code Coverage

Information
Class: NLightning.Application.NLTG.Extensions.NltgConfigurationExtensions
Assembly: NLightning.Application.NLTG
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Application.NLTG/Extensions/NltgConfigurationExtensions.cs
Tag: 30_15166811759
Line coverage
0%
Covered lines: 0
Uncovered lines: 108
Coverable lines: 108
Total lines: 169
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 14
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%210140%
CreateDefaultConfigJson()100%210%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Application.NLTG/Extensions/NltgConfigurationExtensions.cs

#LineLine coverage
 1using Microsoft.Extensions.Configuration;
 2using Microsoft.Extensions.Hosting;
 3using Serilog;
 4
 5namespace NLightning.Application.NLTG.Extensions;
 6
 7using Helpers;
 8
 9public static class NltgConfigurationExtensions
 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 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 current configuration
 047                loggerConfig
 048                    .ReadFrom.Configuration(config)
 049                    .Enrich.With<ClassNameEnricher>();
 050            });
 51    }
 52
 53    public static IConfiguration 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 custom config path first
 063        var configPath = initialConfig["config"] ?? initialConfig["c"];
 064        var usingCustomConfig = !string.IsNullOrEmpty(configPath);
 65
 066        if (usingCustomConfig)
 67        {
 068            configPath = Path.GetFullPath(configPath!);
 069            if (!File.Exists(configPath))
 70            {
 071                Log.Warning("Custom configuration file not found at {ConfigPath}", configPath);
 072                usingCustomConfig = false;
 73            }
 74        }
 75
 76        // If no custom path, use default ~/.nltg/{network}/appsettings.json
 077        if (!usingCustomConfig)
 78        {
 079            var homeDir = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
 080            var configDir = Path.Combine(homeDir, ".nltg", network);
 081            configPath = Path.Combine(configDir, "appsettings.json");
 82
 83            // Ensure directory exists
 084            Directory.CreateDirectory(configDir);
 85
 86            // Create default config if none exists
 087            if (!File.Exists(configPath))
 88            {
 089                File.WriteAllText(configPath, CreateDefaultConfigJson());
 90            }
 91        }
 92
 93        // Log startup info using bootstrap logger
 094        Log.Information("Starting NLTG with configuration from {ConfigPath} (Network: {Network})", configPath, network);
 95
 96        // Build configuration with proper precedence
 097        var config = new ConfigurationBuilder();
 098        config.Sources.Clear();
 99
 0100        return config
 0101            .AddJsonFile(configPath!, optional: false, reloadOnChange: false)
 0102            .AddEnvironmentVariables("NLTG_")
 0103            .AddCommandLine(args)
 0104            .Build();
 105    }
 106
 107    /// <summary>
 108    /// Creates default configuration JSON
 109    /// </summary>
 110    private static string CreateDefaultConfigJson()
 111    {
 0112        return """
 0113               {
 0114                 "Serilog": {
 0115                   "Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File" ],
 0116                   "MinimumLevel": {
 0117                     "Default": "Error",
 0118                     "Override": {
 0119                       "NLightning": "Information",
 0120                       "System": "Warning"
 0121                     }
 0122                   },
 0123                   "WriteTo": [
 0124                     {
 0125                       "Name": "Console",
 0126                       "Args": {
 0127                         "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{ClassName}] {Message:lj}{NewL
 0128                       }
 0129                     },
 0130                     {
 0131                       "Name": "File",
 0132                       "Args": {
 0133                         "path": "logs/log-.txt",
 0134                         "rollingInterval": "Month",
 0135                         "retainedFileCountLimit": 12,
 0136                         "outputTemplate": "[{Timestamp:yyyy-MM-dd HH:mm:ss} {Level:u3}] [{ClassName}] {Message:lj}{NewL
 0137                       }
 0138                     }
 0139                   ],
 0140                   "Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId", "ClassName" ]
 0141                 },
 0142                 "Node": {
 0143                   "Network": "regtest",
 0144                   "Daemon": false,
 0145                   "DnsSeedServers": [
 0146                     "nlseed.nlightn.ing",
 0147                     "nodes.lightning.directory",
 0148                     "lseed.bitcoinstats.com"
 0149                   ],
 0150                   "ListenAddresses": [
 0151                     "0.0.0.0:9735"
 0152                   ],
 0153                   "Features": {
 0154                     "StaticRemoteKey": "Compulsory"
 0155                   }
 0156                 },
 0157                 "FeeEstimation": {
 0158                   "Url": "https://mempool.space/api/v1/fees/recommended",
 0159                   "Method": "GET",
 0160                   "ContentType": "application/json",
 0161                   "PreferredFeeRate": "fastestFee",
 0162                   "CacheExpiration": "5m",
 0163                   "RateMultiplier": 1000,
 0164                   "CacheFile": "fee_estimation_cache.bin"
 0165                 }
 0166               }
 0167               """;
 168    }
 169}