< Summary - Combined Code Coverage

Information
Class: NLightning.Infrastructure.Serialization.Payloads.ShutdownPayloadSerializer
Assembly: NLightning.Infrastructure.Serialization
File(s): /home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Serialization/Payloads/ShutdownPayloadSerializer.cs
Tag: 30_15166811759
Line coverage
77%
Covered lines: 24
Uncovered lines: 7
Coverable lines: 31
Total lines: 78
Line coverage: 77.4%
Branch coverage
50%
Covered branches: 4
Total branches: 8
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%4.21476.47%
NLightning-Domain-Serialization-Payloads-IPayloadSerializer-DeserializeAsync()100%210%

File(s)

/home/runner/work/nlightning/nlightning/src/NLightning.Infrastructure.Serialization/Payloads/ShutdownPayloadSerializer.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.Bitcoin.Constants;
 10using Domain.Protocol.Payloads;
 11using Domain.Protocol.Payloads.Interfaces;
 12using Domain.Serialization.Factories;
 13using Domain.ValueObjects;
 14using Exceptions;
 15
 16public class ShutdownPayloadSerializer : IPayloadSerializer<ShutdownPayload>
 17{
 18    private readonly IValueObjectSerializerFactory _valueObjectSerializerFactory;
 19
 420    public ShutdownPayloadSerializer(IValueObjectSerializerFactory valueObjectSerializerFactory)
 21    {
 422        _valueObjectSerializerFactory = valueObjectSerializerFactory;
 423    }
 24
 25    public async Task SerializeAsync(IMessagePayload payload, Stream stream)
 26    {
 427        if (payload is not ShutdownPayload shutdownPayload)
 028            throw new SerializationException($"Payload is not of type {nameof(ShutdownPayload)}");
 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(shutdownPayload.ChannelId, stream);
 35
 436        await stream.WriteAsync(EndianBitConverter.GetBytesBigEndian(shutdownPayload.ScriptPubkeyLen));
 437        await stream.WriteAsync(shutdownPayload.ScriptPubkey.ToBytes());
 438    }
 39
 40    public async Task<ShutdownPayload?> DeserializeAsync(Stream stream)
 41    {
 442        var buffer = ArrayPool<byte>.Shared.Rent(ScriptConstants.MAX_SCRIPT_SIZE);
 43
 44        try
 45        {
 46            // Get the value object serializer
 447            var channelIdSerializer =
 448                _valueObjectSerializerFactory.GetSerializer<ChannelId>()
 449                ?? throw new SerializationException($"No serializer found for value object type {nameof(ChannelId)}");
 450            var channelId = await channelIdSerializer.DeserializeAsync(stream);
 51
 452            await stream.ReadExactlyAsync(buffer.AsMemory()[..sizeof(ushort)]);
 453            var len = EndianBitConverter.ToUInt16BigEndian(buffer[..sizeof(ushort)]);
 54
 455            if (len > ScriptConstants.MAX_SCRIPT_SIZE)
 056                throw new SerializationException(
 057                    $"ScriptPubkey length {len} exceeds maximum size {ScriptConstants.MAX_SCRIPT_SIZE}");
 58
 459            await stream.ReadExactlyAsync(buffer.AsMemory()[..len]);
 460            var scriptPubkey = new Script(buffer[..len]);
 61
 462            return new ShutdownPayload(channelId, scriptPubkey);
 63        }
 064        catch (Exception e)
 65        {
 066            throw new PayloadSerializationException($"Error deserializing {nameof(ShutdownPayload)}", e);
 67        }
 68        finally
 69        {
 470            ArrayPool<byte>.Shared.Return(buffer);
 71        }
 472    }
 73
 74    async Task<IMessagePayload?> IPayloadSerializer.DeserializeAsync(Stream stream)
 75    {
 076        return await DeserializeAsync(stream);
 077    }
 78}