< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Protocol.Tlv.Converters.RemoteAddressTlvConverter
Assembly: NLightning.Infrastructure
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure/Protocol/Tlv/Converters/RemoteAddressTlvConverter.cs
Tag: 36_15743069263
Line coverage
0%
Covered lines: 0
Uncovered lines: 54
Coverable lines: 54
Total lines: 127
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 30
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ConvertToBase(...)0%110100%
ConvertFromBase(...)0%420200%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure/Protocol/Tlv/Converters/RemoteAddressTlvConverter.cs

#LineLine coverage
 1using System.Diagnostics.CodeAnalysis;
 2using System.Net;
 3using System.Text;
 4using NLightning.Domain.Protocol.Constants;
 5using NLightning.Domain.Protocol.Interfaces;
 6using NLightning.Domain.Protocol.Tlv;
 7using NLightning.Infrastructure.Converters;
 8
 9namespace NLightning.Infrastructure.Protocol.Tlv.Converters;
 10
 11public class RemoteAddressTlvConverter : ITlvConverter<RemoteAddressTlv>
 12{
 13    public BaseTlv ConvertToBase(RemoteAddressTlv tlv)
 14    {
 015        var tlvValue = new byte[tlv.Length];
 016        tlvValue[0] = tlv.AddressType;
 17
 018        switch (tlv.AddressType)
 19        {
 20            // IPv4
 21            case 1:
 22                {
 023                    var ipAddressBytes = IPAddress.Parse(tlv.Address).GetAddressBytes();
 024                    if (ipAddressBytes.Length != 4)
 025                        throw new InvalidOperationException("Invalid IPv4 address");
 26
 027                    ipAddressBytes.CopyTo(tlvValue, 1);
 028                    EndianBitConverter.GetBytesBigEndian(tlv.Port).CopyTo(tlvValue, 5);
 029                    break;
 30                }
 31            // IPv6
 32            case 2:
 33                {
 034                    var ipAddressBytes = IPAddress.Parse(tlv.Address).GetAddressBytes();
 035                    if (ipAddressBytes.Length != 16)
 036                        throw new InvalidOperationException("Invalid IPv6 address");
 37
 038                    ipAddressBytes.CopyTo(tlvValue, 1);
 039                    EndianBitConverter.GetBytesBigEndian(tlv.Port).CopyTo(tlvValue, 17);
 040                    break;
 41                }
 42            // Tor v3
 43            case 4:
 44                {
 045                    var torV3Bytes = Convert.FromHexString(tlv.Address);
 046                    torV3Bytes.CopyTo(tlvValue, 1);
 047                    EndianBitConverter.GetBytesBigEndian(tlv.Port).CopyTo(tlvValue, 36);
 048                    break;
 49                }
 50            // Custom address type
 51            case 5:
 52                {
 053                    var customAddressBytes = Encoding.ASCII.GetBytes(tlv.Address);
 054                    customAddressBytes[1] = (byte)customAddressBytes.Length;
 055                    customAddressBytes.CopyTo(tlvValue, 2);
 056                    EndianBitConverter.GetBytesBigEndian(tlv.Port).CopyTo(tlvValue, customAddressBytes.Length + 2);
 057                    break;
 58                }
 59            default:
 060                throw new InvalidOperationException("Invalid address type");
 61        }
 62
 063        return new BaseTlv(tlv.Type, tlvValue);
 64    }
 65
 66    public RemoteAddressTlv ConvertFromBase(BaseTlv baseTlv)
 67    {
 068        if (baseTlv.Type != TlvConstants.RemoteAddress)
 069            throw new InvalidCastException("Invalid TLV type");
 70
 071        var addressType = baseTlv.Value[0];
 72        string address;
 73        ushort port;
 74
 75        switch (addressType)
 76        {
 77            // IPv4
 78            case 1:
 079                if (baseTlv.Length != 7)
 080                    throw new InvalidCastException("Invalid length for IPv4 address");
 081                address = new IPAddress(baseTlv.Value[1..5]).ToString();
 082                port = EndianBitConverter.ToUInt16BigEndian(baseTlv.Value.AsSpan()[5..]);
 083                break;
 84            // IPv6
 85            case 2:
 086                if (baseTlv.Length != 19)
 087                    throw new InvalidCastException("Invalid length for IPv6 address");
 088                address = new IPAddress(baseTlv.Value[1..17]).ToString();
 089                port = EndianBitConverter.ToUInt16BigEndian(baseTlv.Value.AsSpan()[17..]);
 090                break;
 91            // Tor v3
 92            case 4:
 093                if (baseTlv.Length != 38)
 094                    throw new InvalidCastException("Invalid length for Tor v3 address");
 095                address = Convert.ToHexString(baseTlv.Value[1..37]);
 096                port = EndianBitConverter.ToUInt16BigEndian(baseTlv.Value.AsSpan()[37..]);
 097                break;
 98            // Custom address type
 99            case 5:
 0100                if (baseTlv.Length < 3 || baseTlv.Length > 258)
 0101                    throw new InvalidCastException("Invalid length for custom address");
 0102                var customAddressLength = baseTlv.Value[1];
 0103                if (customAddressLength + 3 != baseTlv.Length)
 0104                    throw new InvalidCastException("Custom address length mismatch");
 0105                address = Encoding.ASCII.GetString(baseTlv.Value[2..(2 + customAddressLength)]);
 0106                port = EndianBitConverter.ToUInt16BigEndian(baseTlv.Value.AsSpan()[(2 + customAddressLength)..]);
 0107                break;
 108            default:
 0109                throw new InvalidOperationException("Invalid address type");
 110        }
 111
 0112        return new RemoteAddressTlv(addressType, address, port);
 113    }
 114
 115    [ExcludeFromCodeCoverage]
 116    BaseTlv ITlvConverter.ConvertFromBase(BaseTlv tlv)
 117    {
 118        return ConvertFromBase(tlv);
 119    }
 120
 121    [ExcludeFromCodeCoverage]
 122    BaseTlv ITlvConverter.ConvertToBase(BaseTlv tlv)
 123    {
 124        return ConvertToBase(tlv as RemoteAddressTlv
 125                          ?? throw new InvalidCastException($"Error converting BaseTlv to {nameof(RemoteAddressTlv)}"));
 126    }
 127}