< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Serialization.Payloads.CommitmentSignedPayloadSerializer
Assembly: NLightning.Infrastructure.Serialization
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Serialization/Payloads/CommitmentSignedPayloadSerializer.cs
Tag: 30_15166811759
Line coverage
81%
Covered lines: 31
Uncovered lines: 7
Coverable lines: 38
Total lines: 95
Line coverage: 81.5%
Branch coverage
64%
Covered branches: 9
Total branches: 14
Branch coverage: 64.2%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
SerializeAsync()66.67%6.03690.91%
DeserializeAsync()62.5%8.38881.82%
NLightning-Domain-Serialization-Payloads-IPayloadSerializer-DeserializeAsync()100%210%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Serialization/Payloads/CommitmentSignedPayloadSerializer.cs

#LineLine coverage
 1using System.Buffers;
 2using System.Runtime.Serialization;
 3using NBitcoin.Crypto;
 4using NLightning.Domain.Serialization.Payloads;
 5
 6namespace NLightning.Infrastructure.Serialization.Payloads;
 7
 8using Converters;
 9using Domain.Crypto.Constants;
 10using Domain.Protocol.Payloads;
 11using Domain.Protocol.Payloads.Interfaces;
 12using Domain.Serialization.Factories;
 13using Domain.ValueObjects;
 14using Exceptions;
 15
 16public class CommitmentSignedPayloadSerializer : IPayloadSerializer<CommitmentSignedPayload>
 17{
 18    private readonly IValueObjectSerializerFactory _valueObjectSerializerFactory;
 19
 420    public CommitmentSignedPayloadSerializer(IValueObjectSerializerFactory valueObjectSerializerFactory)
 21    {
 422        _valueObjectSerializerFactory = valueObjectSerializerFactory;
 423    }
 24
 25    public async Task SerializeAsync(IMessagePayload payload, Stream stream)
 26    {
 427        if (payload is not CommitmentSignedPayload commitmentSignedPayload)
 028            throw new SerializationException($"Payload is not of type {nameof(CommitmentSignedPayload)}");
 29
 30        // Get the value object serializer
 431        var channelIdSerializer =
 432            _valueObjectSerializerFactory.GetSerializer<ChannelId>()
 433            ?? throw new SerializationException($"No serializer found for value object type {nameof(ChannelId)}");
 434        await channelIdSerializer.SerializeAsync(commitmentSignedPayload.ChannelId, stream);
 35
 36        // Serialize other types
 437        await stream.WriteAsync(commitmentSignedPayload.Signature.ToCompact());
 438        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian(commitmentSignedPayload.NumHtlcs));
 2439        foreach (var htlcsSignature in commitmentSignedPayload.HtlcSignatures)
 40        {
 841            await stream.WriteAsync(htlcsSignature.ToCompact());
 42        }
 443    }
 44
 45    public async Task<CommitmentSignedPayload?> DeserializeAsync(Stream stream)
 46    {
 447        var buffer = ArrayPool<byte>.Shared.Rent(CryptoConstants.MAX_SIGNATURE_SIZE);
 48
 49        try
 50        {
 51            // Get the value object serializer
 452            var channelIdSerializer =
 453                _valueObjectSerializerFactory.GetSerializer<ChannelId>()
 454                ?? throw new SerializationException($"No serializer found for value object type {nameof(ChannelId)}");
 455            var channelId = await channelIdSerializer.DeserializeAsync(stream);
 56
 457            await stream.ReadExactlyAsync(buffer.AsMemory()[..CryptoConstants.MAX_SIGNATURE_SIZE]);
 458            if (!ECDSASignature.TryParseFromCompact(buffer[..CryptoConstants.MAX_SIGNATURE_SIZE], out var signature))
 59            {
 060                throw new Exception("Unable to parse signature");
 61            }
 62
 463            await stream.ReadExactlyAsync(buffer.AsMemory()[..sizeof(ushort)]);
 464            var numHtlcs = EndianBitConverter.ToUInt16BigEndian(buffer[..sizeof(ushort)]);
 65
 466            var htlcSignatures = new List<ECDSASignature>(numHtlcs);
 2467            for (var i = 0; i < numHtlcs; i++)
 68            {
 869                await stream.ReadExactlyAsync(buffer.AsMemory()[..CryptoConstants.MAX_SIGNATURE_SIZE]);
 870                if (!ECDSASignature.TryParseFromCompact(buffer[..CryptoConstants.MAX_SIGNATURE_SIZE],
 871                                                        out var htlcSignature))
 72                {
 073                    throw new Exception("Unable to parse htcl signature");
 74                }
 75
 876                htlcSignatures.Add(htlcSignature);
 77            }
 78
 479            return new CommitmentSignedPayload(channelId, htlcSignatures, signature);
 80        }
 081        catch (Exception e)
 82        {
 083            throw new PayloadSerializationException("Error deserializing CommitmentSignedPayload", e);
 84        }
 85        finally
 86        {
 487            ArrayPool<byte>.Shared.Return(buffer);
 88        }
 489    }
 90
 91    async Task<IMessagePayload?> IPayloadSerializer.DeserializeAsync(Stream stream)
 92    {
 093        return await DeserializeAsync(stream);
 094    }
 95}