From 28ef9b07b10c3beb183e0669a3ab6e0aecbee022 Mon Sep 17 00:00:00 2001 From: drieseng Date: Thu, 4 Nov 2021 12:27:40 +0100 Subject: [PATCH] TaskExtensions.IsCompletedSuccessfully(this Task t) only has to check if Status equals RanToCompletion to verify that the task completed successfully. --- src/Quartz.Tests.Unit/TaskExtensionsTest.cs | 107 ++++++++++++++++++++ src/Quartz/TaskExtensions.cs | 8 +- 2 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 src/Quartz.Tests.Unit/TaskExtensionsTest.cs diff --git a/src/Quartz.Tests.Unit/TaskExtensionsTest.cs b/src/Quartz.Tests.Unit/TaskExtensionsTest.cs new file mode 100644 index 000000000..07517b6be --- /dev/null +++ b/src/Quartz.Tests.Unit/TaskExtensionsTest.cs @@ -0,0 +1,107 @@ +using NUnit.Framework; +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Quartz.Tests.Unit +{ + [TestFixture] + public class TaskExtensionsTest + { + [Test] + public void IsCompletedSuccessfully_Created() + { + var task = new Task(() => Task.Delay(300)); + + Assert.False(task.IsCompletedSuccessfully()); + Assert.AreEqual(TaskStatus.Created, task.Status); + } + + [Test] + public void IsCompletedSuccessfully_WaitingToRun() + { + var task = new Task(() => Thread.Sleep(300)); + task.Start(); + + Assert.False(task.IsCompletedSuccessfully()); + Assert.AreEqual(TaskStatus.WaitingToRun, task.Status); + } + + [Test] + public void IsCompletedSuccessfully_Running() + { + var task = new Task(() => Thread.Sleep(300)); + task.Start(); + + task.Wait(50); + + Assert.False(task.IsCompletedSuccessfully()); + Assert.AreEqual(TaskStatus.Running, task.Status); + } + + [Test] + public void IsCompletedSuccessfully_WaitingForActivation() + { + var task = Task.Run(() => Task.Delay(300)); + + Assert.False(task.IsCompletedSuccessfully()); + Assert.AreEqual(TaskStatus.WaitingForActivation, task.Status); + } + + [Test] + public void IsCompletedSuccessfully_Canceled() + { + var tokenSource = new CancellationTokenSource(); + CancellationToken ct = tokenSource.Token; + + var task = Task.Run(() => + { + + while (true) + { + ct.ThrowIfCancellationRequested(); + } + }, ct); + + tokenSource.Cancel(); + + try + { + task.GetAwaiter().GetResult(); + Assert.Fail(); + } + catch (OperationCanceledException) + { + Assert.False(task.IsCompletedSuccessfully()); + Assert.AreEqual(TaskStatus.Canceled, task.Status); + } + } + + [Test] + public void IsCompletedSuccessfully_Faulted() + { + var task = Task.Run(() => throw new ApplicationException()); + + try + { + task.GetAwaiter().GetResult(); + Assert.Fail(); + } + catch (ApplicationException) + { + Assert.False(task.IsCompletedSuccessfully()); + Assert.AreEqual(TaskStatus.Faulted, task.Status); + } + } + + [Test] + public void IsCompletedSuccessfully_RanToCompletion() + { + var task = Task.Run(() => { }); + task.Wait(30); + + Assert.True(task.IsCompletedSuccessfully()); + Assert.AreEqual(TaskStatus.RanToCompletion, task.Status); + } + } +} diff --git a/src/Quartz/TaskExtensions.cs b/src/Quartz/TaskExtensions.cs index b0c57a0ad..d015765b5 100644 --- a/src/Quartz/TaskExtensions.cs +++ b/src/Quartz/TaskExtensions.cs @@ -8,7 +8,11 @@ internal static class TaskExtensions [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool IsCompletedSuccessfully(this Task t) { - return t.Status == TaskStatus.RanToCompletion && !t.IsFaulted && !t.IsCanceled; - } +#if NETSTANDARD2_1_OR_GREATER || NETCOREAPP2_0_OR_GREATER + return t.IsCompletedSuccessfully; +#else + return t.Status == TaskStatus.RanToCompletion; +#endif + } } } \ No newline at end of file