WebSocketConnectionTests.cs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System;
  2. using System.Buffers;
  3. using System.IO;
  4. using System.Text.Json;
  5. using Emby.Server.Implementations.HttpServer;
  6. using Microsoft.Extensions.Logging.Abstractions;
  7. using Xunit;
  8. namespace Jellyfin.Server.Implementations.Tests.HttpServer
  9. {
  10. public class WebSocketConnectionTests
  11. {
  12. [Fact]
  13. public void DeserializeWebSocketMessage_SingleSegment_Success()
  14. {
  15. var con = new WebSocketConnection(new NullLogger<WebSocketConnection>(), null!, null!, null!);
  16. var bytes = File.ReadAllBytes("Test Data/HttpServer/ForceKeepAlive.json");
  17. con.DeserializeWebSocketMessage(new ReadOnlySequence<byte>(bytes), out var bytesConsumed);
  18. Assert.Equal(109, bytesConsumed);
  19. }
  20. [Fact]
  21. public void DeserializeWebSocketMessage_MultipleSegments_Success()
  22. {
  23. const int SplitPos = 64;
  24. var con = new WebSocketConnection(new NullLogger<WebSocketConnection>(), null!, null!, null!);
  25. var bytes = File.ReadAllBytes("Test Data/HttpServer/ForceKeepAlive.json");
  26. var seg1 = new BufferSegment(new Memory<byte>(bytes, 0, SplitPos));
  27. var seg2 = seg1.Append(new Memory<byte>(bytes, SplitPos, bytes.Length - SplitPos));
  28. con.DeserializeWebSocketMessage(new ReadOnlySequence<byte>(seg1, 0, seg2, seg2.Memory.Length - 1), out var bytesConsumed);
  29. Assert.Equal(109, bytesConsumed);
  30. }
  31. [Fact]
  32. public void DeserializeWebSocketMessage_ValidPartial_Success()
  33. {
  34. var con = new WebSocketConnection(new NullLogger<WebSocketConnection>(), null!, null!, null!);
  35. var bytes = File.ReadAllBytes("Test Data/HttpServer/ValidPartial.json");
  36. con.DeserializeWebSocketMessage(new ReadOnlySequence<byte>(bytes), out var bytesConsumed);
  37. Assert.Equal(109, bytesConsumed);
  38. }
  39. [Fact]
  40. public void DeserializeWebSocketMessage_Partial_ThrowJsonException()
  41. {
  42. var con = new WebSocketConnection(new NullLogger<WebSocketConnection>(), null!, null!, null!);
  43. var bytes = File.ReadAllBytes("Test Data/HttpServer/Partial.json");
  44. Assert.Throws<JsonException>(() => con.DeserializeWebSocketMessage(new ReadOnlySequence<byte>(bytes), out var bytesConsumed));
  45. }
  46. internal sealed class BufferSegment : ReadOnlySequenceSegment<byte>
  47. {
  48. public BufferSegment(Memory<byte> memory)
  49. {
  50. Memory = memory;
  51. }
  52. public BufferSegment Append(Memory<byte> memory)
  53. {
  54. var segment = new BufferSegment(memory)
  55. {
  56. RunningIndex = RunningIndex + Memory.Length
  57. };
  58. Next = segment;
  59. return segment;
  60. }
  61. }
  62. }
  63. }