You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
jellyfin/tests/Jellyfin.LiveTv.Tests/HdHomerunManagerTests.cs

327 lines
11 KiB

using System;
using System.Text;
using Jellyfin.LiveTv.TunerHosts.HdHomerun;
using Xunit;
namespace Jellyfin.LiveTv.Tests
{
public class HdHomerunManagerTests
{
[Fact]
public void WriteNullTerminatedString_Empty_Success()
{
ReadOnlySpan<byte> expected = stackalloc byte[]
{
1, 0
};
Span<byte> buffer = stackalloc byte[128];
int len = HdHomerunManager.WriteNullTerminatedString(buffer, string.Empty);
Assert.Equal(
Convert.ToHexString(expected),
Convert.ToHexString(buffer.Slice(0, len)));
}
[Fact]
public void WriteNullTerminatedString_Valid_Success()
{
ReadOnlySpan<byte> expected = stackalloc byte[]
{
10, (byte)'T', (byte)'h', (byte)'e', (byte)' ', (byte)'q', (byte)'u', (byte)'i', (byte)'c', (byte)'k', 0
};
Span<byte> buffer = stackalloc byte[128];
int len = HdHomerunManager.WriteNullTerminatedString(buffer, "The quick");
Assert.Equal(
Convert.ToHexString(expected),
Convert.ToHexString(buffer.Slice(0, len)));
}
[Fact]
public void WriteGetMessage_Valid_Success()
{
ReadOnlySpan<byte> expected = stackalloc byte[]
{
0, 4,
0, 12,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
0xc0, 0xc9, 0x87, 0x33
};
Span<byte> buffer = stackalloc byte[128];
int len = HdHomerunManager.WriteGetMessage(buffer, 0, "N");
Assert.Equal(
Convert.ToHexString(expected),
Convert.ToHexString(buffer.Slice(0, len)));
}
[Fact]
public void WriteSetMessage_NoLockKey_Success()
{
ReadOnlySpan<byte> expected = stackalloc byte[]
{
0, 4,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0xa9, 0x49, 0xd0, 0x68
};
Span<byte> buffer = stackalloc byte[128];
int len = HdHomerunManager.WriteSetMessage(buffer, 0, "N", "value", null);
Assert.Equal(
Convert.ToHexString(expected),
Convert.ToHexString(buffer.Slice(0, len)));
}
[Fact]
public void WriteSetMessage_LockKey_Success()
{
ReadOnlySpan<byte> expected = stackalloc byte[]
{
0, 4,
0, 26,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
21,
4, 0x00, 0x01, 0x38, 0xd5,
0x8e, 0xb6, 0x06, 0x82
};
Span<byte> buffer = stackalloc byte[128];
int len = HdHomerunManager.WriteSetMessage(buffer, 0, "N", "value", 80085);
Assert.Equal(
Convert.ToHexString(expected),
Convert.ToHexString(buffer.Slice(0, len)));
}
[Fact]
public void TryGetReturnValueOfGetSet_Valid_Success()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0x7d, 0xa3, 0xa3, 0xf3
};
Assert.True(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out var value));
Assert.Equal("value", Encoding.UTF8.GetString(value));
}
[Fact]
public void TryGetReturnValueOfGetSet_InvalidCrc_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0x7d, 0xa3, 0xa3, 0xf4
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void TryGetReturnValueOfGetSet_InvalidPacketType_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 4,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0xa9, 0x49, 0xd0, 0x68
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void TryGetReturnValueOfGetSet_InvalidPacket_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
0x7d, 0xa3, 0xa3
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void TryGetReturnValueOfGetSet_TooSmallMessageLength_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 19,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0x25, 0x25, 0x44, 0x9a
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void TryGetReturnValueOfGetSet_TooLargeMessageLength_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 21,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0xe3, 0x20, 0x79, 0x6c
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void TryGetReturnValueOfGetSet_TooLargeNameLength_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
3,
20, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0xe1, 0x8e, 0x9c, 0x74
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void TryGetReturnValueOfGetSet_InvalidGetSetNameTag_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
4,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0xee, 0x05, 0xe7, 0x12
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void TryGetReturnValueOfGetSet_InvalidGetSetValueTag_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
3,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0x64, 0xaa, 0x66, 0xf9
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void TryGetReturnValueOfGetSet_TooLargeValueLength_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
7, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0xc9, 0xa8, 0xd4, 0x55
};
Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
}
[Fact]
public void VerifyReturnValueOfGetSet_Valid_True()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0x7d, 0xa3, 0xa3, 0xf3
};
Assert.True(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "value"));
}
[Fact]
public void VerifyReturnValueOfGetSet_WrongValue_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 5,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0x7d, 0xa3, 0xa3, 0xf3
};
Assert.False(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "none"));
}
[Fact]
public void VerifyReturnValueOfGetSet_InvalidPacket_False()
{
ReadOnlySpan<byte> packet = new byte[]
{
0, 4,
0, 20,
3,
10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
4,
6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
0x7d, 0xa3, 0xa3, 0xf3
};
Assert.False(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "value"));
}
}
}