PsQueueTest.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. using qdr.fnd.core.pqueue.Configuration;
  2. using qdr.fnd.core.pqueue.Enums;
  3. using qdr.fnd.core.pqueue.Exceptions;
  4. using qdr.fnd.core.pqueue.Storages;
  5. using qdr.fnd.core.pqueue.test.Mocks;
  6. using qdr.fnd.core.pqueue.test.Process.Mock;
  7. using Quadarax.Foundation.Core.Logging;
  8. using Quadarax.Foundation.Core.Value.Generators;
  9. namespace qdr.fnd.core.pqueue.test
  10. {
  11. /// <summary>
  12. /// Complex test class for <see cref="Mocks.PsQueueMock"/> <see langword="class"/>.
  13. /// </summary>
  14. public class PsQueueTest
  15. {
  16. #region *** Queue Fields ***
  17. private string _queueName;
  18. private ILogger? _logger;
  19. private PsQueueConfiguration? _configuration;
  20. private IPsQueueStorage? _storageProvider;
  21. #endregion
  22. #region *** Queue Item Fields ***
  23. private string _id = "id";
  24. private string _owner = "owner";
  25. private string _ownerRef = "ownerRef";
  26. private string _providerClass = "providerClass";
  27. private DateTime _created = DateTime.Now;
  28. private PsStatusEnum _status = PsStatusEnum.New;
  29. private bool _statusTrancient = false;
  30. private string _statusMessage = "message";
  31. private int _attemptsLeft = 3;
  32. private TinyHash _hash = new TinyHash();
  33. private IDictionary<string, List<PsStatusEnum>> _ItemStatuses = new Dictionary<string, List<PsStatusEnum>>();
  34. #endregion
  35. [SetUp]
  36. public void Setup()
  37. {
  38. _queueName = "queueName";
  39. _logger = new LoggerMock();
  40. _configuration = new PsQueueConfiguration();
  41. _storageProvider = new MemoryStorageProvider(_logger);
  42. _providerClass = typeof(PsProcessProviderBaseMock).AssemblyQualifiedName!;
  43. }
  44. [Test(TestOf=typeof(PsQueue))]
  45. public void ConstructorOk()
  46. {
  47. var queue = CreateQueue();
  48. Assert.IsFalse(queue.IsRunning);
  49. }
  50. [Test(TestOf=typeof(PsQueue))]
  51. public void ConstructorFail()
  52. {
  53. Assert.Throws<ArgumentNullException>(() => new PsQueueMock(string.Empty, _configuration!, _storageProvider!, _logger!));
  54. Assert.Throws<ArgumentNullException>(() => new PsQueueMock(_queueName, null!, _storageProvider!, _logger!));
  55. Assert.Throws<ArgumentNullException>(() => new PsQueueMock(_queueName, _configuration!, null!, _logger!));
  56. }
  57. [Test(TestOf=typeof(PsQueue))]
  58. public void ValidateItemIdOk()
  59. {
  60. var queue = CreateQueue();
  61. queue.TestValidateItemId("aaa");
  62. }
  63. [Test(TestOf=typeof(PsQueue))]
  64. public void ValidateItemIdFail()
  65. {
  66. var queue = CreateQueue();
  67. Assert.Throws<ArgumentNullException>(() => queue.TestValidateItemId(string.Empty));
  68. Assert.Throws<ArgumentNullException>(() => queue.TestValidateItemId(null!));
  69. }
  70. [Test(TestOf=typeof(PsQueue))]
  71. public void ValidateEmitterOk()
  72. {
  73. var queue = CreateQueue();
  74. queue.TestValidateEmitter("aaa");
  75. }
  76. [Test(TestOf=typeof(PsQueue))]
  77. public void ValidateEmitterFail()
  78. {
  79. var queue = CreateQueue();
  80. Assert.Throws<ArgumentNullException>(() => queue.TestValidateEmitter(string.Empty));
  81. Assert.Throws<ArgumentNullException>(() => queue.TestValidateEmitter(null!));
  82. }
  83. [Test(TestOf=typeof(PsQueue))]
  84. public void ValidateItemOk()
  85. {
  86. var queue = CreateQueue();
  87. var item = CreateQueueItem(_id);
  88. queue.TestValidateItem(item);
  89. }
  90. [Test(TestOf=typeof(PsQueue))]
  91. public void ValidateItemFail()
  92. {
  93. var queue = CreateQueue();
  94. var item = CreateQueueItem(_id);
  95. Assert.Throws<ArgumentNullException>(()=>queue.TestValidateItem(null!));
  96. item.SetOwner(string.Empty, string.Empty);
  97. var e = Assert.Throws<PSQueueValidationException>(()=>queue.TestValidateItem(item));
  98. Assert.That(e.Code, Is.EqualTo(PSQueueValidationException.ErrorCodes.OwnerRequired));
  99. item.SetOwner(_owner, string.Empty);
  100. e = Assert.Throws<PSQueueValidationException>(()=>queue.TestValidateItem(item));
  101. Assert.That(e.Code, Is.EqualTo(PSQueueValidationException.ErrorCodes.OwnerRefRequired));
  102. item.SetOwner(_owner, _ownerRef);
  103. item.ClearArguments();
  104. Assert.Throws<PsProcessProviderException>(() => queue.TestValidateItem(item));
  105. }
  106. [Test(TestOf=typeof(PsQueue))]
  107. public void SetItemStatusInternalOk()
  108. {
  109. var queue = CreateQueue();
  110. var item = CreateQueueItem(_id);
  111. item.AddToStorage(queue.Storage);
  112. var testStatus = PsStatusEnum.Pending;
  113. var initStatus = item.Status;
  114. Assert.That(item.Status, Is.Not.EqualTo(testStatus));
  115. queue.TestSetItemStatusInternal(item, testStatus, false, _owner);
  116. var changedItem = queue.Storage.GetItem(item.Id);
  117. Assert.That(changedItem.Status, Is.EqualTo(testStatus));
  118. Assert.That(changedItem.IsStatusTransient, Is.EqualTo(false));
  119. Assert.That(_ItemStatuses[changedItem.Id].LastOrDefault(), Is.EqualTo(testStatus));
  120. Assert.That(changedItem.StatusJournal.Count, Is.EqualTo(1));
  121. Assert.That(changedItem.StatusJournal.FirstOrDefault()?.PreviousStatus, Is.EqualTo(initStatus));
  122. queue.TestSetItemStatusInternal(item, null, true, _owner);
  123. changedItem = queue.Storage.GetItem(item.Id);
  124. Assert.That(changedItem.Status, Is.EqualTo(testStatus));
  125. Assert.That(changedItem.IsStatusTransient, Is.EqualTo(true));
  126. Assert.That(_ItemStatuses[changedItem.Id].LastOrDefault(), Is.EqualTo(testStatus));
  127. Assert.That(changedItem.StatusJournal.Count, Is.EqualTo(2));
  128. Assert.That(changedItem.StatusJournal.LastOrDefault()?.PreviousIsStatusTransient, Is.EqualTo(false));
  129. Assert.That(changedItem.StatusJournal.LastOrDefault()?.PreviousStatus, Is.EqualTo(testStatus));
  130. }
  131. [Test(TestOf=typeof(PsQueue))]
  132. public void SetItemStatusInternalFail()
  133. {
  134. var queue = CreateQueue();
  135. var item = CreateQueueItem(_id);
  136. item.AddToStorage(queue.Storage);
  137. var testStatus = PsStatusEnum.DoneOk;
  138. var initStatus = item.Status;
  139. Assert.That(item.Status, Is.Not.EqualTo(testStatus));
  140. var e1 = Assert.Throws<PSQueueValidationException>(()=>queue.TestSetItemStatusInternal(item, null, false, _owner));
  141. Assert.That(e1.Code, Is.EqualTo(PSQueueValidationException.ErrorCodes.InvalidStatusTransientCombination));
  142. e1 = Assert.Throws<PSQueueValidationException>(()=>queue.TestSetItemStatusInternal(item, PsStatusEnum.DoneOk, false, _owner));
  143. Assert.That(e1.Code, Is.EqualTo(PSQueueValidationException.ErrorCodes.InvalidStatusTransition));
  144. }
  145. [Test(TestOf=typeof(PsQueue))]
  146. public void ResolveProviderOk()
  147. {
  148. var queue = CreateQueue();
  149. var arguments = PsProcessProviderBaseMock.CreateArguments();
  150. var provider = queue.TestResolveProvider(_id, _providerClass, arguments);
  151. Assert.That(provider, Is.Not.Null);
  152. Assert.That(provider.ItemId, Is.EqualTo(_id));
  153. Assert.That(provider.IsRunning, Is.EqualTo(false));
  154. Assert.That(provider.Arguments.Values.Select(x=>x.Name), Is.EquivalentTo(arguments.Select(x=>x.Name)));
  155. Assert.That(provider.Arguments.Values.Select(x=>x.Value), Is.EquivalentTo(arguments.Select(x=>x.Value)));
  156. Assert.That(provider.Arguments.Values.Select(x=>x.ValueType), Is.EquivalentTo(arguments.Select(x=>x.ValueType)));
  157. }
  158. [Test(TestOf=typeof(PsQueue))]
  159. public void ResolveProviderFail()
  160. {
  161. var queue = CreateQueue();
  162. var arguments = PsProcessProviderBaseMock.CreateArguments();
  163. var e1 = Assert.Throws<PSQueueValidationException>(()=>queue.TestResolveProvider(_id, null!, arguments));
  164. Assert.That(e1.Code, Is.EqualTo(PSQueueValidationException.ErrorCodes.ProcessProviderRequired));
  165. e1 = Assert.Throws<PSQueueValidationException>(()=>queue.TestResolveProvider(_id, string.Empty, arguments));
  166. Assert.That(e1.Code, Is.EqualTo(PSQueueValidationException.ErrorCodes.ProcessProviderRequired));
  167. e1 = Assert.Throws<PSQueueValidationException>(()=>queue.TestResolveProvider(string.Empty, "aaa", arguments));
  168. Assert.That(e1.Code, Is.EqualTo(PSQueueValidationException.ErrorCodes.ProcessProviderCannotResolve));
  169. e1 = Assert.Throws<PSQueueValidationException>(()=>queue.TestResolveProvider(string.Empty, _providerClass, arguments));
  170. Assert.That(e1.Code, Is.EqualTo(PSQueueValidationException.ErrorCodes.ProcessProviderCannotResolve));
  171. }
  172. private PsQueueMock CreateQueue()
  173. {
  174. var ps = new PsQueueMock(_queueName, _configuration!, _storageProvider!, _logger!);
  175. ps.ProcessItemStatusChanged += OnProcessItemStatusChanged;
  176. return ps;
  177. }
  178. private void OnProcessItemStatusChanged(IPsQueue sender, PsQueueStatusChangedEventArgs e)
  179. {
  180. TestContext.WriteLine($"#StaChg: ItemId={e.ProcessQueueItemId}; newStatus={e.CurrentStatus}; isTransient='{e.CurrentIsStatusTransient}'");
  181. if (_ItemStatuses.ContainsKey(e.ProcessQueueItemId))
  182. _ItemStatuses[e.ProcessQueueItemId].Add(e.CurrentStatus);
  183. else
  184. _ItemStatuses.Add(e.ProcessQueueItemId, new List<PsStatusEnum> { e.CurrentStatus });
  185. }
  186. private PsQueueItemMock CreateQueueItem(string id)
  187. {
  188. var item = new PsQueueItemMock(id, _owner,_ownerRef,_providerClass,_created, PsProcessProviderBaseMock.CreateArguments(), _attemptsLeft);
  189. return item;
  190. }
  191. }
  192. }