< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Serialization.Payloads.TxAbortPayloadSerializer
Assembly: NLightning.Infrastructure.Serialization
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Serialization/Payloads/TxAbortPayloadSerializer.cs
Tag: 36_15743069263
Line coverage
82%
Covered lines: 24
Uncovered lines: 5
Coverable lines: 29
Total lines: 74
Line coverage: 82.7%
Branch coverage
50%
Covered branches: 3
Total branches: 6
Branch coverage: 50%
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()50%4.02488.89%
DeserializeAsync()50%2.01286.67%
NLightning-Domain-Serialization-Interfaces-IPayloadSerializer-DeserializeAsync()100%210%

File(s)

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

#LineLine coverage
 1using System.Buffers;
 2using System.Runtime.Serialization;
 3using NLightning.Domain.Channels.ValueObjects;
 4using NLightning.Domain.Protocol.Interfaces;
 5using NLightning.Domain.Serialization.Interfaces;
 6
 7namespace NLightning.Infrastructure.Serialization.Payloads;
 8
 9using Converters;
 10using Domain.Protocol.Payloads;
 11using Exceptions;
 12
 13public class TxAbortPayloadSerializer : IPayloadSerializer<TxAbortPayload>
 14{
 15    private readonly IValueObjectSerializerFactory _valueObjectSerializerFactory;
 16
 417    public TxAbortPayloadSerializer(IValueObjectSerializerFactory valueObjectSerializerFactory)
 18    {
 419        _valueObjectSerializerFactory = valueObjectSerializerFactory;
 420    }
 21
 22    public async Task SerializeAsync(IMessagePayload payload, Stream stream)
 23    {
 424        if (payload is not TxAbortPayload txAbortPayload)
 025            throw new SerializationException($"Payload is not of type {nameof(TxAbortPayload)}");
 26
 27        // Get the value object serializer
 428        var channelIdSerializer =
 429            _valueObjectSerializerFactory.GetSerializer<ChannelId>()
 430         ?? throw new SerializationException($"No serializer found for value object type {nameof(ChannelId)}");
 431        await channelIdSerializer.SerializeAsync(txAbortPayload.ChannelId, stream);
 32
 433        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian((ushort)txAbortPayload.Data.Length));
 434        await stream.WriteAsync(txAbortPayload.Data);
 435    }
 36
 37    public async Task<TxAbortPayload?> DeserializeAsync(Stream stream)
 38    {
 439        var buffer = ArrayPool<byte>.Shared.Rent(sizeof(ushort));
 40
 41        try
 42        {
 43            // Get the value object serializer
 444            var channelIdSerializer =
 445                _valueObjectSerializerFactory.GetSerializer<ChannelId>()
 446             ?? throw new SerializationException($"No serializer found for value object type {nameof(ChannelId)}");
 447            var channelId = await channelIdSerializer.DeserializeAsync(stream);
 48
 449            await stream.ReadExactlyAsync(buffer.AsMemory()[..sizeof(ushort)]);
 450            var length = EndianBitConverter.ToUInt16BigEndian(buffer[..sizeof(ushort)]);
 51
 52            // Use only the first 256 bytes of the buffer
 453            length = Math.Min(length, (ushort)256);
 54
 455            var data = new byte[length];
 456            await stream.ReadExactlyAsync(data);
 57
 458            return new TxAbortPayload(channelId, data);
 59        }
 060        catch (Exception e)
 61        {
 062            throw new PayloadSerializationException($"Error deserializing {nameof(TxAbortPayload)}", e);
 63        }
 64        finally
 65        {
 466            ArrayPool<byte>.Shared.Return(buffer);
 67        }
 468    }
 69
 70    async Task<IMessagePayload?> IPayloadSerializer.DeserializeAsync(Stream stream)
 71    {
 072        return await DeserializeAsync(stream);
 073    }
 74}