No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

485 líneas
20 KiB

  1. using JT808.Protocol.MessagePack;
  2. using JT808.Protocol.Extensions;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Text;
  6. using Xunit;
  7. using System.Buffers;
  8. using JT808.Protocol.Enums;
  9. using System.Buffers.Binary;
  10. namespace JT808.Protocol.Test.MessagePack
  11. {
  12. public class JT808MessagePackWriterTest
  13. {
  14. [Fact]
  15. public void WriteEncodeTest()
  16. {
  17. byte[] array = new byte[4096];
  18. var msgpackWriter = new JT808MessagePackWriter(array);
  19. msgpackWriter.WriteStart();
  20. msgpackWriter.WriteByte(0x7E);
  21. msgpackWriter.WriteByte(0x7D);
  22. msgpackWriter.WriteByte(0x7E);
  23. msgpackWriter.WriteByte(0x7D);
  24. msgpackWriter.WriteEnd();
  25. msgpackWriter.WriteEncode();
  26. //===========output=========
  27. //Unencode:
  28. //7E 7E 7D 7E 7D 7E
  29. //Encode
  30. //7E 7D 02 7D 01 7D 02 7D 01 7E
  31. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  32. Assert.Equal("7E 7E 7D 7E 7D 7E 7E 7D 02 7D 01 7D 02 7D 01 7E".Replace(" ", ""), realBytes);
  33. }
  34. [Fact]
  35. public void WriteEncodeTest1()
  36. {
  37. byte[] array = new byte[4096];
  38. var msgpackWriter = new JT808MessagePackWriter(array);
  39. msgpackWriter.WriteByte(0x7E);
  40. msgpackWriter.WriteByte(0x7D);
  41. msgpackWriter.WriteByte(0x7E);
  42. msgpackWriter.WriteByte(0x7D);
  43. msgpackWriter.WriteFullEncode();
  44. //===========output=========
  45. //Unencode:
  46. //7E 7D 7E 7D
  47. //Encode
  48. //7D 02 7D 01 7D 02 7D 01
  49. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  50. Assert.Equal("7E 7D 7E 7D 7D 02 7D 01 7D 02 7D 01".Replace(" ", ""), realBytes);
  51. }
  52. [Fact]
  53. public void WriteDateTimeTest()
  54. {
  55. byte[] array = new byte[4096];
  56. var msgpackWriter = new JT808MessagePackWriter(array);
  57. msgpackWriter.WriteStart();
  58. msgpackWriter.WriteDateTime4(DateTime.Parse("2019-06-19 23:23:23"));
  59. msgpackWriter.WriteDateTime5(DateTime.Parse("2019-06-19 23:23:23.123"));
  60. msgpackWriter.WriteDateTime6(DateTime.Parse("2019-06-19 23:23:23"));
  61. msgpackWriter.WriteEnd();
  62. msgpackWriter.WriteEncode();
  63. //===========output=========
  64. //WriteDateTime4=>YYYYMMDD=>20 19 06 19
  65. //WriteDateTime5=>HH-mm-ss-fff|HH-mm-ss-msms=>23 23 23 01 23
  66. //WriteDateTime6=>yyMMddHHmmss=>19 23 23 23
  67. //Unencode:
  68. //7E2019061923232312301906192323237E
  69. //Encode
  70. //7E 20 19 06 19 23 23 23 01 23 19 06 19 23 23 23 7E
  71. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  72. Assert.Equal("7E2019061923232301231906192323237E".Replace(" ", ""), encodeBytes);
  73. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  74. Assert.Equal("7E2019061923232301231906192323237E7E2019061923232301231906192323237E", realBytes);
  75. }
  76. [Fact]
  77. public void WriteUTCDateTimeTest()
  78. {
  79. byte[] array = new byte[4096];
  80. var msgpackWriter = new JT808MessagePackWriter(array);
  81. msgpackWriter.WriteUTCDateTime(DateTime.Parse("2019-06-21 23:23:23"));
  82. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  83. Assert.Equal("000000005D0CF66B", encodeBytes);
  84. }
  85. [Fact]
  86. public void WriteBCDTest1()
  87. {
  88. byte[] array = new byte[4096];
  89. var msgpackWriter = new JT808MessagePackWriter(array);
  90. msgpackWriter.WriteStart();
  91. msgpackWriter.WriteBCD("1234567890", 10);
  92. msgpackWriter.WriteEnd();
  93. msgpackWriter.WriteEncode();
  94. //7E 12 34 56 78 90 7E 7E 12 34 56 78 90 7E
  95. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  96. Assert.Equal("7E 12 34 56 78 90 7E 7E 12 34 56 78 90 7E".Replace(" ", ""), realBytes);
  97. }
  98. [Fact]
  99. public void WriteBCDTest2()
  100. {
  101. byte[] array = new byte[4096];
  102. var msgpackWriter = new JT808MessagePackWriter(array);
  103. msgpackWriter.WriteStart();
  104. msgpackWriter.WriteBCD("1234567890", 5);
  105. msgpackWriter.WriteEnd();
  106. msgpackWriter.WriteEncode();
  107. //7E 12 34 7E 7E 12 34 7E
  108. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  109. Assert.Equal("7E 12 34 7E 7E 12 34 7E".Replace(" ", ""), realBytes);
  110. }
  111. [Fact]
  112. public void WriteBCDTest3()
  113. {
  114. byte[] array = new byte[4096];
  115. var msgpackWriter = new JT808MessagePackWriter(array);
  116. msgpackWriter.WriteStart();
  117. msgpackWriter.WriteBCD("123", 5);
  118. msgpackWriter.WriteEnd();
  119. msgpackWriter.WriteEncode();
  120. //7E 00 12 7E 7E 00 12 7E
  121. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  122. Assert.Equal("7E 00 12 7E 7E 00 12 7E".Replace(" ", ""), realBytes);
  123. }
  124. [Theory]
  125. [InlineData("smallchi(Koike)")]
  126. public void WriteStringTest(string str)
  127. {
  128. byte[] array = new byte[4096];
  129. var msgpackWriter = new JT808MessagePackWriter(array);
  130. msgpackWriter.WriteStart();
  131. msgpackWriter.WriteString(str);
  132. msgpackWriter.WriteEnd();
  133. msgpackWriter.WriteEncode();
  134. byte[] strBytes = JT808Constants.Encoding.GetBytes(str);
  135. var strHex = strBytes.ToHexString();
  136. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  137. //7E736D616C6C636869284B6F696B65297E7E736D616C6C636869284B6F696B65297E
  138. Assert.StartsWith(strHex, realBytes.Substring(2));
  139. Assert.Equal("7E736D616C6C636869284B6F696B65297E7E736D616C6C636869284B6F696B65297E", realBytes);
  140. }
  141. [Theory]
  142. [InlineData("ABCDEF1234")]
  143. public void WriteHexTest(string hexStr)
  144. {
  145. byte[] array = new byte[4096];
  146. var msgpackWriter = new JT808MessagePackWriter(array);
  147. msgpackWriter.WriteStart();
  148. msgpackWriter.WriteHex(hexStr, 16);
  149. msgpackWriter.WriteEnd();
  150. msgpackWriter.WriteEncode();
  151. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  152. //7E0000000000000000000000ABCDEF12347E7E0000000000000000000000ABCDEF12347E
  153. Assert.StartsWith("0000000000000000000000ABCDEF1234", realBytes.Substring(2));
  154. Assert.Equal("7E0000000000000000000000ABCDEF12347E7E0000000000000000000000ABCDEF12347E", realBytes);
  155. }
  156. [Theory]
  157. [InlineData(new byte[] { 0x01, 0x02, 0x03 })]
  158. public void WriteArrayTest(byte[] dara)
  159. {
  160. byte[] array = new byte[4096];
  161. var msgpackWriter = new JT808MessagePackWriter(array);
  162. msgpackWriter.WriteStart();
  163. msgpackWriter.WriteArray(dara);
  164. msgpackWriter.WriteEnd();
  165. msgpackWriter.WriteEncode();
  166. //===========output=========
  167. //Unencode:
  168. //7E 01 02 03 7E
  169. //Encode
  170. //7E 01 02 03 7E
  171. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  172. Assert.Equal("7E 01 02 03 7E 7E 01 02 03 7E".Replace(" ",""), realBytes);
  173. }
  174. [Fact]
  175. public void WriteNumericalTest()
  176. {
  177. byte[] array = new byte[4096];
  178. var msgpackWriter = new JT808MessagePackWriter(array);
  179. msgpackWriter.WriteStart();
  180. msgpackWriter.WriteByte(0x01);
  181. msgpackWriter.WriteUInt16(16);
  182. msgpackWriter.WriteInt32(32);
  183. msgpackWriter.WriteUInt32(64);
  184. msgpackWriter.WriteEnd();
  185. msgpackWriter.WriteEncode();
  186. //===========output=========
  187. //Unencode:
  188. //7E 01 00 10 00 00 00 20 00 00 00 40 7E
  189. //Encode
  190. //7E 01 00 10 00 00 00 20 00 00 00 40 7E
  191. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  192. Assert.Equal("7E 01 00 10 00 00 00 20 00 00 00 40 7E 7E 01 00 10 00 00 00 20 00 00 00 40 7E".Replace(" ", ""), realBytes);
  193. }
  194. [Theory]
  195. [InlineData(5)]
  196. public void SkipTest(int count)
  197. {
  198. byte[] array = new byte[4096];
  199. var msgpackWriter = new JT808MessagePackWriter(array);
  200. msgpackWriter.WriteStart();
  201. msgpackWriter.Skip(count, out int position);
  202. msgpackWriter.WriteEnd();
  203. msgpackWriter.WriteEncode();
  204. //===========output=========
  205. //Unencode:
  206. //7E 00 00 00 00 00 7E
  207. //Encode
  208. //7E 00 00 00 00 00 7E
  209. Assert.Equal(1, position);
  210. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  211. Assert.Equal("7E 00 00 00 00 00 7E 7E 00 00 00 00 00 7E".Replace(" ",""), realBytes);
  212. }
  213. [Theory]
  214. [InlineData(5,0xFF)]
  215. public void CustomSkipTest(int count,byte fullValue)
  216. {
  217. byte[] array = new byte[4096];
  218. var msgpackWriter = new JT808MessagePackWriter(array);
  219. msgpackWriter.WriteStart();
  220. msgpackWriter.Skip(count, out int position, fullValue);
  221. msgpackWriter.WriteEnd();
  222. msgpackWriter.WriteEncode();
  223. //===========output=========
  224. //Unencode:
  225. //7E FF FF FF FF FF 7E
  226. //Encode
  227. //7E FF FF FF FF FF 7E
  228. Assert.Equal(1, position);
  229. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  230. Assert.Equal("7E FF FF FF FF FF 7E 7E FF FF FF FF FF 7E".Replace(" ", ""), realBytes);
  231. }
  232. [Fact]
  233. public void NilTest()
  234. {
  235. byte[] array = new byte[4096];
  236. var msgpackWriter = new JT808MessagePackWriter(array);
  237. msgpackWriter.WriteStart();
  238. msgpackWriter.Nil(out int position);
  239. msgpackWriter.WriteEnd();
  240. msgpackWriter.WriteEncode();
  241. Assert.Equal(1, position);
  242. //===========output=========
  243. //Unencode:
  244. //7E 00 7E
  245. //Encode
  246. //7E 00 7E
  247. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  248. Assert.Equal("7E 00 7E 7E 00 7E".Replace(" ", ""), realBytes);
  249. }
  250. [Theory]
  251. [InlineData(1, 12)]
  252. public void WriteXorTest1(int start,int end)
  253. {
  254. byte[] array = new byte[4096];
  255. var msgpackWriter = new JT808MessagePackWriter(array);
  256. msgpackWriter.WriteStart();
  257. msgpackWriter.WriteArray("02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01".ToHexBytes());
  258. msgpackWriter.WriteXor(start, end);
  259. msgpackWriter.WriteEnd();
  260. msgpackWriter.WriteEncode();
  261. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  262. Assert.NotEqual("13", realBytes.Substring(realBytes.Length-4, 2));
  263. }
  264. [Theory]
  265. [InlineData(12, 1)]
  266. public void WriteXorTest2(int start, int end)
  267. {
  268. Assert.Throws<ArgumentOutOfRangeException>(() =>
  269. {
  270. byte[] array = new byte[4096];
  271. var msgpackWriter = new JT808MessagePackWriter(array);
  272. msgpackWriter.WriteStart();
  273. msgpackWriter.WriteXor(start, end);
  274. msgpackWriter.WriteEnd();
  275. msgpackWriter.WriteEncode();
  276. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  277. });
  278. }
  279. [Fact]
  280. public void WriteXorTest3()
  281. {
  282. byte[] array = new byte[4096];
  283. var msgpackWriter = new JT808MessagePackWriter(array);
  284. msgpackWriter.WriteStart();
  285. msgpackWriter.WriteArray("02 00 00 26 12 34 56 78 90 12 00 7D 02 00 00 00 01 00 00 00 02 00 BA 7F 0E 07 E4 F1 1C 00 28 00 3C 00 00 18 10 15 10 10 10 01 04 00 00 00 64 02 02 00 7D 01".ToHexBytes());
  286. msgpackWriter.WriteXor();
  287. msgpackWriter.WriteEnd();
  288. msgpackWriter.WriteEncode();
  289. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  290. Assert.Equal("13", realBytes.Substring(realBytes.Length - 4, 2));
  291. }
  292. [Theory]
  293. [InlineData(1,0x02,
  294. 2,8,
  295. 4,9,
  296. 6,"654321",
  297. 3,new byte[] { 0x01,0x02,0x03})]
  298. public void WriteReturnTest(
  299. int skipbyte, byte writeNewByte,
  300. int skipInt16, ushort writeNewInt16,
  301. int skipInt32, int writeNewInt32,
  302. int skipString, string writeNewString,
  303. int skipArray3, byte[] writeNewArray)
  304. {
  305. byte[] array = new byte[4096];
  306. var msgpackWriter = new JT808MessagePackWriter(array);
  307. msgpackWriter.WriteStart();
  308. msgpackWriter.Skip(skipbyte, out var position1);
  309. msgpackWriter.Skip(skipInt16, out var position2);
  310. msgpackWriter.Skip(skipInt32, out var position3);
  311. msgpackWriter.Skip(skipString, out var position4);
  312. msgpackWriter.Skip(skipArray3, out var position5);
  313. msgpackWriter.WriteEnd();
  314. msgpackWriter.WriteEncode();
  315. //===========skip output=========
  316. //Unencode:
  317. //7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E
  318. //Encode
  319. //7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E
  320. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  321. Assert.Equal("7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E".Replace(" ", ""), realBytes);
  322. msgpackWriter.WriteByteReturn(writeNewByte, position1);
  323. msgpackWriter.WriteUInt16Return(writeNewInt16, position2);
  324. msgpackWriter.WriteInt32Return(writeNewInt32, position3);
  325. msgpackWriter.WriteBCDReturn(writeNewString, skipString, position4);
  326. msgpackWriter.WriteArrayReturn(writeNewArray, position5);
  327. //===========write return output=========
  328. //7E 02 00 08 00 00 00 09 65 43 21 00 00 00 01 02 03 7E
  329. var writeRealBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  330. Assert.Equal("7E 02 00 08 00 00 00 09 65 43 21 00 00 00 01 02 03 7E 7E 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7E".Replace(" ", ""), writeRealBytes);
  331. }
  332. [Fact]
  333. public void WriteUInt64Test()
  334. {
  335. byte[] array = new byte[4096];
  336. var msgpackWriter = new JT808MessagePackWriter(array);
  337. msgpackWriter.WriteUInt64(1008611);
  338. var hex = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  339. //00 00 00 00 00 0F 63 E3
  340. Assert.Equal("00 00 00 00 00 0F 63 E3".Replace(" ", ""), hex);
  341. }
  342. [Theory]
  343. [InlineData("123456789")]
  344. public void WriteBigNumberTest(string numStr)
  345. {
  346. byte[] array = new byte[4096];
  347. var msgpackWriter = new JT808MessagePackWriter(array);
  348. msgpackWriter.WriteBigNumber(numStr, numStr.Length);
  349. var hex = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  350. Assert.Equal("0000000000075BCD15", hex);
  351. }
  352. [Theory]
  353. [InlineData(100000)]
  354. //[InlineData(1000000)]
  355. //[InlineData(10000000)]
  356. //[InlineData(100000000)]
  357. public void ArrayPoolTest1(int count)
  358. {
  359. var arrayPool = ArrayPool<byte>.Create();
  360. while (count>=0)
  361. {
  362. var buffer = arrayPool.Rent(65535);
  363. var msgpackWriter = new JT808MessagePackWriter(buffer);
  364. try
  365. {
  366. msgpackWriter.WriteStart();
  367. msgpackWriter.WriteInt32(16);
  368. msgpackWriter.WriteEnd();
  369. msgpackWriter.WriteEncode();
  370. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  371. Assert.Equal("7E 00 00 00 10 7E 7E 00 00 00 10 7E".Replace(" ", ""), realBytes);
  372. }
  373. catch (Exception)
  374. {
  375. }
  376. finally
  377. {
  378. arrayPool.Return(buffer);
  379. count--;
  380. }
  381. }
  382. }
  383. [Fact]
  384. public void WriteASCII()
  385. {
  386. byte[] array = new byte[4096];
  387. byte[] array1 = new byte[] { 0x53,0x56,0x31,0x2E,0x31,0x2E,0x30 };
  388. var msgpackWriter = new JT808MessagePackWriter(array);
  389. msgpackWriter.WirteASCII("SV1.1.0");
  390. var writeRealBytes = msgpackWriter.FlushAndGetRealArray();
  391. Assert.Equal(array1, writeRealBytes);
  392. }
  393. [Fact]
  394. public void CompositeTest1()
  395. {
  396. byte[] array = new byte[4096];
  397. var msgpackWriter = new JT808MessagePackWriter(array);
  398. msgpackWriter.WriteStart();
  399. msgpackWriter.WriteByte(0x01);
  400. msgpackWriter.WriteByte(0x7E);
  401. msgpackWriter.WriteByte(0x7d);
  402. msgpackWriter.WriteEnd();
  403. msgpackWriter.WriteEncode();
  404. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  405. Assert.Equal("7E017D027D017E", encodeBytes);
  406. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  407. Assert.Equal("7E017E7D7E7E017D027D017E", realBytes);
  408. }
  409. [Fact]
  410. public void CompositeTest2()
  411. {
  412. byte[] array = new byte[4096];
  413. var msgpackWriter = new JT808MessagePackWriter(array);
  414. msgpackWriter.WriteStart();
  415. msgpackWriter.WriteByte(0x01);
  416. msgpackWriter.WriteByte(0x7E);
  417. msgpackWriter.Nil(out int nilPosition);
  418. Assert.Equal(3, nilPosition);
  419. msgpackWriter.WriteByte(0x7d);
  420. msgpackWriter.WriteBCD("123456789", 10);
  421. msgpackWriter.Skip(5, out int skipPostion);
  422. Assert.Equal(10, skipPostion);
  423. msgpackWriter.WriteEnd();
  424. msgpackWriter.WriteEncode();
  425. //===========output=========
  426. //Unencode:
  427. //7E 01 7E 00 7D 01 23 45 67 89 00 00 00 00 00 7E
  428. //Encode
  429. //7E 01 7D 02 00 7D 01 01 23 45 67 89 00 00 00 00 00 7E
  430. //7E 01 7D 02 00 7D 01 01 00 23 00 45 00 00 00 00 00 7E
  431. var encodeBytes = msgpackWriter.FlushAndGetEncodingArray().ToHexString();
  432. Assert.Equal("7E 01 7D 02 00 7D 01 01 23 45 67 89 00 00 00 00 00 7E".Replace(" ", ""), encodeBytes);
  433. var realBytes = msgpackWriter.FlushAndGetRealArray().ToHexString();
  434. Assert.Equal("7E 01 7E 00 7D 01 23 45 67 89 00 00 00 00 00 7E 7E 01 7D 02 00 7D 01 01 23 45 67 89 00 00 00 00 00 7E".Replace(" ", ""), realBytes);
  435. }
  436. [Fact]
  437. public void VersionTest1()
  438. {
  439. byte[] array = new byte[4096];
  440. var msgpackWriter = new JT808MessagePackWriter(array);
  441. Assert.Equal(JT808Version.JTT2013, msgpackWriter.Version);
  442. msgpackWriter.Version = JT808Version.JTT2019;
  443. Assert.Equal(JT808Version.JTT2019, msgpackWriter.Version);
  444. }
  445. [Fact]
  446. public void WriteInt16Test1()
  447. {
  448. byte[] array1 = new byte[2];
  449. byte[] array2= new byte[2];
  450. BinaryPrimitives.WriteInt16BigEndian(array1, -1233);
  451. short a = -1233;
  452. BinaryPrimitives.WriteUInt16BigEndian(array2, (ushort)a);
  453. Assert.Equal(array1, array2);
  454. }
  455. }
  456. }