PsProcessProviderBaseTest.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using qdr.fnd.core.pqueue.Enums;
  2. using qdr.fnd.core.pqueue.Exceptions;
  3. using qdr.fnd.core.pqueue.fnd.candidates;
  4. using qdr.fnd.core.pqueue.Process;
  5. using qdr.fnd.core.pqueue.test.Mocks;
  6. using qdr.fnd.core.pqueue.test.Process.Mock;
  7. using Quadarax.Foundation.Core.Data;
  8. using Quadarax.Foundation.Core.Value.Extensions;
  9. using System.Collections.Concurrent;
  10. namespace qdr.fnd.core.pqueue.test.Process
  11. {
  12. internal class PsProcessProviderBaseTest
  13. {
  14. private IDictionary<string, List<string>> _stdOutPool;
  15. private IDictionary<string, List<Tuple<PsStatusEnum, string>>> _statusDonePool;
  16. [SetUp]
  17. public void Setup()
  18. {
  19. _stdOutPool = new ConcurrentDictionary<string, List<string>>();
  20. _statusDonePool = new ConcurrentDictionary<string, List<Tuple<PsStatusEnum, string>>>();
  21. }
  22. [Test(TestOf=typeof(PsProcessProviderBase))]
  23. public void ConstructorOk()
  24. {
  25. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  26. var process = CreateProcess(args);
  27. Assert.IsFalse(process.IsRunning);
  28. Assert.That(args, Is.EquivalentTo(process.Arguments.Values));
  29. }
  30. [Test(TestOf=typeof(PsProcessProviderBase))]
  31. public void ConstructorFail()
  32. {
  33. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  34. var itemId = "a";
  35. Assert.Throws<ArgumentNullException>(() => new PsProcessProviderBaseMock(null!, OnProcessStdOut,itemId, args, new LoggerMock()));
  36. Assert.Throws<ArgumentNullException>(() => new PsProcessProviderBaseMock(OnProcessDone, null!,itemId, args, new LoggerMock()));
  37. Assert.Throws<ArgumentNullException>(() => new PsProcessProviderBaseMock(OnProcessDone, OnProcessStdOut,null!, args, new LoggerMock()));
  38. Assert.Throws<ArgumentNullException>(() => new PsProcessProviderBaseMock(OnProcessDone, OnProcessStdOut,string.Empty, args, new LoggerMock()));
  39. Assert.Throws<ArgumentNullException>(() => new PsProcessProviderBaseMock(OnProcessDone, OnProcessStdOut,itemId, null!, new LoggerMock()));
  40. }
  41. [Test(TestOf=typeof(PsProcessProviderBase))]
  42. public void OnProcessErrorOk()
  43. {
  44. var testMessage = "Test";
  45. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  46. var process = CreateProcess(args);
  47. process.TestOnProcessError(new Exception(testMessage));
  48. Assert.That(_stdOutPool.ContainsKey(process.ItemId), Is.True);
  49. Assert.That(_stdOutPool[process.ItemId].Contains(testMessage), Is.True);
  50. }
  51. [Test(TestOf=typeof(PsProcessProviderBase))]
  52. public void OnProcessErrorFail()
  53. {
  54. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  55. var process = CreateProcess(args);
  56. var ex = Assert.Throws<AggregateException>(()=>process.TestOnProcessError(null!));
  57. Assert.That(ex.InnerExceptions.Any(e => e is ArgumentNullException), Is.True);
  58. }
  59. [Test(TestOf=typeof(PsProcessProviderBase))]
  60. public void GetArgumentValueOk()
  61. {
  62. var value = "a";
  63. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  64. args.Where(x=>x.Name == PsProcessProviderBase.CS_ARG_RESULT_TEXT).First().Value = value;
  65. var process = CreateProcess(args);
  66. Assert.That(process.TestGetArgumentValue<string>(PsProcessProviderBase.CS_ARG_RESULT_TEXT), Is.EqualTo(value));
  67. }
  68. [Test(TestOf=typeof(PsProcessProviderBase))]
  69. public void GetArgumentValueFail()
  70. {
  71. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  72. var process = CreateProcess(args);
  73. Assert.Throws<ArgumentNullException>(() => process.TestGetArgumentValue<string>(null!));
  74. Assert.Throws<ArgumentNullException>(() => process.TestGetArgumentValue<string>(string.Empty));
  75. Assert.That(process.TestGetArgumentValue<string>("a"), Is.Null);
  76. }
  77. [Test(TestOf=typeof(PsProcessProviderBase))]
  78. public void ContainsArgumentOk()
  79. {
  80. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  81. var process = CreateProcess(args);
  82. Assert.That(process.TestContainsArgument(PsProcessProviderBase.CS_ARG_RESULT_TEXT), Is.True);
  83. Assert.That(process.TestContainsArgument("a"), Is.False);
  84. }
  85. [Test(TestOf=typeof(PsProcessProviderBase))]
  86. public void ContainsArgumentFail()
  87. {
  88. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  89. var process = CreateProcess(args);
  90. Assert.Throws<ArgumentNullException>(() => process.TestContainsArgument(string.Empty));
  91. Assert.Throws<ArgumentNullException>(() => process.TestContainsArgument(null!));
  92. }
  93. [Test(TestOf=typeof(PsProcessProviderBase))]
  94. public void StartOk()
  95. {
  96. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  97. args.SetArgumentValue<TimeSpan>(PsProcessProviderBase.CS_ARG_PROCESS_TIMEOUT, TimeSpan.FromSeconds(5));
  98. var process = CreateProcess(args);
  99. var dtStart = DateTime.Now;
  100. process.Start();
  101. process.WaitToDone();
  102. TestContext.WriteLine($"#Process duration check: {(DateTime.Now - dtStart).ToReadableString()}");
  103. Assert.That(process.IsRunning, Is.False);
  104. Assert.That(_statusDonePool.ContainsKey(process.ItemId), Is.True);
  105. Assert.That(_statusDonePool[process.ItemId].Any(x => x.Item1 == PsStatusEnum.DoneOk), Is.True);
  106. }
  107. [Test(TestOf=typeof(PsProcessProviderBase))]
  108. public void StartFail()
  109. {
  110. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  111. args.SetArgumentValue<TimeSpan>(PsProcessProviderBase.CS_ARG_PROCESS_TIMEOUT, TimeSpan.FromSeconds(15));
  112. var process = CreateProcess(args);
  113. var dtStart = DateTime.Now;
  114. process.Start();
  115. Assert.That(process.IsRunning, Is.True);
  116. var e = Assert.Throws<PsProcessProviderException>(()=>process.Start());
  117. process.Stop();
  118. Assert.That(e.Code, Is.EqualTo(PsProcessProviderException.ErrorCodes.ProcessProviderIsRunning));
  119. }
  120. [Test(TestOf=typeof(PsProcessProviderBase))]
  121. public void StopFail()
  122. {
  123. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  124. args.SetArgumentValue<TimeSpan>(PsProcessProviderBase.CS_ARG_PROCESS_TIMEOUT, TimeSpan.FromSeconds(5));
  125. var process = CreateProcess(args);
  126. Assert.That(process.IsRunning, Is.False);
  127. var e = Assert.Throws<PsProcessProviderException>(()=>process.Stop());
  128. Assert.That(e.Code, Is.EqualTo(PsProcessProviderException.ErrorCodes.ProcessProviderNotRunning));
  129. }
  130. [Test(TestOf=typeof(PsProcessProviderBase))]
  131. public void StartStopOk()
  132. {
  133. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  134. args.SetArgumentValue<TimeSpan>(PsProcessProviderBase.CS_ARG_PROCESS_TIMEOUT, TimeSpan.FromSeconds(5));
  135. var process = CreateProcess(args);
  136. var dtStart = DateTime.Now;
  137. process.Start();
  138. Task.Delay(TimeSpan.FromSeconds(1)).Wait();
  139. process.Stop();
  140. process.WaitToDone();
  141. TestContext.WriteLine($"#Process duration check: {(DateTime.Now - dtStart).ToReadableString()}");
  142. Assert.That(process.IsRunning, Is.False);
  143. Assert.That(_statusDonePool.ContainsKey(process.ItemId), Is.True);
  144. Assert.That(_statusDonePool[process.ItemId].Any(x => x.Item1 == PsStatusEnum.DoneFailed), Is.True);
  145. }
  146. [Test(TestOf=typeof(PsProcessProviderBase))]
  147. public void StartTimeoutFail()
  148. {
  149. var args = PsProcessProviderBaseMock.CreateArguments().ToArray();
  150. args.SetArgumentValue<TimeSpan>(PsProcessProviderBase.CS_ARG_PROCESS_TIMEOUT, TimeSpan.FromSeconds(1));
  151. var process = CreateProcess(args);
  152. var dtStart = DateTime.Now;
  153. process.Start();
  154. process.WaitToDone();
  155. TestContext.WriteLine($"#Process duration check: {(DateTime.Now - dtStart).ToReadableString()}");
  156. Assert.That(process.IsRunning, Is.False);
  157. Assert.That((DateTime.Now - dtStart).TotalSeconds, Is.LessThan(2), "Timeout restriction doesn't work.");
  158. Assert.That(_statusDonePool.ContainsKey(process.ItemId), Is.True);
  159. Assert.That(_statusDonePool[process.ItemId].Any(x => x.Item1 == PsStatusEnum.DoneFailed), Is.True);
  160. }
  161. private PsProcessProviderBaseMock CreateProcess(TypedArgument[] args)
  162. {
  163. var itemId = "a";
  164. return new PsProcessProviderBaseMock(OnProcessDone, OnProcessStdOut, itemId, args, new LoggerMock());
  165. }
  166. private void OnProcessStdOut(string itemId, string message)
  167. {
  168. TestContext.WriteLine($"#StdOut: ItemId={itemId}; message='{message}'");
  169. _stdOutPool.TryAdd(itemId, new List<string>());
  170. _stdOutPool[itemId].Add(message);
  171. }
  172. private void OnProcessDone(string itemId, PsStatusEnum newStatus, string message)
  173. {
  174. TestContext.WriteLine($"#StaChg: ItemId={itemId}; newStatus={newStatus}; message='{message}'");
  175. _statusDonePool.TryAdd(itemId, new List<Tuple<PsStatusEnum, string>>());
  176. _statusDonePool[itemId].Add(new Tuple<PsStatusEnum, string>(newStatus, message));
  177. }
  178. }
  179. }