HdHomerunManagerTests.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. using System;
  2. using System.Text;
  3. using Jellyfin.LiveTv.TunerHosts.HdHomerun;
  4. using Xunit;
  5. namespace Jellyfin.LiveTv.Tests
  6. {
  7. public class HdHomerunManagerTests
  8. {
  9. [Fact]
  10. public void WriteNullTerminatedString_Empty_Success()
  11. {
  12. ReadOnlySpan<byte> expected = stackalloc byte[]
  13. {
  14. 1, 0
  15. };
  16. Span<byte> buffer = stackalloc byte[128];
  17. int len = HdHomerunManager.WriteNullTerminatedString(buffer, string.Empty);
  18. Assert.Equal(
  19. Convert.ToHexString(expected),
  20. Convert.ToHexString(buffer.Slice(0, len)));
  21. }
  22. [Fact]
  23. public void WriteNullTerminatedString_Valid_Success()
  24. {
  25. ReadOnlySpan<byte> expected = stackalloc byte[]
  26. {
  27. 10, (byte)'T', (byte)'h', (byte)'e', (byte)' ', (byte)'q', (byte)'u', (byte)'i', (byte)'c', (byte)'k', 0
  28. };
  29. Span<byte> buffer = stackalloc byte[128];
  30. int len = HdHomerunManager.WriteNullTerminatedString(buffer, "The quick");
  31. Assert.Equal(
  32. Convert.ToHexString(expected),
  33. Convert.ToHexString(buffer.Slice(0, len)));
  34. }
  35. [Fact]
  36. public void WriteGetMessage_Valid_Success()
  37. {
  38. ReadOnlySpan<byte> expected = stackalloc byte[]
  39. {
  40. 0, 4,
  41. 0, 12,
  42. 3,
  43. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  44. 0xc0, 0xc9, 0x87, 0x33
  45. };
  46. Span<byte> buffer = stackalloc byte[128];
  47. int len = HdHomerunManager.WriteGetMessage(buffer, 0, "N");
  48. Assert.Equal(
  49. Convert.ToHexString(expected),
  50. Convert.ToHexString(buffer.Slice(0, len)));
  51. }
  52. [Fact]
  53. public void WriteSetMessage_NoLockKey_Success()
  54. {
  55. ReadOnlySpan<byte> expected = stackalloc byte[]
  56. {
  57. 0, 4,
  58. 0, 20,
  59. 3,
  60. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  61. 4,
  62. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  63. 0xa9, 0x49, 0xd0, 0x68
  64. };
  65. Span<byte> buffer = stackalloc byte[128];
  66. int len = HdHomerunManager.WriteSetMessage(buffer, 0, "N", "value", null);
  67. Assert.Equal(
  68. Convert.ToHexString(expected),
  69. Convert.ToHexString(buffer.Slice(0, len)));
  70. }
  71. [Fact]
  72. public void WriteSetMessage_LockKey_Success()
  73. {
  74. ReadOnlySpan<byte> expected = stackalloc byte[]
  75. {
  76. 0, 4,
  77. 0, 26,
  78. 3,
  79. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  80. 4,
  81. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  82. 21,
  83. 4, 0x00, 0x01, 0x38, 0xd5,
  84. 0x8e, 0xb6, 0x06, 0x82
  85. };
  86. Span<byte> buffer = stackalloc byte[128];
  87. int len = HdHomerunManager.WriteSetMessage(buffer, 0, "N", "value", 80085);
  88. Assert.Equal(
  89. Convert.ToHexString(expected),
  90. Convert.ToHexString(buffer.Slice(0, len)));
  91. }
  92. [Fact]
  93. public void TryGetReturnValueOfGetSet_Valid_Success()
  94. {
  95. ReadOnlySpan<byte> packet = new byte[]
  96. {
  97. 0, 5,
  98. 0, 20,
  99. 3,
  100. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  101. 4,
  102. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  103. 0x7d, 0xa3, 0xa3, 0xf3
  104. };
  105. Assert.True(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out var value));
  106. Assert.Equal("value", Encoding.UTF8.GetString(value));
  107. }
  108. [Fact]
  109. public void TryGetReturnValueOfGetSet_InvalidCrc_False()
  110. {
  111. ReadOnlySpan<byte> packet = new byte[]
  112. {
  113. 0, 5,
  114. 0, 20,
  115. 3,
  116. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  117. 4,
  118. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  119. 0x7d, 0xa3, 0xa3, 0xf4
  120. };
  121. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  122. }
  123. [Fact]
  124. public void TryGetReturnValueOfGetSet_InvalidPacketType_False()
  125. {
  126. ReadOnlySpan<byte> packet = new byte[]
  127. {
  128. 0, 4,
  129. 0, 20,
  130. 3,
  131. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  132. 4,
  133. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  134. 0xa9, 0x49, 0xd0, 0x68
  135. };
  136. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  137. }
  138. [Fact]
  139. public void TryGetReturnValueOfGetSet_InvalidPacket_False()
  140. {
  141. ReadOnlySpan<byte> packet = new byte[]
  142. {
  143. 0, 5,
  144. 0, 20,
  145. 0x7d, 0xa3, 0xa3
  146. };
  147. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  148. }
  149. [Fact]
  150. public void TryGetReturnValueOfGetSet_TooSmallMessageLength_False()
  151. {
  152. ReadOnlySpan<byte> packet = new byte[]
  153. {
  154. 0, 5,
  155. 0, 19,
  156. 3,
  157. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  158. 4,
  159. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  160. 0x25, 0x25, 0x44, 0x9a
  161. };
  162. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  163. }
  164. [Fact]
  165. public void TryGetReturnValueOfGetSet_TooLargeMessageLength_False()
  166. {
  167. ReadOnlySpan<byte> packet = new byte[]
  168. {
  169. 0, 5,
  170. 0, 21,
  171. 3,
  172. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  173. 4,
  174. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  175. 0xe3, 0x20, 0x79, 0x6c
  176. };
  177. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  178. }
  179. [Fact]
  180. public void TryGetReturnValueOfGetSet_TooLargeNameLength_False()
  181. {
  182. ReadOnlySpan<byte> packet = new byte[]
  183. {
  184. 0, 5,
  185. 0, 20,
  186. 3,
  187. 20, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  188. 4,
  189. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  190. 0xe1, 0x8e, 0x9c, 0x74
  191. };
  192. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  193. }
  194. [Fact]
  195. public void TryGetReturnValueOfGetSet_InvalidGetSetNameTag_False()
  196. {
  197. ReadOnlySpan<byte> packet = new byte[]
  198. {
  199. 0, 5,
  200. 0, 20,
  201. 4,
  202. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  203. 4,
  204. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  205. 0xee, 0x05, 0xe7, 0x12
  206. };
  207. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  208. }
  209. [Fact]
  210. public void TryGetReturnValueOfGetSet_InvalidGetSetValueTag_False()
  211. {
  212. ReadOnlySpan<byte> packet = new byte[]
  213. {
  214. 0, 5,
  215. 0, 20,
  216. 3,
  217. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  218. 3,
  219. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  220. 0x64, 0xaa, 0x66, 0xf9
  221. };
  222. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  223. }
  224. [Fact]
  225. public void TryGetReturnValueOfGetSet_TooLargeValueLength_False()
  226. {
  227. ReadOnlySpan<byte> packet = new byte[]
  228. {
  229. 0, 5,
  230. 0, 20,
  231. 3,
  232. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  233. 4,
  234. 7, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  235. 0xc9, 0xa8, 0xd4, 0x55
  236. };
  237. Assert.False(HdHomerunManager.TryGetReturnValueOfGetSet(packet, out _));
  238. }
  239. [Fact]
  240. public void VerifyReturnValueOfGetSet_Valid_True()
  241. {
  242. ReadOnlySpan<byte> packet = new byte[]
  243. {
  244. 0, 5,
  245. 0, 20,
  246. 3,
  247. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  248. 4,
  249. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  250. 0x7d, 0xa3, 0xa3, 0xf3
  251. };
  252. Assert.True(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "value"));
  253. }
  254. [Fact]
  255. public void VerifyReturnValueOfGetSet_WrongValue_False()
  256. {
  257. ReadOnlySpan<byte> packet = new byte[]
  258. {
  259. 0, 5,
  260. 0, 20,
  261. 3,
  262. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  263. 4,
  264. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  265. 0x7d, 0xa3, 0xa3, 0xf3
  266. };
  267. Assert.False(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "none"));
  268. }
  269. [Fact]
  270. public void VerifyReturnValueOfGetSet_InvalidPacket_False()
  271. {
  272. ReadOnlySpan<byte> packet = new byte[]
  273. {
  274. 0, 4,
  275. 0, 20,
  276. 3,
  277. 10, (byte)'/', (byte)'t', (byte)'u', (byte)'n', (byte)'e', (byte)'r', (byte)'0', (byte)'/', (byte)'N', 0,
  278. 4,
  279. 6, (byte)'v', (byte)'a', (byte)'l', (byte)'u', (byte)'e', 0,
  280. 0x7d, 0xa3, 0xa3, 0xf3
  281. };
  282. Assert.False(HdHomerunManager.VerifyReturnValueOfGetSet(packet, "value"));
  283. }
  284. }
  285. }