Ver Fonte

PsQueue add StartOk, StartTimeoutFail test

Dalibor Votruba há 1 ano atrás
pai
commit
ecbe66d1af

+ 1 - 1
qdr.fnd.core.pqueue.test/Process/Mock/PsProcessProviderBaseMock.cs

@@ -31,8 +31,8 @@ namespace qdr.fnd.core.pqueue.test.Process.Mock
             {
                 Log.Log(LogSeverityEnum.Info, $"Nothing to emitte");
             }
-            Task.Delay(3000).Wait();
             await base.OnProcess();
+            Task.Delay(3000).Wait();
         }
 
         public void TestOnProcessError(Exception exception)

+ 2 - 1
qdr.fnd.core.pqueue.test/Process/PsProcessProviderBaseTest.cs

@@ -132,8 +132,9 @@ namespace qdr.fnd.core.pqueue.test.Process
             process.Start();
             process.WaitToDone();
             TestContext.WriteLine($"#Process duration check: {(DateTime.Now - dtStart).ToReadableString()}");
-
+            
             Assert.That(process.IsRunning, Is.False);
+            Assert.That((DateTime.Now - dtStart).TotalSeconds, Is.LessThan(2), "Timeout restriction doesn't work.");
             Assert.That(_statusDonePool.ContainsKey(process.ItemId), Is.True);
             Assert.That(_statusDonePool[process.ItemId].Any(x => x.Item1 == PsStatusEnum.DoneOk), Is.True);
         }

+ 1 - 1
qdr.fnd.core.pqueue.test/fnd.candidates/TypedArgumentExtTest.cs

@@ -3,7 +3,7 @@ using Quadarax.Foundation.Core.Data;
 
 namespace qdr.fnd.core.pqueue.test.fnd.candidates
 {
-    public class TypedArgumentExtTest
+    internal class TypedArgumentExtTest
     {
 
         private TypedArgument[] _args;

+ 2 - 2
qdr.fnd.core.pqueue/Process/PsProcessProviderBase.cs

@@ -1,9 +1,9 @@
 using qdr.fnd.core.pqueue.Enums;
 using qdr.fnd.core.pqueue.Exceptions;
+using qdr.fnd.core.pqueue.fnd.candidates;
 using Quadarax.Foundation.Core.Data;
 using Quadarax.Foundation.Core.Logging;
 using Quadarax.Foundation.Core.Object;
-using Quadarax.Foundation.Core.Thread.Extensions;
 using Quadarax.Foundation.Core.Value.Extensions;
 
 namespace qdr.fnd.core.pqueue.Process
@@ -73,7 +73,7 @@ namespace qdr.fnd.core.pqueue.Process
             IsRunning = true;
             var timeout = GetArgumentValue<TimeSpan>(CS_ARG_PROCESS_TIMEOUT);
 
-            Task.Factory.StartNew(()=>StartInternal(timeout).TimeoutAfter(timeout), _cancelationToken!.Token);
+            _ = Task.Factory.StartNew(() => StartInternal(timeout).TimeoutAfter(_cancelationToken!, timeout), _cancelationToken!.Token);
         }
 
         /// <inheritdoc />

+ 17 - 0
qdr.fnd.core.pqueue/fnd.candidates/TaskExt.cs

@@ -0,0 +1,17 @@
+namespace qdr.fnd.core.pqueue.fnd.candidates
+{
+    internal static class TaskExt
+    {
+        public static async Task TimeoutAfter(this Task task,CancellationTokenSource timeoutCancellationTokenSource, TimeSpan timeout)
+    {
+        if (await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token)) == task)
+        {
+            timeoutCancellationTokenSource.Cancel();
+            await task;
+            return;
+        }
+
+        throw new TimeoutException("The operation has timed out.");
+    }
+    }
+}