ProcessorInstanceCreatorUnitTest.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. using Edge.Core.Database.Configuration.Models;
  2. using Edge.Core.IndustryStandardInterface.Pump;
  3. using Edge.Core.Processor;
  4. using Edge.Core.Processor.Communicator;
  5. using Edge.Core.Processor.Dispatcher;
  6. using Edge.Core.Processor.Dispatcher.Attributes;
  7. using Microsoft.Extensions.DependencyInjection;
  8. using Microsoft.VisualStudio.TestTools.UnitTesting;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using Wayne_Pump_Dart;
  15. namespace Edge.Core.Test
  16. {
  17. [TestClass]
  18. public class ProcessorInstanceCreatorUnitTest
  19. {
  20. public class PumpGroupHandler_WithoutMetaPartAttribute : PumpGroupHandler
  21. {
  22. public PumpGroupHandler_WithoutMetaPartAttribute(int amountDecimalDigits, int volumeDecimalDigits,
  23. int priceDecimalDigits, int volumeTotalizerDecimalDigits,
  24. string pumpGroupXmlConfiguration, IServiceProvider services) : base(amountDecimalDigits, volumeDecimalDigits, priceDecimalDigits, volumeTotalizerDecimalDigits,
  25. pumpGroupXmlConfiguration)
  26. { }
  27. }
  28. [MetaPartsRequired(typeof(StateMachineMessageCutter))]
  29. [MetaPartsRequired(typeof(Wayne_Pump_Dart.Parser))]
  30. [MetaPartsRequired(typeof(HalfDuplexActivePollingDeviceProcessor<,>), DefaultCtorParamsJsonStrings = new string[] { "300" })]
  31. public class PumpGroupHandler_WithMetaPartAttribute : PumpGroupHandler
  32. {
  33. public PumpGroupHandler_WithMetaPartAttribute(int amountDecimalDigits, int volumeDecimalDigits,
  34. int priceDecimalDigits, int volumeTotalizerDecimalDigits,
  35. string pumpGroupXmlConfiguration, IServiceProvider services) : base(amountDecimalDigits, volumeDecimalDigits, priceDecimalDigits, volumeTotalizerDecimalDigits,
  36. pumpGroupXmlConfiguration)
  37. { }
  38. }
  39. [TestMethod]
  40. public async Task DeviceProcessor_TestMethod1()
  41. {
  42. var parserFullTypeStr = typeof(Wayne_Pump_Dart.Parser).FullName;
  43. var messageCutterFullTypeStr = typeof(Wayne_Pump_Dart.StateMachineMessageCutter).FullName;
  44. var messageBaseFullTypeStr = typeof(Wayne_Pump_Dart.MessageEntity.MessageBase).FullName;
  45. var deviceHandlerFullTypeStr = typeof(PumpGroupHandler_WithoutMetaPartAttribute).FullName;
  46. var communicatorFullTypeStr = typeof(ComPortCommunicator<>).FullName;
  47. var processorFullTypeStr = typeof(HalfDuplexActivePollingDeviceProcessor<,>).FullName;
  48. ProcessorMetaConfig processorMetaConfig = new ProcessorMetaConfig()
  49. {
  50. Activated = true,
  51. Name = "testWayneDartPumpOnComportConfig",
  52. Type = ProcessorTypeEnum.DeviceProcessor,
  53. Parts = new List<ProcessorMetaPartsConfig>()
  54. {
  55. new ProcessorMetaPartsConfig()
  56. {
  57. Type = ProcessorMetaPartsTypeEnum.Parser,
  58. FullTypeString = parserFullTypeStr,
  59. },
  60. new ProcessorMetaPartsConfig()
  61. {
  62. Type = ProcessorMetaPartsTypeEnum.MessageCutter,
  63. FullTypeString = messageCutterFullTypeStr,
  64. },
  65. new ProcessorMetaPartsConfig()
  66. {
  67. Type = ProcessorMetaPartsTypeEnum.RawMessageTypeStr,
  68. FullTypeString = typeof(byte[]).FullName,
  69. },
  70. new ProcessorMetaPartsConfig()
  71. {
  72. Type = ProcessorMetaPartsTypeEnum.MessageTypeStr,
  73. FullTypeString = messageBaseFullTypeStr,
  74. },
  75. new ProcessorMetaPartsConfig()
  76. {
  77. Type = ProcessorMetaPartsTypeEnum.DeviceHandler,
  78. FullTypeString = deviceHandlerFullTypeStr,
  79. ParametersJsonArrayStr = "[2,2,3,2,\"<PumpGroup><Pump pumpId='1' physicalId='1'><Nozzles><Nozzle logicalId='1' physicalId='1' defaultNoDecimalPointPriceIfNoHistoryPriceReadFromDb='1234'/></Nozzles></Pump></PumpGroup>\"]",
  80. },
  81. new ProcessorMetaPartsConfig()
  82. {
  83. Type = ProcessorMetaPartsTypeEnum.Communicator,
  84. FullTypeString = communicatorFullTypeStr,
  85. ParametersJsonArrayStr = "[\"COM8\",9600,1,8,1]",
  86. },
  87. new ProcessorMetaPartsConfig()
  88. {
  89. Type = ProcessorMetaPartsTypeEnum.DeviceProcessor,
  90. FullTypeString = processorFullTypeStr,
  91. ParametersJsonArrayStr = "[400]",
  92. },
  93. }
  94. };
  95. var services = new ServiceCollection().AddLogging().BuildServiceProvider();
  96. var processorInstance = ObjectInstanceCreator.CreateProcessor<IProcessor>(processorMetaConfig, new object[] { services });
  97. Assert.AreEqual(true, processorInstance != null);
  98. Assert.AreEqual(true, processorInstance.MetaConfigName == processorMetaConfig.Name);
  99. var deviceProcessor = processorInstance as GenericDeviceProcessor<byte[], Wayne_Pump_Dart.MessageEntity.MessageBase>;
  100. //deviceProcessor.Communicator.sendMessage???
  101. var WayneDartPumpGroupHandler = deviceProcessor.ProcessorDescriptor().DeviceHandlerOrApp as IEnumerable<IFdcPumpController>;
  102. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnFdcServerInit(new Dictionary<string, object>() {
  103. {"test","1" }
  104. }));
  105. bool pumpCallingStateReceived = false;
  106. bool pumpTrxReceived = false;
  107. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnStateChange += async (s, a) =>
  108. {
  109. if (a.NewPumpState == Wayne.FDCPOSLibrary.LogicalDeviceState.FDC_CALLING)
  110. {
  111. pumpCallingStateReceived = true;
  112. await ((IFdcPumpController)s).AuthorizeAsync(1);
  113. }
  114. });
  115. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnCurrentFuellingStatusChange += async (s, a) =>
  116. {
  117. if (a.Transaction.Finished)
  118. {
  119. pumpTrxReceived = true;
  120. }
  121. });
  122. await deviceProcessor.Start();
  123. //await Task.Delay(25000);
  124. }
  125. [TestMethod]
  126. public async Task DeviceProcessor_WithAllMetaParts_TestMethod1()
  127. {
  128. var deviceHandlerFullTypeStr = typeof(PumpGroupHandler_WithMetaPartAttribute).FullName;
  129. var communicatorFullTypeStr = typeof(ComPortCommunicator<>).FullName;
  130. ProcessorMetaConfig processorMetaConfig = new ProcessorMetaConfig()
  131. {
  132. Activated = true,
  133. Name = "testWayneDartPumpOnComportConfig",
  134. Type = ProcessorTypeEnum.DeviceProcessor,
  135. Parts = new List<ProcessorMetaPartsConfig>()
  136. {
  137. //new ProcessorPartsMetaConfig()
  138. //{
  139. // Type = ProcessorPartsTypeEnum.Parser,
  140. // FullTypeString = parserFullTypeStr,
  141. //},
  142. //new ProcessorPartsMetaConfig()
  143. //{
  144. // Type = ProcessorPartsTypeEnum.MessageCutter,
  145. // FullTypeString = messageCutterFullTypeStr,
  146. //},
  147. //new ProcessorPartsMetaConfig()
  148. //{
  149. // Type = ProcessorPartsTypeEnum.RawMessageTypeStr,
  150. // FullTypeString = typeof(byte[]).FullName,
  151. //},
  152. //new ProcessorPartsMetaConfig()
  153. //{
  154. // Type = ProcessorPartsTypeEnum.MessageTypeStr,
  155. // FullTypeString = messageBaseFullTypeStr,
  156. //},
  157. new ProcessorMetaPartsConfig()
  158. {
  159. Type = ProcessorMetaPartsTypeEnum.DeviceHandler,
  160. FullTypeString = deviceHandlerFullTypeStr,
  161. ParametersJsonArrayStr = "[2,2,3,2,\"<PumpGroup><Pump pumpId='1' physicalId='1'><Nozzles><Nozzle logicalId='1' physicalId='1' defaultNoDecimalPointPriceIfNoHistoryPriceReadFromDb='1234'/></Nozzles></Pump></PumpGroup>\"]",
  162. },
  163. new ProcessorMetaPartsConfig()
  164. {
  165. Type = ProcessorMetaPartsTypeEnum.Communicator,
  166. FullTypeString = communicatorFullTypeStr,
  167. ParametersJsonArrayStr = "[\"COM99\",9600,1,8,1]",
  168. },
  169. //new ProcessorPartsMetaConfig()
  170. //{
  171. // Type = ProcessorPartsTypeEnum.Processor,
  172. // FullTypeString = processorFullTypeStr,
  173. // ParametersJsonArrayStr = "[400]",
  174. //},
  175. }
  176. };
  177. var services = new ServiceCollection().AddLogging().BuildServiceProvider();
  178. var processorInstance = ObjectInstanceCreator.CreateProcessor<IProcessor>(processorMetaConfig, new object[] { services });
  179. Assert.AreEqual(true, processorInstance != null);
  180. Assert.AreEqual(true, processorInstance.MetaConfigName == processorMetaConfig.Name);
  181. var deviceProcessor = processorInstance as GenericDeviceProcessor<byte[], Wayne_Pump_Dart.MessageEntity.MessageBase>;
  182. //deviceProcessor.Communicator.sendMessage???
  183. var WayneDartPumpGroupHandler = deviceProcessor.ProcessorDescriptor().DeviceHandlerOrApp as IEnumerable<IFdcPumpController>;
  184. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnFdcServerInit(new Dictionary<string, object>() {
  185. {"test","1" }
  186. }));
  187. bool pumpCallingStateReceived = false;
  188. bool pumpTrxReceived = false;
  189. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnStateChange += async (s, a) =>
  190. {
  191. if (a.NewPumpState == Wayne.FDCPOSLibrary.LogicalDeviceState.FDC_CALLING)
  192. {
  193. pumpCallingStateReceived = true;
  194. await ((IFdcPumpController)s).AuthorizeAsync(1);
  195. }
  196. });
  197. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnCurrentFuellingStatusChange += async (s, a) =>
  198. {
  199. if (a.Transaction.Finished)
  200. {
  201. pumpTrxReceived = true;
  202. }
  203. });
  204. var isStarted = await deviceProcessor.Start();
  205. }
  206. [TestMethod]
  207. public async Task Integration_DeviceProcessor_WithAllMetaParts_TestMethod1()
  208. {
  209. /* need turn on WayneDartPump simualtor, and create a comport pair, processor listen COM8, pump sim listen COM5*/
  210. var deviceHandlerFullTypeStr = typeof(PumpGroupHandler_WithMetaPartAttribute).FullName;
  211. var communicatorFullTypeStr = typeof(ComPortCommunicator<>).FullName;
  212. ProcessorMetaConfig processorMetaConfig = new ProcessorMetaConfig()
  213. {
  214. Activated = true,
  215. Name = "testWayneDartPumpOnComportConfig",
  216. Type = ProcessorTypeEnum.DeviceProcessor,
  217. Parts = new List<ProcessorMetaPartsConfig>()
  218. {
  219. //new ProcessorPartsMetaConfig()
  220. //{
  221. // Type = ProcessorPartsTypeEnum.Parser,
  222. // FullTypeString = parserFullTypeStr,
  223. //},
  224. //new ProcessorPartsMetaConfig()
  225. //{
  226. // Type = ProcessorPartsTypeEnum.MessageCutter,
  227. // FullTypeString = messageCutterFullTypeStr,
  228. //},
  229. //new ProcessorPartsMetaConfig()
  230. //{
  231. // Type = ProcessorPartsTypeEnum.RawMessageTypeStr,
  232. // FullTypeString = typeof(byte[]).FullName,
  233. //},
  234. //new ProcessorPartsMetaConfig()
  235. //{
  236. // Type = ProcessorPartsTypeEnum.MessageTypeStr,
  237. // FullTypeString = messageBaseFullTypeStr,
  238. //},
  239. new ProcessorMetaPartsConfig()
  240. {
  241. Type = ProcessorMetaPartsTypeEnum.DeviceHandler,
  242. FullTypeString = deviceHandlerFullTypeStr,
  243. ParametersJsonArrayStr = "[2,2,3,2,\"<PumpGroup><Pump pumpId='1' physicalId='1'><Nozzles><Nozzle logicalId='1' physicalId='1' defaultNoDecimalPointPriceIfNoHistoryPriceReadFromDb='1234'/></Nozzles></Pump></PumpGroup>\"]",
  244. },
  245. new ProcessorMetaPartsConfig()
  246. {
  247. Type = ProcessorMetaPartsTypeEnum.Communicator,
  248. FullTypeString = communicatorFullTypeStr,
  249. ParametersJsonArrayStr = "[\"COM8\",9600,1,8,1]",
  250. },
  251. //new ProcessorPartsMetaConfig()
  252. //{
  253. // Type = ProcessorPartsTypeEnum.Processor,
  254. // FullTypeString = processorFullTypeStr,
  255. // ParametersJsonArrayStr = "[400]",
  256. //},
  257. }
  258. };
  259. var services = new ServiceCollection().AddLogging().BuildServiceProvider();
  260. var processorInstance = ObjectInstanceCreator.CreateProcessor<IProcessor>(processorMetaConfig, new object[] { services });
  261. Assert.AreEqual(true, processorInstance != null);
  262. Assert.AreEqual(true, processorInstance.MetaConfigName == processorMetaConfig.Name);
  263. var deviceProcessor = processorInstance as GenericDeviceProcessor<byte[], Wayne_Pump_Dart.MessageEntity.MessageBase>;
  264. //deviceProcessor.Communicator.sendMessage???
  265. var WayneDartPumpGroupHandler = deviceProcessor.ProcessorDescriptor().DeviceHandlerOrApp as IEnumerable<IFdcPumpController>;
  266. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnFdcServerInit(new Dictionary<string, object>() {
  267. {"test","1" }
  268. }));
  269. bool pumpCallingStateReceived = false;
  270. bool pumpTrxReceived = false;
  271. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnStateChange += async (s, a) =>
  272. {
  273. if (a.NewPumpState == Wayne.FDCPOSLibrary.LogicalDeviceState.FDC_CALLING)
  274. {
  275. pumpCallingStateReceived = true;
  276. await ((IFdcPumpController)s).AuthorizeAsync(1);
  277. }
  278. });
  279. WayneDartPumpGroupHandler.ToList().ForEach(ph => ph.OnCurrentFuellingStatusChange += async (s, a) =>
  280. {
  281. if (a.Transaction.Finished)
  282. {
  283. pumpTrxReceived = true;
  284. }
  285. });
  286. var isStarted = await deviceProcessor.Start();
  287. Assert.AreEqual(true, isStarted);
  288. int maxWaitSec = 30;
  289. int wait = 0;
  290. while (true)
  291. {
  292. if (wait > maxWaitSec) break;
  293. if (pumpCallingStateReceived && pumpTrxReceived) break;
  294. await Task.Delay(1000);
  295. wait++;
  296. }
  297. Assert.AreEqual(true, pumpCallingStateReceived);
  298. Assert.AreEqual(true, pumpTrxReceived);
  299. }
  300. }
  301. }