using System; using System.Buffers; using System.IO; using System.Text.Json; using Emby.Server.Implementations.HttpServer; using Microsoft.Extensions.Logging.Abstractions; using Xunit; namespace Jellyfin.Server.Implementations.Tests.HttpServer { public class WebSocketConnectionTests { [Fact] public void DeserializeWebSocketMessage_SingleSegment_Success() { var con = new WebSocketConnection(new NullLogger(), null!, null!); var bytes = File.ReadAllBytes("Test Data/HttpServer/ForceKeepAlive.json"); con.DeserializeWebSocketMessage(new ReadOnlySequence(bytes), out var bytesConsumed); Assert.Equal(109, bytesConsumed); } [Fact] public void DeserializeWebSocketMessage_MultipleSegments_Success() { const int SplitPos = 64; var con = new WebSocketConnection(new NullLogger(), null!, null!); var bytes = File.ReadAllBytes("Test Data/HttpServer/ForceKeepAlive.json"); var seg1 = new BufferSegment(new Memory(bytes, 0, SplitPos)); var seg2 = seg1.Append(new Memory(bytes, SplitPos, bytes.Length - SplitPos)); con.DeserializeWebSocketMessage(new ReadOnlySequence(seg1, 0, seg2, seg2.Memory.Length - 1), out var bytesConsumed); Assert.Equal(109, bytesConsumed); } [Fact] public void DeserializeWebSocketMessage_ValidPartial_Success() { var con = new WebSocketConnection(new NullLogger(), null!, null!); var bytes = File.ReadAllBytes("Test Data/HttpServer/ValidPartial.json"); con.DeserializeWebSocketMessage(new ReadOnlySequence(bytes), out var bytesConsumed); Assert.Equal(109, bytesConsumed); } [Fact] public void DeserializeWebSocketMessage_Partial_ThrowJsonException() { var con = new WebSocketConnection(new NullLogger(), null!, null!); var bytes = File.ReadAllBytes("Test Data/HttpServer/Partial.json"); Assert.Throws(() => con.DeserializeWebSocketMessage(new ReadOnlySequence(bytes), out var bytesConsumed)); } internal class BufferSegment : ReadOnlySequenceSegment { public BufferSegment(Memory memory) { Memory = memory; } public BufferSegment Append(Memory memory) { var segment = new BufferSegment(memory) { RunningIndex = RunningIndex + Memory.Length }; Next = segment; return segment; } } } }