< 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: 36_15743069263
Line coverage
86%
Covered lines: 33
Uncovered lines: 5
Coverable lines: 38
Total lines: 86
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-Interfaces-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 NLightning.Domain.Protocol.Interfaces;
 4
 5namespace NLightning.Infrastructure.Serialization.Payloads;
 6
 7using Converters;
 8using Domain.Bitcoin.ValueObjects;
 9using Domain.Channels.ValueObjects;
 10using Domain.Enums;
 11using Domain.Money;
 12using Domain.Protocol.Payloads;
 13using Domain.Serialization.Interfaces;
 14using Exceptions;
 15
 16public class TxAddOutputPayloadSerializer : IPayloadSerializer<TxAddOutputPayload>
 17{
 18    private readonly IValueObjectSerializerFactory _valueObjectSerializerFactory;
 19
 420    public TxAddOutputPayloadSerializer(IValueObjectSerializerFactory valueObjectSerializerFactory)
 21    {
 422        _valueObjectSerializerFactory = valueObjectSerializerFactory;
 423    }
 24
 25    public async Task SerializeAsync(IMessagePayload payload, Stream stream)
 26    {
 427        if (payload is not TxAddOutputPayload txAddOutputPayload)
 028            throw new SerializationException($"Payload is not of type {nameof(TxAddOutputPayload)}");
 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(txAddOutputPayload.ChannelId, stream);
 35
 436        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian(txAddOutputPayload.SerialId));
 437        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian(txAddOutputPayload.Amount.Satoshi));
 438        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian((ushort)txAddOutputPayload.Script.Length));
 439        await stream.WriteAsync(txAddOutputPayload.Script);
 440    }
 41
 42    public async Task<TxAddOutputPayload?> DeserializeAsync(Stream stream)
 43    {
 444        var buffer = ArrayPool<byte>.Shared.Rent(sizeof(ulong));
 45
 46        try
 47        {
 48            // Get the value object serializer
 449            var channelIdSerializer =
 450                _valueObjectSerializerFactory.GetSerializer<ChannelId>()
 451             ?? throw new SerializationException($"No serializer found for value object type {nameof(ChannelId)}");
 452            var channelId = await channelIdSerializer.DeserializeAsync(stream);
 53
 454            var bytes = new byte[8];
 455            await stream.ReadExactlyAsync(bytes);
 456            var serialId = EndianBitConverter.ToUInt64BigEndian(bytes);
 57
 458            bytes = new byte[8];
 459            await stream.ReadExactlyAsync(bytes);
 460            var sats = LightningMoney.FromUnit(EndianBitConverter.ToUInt64BigEndian(bytes), LightningMoneyUnit.Satoshi);
 61
 462            bytes = new byte[2];
 463            await stream.ReadExactlyAsync(bytes);
 464            var scriptLength = EndianBitConverter.ToUInt16BigEndian(bytes);
 65
 466            var scriptBytes = new byte[scriptLength];
 467            await stream.ReadExactlyAsync(scriptBytes);
 468            var script = new BitcoinScript(scriptBytes);
 69
 470            return new TxAddOutputPayload(sats, channelId, script, serialId);
 71        }
 072        catch (Exception e)
 73        {
 074            throw new PayloadSerializationException($"Error deserializing {nameof(TxAddOutputPayload)}", e);
 75        }
 76        finally
 77        {
 478            ArrayPool<byte>.Shared.Return(buffer);
 79        }
 480    }
 81
 82    async Task<IMessagePayload?> IPayloadSerializer.DeserializeAsync(Stream stream)
 83    {
 084        return await DeserializeAsync(stream);
 085    }
 86}