StateMachineMessageCutterUnitTest.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. using System;
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3. using System.Linq;
  4. using HengShan_Pump_NonIC;
  5. using HengShan_Pump_NonIC.MessageEntity;
  6. using Edge.Core.Parser.BinaryParser.Util;
  7. using System.Collections.Generic;
  8. namespace Test_HengShan_Pump_NonIC
  9. {
  10. [TestClass]
  11. public class StateMachineMessageCutterUnitTest
  12. {
  13. public static bool ValueEquals(IEnumerable<byte> array1, IEnumerable<byte> array2)
  14. {
  15. if (array1 == null && array2 == null)
  16. {
  17. return true;
  18. }
  19. if ((array1 == null) || (array2 == null))
  20. {
  21. return false;
  22. }
  23. if (array1.Count() != array2.Count())
  24. {
  25. return false;
  26. }
  27. if (array1.Equals(array2))
  28. {
  29. return true;
  30. }
  31. else
  32. {
  33. for (int Index = 0; Index < array1.Count(); Index++)
  34. {
  35. if (!Equals(array1.ElementAt(Index), array2.ElementAt(Index)))
  36. {
  37. return false;
  38. }
  39. }
  40. }
  41. return true;
  42. }
  43. [TestMethod]
  44. public void ShouldCutTest1()
  45. {
  46. var cutter = new StateMachineMessageCutter();
  47. int onMsgCutCalledTimes = 0;
  48. byte[] msg = null;
  49. cutter.OnMessageCut += (s, a) =>
  50. {
  51. onMsgCutCalledTimes++;
  52. msg = cutter.Message;
  53. };
  54. string rawRealCompleteMsg = "FF 12 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0";
  55. cutter.Feed(rawRealCompleteMsg.ToBytes());
  56. Assert.AreEqual(true, onMsgCutCalledTimes == 1);
  57. Assert.AreEqual(true, ValueEquals(msg, rawRealCompleteMsg.ToBytes()));
  58. }
  59. [TestMethod]
  60. public void ShouldCutTest2()
  61. {
  62. StateMachineMessageCutter cutter = new StateMachineMessageCutter();
  63. int onMsgCutCalledTimes = 0;
  64. byte[] msg = null;
  65. cutter.OnMessageCut += (s, a) =>
  66. {
  67. onMsgCutCalledTimes++;
  68. msg = cutter.Message;
  69. };
  70. string rawRealCompleteMsg = "FF 12 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0";
  71. string rawRealMsgWithExtraHeaderAndTail = "aa" + rawRealCompleteMsg + "bb";
  72. cutter.Feed(rawRealMsgWithExtraHeaderAndTail.ToBytes());
  73. Assert.AreEqual(true, onMsgCutCalledTimes == 1);
  74. Assert.AreEqual(true, ValueEquals(msg, rawRealCompleteMsg.ToBytes()));
  75. }
  76. [TestMethod]
  77. public void ShouldCutTest3()
  78. {
  79. StateMachineMessageCutter cutter = new StateMachineMessageCutter();
  80. int onMsgCutCalledTimes = 0;
  81. byte[] msg = null;
  82. cutter.OnMessageCut += (s, a) =>
  83. {
  84. onMsgCutCalledTimes++;
  85. msg = cutter.Message;
  86. };
  87. string rawRealCompleteMsg = "FF 12 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0";
  88. string rawRealMsgWithExtraHeaderAndTail = "aa" + rawRealCompleteMsg + "bb";
  89. cutter.Feed(rawRealMsgWithExtraHeaderAndTail.ToBytes());
  90. Assert.AreEqual(true, onMsgCutCalledTimes == 1);
  91. Assert.AreEqual(true, ValueEquals(msg, rawRealCompleteMsg.ToBytes()));
  92. }
  93. [TestMethod]
  94. public void ShouldCutTest4()
  95. {
  96. StateMachineMessageCutter cutter = new StateMachineMessageCutter();
  97. int onMsgCutCalledTimes = 0;
  98. List<byte[]> messages = new List<byte[]>();
  99. cutter.OnMessageCut += (s, a) =>
  100. {
  101. onMsgCutCalledTimes++;
  102. messages.Add(cutter.Message);
  103. };
  104. List<string> rawRealCompleteMessages = new List<string>();
  105. rawRealCompleteMessages.Add("FF 12 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0");
  106. rawRealCompleteMessages.Add("FF 03 A0 00 00");
  107. string rawRealMsgWithExtraHeaderAndTail = "aabc"
  108. + rawRealCompleteMessages.Aggregate((acc, n) => acc + n)
  109. + "1122bb";
  110. cutter.Feed(rawRealMsgWithExtraHeaderAndTail.ToBytes());
  111. Assert.AreEqual(true, onMsgCutCalledTimes == rawRealCompleteMessages.Count);
  112. for (int i = 0; i < rawRealCompleteMessages.Count; i++)
  113. Assert.AreEqual(true, ValueEquals(messages[i], rawRealCompleteMessages[i].ToBytes()));
  114. }
  115. [TestMethod]
  116. public void ShouldCutTest5()
  117. {
  118. StateMachineMessageCutter cutter = new StateMachineMessageCutter();
  119. int onMsgCutCalledTimes = 0;
  120. List<byte[]> messages = new List<byte[]>();
  121. cutter.OnMessageCut += (s, a) =>
  122. {
  123. onMsgCutCalledTimes++;
  124. messages.Add(cutter.Message);
  125. };
  126. List<string> rawRealCompleteMessages = new List<string>();
  127. rawRealCompleteMessages.Add("FF 12 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0");
  128. rawRealCompleteMessages.Add("FF 03 A0 00 00");
  129. rawRealCompleteMessages.Add("FF 05 A0 00 00 00 00");
  130. rawRealCompleteMessages.Add("FF 10 A0 00 00 10 A0 00 00 10 A0 00 00 10 A0 00 00 10");
  131. string rawRealMsgWithExtraHeaderAndTail = "aabc"
  132. + rawRealCompleteMessages.Aggregate((acc, n) => acc + n)
  133. + "1122bb";
  134. cutter.Feed(rawRealMsgWithExtraHeaderAndTail.ToBytes());
  135. Assert.AreEqual(true, onMsgCutCalledTimes == rawRealCompleteMessages.Count);
  136. for (int i = 0; i < rawRealCompleteMessages.Count; i++)
  137. Assert.AreEqual(true, ValueEquals(messages[i], rawRealCompleteMessages[i].ToBytes()));
  138. }
  139. [TestMethod]
  140. public void ShouldCutTest_Negative0()
  141. {
  142. StateMachineMessageCutter cutter = new StateMachineMessageCutter();
  143. int onMsgCutCalledTimes = 0;
  144. byte[] msg = null;
  145. cutter.OnMessageCut += (s, a) =>
  146. {
  147. onMsgCutCalledTimes++;
  148. msg = cutter.Message;
  149. };
  150. string rawRealCompleteMsg = "FF 12 A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0";
  151. // dumplicate `FF` will make cutter consider the 2nd `FF` as the MsgLen.
  152. string rawRealMsgWithExtraHeaderAndTail = "FF" + rawRealCompleteMsg + "bbFF";
  153. cutter.Feed(rawRealMsgWithExtraHeaderAndTail.ToBytes());
  154. Assert.AreEqual(true, onMsgCutCalledTimes == 0);
  155. Assert.AreEqual(true, msg == null);
  156. }
  157. [TestMethod]
  158. public void ShouldCutTest_Negative1()
  159. {
  160. StateMachineMessageCutter cutter = new StateMachineMessageCutter();
  161. int onMsgCutCalledTimes = 0;
  162. byte[] msg = null;
  163. cutter.OnMessageCut += (s, a) =>
  164. {
  165. onMsgCutCalledTimes++;
  166. msg = cutter.Message;
  167. };
  168. string rawRealCompleteMsg = "FF 03 A0 00 00";
  169. string rawRealMsgWithExtraHeaderAndTail = "FF03aa" + rawRealCompleteMsg;
  170. cutter.Feed(rawRealMsgWithExtraHeaderAndTail.ToBytes());
  171. Assert.AreEqual(true, onMsgCutCalledTimes == 1);
  172. Assert.AreEqual(true, ValueEquals(msg, "FF03aa FF 03".ToBytes()));
  173. }
  174. [TestMethod]
  175. public void ShouldCutTest_Negative2()
  176. {
  177. StateMachineMessageCutter cutter = new StateMachineMessageCutter();
  178. int onMsgCutCalledTimes = 0;
  179. List<byte[]> messages = new List<byte[]>();
  180. cutter.OnMessageCut += (s, a) =>
  181. {
  182. onMsgCutCalledTimes++;
  183. messages.Add(cutter.Message);
  184. };
  185. /* the 2nd `FF` will be caught and included in a msg body, the next cut will only start by seeing another `FF`*/
  186. string rawRealCompleteMsg = "FF 03 A0 00 00";
  187. string rawRealMsgWithExtraHeaderAndTail = "FF02aa" + rawRealCompleteMsg + "FF0100";
  188. cutter.Feed(rawRealMsgWithExtraHeaderAndTail.ToBytes());
  189. Assert.AreEqual(true, onMsgCutCalledTimes == 2);
  190. Assert.AreEqual(true, ValueEquals(messages[0], "FF02aa FF".ToBytes()));
  191. Assert.AreEqual(true, ValueEquals(messages[1], "FF0100".ToBytes()));
  192. }
  193. }
  194. }