< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Serialization.Payloads.TxAddOutputPayloadSerializer
Assembly: NLightning.Infrastructure.Serialization
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Serialization/Payloads/TxAddOutputPayloadSerializer.cs
Tag: 30_15166811759
Line coverage
86%
Covered lines: 33
Uncovered lines: 5
Coverable lines: 38
Total lines: 87
Line coverage: 86.8%
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.01490.91%
DeserializeAsync()50%2290.91%
NLightning-Domain-Serialization-Payloads-IPayloadSerializer-DeserializeAsync()100%210%

File(s)

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

#LineLine coverage
 1using System.Buffers;
 2using System.Runtime.Serialization;
 3using NBitcoin;
 4using NLightning.Domain.Serialization.Payloads;
 5
 6namespace NLightning.Infrastructure.Serialization.Payloads;
 7
 8using Converters;
 9using Domain.Enums;
 10using Domain.Money;
 11using Domain.Protocol.Payloads;
 12using Domain.Protocol.Payloads.Interfaces;
 13using Domain.Serialization.Factories;
 14using Domain.ValueObjects;
 15using Exceptions;
 16
 17public class TxAddOutputPayloadSerializer : IPayloadSerializer<TxAddOutputPayload>
 18{
 19    private readonly IValueObjectSerializerFactory _valueObjectSerializerFactory;
 20
 421    public TxAddOutputPayloadSerializer(IValueObjectSerializerFactory valueObjectSerializerFactory)
 22    {
 423        _valueObjectSerializerFactory = valueObjectSerializerFactory;
 424    }
 25
 26    public async Task SerializeAsync(IMessagePayload payload, Stream stream)
 27    {
 428        if (payload is not TxAddOutputPayload txAddOutputPayload)
 029            throw new SerializationException($"Payload is not of type {nameof(TxAddOutputPayload)}");
 30
 31        // Get the value object serializer
 432        var channelIdSerializer =
 433            _valueObjectSerializerFactory.GetSerializer<ChannelId>()
 434            ?? throw new SerializationException($"No serializer found for value object type {nameof(ChannelId)}");
 435        await channelIdSerializer.SerializeAsync(txAddOutputPayload.ChannelId, stream);
 36
 437        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian(txAddOutputPayload.SerialId));
 438        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian(txAddOutputPayload.Amount.Satoshi));
 439        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian((ushort)txAddOutputPayload.Script.Length));
 440        await stream.WriteAsync(txAddOutputPayload.Script.ToBytes());
 441    }
 42
 43    public async Task<TxAddOutputPayload?> DeserializeAsync(Stream stream)
 44    {
 445        var buffer = ArrayPool<byte>.Shared.Rent(sizeof(ulong));
 46
 47        try
 48        {
 49            // Get the value object serializer
 450            var channelIdSerializer =
 451                _valueObjectSerializerFactory.GetSerializer<ChannelId>()
 452                ?? throw new SerializationException($"No serializer found for value object type {nameof(ChannelId)}");
 453            var channelId = await channelIdSerializer.DeserializeAsync(stream);
 54
 455            var bytes = new byte[8];
 456            await stream.ReadExactlyAsync(bytes);
 457            var serialId = EndianBitConverter.ToUInt64BigEndian(bytes);
 58
 459            bytes = new byte[8];
 460            await stream.ReadExactlyAsync(bytes);
 461            var sats = LightningMoney.FromUnit(EndianBitConverter.ToUInt64BigEndian(bytes), LightningMoneyUnit.Satoshi);
 62
 463            bytes = new byte[2];
 464            await stream.ReadExactlyAsync(bytes);
 465            var scriptLength = EndianBitConverter.ToUInt16BigEndian(bytes);
 66
 467            var scriptBytes = new byte[scriptLength];
 468            await stream.ReadExactlyAsync(scriptBytes);
 469            var script = new Script(scriptBytes);
 70
 471            return new TxAddOutputPayload(sats, channelId, script, serialId);
 72        }
 073        catch (Exception e)
 74        {
 075            throw new PayloadSerializationException($"Error deserializing {nameof(TxAddOutputPayload)}", e);
 76        }
 77        finally
 78        {
 479            ArrayPool<byte>.Shared.Return(buffer);
 80        }
 481    }
 82
 83    async Task<IMessagePayload?> IPayloadSerializer.DeserializeAsync(Stream stream)
 84    {
 085        return await DeserializeAsync(stream);
 086    }
 87}