ProtocolMessageTest.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using Dfs.WayneChina.GilbarcoDispenserPayTerminal.MessageEntities.Incoming;
  2. using Dfs.WayneChina.GilbarcoDispenserPayTerminal.MessageEntities.Outgoing;
  3. using Microsoft.VisualStudio.TestTools.UnitTesting;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Diagnostics;
  7. using System.Linq;
  8. namespace GilbarcoDispenserPayTerminal_Test
  9. {
  10. [TestClass]
  11. public class ProtocolMessageTest
  12. {
  13. private Dfs.WayneChina.GilbarcoDispenserPayTerminal.Parser parser = new Dfs.WayneChina.GilbarcoDispenserPayTerminal.Parser();
  14. #region Incoming message binary
  15. private byte[] serializedCheckCmd = new byte[]
  16. {
  17. 0xFA,0x23,0xE0,0x45,0x00,0x17,0x30,0x20,0x20,0x08,0x07,0x11,0x15,0x04,0x00,0x01,
  18. 0x10,0x01,0x06,0x23,0x10,0x00,0x00,0x73,0x94
  19. };
  20. private byte[] crcWithDoubleFA = new byte[]
  21. {
  22. 0xFA,0x23,0xE0,0x4A,0x00,0x17,0x30,0x20,0x20,0x08,0x07,0x11,0x18,0x47,0x00,0x01,
  23. 0x10,0x01,0x06,0x23,0x10,0x00,0x00,0xFA,0xFA,0x09
  24. };
  25. private byte[] infoCmdNormalBytes = new byte[]
  26. {
  27. 0xFA,0xE0,0x23,0x49,0x00,0x02,0x31,0x00,0x03,0x8F
  28. };
  29. private byte[] infoCmdWithCardBytes = new byte[]
  30. {
  31. 0xFA,0xE0,0x23,0x48,0x00,0x21,0x31,0x01,0x01,0x01,0x10,0x01,0x02,0x05,0x10,0x10,
  32. 0x00,0x00,0x00,0x00,0x42,0x00,0x00,0xFF,0xD6,0x03,0xCA,0xB5,0x54
  33. };
  34. private byte[] infoCmdWithFillingStatusBytes = new byte[]
  35. {
  36. 0xFA,0xE0,0x23,0x45,0x00,0x13,0x31,0x01,0x02,0x01,0x00,0x00,0x04,0x17,0x00,0x00,
  37. 0xC3,0x02,0x19,0x02,0xAC
  38. };
  39. private byte[] transactionDataBytes = new byte[]
  40. {
  41. 0xFA,0xE0,0x23,0x45,0x00,0x96,0x32,0x00,0x00,0x1B,0xAD,0x50,0x20,0x20,0x08,0x07,
  42. 0x11,0x14,0x56,0x01,0x02,0x05,0x10,0x10,0x00,0x00,0x00,0x00,0x42,0xFF,0xD5,0xFF,
  43. 0x98,0x00,0x04,0x32,0x02,0xDF,0xE6,0x2D,0x52,0x81,0x00,0x00,0x00,0x00,0x00,0x00,
  44. 0x00,0x00,0x01,0x02,0x10,0x10,0x10,0x09,0x00,0x00,0x00,0x46,0x13,0x01,0x00,0x00,
  45. 0x00,0x46,0x00,0x00,0x09,0x21,0x00,0x00,0x00,0x11,0x01,0x20,0x30,0x00,0x00,0xC8,
  46. 0x02,0x19,0x04,0x01,0xD4,0x1B,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  47. 0x00,0x00,0x11,0x62,0x7F,0xEF,0x74,0xA7
  48. };
  49. private byte[] transData = new byte[]
  50. {
  51. 0xFA,0xE0,0x22,0x47,0x00,0x96,0x32,0x00,0x00,0x1B,0xD9,0x50,0x20,0x20,0x08,0x24,
  52. 0x14,0x43,0x32,0x01,0x02,0x05,0x10,0x10,0x00,0x00,0x00,0x00,0x42,0xFF,0xD5,0xE3,
  53. 0x51,0x00,0x02,0x20,0x02,0xE6,0x05,0xF3,0x72,0xE5,0x00,0x00,0x00,0x00,0x00,0x00,
  54. 0x00,0x00,0x01,0x02,0x10,0x10,0x10,0x09,0x00,0x00,0x00,0x46,0x13,0x01,0x00,0x00,
  55. 0x00,0x46,0x00,0x00,0x09,0x39,0x00,0x00,0x00,0x11,0x01,0x20,0x30,0x00,0x00,0x64,
  56. 0x02,0x20,0x04,0x01,0xD5,0x2B,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  57. 0x00,0x00,0x74,0x6A,0x5E,0x20,0x21,0x2D
  58. };
  59. private byte[] infoCmdWithDoubleFA = new byte[]
  60. {
  61. 0xFA,0xE0,0x22,0x5E,0x00,0x02,0x31,0x00,0xD1,0xFA,0xFA
  62. };
  63. #endregion
  64. [TestMethod]
  65. public void Check_command_serialized_ok()
  66. {
  67. CheckCommand checkCommand = new CheckCommand();
  68. checkCommand.DestinationAddress = 0x23;
  69. checkCommand.SourceAddress = 0xE0;
  70. checkCommand.FrameSqNoByte = 0x45;
  71. checkCommand.Time = 20200807111504;
  72. checkCommand.BaseBlacklistVersion = 1;
  73. checkCommand.AddBlacklistVersion = 0x10;
  74. checkCommand.DeleteBlacklistVersion = 1;
  75. checkCommand.WhitelistVersion = 6;
  76. checkCommand.PriceVersion = 0x23;
  77. checkCommand.StationGeneralInfoVersion = 0x10;
  78. checkCommand.PrivateDataDownloadFlag = 0;
  79. checkCommand.SoftwareDownloadFlag = 0;
  80. var bytes = parser.Serialize(checkCommand);
  81. Assert.IsTrue(ValueEquals(serializedCheckCmd, bytes));
  82. }
  83. [TestMethod]
  84. public void Double_FA_in_crc_is_inserted_ok()
  85. {
  86. CheckCommand checkCommand = new CheckCommand();
  87. checkCommand.DestinationAddress = 0x23;
  88. checkCommand.SourceAddress = 0xE0;
  89. checkCommand.FrameSqNoByte = 0x4A;
  90. checkCommand.Time = 20200807111847;
  91. checkCommand.BaseBlacklistVersion = 1;
  92. checkCommand.AddBlacklistVersion = 0x10;
  93. checkCommand.DeleteBlacklistVersion = 1;
  94. checkCommand.WhitelistVersion = 6;
  95. checkCommand.PriceVersion = 0x23;
  96. checkCommand.StationGeneralInfoVersion = 0x10;
  97. checkCommand.PrivateDataDownloadFlag = 0;
  98. checkCommand.SoftwareDownloadFlag = 0;
  99. var bytes = parser.Serialize(checkCommand);
  100. Assert.IsTrue(ValueEquals(crcWithDoubleFA, bytes));
  101. }
  102. [TestMethod]
  103. public void Normal_info_cmd_parsed_ok()
  104. {
  105. var msg = parser.Deserialize(infoCmdNormalBytes);
  106. var infoCmd = msg as InfoCommand;
  107. Assert.AreEqual(0, infoCmd.Count);
  108. }
  109. [TestMethod]
  110. public void Info_command_with_double_FA_parsed_ok()
  111. {
  112. var msg = parser.Deserialize(infoCmdWithDoubleFA);
  113. var infoCmd = msg as InfoCommand;
  114. Assert.AreEqual(0, infoCmd.Count);
  115. }
  116. [TestMethod]
  117. public void Info_cmd_with_card_parsed_ok()
  118. {
  119. var msg = parser.Deserialize(infoCmdWithCardBytes);
  120. var infoCmd = msg as InfoCommand;
  121. Assert.AreEqual(1, infoCmd.Count);
  122. Assert.AreEqual(1, infoCmd.CardInsertedStates.Count);
  123. Assert.AreEqual("01020510100000000042", infoCmd.CardInsertedStates[0].ASN);
  124. }
  125. [TestMethod]
  126. public void Info_cmd_with_filling_status_parsed_ok()
  127. {
  128. var msg = parser.Deserialize(infoCmdWithFillingStatusBytes);
  129. var infoCmd = msg as InfoCommand;
  130. Assert.AreEqual(1, infoCmd.Count);
  131. Assert.AreEqual(537, infoCmd.NozzleOperatingStates[0].PRC);
  132. }
  133. [TestMethod]
  134. public void Transaction_data_is_parsed_ok()
  135. {
  136. var msg = parser.Deserialize(transactionDataBytes);
  137. var transactionDataCmd = msg as TransactionData;
  138. Assert.IsNotNull(transactionDataCmd);
  139. Assert.AreEqual(0x1BAD, transactionDataCmd.PosTtc);
  140. Assert.AreEqual("FFD5FF98", transactionDataCmd.Balance);
  141. Assert.AreEqual("20200807111456", transactionDataCmd.TransTime);
  142. Assert.AreEqual("01020510100000000042", transactionDataCmd.Asn);
  143. Assert.AreEqual(0x432, transactionDataCmd.Amount);
  144. Assert.AreEqual(2030, transactionDataCmd.GoodsCode);
  145. Assert.AreEqual(1, transactionDataCmd.NozzleNo);
  146. Assert.AreEqual(0xC8, transactionDataCmd.Volume);
  147. Assert.AreEqual(0x219, transactionDataCmd.Price);
  148. Assert.AreEqual(0x2DF, transactionDataCmd.Ctc);
  149. Assert.IsTrue(ValueEquals(new byte[2] { 0x74, 0xA7 }, transactionDataCmd.CRC));
  150. }
  151. [TestMethod]
  152. public void Trans_data_crc_ok()
  153. {
  154. var msg = parser.Deserialize(transData);
  155. var transDataCmd = msg as TransactionData;
  156. Assert.IsTrue(ValueEquals(new byte[2] { 0x21, 0x2D }, transDataCmd.CRC));
  157. }
  158. #region Helper method
  159. public static bool ValueEquals(IEnumerable<byte> array1, IEnumerable<byte> array2)
  160. {
  161. if (array1 == null && array2 == null)
  162. {
  163. return true;
  164. }
  165. if ((array1 == null) || (array2 == null))
  166. {
  167. return false;
  168. }
  169. if (array1.Count() != array2.Count())
  170. {
  171. return false;
  172. }
  173. if (array1.Equals(array2))
  174. {
  175. return true;
  176. }
  177. else
  178. {
  179. for (int Index = 0; Index < array1.Count(); Index++)
  180. {
  181. if (!Equals(array1.ElementAt(Index), array2.ElementAt(Index)))
  182. {
  183. return false;
  184. }
  185. }
  186. }
  187. return true;
  188. }
  189. public byte[] StringToByteArray(string hex)
  190. {
  191. int numberChars = hex.Length;
  192. byte[] bytes = new byte[numberChars / 2];
  193. for (int i = 0; i < numberChars; i += 2)
  194. bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
  195. return bytes;
  196. }
  197. public static string ByteArrayToString(byte[] ba)
  198. {
  199. return BitConverter.ToString(ba).Replace("-", "");
  200. }
  201. #endregion
  202. }
  203. }