diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 886e49413..ae99ad5e6 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -21,7 +21,7 @@ on: env: BUILD_CONFIG: "Release" SOLUTION: "Monai.Deploy.WorkflowManager.sln" - + jobs: build-and-deploy: runs-on: ubuntu-latest @@ -36,7 +36,7 @@ jobs: outputs: semVer: ${{ steps.gitversion.outputs.semVer }} majorMinorPatch: ${{ steps.gitversion.outputs.majorMinorPatch }} - env: + env: REGISTRY: ghcr.io permissions: packages: write @@ -106,7 +106,7 @@ jobs: - name: Trivy Vulnerability Scanner uses: aquasecurity/trivy-action@master - if: ${{ contains(github.ref, 'refs/heads/main') || contains(github.head_ref, 'release/') }} + if: ${{ contains(github.ref, 'refs/heads/main') || contains(github.head_ref, 'release/') }} with: image-ref: ${{ fromJSON(steps.meta.outputs.json).tags[0] }} format: 'sarif' @@ -114,7 +114,7 @@ jobs: - name: Upload Trivy SARIF Report uses: github/codeql-action/upload-sarif@v2 - if: ${{ contains(github.ref, 'refs/heads/main') || contains(github.head_ref, 'release/') }} + if: ${{ contains(github.ref, 'refs/heads/main') || contains(github.head_ref, 'release/') }} with: sarif_file: 'trivy-results.sarif' @@ -184,7 +184,7 @@ jobs: run: | mkdir ~\release Compress-Archive -Path docs\_site\* -DestinationPath ~\release\mwm-docs-${{ env.SEMVER }}.zip - Get-ChildItem ~\release -Recurse + Get-ChildItem ~\release -Recurse - name: Upload docs uses: actions/upload-artifact@v3.1.1 diff --git a/src/Monai.Deploy.WorkflowManager.sln b/src/Monai.Deploy.WorkflowManager.sln index 1708fb1ee..f235958d1 100644 --- a/src/Monai.Deploy.WorkflowManager.sln +++ b/src/Monai.Deploy.WorkflowManager.sln @@ -80,7 +80,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.WorkflowManage EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.WorkflowManager.Shared", "Shared\Shared\Monai.Deploy.WorkflowManager.Shared.csproj", "{81E3F943-B992-4C81-AA09-A17C05081236}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Monai.Deploy.WorkflowManager.Shared.Tests", "..\tests\UnitTests\Monai.Deploy.WorkflowManager.Shared.Tests\Monai.Deploy.WorkflowManager.Shared.Tests.csproj", "{C853A9E3-C53D-4B1A-BFDA-228689A8C94C}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.WorkflowManager.Shared.Tests", "..\tests\UnitTests\Monai.Deploy.WorkflowManager.Shared.Tests\Monai.Deploy.WorkflowManager.Shared.Tests.csproj", "{C853A9E3-C53D-4B1A-BFDA-228689A8C94C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Monai.Deploy.WorkflowManager.Common.Tests", "..\tests\UnitTests\Common.Tests\Monai.Deploy.WorkflowManager.Common.Tests.csproj", "{75A4AEDA-0386-4B2D-9DBA-BC9AE733660E}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -228,6 +230,10 @@ Global {C853A9E3-C53D-4B1A-BFDA-228689A8C94C}.Debug|Any CPU.Build.0 = Debug|Any CPU {C853A9E3-C53D-4B1A-BFDA-228689A8C94C}.Release|Any CPU.ActiveCfg = Release|Any CPU {C853A9E3-C53D-4B1A-BFDA-228689A8C94C}.Release|Any CPU.Build.0 = Release|Any CPU + {75A4AEDA-0386-4B2D-9DBA-BC9AE733660E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75A4AEDA-0386-4B2D-9DBA-BC9AE733660E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75A4AEDA-0386-4B2D-9DBA-BC9AE733660E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75A4AEDA-0386-4B2D-9DBA-BC9AE733660E}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -269,6 +275,7 @@ Global {BF6569A1-1A5A-4358-9C02-1A6A5F0FBFD9} = {71DDEE7B-E213-4E39-A7F4-4646783A27F7} {81E3F943-B992-4C81-AA09-A17C05081236} = {37A19144-CEA5-47A2-9FFD-22C522E8B895} {C853A9E3-C53D-4B1A-BFDA-228689A8C94C} = {71DDEE7B-E213-4E39-A7F4-4646783A27F7} + {75A4AEDA-0386-4B2D-9DBA-BC9AE733660E} = {71DDEE7B-E213-4E39-A7F4-4646783A27F7} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {DC0D56C8-D8CB-45CE-B528-F3DCF86D63ED} diff --git a/src/Shared/Shared/Monai.Deploy.WorkflowManager.Shared.csproj b/src/Shared/Shared/Monai.Deploy.WorkflowManager.Shared.csproj index daf8345d3..29a375894 100644 --- a/src/Shared/Shared/Monai.Deploy.WorkflowManager.Shared.csproj +++ b/src/Shared/Shared/Monai.Deploy.WorkflowManager.Shared.csproj @@ -41,7 +41,7 @@ - + diff --git a/src/TaskManager/API/Monai.Deploy.WorkflowManager.TaskManager.API.csproj b/src/TaskManager/API/Monai.Deploy.WorkflowManager.TaskManager.API.csproj index 94267a562..f0232c41a 100644 --- a/src/TaskManager/API/Monai.Deploy.WorkflowManager.TaskManager.API.csproj +++ b/src/TaskManager/API/Monai.Deploy.WorkflowManager.TaskManager.API.csproj @@ -1,4 +1,4 @@ - - - + + @@ -34,10 +34,10 @@ limitations under the License. diff --git a/src/WorkflowManager/Authentication/Extensions/AuthKeys.cs b/src/WorkflowManager/Authentication/Extensions/AuthKeys.cs index a3564e032..1d0689929 100644 --- a/src/WorkflowManager/Authentication/Extensions/AuthKeys.cs +++ b/src/WorkflowManager/Authentication/Extensions/AuthKeys.cs @@ -25,6 +25,7 @@ public static class AuthKeys // Configuration Keys public const string ServerRealm = "ServerRealm"; + public const string ServerRealmKey = "ServerRealmKey"; public const string Claims = "Claims"; public const string OpenId = "OpenId"; diff --git a/src/WorkflowManager/Authentication/Extensions/ConfigurationExtension.cs b/src/WorkflowManager/Authentication/Extensions/ConfigurationExtension.cs index b38ef2c53..61bfe2ee3 100644 --- a/src/WorkflowManager/Authentication/Extensions/ConfigurationExtension.cs +++ b/src/WorkflowManager/Authentication/Extensions/ConfigurationExtension.cs @@ -14,9 +14,10 @@ * limitations under the License. */ -using Microsoft.Extensions.Configuration; using Ardalis.GuardClauses; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Monai.Deploy.WorkflowManager.Logging; namespace Monai.Deploy.WorkflowManager.Authentication.Extensions { @@ -32,7 +33,7 @@ public static bool BypassAuth(this IConfiguration configuration, ILogger logger) if (authenticationSettings[AuthKeys.OpenId] is null) { - logger.LogInformation("Bypass Authentication"); + logger.BypassAuthentication(); return true; } @@ -42,7 +43,7 @@ public static bool BypassAuth(this IConfiguration configuration, ILogger logger) /// /// Gets configuration values from the IConfiguration provider. /// under "WorkflowManagerAuthentication" key you are able to - /// have any label of configuration for example could have + /// have any label of configuration for example could have /// /// /// diff --git a/src/WorkflowManager/Authentication/Extensions/MonaiAuthenticationExtensions.cs b/src/WorkflowManager/Authentication/Extensions/MonaiAuthenticationExtensions.cs index d6d5f3ad3..2ea38a725 100644 --- a/src/WorkflowManager/Authentication/Extensions/MonaiAuthenticationExtensions.cs +++ b/src/WorkflowManager/Authentication/Extensions/MonaiAuthenticationExtensions.cs @@ -14,16 +14,16 @@ * limitations under the License. */ +using System.Text; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Authentication.JwtBearer; +using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Tokens; -using Microsoft.AspNetCore.Authentication.JwtBearer; -using Monai.Deploy.WorkflowManager.Common.Extensions; -using System.Text; -using Microsoft.AspNetCore.Authorization; -using Microsoft.AspNetCore.Authentication; using Monai.Deploy.WorkflowManager.Authentication.Middleware; -using Microsoft.Extensions.Logging; +using Monai.Deploy.WorkflowManager.Common.Extensions; namespace Monai.Deploy.WorkflowManager.Authentication.Extensions { diff --git a/src/WorkflowManager/Authentication/Middleware/BypassAuthenticationHandler.cs b/src/WorkflowManager/Authentication/Middleware/BypassAuthenticationHandler.cs index 424b8f1f7..3fc3760ea 100644 --- a/src/WorkflowManager/Authentication/Middleware/BypassAuthenticationHandler.cs +++ b/src/WorkflowManager/Authentication/Middleware/BypassAuthenticationHandler.cs @@ -14,11 +14,12 @@ * limitations under the License. */ -using Microsoft.AspNetCore.Authentication; -using Microsoft.Extensions.Options; using System.Security.Claims; using System.Text.Encodings.Web; +using Microsoft.AspNetCore.Authentication; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Monai.Deploy.WorkflowManager.Logging; namespace Monai.Deploy.WorkflowManager.Authentication.Middleware { @@ -36,7 +37,7 @@ public BypassAuthenticationHandler( protected override Task HandleAuthenticateAsync() { var principal = new ClaimsPrincipal(new ClaimsIdentity(Array.Empty(), Scheme.Name)); - Logger.LogInformation("Bypassing request"); + Logger.BypassAuthentication(); return Task.FromResult(AuthenticateResult.Success(new AuthenticationTicket(principal, Scheme.Name))); } } diff --git a/src/WorkflowManager/Authentication/Middleware/EndpointAuthorizationMiddleware.cs b/src/WorkflowManager/Authentication/Middleware/EndpointAuthorizationMiddleware.cs index 92ebaa8a4..12001180c 100644 --- a/src/WorkflowManager/Authentication/Middleware/EndpointAuthorizationMiddleware.cs +++ b/src/WorkflowManager/Authentication/Middleware/EndpointAuthorizationMiddleware.cs @@ -14,12 +14,12 @@ * limitations under the License. */ -using Microsoft.Extensions.Configuration; -using Microsoft.AspNetCore.Routing; using System.Net; using Microsoft.AspNetCore.Http; -using Monai.Deploy.WorkflowManager.Authentication.Extensions; +using Microsoft.AspNetCore.Routing; +using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Monai.Deploy.WorkflowManager.Authentication.Extensions; namespace Monai.Deploy.WorkflowManager.Authentication.Middleware { diff --git a/src/WorkflowManager/Authentication/Monai.Deploy.WorkflowManager.Authentication.csproj b/src/WorkflowManager/Authentication/Monai.Deploy.WorkflowManager.Authentication.csproj index 4e7650da4..3cf7a4620 100644 --- a/src/WorkflowManager/Authentication/Monai.Deploy.WorkflowManager.Authentication.csproj +++ b/src/WorkflowManager/Authentication/Monai.Deploy.WorkflowManager.Authentication.csproj @@ -25,11 +25,12 @@ - + + - + diff --git a/src/WorkflowManager/Common/Extensions/FileExtensions.cs b/src/WorkflowManager/Common/Extensions/FileExtensions.cs index cfe134f11..f32189ab8 100644 --- a/src/WorkflowManager/Common/Extensions/FileExtensions.cs +++ b/src/WorkflowManager/Common/Extensions/FileExtensions.cs @@ -14,7 +14,6 @@ * limitations under the License. */ - using Monai.Deploy.Storage.API; namespace Monai.Deploy.WorkflowManager.Common.Extensions diff --git a/src/WorkflowManager/Common/Interfaces/IWorkflowInstanceService.cs b/src/WorkflowManager/Common/Interfaces/IWorkflowInstanceService.cs index 14f930b7c..4bb067924 100644 --- a/src/WorkflowManager/Common/Interfaces/IWorkflowInstanceService.cs +++ b/src/WorkflowManager/Common/Interfaces/IWorkflowInstanceService.cs @@ -51,7 +51,6 @@ public interface IWorkflowInstanceService : IPaginatedApi /// public Task FilteredCountAsync(Status? status = null, string? payloadId = null); - /// /// Get all failed workflow instance's within a time span. /// diff --git a/src/WorkflowManager/Common/Services/PayloadService.cs b/src/WorkflowManager/Common/Services/PayloadService.cs index d52468681..0c29d5be5 100644 --- a/src/WorkflowManager/Common/Services/PayloadService.cs +++ b/src/WorkflowManager/Common/Services/PayloadService.cs @@ -20,7 +20,7 @@ using Monai.Deploy.WorkflowManager.Common.Interfaces; using Monai.Deploy.WorkflowManager.Contracts.Models; using Monai.Deploy.WorkflowManager.Database.Interfaces; -using Monai.Deploy.WorkflowManager.Logging.Logging; +using Monai.Deploy.WorkflowManager.Logging; using Monai.Deploy.WorkflowManager.Storage.Services; namespace Monai.Deploy.WorkflowManager.Common.Services @@ -51,7 +51,6 @@ public PayloadService(IPayloadRepsitory payloadRepsitory, IDicomService dicomSer if (exists is not null) { _logger.PayloadAlreadyExists(eventPayload.PayloadId.ToString()); - return exists; } @@ -73,8 +72,13 @@ public PayloadService(IPayloadRepsitory payloadRepsitory, IDicomService dicomSer if (await _payloadRepsitory.CreateAsync(payload)) { + _logger.PayloadCreated(payload.Id); return payload; } + else + { + _logger.FailedToCreatedPayload(); + } } catch (Exception e) { @@ -103,6 +107,17 @@ public async Task> GetAllAsync(int? skip = null, int? limit = nul public async Task CountAsync() => await _payloadRepsitory.CountAsync(); public async Task UpdateWorkflowInstanceIdsAsync(string payloadId, IEnumerable workflowInstances) - => await _payloadRepsitory.UpdateAssociatedWorkflowInstancesAsync(payloadId, workflowInstances); + { + if (await _payloadRepsitory.UpdateAssociatedWorkflowInstancesAsync(payloadId, workflowInstances)) + { + _logger.PayloadUpdated(payloadId); + return true; + } + else + { + _logger.PayloadUpdateFailed(payloadId); + return false; + } + } } } diff --git a/src/WorkflowManager/Common/Services/TasksService.cs b/src/WorkflowManager/Common/Services/TasksService.cs index 49cc942e7..45d514d0d 100644 --- a/src/WorkflowManager/Common/Services/TasksService.cs +++ b/src/WorkflowManager/Common/Services/TasksService.cs @@ -15,8 +15,8 @@ */ using Monai.Deploy.WorkflowManager.Common.Interfaces; -using Monai.Deploy.WorkflowManager.Database.Interfaces; using Monai.Deploy.WorkflowManager.Contracts.Models; +using Monai.Deploy.WorkflowManager.Database.Interfaces; namespace Monai.Deploy.WorkflowManager.Common.Services { diff --git a/src/WorkflowManager/Common/Services/WorkflowInstanceService.cs b/src/WorkflowManager/Common/Services/WorkflowInstanceService.cs index fd866d740..58a4d50e1 100644 --- a/src/WorkflowManager/Common/Services/WorkflowInstanceService.cs +++ b/src/WorkflowManager/Common/Services/WorkflowInstanceService.cs @@ -15,21 +15,25 @@ */ using Ardalis.GuardClauses; -using Monai.Deploy.WorkflowManager.Common.Interfaces; -using Monai.Deploy.WorkflowManager.Database.Interfaces; -using Monai.Deploy.WorkflowManager.Contracts.Models; +using Microsoft.Extensions.Logging; using Monai.Deploy.Messaging.Events; using Monai.Deploy.WorkflowManager.Common.Exceptions; +using Monai.Deploy.WorkflowManager.Common.Interfaces; +using Monai.Deploy.WorkflowManager.Contracts.Models; +using Monai.Deploy.WorkflowManager.Database.Interfaces; +using Monai.Deploy.WorkflowManager.Logging; namespace Monai.Deploy.WorkflowManager.Common.Services { public class WorkflowInstanceService : IWorkflowInstanceService, IPaginatedApi { private readonly IWorkflowInstanceRepository _workflowInstanceRepository; + private readonly ILogger _logger; - public WorkflowInstanceService(IWorkflowInstanceRepository workflowInstanceRepository) + public WorkflowInstanceService(IWorkflowInstanceRepository workflowInstanceRepository, ILogger logger) { _workflowInstanceRepository = workflowInstanceRepository ?? throw new ArgumentNullException(nameof(workflowInstanceRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public async Task GetByIdAsync(string id) @@ -57,12 +61,14 @@ public async Task AcknowledgeTaskError(string workflowInstance } var updatedInstance = await _workflowInstanceRepository.AcknowledgeTaskError(workflowInstanceId, executionId); - + _logger.AckowledgedTaskError(); var failedTasks = updatedInstance.Tasks.Where(t => t.Status == TaskExecutionStatus.Failed); if (failedTasks.Any() && failedTasks.All(t => t.AcknowledgedTaskErrors != null)) { - return await _workflowInstanceRepository.AcknowledgeWorkflowInstanceErrors(workflowInstanceId); + var results = await _workflowInstanceRepository.AcknowledgeWorkflowInstanceErrors(workflowInstanceId); + _logger.AckowledgedWorkflowInstanceErrors(); + return results; } return updatedInstance; diff --git a/src/WorkflowManager/Common/Services/WorkflowService.cs b/src/WorkflowManager/Common/Services/WorkflowService.cs index 65b8eab32..76a18a4d8 100644 --- a/src/WorkflowManager/Common/Services/WorkflowService.cs +++ b/src/WorkflowManager/Common/Services/WorkflowService.cs @@ -15,19 +15,23 @@ */ using Ardalis.GuardClauses; +using Microsoft.Extensions.Logging; using Monai.Deploy.WorkflowManager.Common.Interfaces; using Monai.Deploy.WorkflowManager.Contracts.Models; using Monai.Deploy.WorkflowManager.Database.Interfaces; +using Monai.Deploy.WorkflowManager.Logging; namespace Monai.Deploy.WorkflowManager.Common.Services { public class WorkflowService : IWorkflowService { private readonly IWorkflowRepository _workflowRepository; + private readonly ILogger _logger; - public WorkflowService(IWorkflowRepository workflowRepository) + public WorkflowService(IWorkflowRepository workflowRepository, ILogger logger) { _workflowRepository = workflowRepository ?? throw new ArgumentNullException(nameof(workflowRepository)); + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public async Task GetAsync(string id) @@ -50,7 +54,9 @@ public async Task CreateAsync(Workflow workflow) { Guard.Against.Null(workflow); - return await _workflowRepository.CreateAsync(workflow); + var id = await _workflowRepository.CreateAsync(workflow); + _logger.WorkflowCreated(id, workflow.Name); + return id; } public async Task UpdateAsync(Workflow workflow, string id) @@ -65,13 +71,17 @@ public async Task CreateAsync(Workflow workflow) return null; } - return await _workflowRepository.UpdateAsync(workflow, existingWorkflow); + var result = await _workflowRepository.UpdateAsync(workflow, existingWorkflow); + _logger.WorkflowUpdated(id, workflow.Name); + return result; } public Task DeleteWorkflowAsync(WorkflowRevision workflow) { Guard.Against.Null(workflow); - return _workflowRepository.SoftDeleteWorkflow(workflow); + var result = _workflowRepository.SoftDeleteWorkflow(workflow); + _logger.WorkflowDeleted(workflow.WorkflowId, workflow.Id, workflow.Workflow?.Name); + return result; } public async Task CountAsync() => await _workflowRepository.CountAsync(); diff --git a/src/WorkflowManager/ConditionsResolver/Extensions/StringExtensions.cs b/src/WorkflowManager/ConditionsResolver/Extensions/StringExtensions.cs index 29ecb0df9..973c79282 100644 --- a/src/WorkflowManager/ConditionsResolver/Extensions/StringExtensions.cs +++ b/src/WorkflowManager/ConditionsResolver/Extensions/StringExtensions.cs @@ -43,6 +43,7 @@ public static string TrimStartExt(this string input, string prefixToRemove, Stri input = input.TrimStart().Substring(prefixToRemove.Length, input.Length - prefixToRemove.Length); } return input?.TrimStart() ?? string.Empty; + case StringComparison.CurrentCultureIgnoreCase: case StringComparison.InvariantCultureIgnoreCase: case StringComparison.OrdinalIgnoreCase: diff --git a/src/WorkflowManager/ConditionsResolver/Parser/ConditionalParameterParser.cs b/src/WorkflowManager/ConditionsResolver/Parser/ConditionalParameterParser.cs index 88ff18540..2b95f006a 100644 --- a/src/WorkflowManager/ConditionsResolver/Parser/ConditionalParameterParser.cs +++ b/src/WorkflowManager/ConditionsResolver/Parser/ConditionalParameterParser.cs @@ -22,6 +22,7 @@ using Monai.Deploy.WorkflowManager.ConditionsResolver.Extensions; using Monai.Deploy.WorkflowManager.ConditionsResolver.Resolver; using Monai.Deploy.WorkflowManager.Contracts.Models; +using Monai.Deploy.WorkflowManager.Logging; using Monai.Deploy.WorkflowManager.Storage.Services; namespace Monai.Deploy.WorkflowManager.ConditionsResolver.Parser @@ -106,7 +107,7 @@ public bool TryParse(string[] conditions, WorkflowInstance workflowInstance) } catch (Exception ex) { - _logger.LogWarning($"Failure attemping to parse condition - {conditions}", ex); + _logger.FailedToParseCondition(string.Join(Environment.NewLine, conditions), ex); return false; } } @@ -123,7 +124,7 @@ public bool TryParse(string conditions, WorkflowInstance workflowInstance) } catch (Exception ex) { - _logger.LogWarning($"Failure attemping to parse condition - {conditions}", ex); + _logger.FailedToParseCondition(string.Join(Environment.NewLine, conditions), ex); return false; } } @@ -167,7 +168,7 @@ public string ResolveParameters(string conditions, string workflowInstanceId) } catch (Exception e) { - _logger.LogError(e.Message); + _logger.FailedToParseCondition(conditions, e); ClearWorkflowParser(); throw; } @@ -187,7 +188,6 @@ private void ClearWorkflowParser() WorkflowInstance = null; } - /// /// Parses regex match collection for brackets /// @@ -221,6 +221,7 @@ private void ClearWorkflowParser() Guard.Against.NullOrWhiteSpace(value); value = value.Substring(2, value.Length - 4).Trim(); + _logger.ResolveValue(value); var context = ParameterContext.Undefined; if (value.StartsWith(ExecutionsTask)) { @@ -251,6 +252,7 @@ private void ClearWorkflowParser() var valueArr = subValue.Split('\''); var keyId = $"{valueArr[1]}{valueArr[3]}"; + _logger.ResolveDicomValue(subValue, keyId); if (subValue.StartsWith(".any")) { var task = Task.Run(async () => await _dicom.GetAnyValueAsync(keyId, WorkflowInstance.PayloadId, WorkflowInstance.BucketId)); @@ -289,42 +291,54 @@ private void ClearWorkflowParser() keyValue = subValues[3]?.Split('\'')[1]; } + _logger.ResolveExecutionTask(subValueKey); var resultStr = null as string; switch (subValueKey.ToLower()) { case ParameterConstants.TaskId: resultStr = task.TaskId; break; + case ParameterConstants.Status: resultStr = task.Status.ToString(); break; + case ParameterConstants.ExecutionId: resultStr = task.ExecutionId; break; + case ParameterConstants.OutputDirectory: resultStr = task.OutputDirectory; break; + case ParameterConstants.TaskType: resultStr = task.TaskType; break; + case ParameterConstants.PreviousTaskId: resultStr = task.PreviousTaskId; break; + case ParameterConstants.ErrorMessage: resultStr = task.Reason.ToString(); break; + case ParameterConstants.Result: resultStr = GetValueFromDictionary(task.ResultMetadata, keyValue); break; + case ParameterConstants.ExecutionStats: resultStr = GetValueFromDictionary(task.ExecutionStats, keyValue); break; + case ParameterConstants.StartTime: resultStr = task.TaskStartTime.ToString("dd/MM/yyyy HH:mm:ss"); break; + case ParameterConstants.EndTime: resultStr = task.TaskEndTime?.ToString("dd/MM/yyyy HH:mm:ss"); break; + default: break; } @@ -377,15 +391,18 @@ private void ClearWorkflowParser() if (workflowSpecValue is not null) { + _logger.ResolveWorkflow(keyValue); var resultStr = null as string; switch (keyValue) { case ParameterConstants.Name: resultStr = workflowSpecValue.Name; break; + case ParameterConstants.Description: resultStr = workflowSpecValue.Description; break; + default: break; } @@ -419,21 +436,27 @@ private void ClearWorkflowParser() case ParameterConstants.PatientId: resultStr = patientValue.PatientId; break; + case ParameterConstants.PatientName: resultStr = patientValue.PatientName; break; + case ParameterConstants.PatientSex: resultStr = patientValue.PatientSex; break; + case ParameterConstants.PatientDob: resultStr = patientValue.PatientDob?.ToString("dd/MM/yyyy"); break; + case ParameterConstants.PatientAge: resultStr = patientValue.PatientAge; break; + case ParameterConstants.PatientHospitalId: resultStr = patientValue.PatientHospitalId; break; + default: break; } @@ -443,7 +466,5 @@ private void ClearWorkflowParser() return (Result: null, Context: ParameterContext.PatientDetails); } - - } } diff --git a/src/WorkflowManager/ConditionsResolver/Resovler/Conditional.cs b/src/WorkflowManager/ConditionsResolver/Resovler/Conditional.cs index 283d44576..d86a427b2 100644 --- a/src/WorkflowManager/ConditionsResolver/Resovler/Conditional.cs +++ b/src/WorkflowManager/ConditionsResolver/Resovler/Conditional.cs @@ -73,7 +73,6 @@ public void SetNextParameter(string value, bool isArrayValue = false) LeftParameterIsArray = isArrayValue; return; } - else if (string.IsNullOrEmpty(RightParameter)) { RightParameter = value; @@ -200,6 +199,7 @@ private int ParseChars(ReadOnlySpan input, int currentIndex, char currentC LogicalOperator = currentChar.ToString(); } break; + default: break; } diff --git a/src/WorkflowManager/Contracts/Models/Artifact.cs b/src/WorkflowManager/Contracts/Models/Artifact.cs index 417f5a6d8..e903a157e 100644 --- a/src/WorkflowManager/Contracts/Models/Artifact.cs +++ b/src/WorkflowManager/Contracts/Models/Artifact.cs @@ -28,5 +28,10 @@ public class Artifact [JsonProperty(PropertyName = "mandatory")] public bool Mandatory { get; set; } = true; + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } } } diff --git a/src/WorkflowManager/Contracts/Models/PatientDetails.cs b/src/WorkflowManager/Contracts/Models/PatientDetails.cs index 0db18f08b..6e5e4543a 100644 --- a/src/WorkflowManager/Contracts/Models/PatientDetails.cs +++ b/src/WorkflowManager/Contracts/Models/PatientDetails.cs @@ -38,5 +38,10 @@ public class PatientDetails [JsonProperty(PropertyName = "patient_hospital_id")] public string? PatientHospitalId { get; set; } + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } } } diff --git a/src/WorkflowManager/Contracts/Models/TaskExecution.cs b/src/WorkflowManager/Contracts/Models/TaskExecution.cs index 3093f2b7b..22ac2a375 100644 --- a/src/WorkflowManager/Contracts/Models/TaskExecution.cs +++ b/src/WorkflowManager/Contracts/Models/TaskExecution.cs @@ -79,5 +79,10 @@ public class TaskExecution [JsonProperty(PropertyName = "acknowledged_task_errors")] public DateTime? AcknowledgedTaskErrors { get; set; } = null; + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } } } diff --git a/src/WorkflowManager/Contracts/Models/WorkflowInstance.cs b/src/WorkflowManager/Contracts/Models/WorkflowInstance.cs index 13b693338..fb7977b20 100644 --- a/src/WorkflowManager/Contracts/Models/WorkflowInstance.cs +++ b/src/WorkflowManager/Contracts/Models/WorkflowInstance.cs @@ -14,9 +14,9 @@ * limitations under the License. */ -using Newtonsoft.Json; using System; using System.Collections.Generic; +using Newtonsoft.Json; namespace Monai.Deploy.WorkflowManager.Contracts.Models { @@ -54,5 +54,10 @@ public class WorkflowInstance [JsonProperty(PropertyName = "acknowledged_workflow_errors")] public DateTime? AcknowledgedWorkflowErrors { get; set; } = null; + + public override string ToString() + { + return JsonConvert.SerializeObject(this); + } } } diff --git a/src/WorkflowManager/Contracts/Monai.Deploy.WorkflowManager.Contracts.csproj b/src/WorkflowManager/Contracts/Monai.Deploy.WorkflowManager.Contracts.csproj index d1f8aa99e..d7ab3bfa7 100644 --- a/src/WorkflowManager/Contracts/Monai.Deploy.WorkflowManager.Contracts.csproj +++ b/src/WorkflowManager/Contracts/Monai.Deploy.WorkflowManager.Contracts.csproj @@ -1,4 +1,4 @@ - - - + + @@ -34,10 +34,10 @@ limitations under the License. diff --git a/src/WorkflowManager/WorkflowManager/stylecop.json b/src/WorkflowManager/WorkflowManager/stylecop.json index 9442073a0..dc6bc00a5 100644 --- a/src/WorkflowManager/WorkflowManager/stylecop.json +++ b/src/WorkflowManager/WorkflowManager/stylecop.json @@ -6,8 +6,8 @@ }, "documentationRules": { "copyrightText": "Copyright YYYY MONAI Consortium\n\n Licensed under the Apache License, Version 2.0 (the \"License\");\n you may not use this file except in compliance with the License.\n You may obtain a copy of the at\n\n http:\nwww.apache.org/licenses/LICENSE-2.0\n\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.", - "companyName": "MONAI Consortium", + "companyName": "MONAI Consortium", "xmlHeader": false } } -} +} \ No newline at end of file diff --git a/stylecop.json b/stylecop.json index 99b50c812..78e9c67c5 100644 --- a/stylecop.json +++ b/stylecop.json @@ -5,4 +5,4 @@ "usingDirectivesPlacement": "outsideNamespace" } } -} +} \ No newline at end of file diff --git a/tests/IntegrationTests/TaskManager.IntegrationTests/StepDefinitions/CommonApiDefinitions.cs b/tests/IntegrationTests/TaskManager.IntegrationTests/StepDefinitions/CommonApiDefinitions.cs index f93c8703a..b053e9503 100644 --- a/tests/IntegrationTests/TaskManager.IntegrationTests/StepDefinitions/CommonApiDefinitions.cs +++ b/tests/IntegrationTests/TaskManager.IntegrationTests/StepDefinitions/CommonApiDefinitions.cs @@ -18,7 +18,6 @@ using FluentAssertions; using Monai.Deploy.WorkflowManager.TaskManager.IntegrationTests.POCO; using Monai.Deploy.WorkflowManager.TaskManager.IntegrationTests.Support; -using MongoDB.Driver; using Newtonsoft.Json; namespace Monai.Deploy.WorkflowManager.TaskManager.IntegrationTests.StepDefinitions @@ -74,4 +73,4 @@ public async Task ThenIWillGetAHealthCheckResponseMessage(string expectedMessage response!.Checks.Should().ContainEquivalentOf(new Component { Check = "mongodb", Result = expectedMessage }); } } -} \ No newline at end of file +} diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/DICOMs/output_metadata_multiple_files/dcm/output3.json b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/DICOMs/output_metadata_multiple_files/dcm/output3.json index c3038aaa4..4b76ebe35 100644 Binary files a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/DICOMs/output_metadata_multiple_files/dcm/output3.json and b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/DICOMs/output_metadata_multiple_files/dcm/output3.json differ diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/WorkflowInstancesApi.feature b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/WorkflowInstancesApi.feature index 52bfc9a32..2f0b38e00 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/WorkflowInstancesApi.feature +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Features/WorkflowInstancesApi.feature @@ -147,7 +147,7 @@ Scenario: Get all workflows instances by Id. Id Bad Request And I have a Workflow Instance WFI_Static_1 with no artifacts When I send a GET request Then I will get a 400 response - And I will receive the error message Failed to validate id, not a valid guid + And I will receive the error message Failed to validate id, not a valid GUID @GetWorkflowInstances @@ -156,7 +156,7 @@ Scenario: Get workflow instances by payloadId. Id Bad Request And I have a Workflow Instance WFI_Static_1 with no artifacts When I send a GET request Then I will get a 400 response - And I will receive the error message Failed to validate payloadId, not a valid guid + And I will receive the error message Failed to validate payloadId, not a valid GUID @UpdateWorkflowInstances Scenario Outline: Acknowledge 1 task error in a single task workflow instance @@ -189,8 +189,8 @@ Scenario Outline: Acknowledge task error in a workflow instance - invalid endpoi And I will receive the error message Examples: | endpoint | errorMessage | - | /workflowinstances/invalidID/executions/d32d5769-4ecf-4639-a048-6ecf2cced04a/acknowledge | Failed to validate id, not a valid guid | - | /workflowinstances/25dff711-efc5-4eeb-bccc-2bb996400a20/executions/invalidID/acknowledge | Failed to validate executionId, not a valid guid | + | /workflowinstances/invalidID/executions/d32d5769-4ecf-4639-a048-6ecf2cced04a/acknowledge | Failed to validate id, not a valid GUID | + | /workflowinstances/25dff711-efc5-4eeb-bccc-2bb996400a20/executions/invalidID/acknowledge | Failed to validate executionId, not a valid GUID | @UpdateWorkflowInstances Scenario Outline: Acknowledge task error in a workflow instance - workflow instance/task not failed diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/CommonApiStepDefinitions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/CommonApiStepDefinitions.cs index 6e376049b..8e2d7c1f9 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/CommonApiStepDefinitions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/CommonApiStepDefinitions.cs @@ -18,7 +18,6 @@ using BoDi; using Monai.Deploy.WorkflowManager.IntegrationTests.POCO; using Monai.Deploy.WorkflowManager.IntegrationTests.Support; -using MongoDB.Driver; using Newtonsoft.Json; using TechTalk.SpecFlow.Infrastructure; diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/PayloadApiStepDefinitions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/PayloadApiStepDefinitions.cs index 69153d73d..bcabc2c07 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/PayloadApiStepDefinitions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/PayloadApiStepDefinitions.cs @@ -18,7 +18,6 @@ using Monai.Deploy.WorkflowManager.Contracts.Models; using Monai.Deploy.WorkflowManager.IntegrationTests.Support; using Monai.Deploy.WorkflowManager.Wrappers; -using MongoDB.Driver; using Newtonsoft.Json; using TechTalk.SpecFlow.Infrastructure; diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstanceStepDefintions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstanceStepDefintions.cs index a547f68f9..9e521680d 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstanceStepDefintions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstanceStepDefintions.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using System.Globalization; using BoDi; using Monai.Deploy.WorkflowManager.Contracts.Models; using Monai.Deploy.WorkflowManager.IntegrationTests.Support; @@ -86,8 +87,7 @@ public void GivenIHaveWorkflowInstancesWithAcknowledgedWorkflowErrors(int count, _outputHelper.WriteLine($"Retrieving {count} workflow instances"); var listOfWorkflowInstance = new List(); - var parseResult = DateTime.TryParse(midDate, out var dateTimeParsed); - + var parseResult = DateTime.TryParse(midDate, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var dateTimeParsed); if (parseResult is false) { throw new Exception("Bad date time provided in generating data."); @@ -116,7 +116,7 @@ public void GivenIHaveWorkflowInstancesWithAcknowledgedWorkflowErrors(int count, } [Then(@"I can see ([1-9]*) Workflow Instances are created")] - [Then(@"I can see ([1-9]*) Workflow Instance is created")] + [Then(@"I can see ([0-9]*) Workflow Instance is created")] public void ThenICanSeeAWorkflowInstanceIsCreated(int count) { _outputHelper.WriteLine($"Retrieving {count} workflow instance/s using the payloadid={DataHelper.WorkflowRequestMessage.PayloadId.ToString()}"); diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstancesApiStepDefinitions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstancesApiStepDefinitions.cs index 48aa174df..2f78b918a 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstancesApiStepDefinitions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/StepDefinitions/WorkflowInstancesApiStepDefinitions.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using System.Globalization; using BoDi; using Monai.Deploy.WorkflowManager.Contracts.Models; using Monai.Deploy.WorkflowManager.IntegrationTests.Support; @@ -140,9 +141,8 @@ public void ThenICanSeeTriggeredWorkflowInstancesFromPayloadId(int count, string [Then(@"I can see (.*) failed workflow instances since (.*)")] public void ThenICanSeeFailedWorkflowInstancesSince(int count, string dateTime) { - var result = ApiHelper.Response.Content.ReadAsStringAsync().Result; - var parseResult = DateTime.TryParse(dateTime, out var dateTimeParsed); - + var result = ApiHelper.Response.Content.ReadAsStringAsync().Result; + var parseResult = DateTime.TryParse(dateTime, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal | DateTimeStyles.AdjustToUniversal, out var dateTimeParsed); if (parseResult is false) { throw new Exception("Bad date time provided"); diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Support/Assertions.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Support/Assertions.cs index 3379f35fe..17a48ca83 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Support/Assertions.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/Support/Assertions.cs @@ -288,7 +288,8 @@ public void AssertPayloadCollection(Payload payloadCollection, PatientDetails pa payloadCollection.CalledAeTitle.Should().Be(workflowRequestMessage.CalledAeTitle); payloadCollection.CorrelationId.Should().Be(workflowRequestMessage.CorrelationId); payloadCollection.Timestamp.Should().BeCloseTo(DateTime.UtcNow, precision: TimeSpan.FromMinutes(1)); - payloadCollection.PatientDetails.Should().BeEquivalentTo(patientDetails); + payloadCollection.PatientDetails.Should().BeEquivalentTo(patientDetails, options => options.Excluding(x => x.PatientDob)); + payloadCollection.PatientDetails.PatientDob?.ToUniversalTime().Should().Be(patientDetails.PatientDob?.ToUniversalTime()); } public void AssertPayloadWorkflowInstanceId(Payload payloadCollection, List workflowInstances) @@ -409,10 +410,11 @@ public void AssertWorkflowInstanceList(List expectedWorkflowIn foreach (var actualWorkflowInstance in actualWorkflowInstances) { var expectedWorkflowInstance = expectedWorkflowInstances.FirstOrDefault(x => x.Id.Equals(actualWorkflowInstance.Id)); - actualWorkflowInstance.StartTime.ToString(format: "yyyy-MM-dd hh:mm:ss").Should().Be(expectedWorkflowInstance?.StartTime.ToString(format: "yyyy-MM-dd hh:mm:ss")); + actualWorkflowInstance.StartTime.ToString("u").Should().Be(expectedWorkflowInstance?.StartTime.ToString("u")); + actualWorkflowInstance.AcknowledgedWorkflowErrors?.ToString("u").Should().Be(expectedWorkflowInstance?.AcknowledgedWorkflowErrors?.ToString("u")); } actualWorkflowInstances.OrderBy(x => x.Id).Should().BeEquivalentTo(expectedWorkflowInstances.OrderBy(x => x.Id), - options => options.Excluding(x => x.StartTime)); + options => options.Excluding(x => x.StartTime).Excluding(x => x.AcknowledgedWorkflowErrors)); } public void AssertWorkflowInstance(List expectedWorkflowInstances, WorkflowInstance? actualWorkflowInstance) diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/PatientTestData.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/PatientTestData.cs index 626298ac2..905e2e208 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/PatientTestData.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/PatientTestData.cs @@ -37,7 +37,7 @@ public static class PatientsTestData PatientId = "1", PatientName = "Patient_Full_Patient", PatientSex = "male", - PatientDob = new DateTime(2000, 01, 01), + PatientDob = new DateTime(2000, 01, 01, 0, 0, 0, kind: DateTimeKind.Local), PatientAge = "21", PatientHospitalId = "123" } diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowInstanceTestData.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowInstanceTestData.cs index cea6bdd75..18f371055 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowInstanceTestData.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowInstanceTestData.cs @@ -16,7 +16,6 @@ using Monai.Deploy.Messaging.Events; using Monai.Deploy.WorkflowManager.Contracts.Models; -using Monai.Deploy.WorkflowManager.Controllers; using Monai.Deploy.WorkflowManager.IntegrationTests.POCO; #pragma warning disable CS8602 // Dereference of a possibly null reference. #pragma warning disable CS8601 // Possible null reference assignment. @@ -43,7 +42,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName(workflowName).WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName(workflowName).WorkflowRevision.WorkflowId, PayloadId = payloadId, - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -678,7 +677,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Invalid_Task_Destination")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Invalid_Task_Destination")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -715,7 +714,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Metadata_Condition_True")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Metadata_Condition_True")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = "c5c3636b-81dd-44a9-8c4b-71adec7d47b2", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -743,7 +742,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Metadata_Condition_True")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Metadata_Condition_True")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = "c5c3636b-81dd-44a9-8c4b-71adec7d47b2", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -771,7 +770,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Condition_True")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Condition_True")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -799,7 +798,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Multi_Condition_True")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Multi_Condition_True")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -827,7 +826,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Multi_Condition_False")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Multi_Condition_False")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -855,7 +854,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Metadata_Condition_False")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Metadata_Condition_False")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = "c5c3636b-81dd-44a9-8c4b-71adec7d47b2", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -883,7 +882,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Condition_False")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Single_Condition_False")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -911,7 +910,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Multiple_Destination_Single_Condition_True")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Multiple_Destination_Single_Condition_True")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -939,7 +938,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Multiple_Destination_Single_Condition_False")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Multiple_Destination_Single_Condition_False")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -967,7 +966,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Invalid_Task_Destination")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Invalid_Task_Destination")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -1004,7 +1003,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Multiple_Condition_True_And_False")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Destination_Multiple_Condition_True_And_False")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -1032,7 +1031,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Task_Destination_Invalid_Condition")?.WorkflowRevision?.Workflow?.InformaticsGateway?.AeTitle, WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Task_Destination_Invalid_Condition")?.WorkflowRevision?.WorkflowId ?? "", PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = "bucket_1", InputMetaData = new Dictionary() @@ -1060,7 +1059,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("TwoTask_Context.Dicom.Input_ArtifactMandatory=Null").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("TwoTask_Context.Dicom.Input_ArtifactMandatory=Null").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1090,7 +1089,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("TwoTask_Context.Dicom.Input_ArtifactMandatory=True").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("TwoTask_Context.Dicom.Input_ArtifactMandatory=True").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1120,7 +1119,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("TwoTask_Context.Dicom.Input_ArtifactMandatory=False").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("TwoTask_Context.Dicom.Input_ArtifactMandatory=False").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1150,7 +1149,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("TwoTask_Context.Executions.Task_id.Artifact.Artifact_Name_Mandatory=True").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("TwoTask_Context.Executions.Task_id.Artifact.Artifact_Name_Mandatory=True").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1180,7 +1179,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("TwoTask_Context.Executions.Task_id.Artifact.Artifact_Name_Mandatory=False").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("TwoTask_Context.Executions.Task_id.Artifact.Artifact_Name_Mandatory=False").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1210,7 +1209,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("TwoTask_Context.Executions.Task_id.Artifact.Artifact_Name_Mandatory=Null").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("TwoTask_Context.Executions.Task_id.Artifact.Artifact_Name_Mandatory=Null").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1240,7 +1239,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Workflow_Revision_for_export_single_dest_1").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("Workflow_Revision_for_export_single_dest_1").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1270,7 +1269,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Workflow_Revision_for_export_folder").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("Workflow_Revision_for_export_folder").WorkflowRevision.WorkflowId, PayloadId = "fd1e99c1-341a-4400-aa28-3fa89d874968", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1301,7 +1300,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Workflow_Revision_for_export_multi_dest_1").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("Workflow_Revision_for_export_multi_dest_1").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1331,7 +1330,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Workflow_Revision_for_export_multi_dest_2").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("Workflow_Revision_for_export_multi_dest_2").WorkflowRevision.WorkflowId, PayloadId = Guid.NewGuid().ToString(), - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1385,7 +1384,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = Helper.GetWorkflowByName("Mandatory_Output").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, WorkflowId = Helper.GetWorkflowByName("Mandatory_Output").WorkflowRevision.WorkflowId, PayloadId = "85dce342-e5b0-4a40-9725-9a34f8e1fda0", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1416,7 +1415,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = "Ae_test", WorkflowId = "a971f5f8-68fa-4cd0-ad34-f20b66675d21", PayloadId = "e908ff53-d808-4c9b-82b6-698b8c60e811", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1528,7 +1527,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = "Ae_test", WorkflowId = "a971f5f8-68fa-4cd0-ad34-f20b66675d214", PayloadId = "e908ff53-d808-4c9b-82b6-698b8c60e8111", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1640,7 +1639,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) AeTitle = "Ae_test", WorkflowId = "a971f5f8-68fa-4cd0-ad34-f20b66675d214", PayloadId = "e908ff53-d808-4c9b-82b6-698b8c60e8111", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, BucketId = TestExecutionConfig.MinioConfig.Bucket, InputMetaData = new Dictionary() @@ -1784,7 +1783,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) BucketId = "bucket1", StartTime = DateTime.UtcNow, Status = Status.Failed, - AcknowledgedWorkflowErrors = new DateTime(2000, 01, 01, 12, 00, 00), + AcknowledgedWorkflowErrors = new DateTime(2000, 01, 01, 12, 00, 00, DateTimeKind.Utc), InputMetaData = new Dictionary() { { "", "" } @@ -1798,7 +1797,7 @@ public static WorkflowInstance CreateWorkflowInstance(string workflowName) OutputDirectory = "payloadId/workflows/workflowInstanceId/executionId/", TaskType = "Multi_task", Status = TaskExecutionStatus.Failed, - AcknowledgedTaskErrors = new DateTime(2000, 01, 01, 12, 00, 00), + AcknowledgedTaskErrors = new DateTime(2000, 01, 01, 12, 00, 00, DateTimeKind.Utc), } } diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowRequestTestData.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowRequestTestData.cs index 54fba13e8..793820567 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowRequestTestData.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowRequestTestData.cs @@ -38,7 +38,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Basic_AE", CallingAeTitle = "Basic_AE_3", } @@ -52,7 +52,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_1").WorkflowRevision.WorkflowId }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "No_AE", CallingAeTitle = "MWM", } @@ -66,7 +66,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_1").WorkflowRevision.WorkflowId, Helper.GetWorkflowByName("Basic_Workflow_2").WorkflowRevision.WorkflowId }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "No_AE", CallingAeTitle = "MWM", } @@ -80,7 +80,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_1").WorkflowRevision.WorkflowId }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Basic_AE_3", CallingAeTitle = "Basic_AE", } @@ -94,7 +94,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Multi_Revision", CallingAeTitle = "MWM", } @@ -108,7 +108,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Multi_Rev_Old", CallingAeTitle = "MWM", } @@ -122,7 +122,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_Multiple_Revisions_2").WorkflowRevision.WorkflowId }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "No_AE", CallingAeTitle = "MWM", } @@ -135,7 +135,7 @@ public static class WorkflowRequestsTestData Bucket = "bucket1", Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_3").WorkflowRevision.WorkflowId }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Basic_AE_3", CallingAeTitle = "MWM", } @@ -148,7 +148,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_3").WorkflowRevision.WorkflowId }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Basic_AE_3", CallingAeTitle = "MWM", } @@ -161,7 +161,7 @@ public static class WorkflowRequestsTestData Bucket = "bucket1", PayloadId = Guid.NewGuid(), Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_3").WorkflowRevision.WorkflowId }, - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Basic_AE_3", CallingAeTitle = "MWM", } @@ -175,7 +175,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_3").WorkflowRevision.WorkflowId }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Basic_AE_3", } }, @@ -188,7 +188,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { Helper.GetWorkflowByName("Basic_Workflow_3").WorkflowRevision.WorkflowId }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CallingAeTitle = "MWM", } }, @@ -201,7 +201,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Multi_Created", CallingAeTitle = "MWM", } @@ -215,7 +215,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "MWM", CallingAeTitle = "Multi_Dispatch", } @@ -229,7 +229,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Same_Ae", CallingAeTitle = "MWM", } @@ -243,7 +243,7 @@ public static class WorkflowRequestsTestData PayloadId = new Guid("23b96697-0174-465c-b9cb-368b20a4591d"), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "MWM", CallingAeTitle = "Basic_AE", } @@ -257,7 +257,7 @@ public static class WorkflowRequestsTestData PayloadId = new Guid("64a2b260-0379-4614-9f05-ff1279cf9e83"), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Basic_AE", CallingAeTitle = "MWM", } @@ -271,7 +271,7 @@ public static class WorkflowRequestsTestData PayloadId = new Guid("b91f5559-8ab2-455a-806d-961244ea22af"), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Basic_AE", CallingAeTitle = "MWM", } @@ -285,7 +285,7 @@ public static class WorkflowRequestsTestData PayloadId = new Guid("c9c1e0f1-5994-4882-b3d4-9e1009729377"), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Non_Existant_AE", CallingAeTitle = "MWM", } @@ -299,7 +299,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Router_1", CallingAeTitle = "MWM", } @@ -313,7 +313,7 @@ public static class WorkflowRequestsTestData PayloadId = new Guid("3d22bf41-eacd-4e43-9161-d00735b31a2e"), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Artifact_AE", CallingAeTitle = "MWM", } @@ -327,7 +327,7 @@ public static class WorkflowRequestsTestData PayloadId = Guid.NewGuid(), Workflows = new List() { }, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "Non_Existent_Called_AE", CallingAeTitle = "Non_Existent_Calling_AE", } diff --git a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowRevisionTestData.cs b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowRevisionTestData.cs index 7e7fd6d99..1c56b47d0 100644 --- a/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowRevisionTestData.cs +++ b/tests/IntegrationTests/WorkflowExecutor.IntegrationTests/TestData/WorkflowRevisionTestData.cs @@ -2796,7 +2796,7 @@ public static class WorkflowRevisionsTestData Id = "66678af8-e8ac-4b77-a431-9d1a289d6c3b", WorkflowId = "c86a437d-d026-4bdf-b1df-c7a6372b89e3", Revision = 1, - Deleted = new DateTime(2000, 01, 01), + Deleted = new DateTime(2000, 01, 01, 0, 0, 0, kind: DateTimeKind.Utc), Workflow = new Workflow() { Name = "Basic workflow", @@ -2830,7 +2830,7 @@ public static class WorkflowRevisionsTestData Id = Guid.NewGuid().ToString(), WorkflowId = "85c48175-f4db-4d3c-bf3a-14f736edaccd", Revision = 1, - Deleted = new DateTime(2000, 01, 01), + Deleted = new DateTime(2000, 01, 01, 0, 0, 0, kind: DateTimeKind.Utc), Workflow = new Workflow() { Name = "Basic workflow multiple revisions 1", @@ -2861,7 +2861,7 @@ public static class WorkflowRevisionsTestData Id = Guid.NewGuid().ToString(), WorkflowId = "85c48175-f4db-4d3c-bf3a-14f736edaccd", Revision = 2, - Deleted = new DateTime(2000, 01, 01), + Deleted = new DateTime(2000, 01, 01, 0, 0, 0, kind: DateTimeKind.Utc), Workflow = new Workflow() { Name = "Basic workflow multiple revisions 2", @@ -2892,7 +2892,7 @@ public static class WorkflowRevisionsTestData Id = Guid.NewGuid().ToString(), WorkflowId = "85c48175-f4db-4d3c-bf3a-14f736edaccd", Revision = 1, - Deleted = new DateTime(2000, 01, 01, 12, 00, 00), + Deleted = new DateTime(2000, 01, 01, 12, 00, 00, DateTimeKind.Utc), Workflow = new Workflow() { Name = "Basic workflow multiple revisions 1", diff --git a/tests/Shared/VerifyLogExtension.cs b/tests/Shared/VerifyLogExtension.cs index a23688f34..7592be460 100644 --- a/tests/Shared/VerifyLogExtension.cs +++ b/tests/Shared/VerifyLogExtension.cs @@ -24,7 +24,6 @@ namespace Monai.Deploy.WorkflowManager.SharedTest { [ExcludeFromCodeCoverage] -#pragma warning disable CS8602 // Dereference of a possibly null reference. public static class VerifyLogExtension { public static Mock VerifyLoggingMessageEndsWith(this Mock logger, string expectedMessage, LogLevel expectedLogLevel = LogLevel.Debug, Times? times = null) @@ -137,5 +136,6 @@ public static Mock> VerifyLogging(this Mock> logger, Lo return logger; } } + #pragma warning restore CS8602 // Dereference of a possibly null reference. } diff --git a/tests/UnitTests/Common.Tests/Services/WorkflowInstanceServiceTests.cs b/tests/UnitTests/Common.Tests/Services/WorkflowInstanceServiceTests.cs index 7c7ca4b0e..703e4deca 100644 --- a/tests/UnitTests/Common.Tests/Services/WorkflowInstanceServiceTests.cs +++ b/tests/UnitTests/Common.Tests/Services/WorkflowInstanceServiceTests.cs @@ -15,6 +15,7 @@ */ using FluentAssertions; +using Microsoft.Extensions.Logging; using Monai.Deploy.Messaging.Events; using Monai.Deploy.WorkflowManager.Common.Exceptions; using Monai.Deploy.WorkflowManager.Common.Interfaces; @@ -31,12 +32,14 @@ public class WorkflowInstanceServiceTests private IWorkflowInstanceService WorkflowInstanceService { get; set; } private readonly Mock _workflowInstanceRepository; + private readonly Mock> _logger; public WorkflowInstanceServiceTests() { _workflowInstanceRepository = new Mock(); + _logger = new Mock>(); - WorkflowInstanceService = new WorkflowInstanceService(_workflowInstanceRepository.Object); + WorkflowInstanceService = new WorkflowInstanceService(_workflowInstanceRepository.Object, _logger.Object); } [Fact] diff --git a/tests/UnitTests/Common.Tests/Services/WorkflowServiceTests.cs b/tests/UnitTests/Common.Tests/Services/WorkflowServiceTests.cs index 61660a4d8..12c32ab6a 100644 --- a/tests/UnitTests/Common.Tests/Services/WorkflowServiceTests.cs +++ b/tests/UnitTests/Common.Tests/Services/WorkflowServiceTests.cs @@ -14,6 +14,7 @@ * limitations under the License. */ +using Microsoft.Extensions.Logging; using Monai.Deploy.WorkflowManager.Common.Interfaces; using Monai.Deploy.WorkflowManager.Common.Services; using Monai.Deploy.WorkflowManager.Contracts.Models; @@ -28,12 +29,14 @@ public class WorkflowServiceTests private IWorkflowService WorkflowService { get; set; } private readonly Mock _workflowRepository; + private readonly Mock> _logger; public WorkflowServiceTests() { _workflowRepository = new Mock(); + _logger = new Mock>(); - WorkflowService = new WorkflowService(_workflowRepository.Object); + WorkflowService = new WorkflowService(_workflowRepository.Object, _logger.Object); } [Fact] diff --git a/tests/UnitTests/Configuration.Tests/VerifyLogExtension.cs b/tests/UnitTests/Configuration.Tests/VerifyLogExtension.cs index 2fb2f80a1..ff45e8c02 100644 --- a/tests/UnitTests/Configuration.Tests/VerifyLogExtension.cs +++ b/tests/UnitTests/Configuration.Tests/VerifyLogExtension.cs @@ -23,8 +23,8 @@ namespace Monai.Deploy.InformaticsGateway.SharedTest { #pragma warning disable CS8602 // Dereference of a possibly null reference. #pragma warning disable CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types. - [ExcludeFromCodeCoverage] + [ExcludeFromCodeCoverage] public static class VerifyLogExtension { public static Mock VerifyLoggingMessageEndsWith(this Mock logger, string expectedMessage, LogLevel expectedLogLevel = LogLevel.Debug, Times? times = null) @@ -137,6 +137,7 @@ public static Mock> VerifyLogging(this Mock> logger, Lo return logger; } } + #pragma warning restore CS8620 // Argument cannot be used for parameter due to differences in the nullability of reference types. #pragma warning restore CS8602 // Dereference of a possibly null reference. } diff --git a/tests/UnitTests/Monai.Deploy.WorkflowManager.Shared.Tests/MonaiServiceLocatorTests.cs b/tests/UnitTests/Monai.Deploy.WorkflowManager.Shared.Tests/MonaiServiceLocatorTests.cs index bf2b7e2b6..83b8c9005 100644 --- a/tests/UnitTests/Monai.Deploy.WorkflowManager.Shared.Tests/MonaiServiceLocatorTests.cs +++ b/tests/UnitTests/Monai.Deploy.WorkflowManager.Shared.Tests/MonaiServiceLocatorTests.cs @@ -25,6 +25,7 @@ public class TestServiceA : IMonaiService public string ServiceName => nameof(TestServiceA); } + public class TestServiceB : IMonaiService { public ServiceStatus Status { get; set; } = ServiceStatus.Running; diff --git a/tests/UnitTests/MonaiBackgroundService.Tests/WorkerTests.cs b/tests/UnitTests/MonaiBackgroundService.Tests/WorkerTests.cs index db4d9c973..cae7ab9de 100644 --- a/tests/UnitTests/MonaiBackgroundService.Tests/WorkerTests.cs +++ b/tests/UnitTests/MonaiBackgroundService.Tests/WorkerTests.cs @@ -88,6 +88,5 @@ public async Task MonaiBackgroundService_DoWork_ShouldPublishMessages() Assert.False(_service.IsRunning); } - } } diff --git a/tests/UnitTests/PayloadListener.Tests/Services/EventPayloadRecieverServiceTests.cs b/tests/UnitTests/PayloadListener.Tests/Services/EventPayloadRecieverServiceTests.cs index 07835eebf..3715d03a3 100644 --- a/tests/UnitTests/PayloadListener.Tests/Services/EventPayloadRecieverServiceTests.cs +++ b/tests/UnitTests/PayloadListener.Tests/Services/EventPayloadRecieverServiceTests.cs @@ -14,21 +14,21 @@ * limitations under the License. */ -using NUnit.Framework; -using Moq; -using Monai.Deploy.WorkflowManager.PayloadListener.Services; using System; -using Monai.Deploy.WorkflowManager.PayloadListener.Validators; -using Monai.Deploy.Messaging.Messages; using System.Threading; -using Monai.Deploy.WorkflowManager.Configuration; -using Monai.Deploy.Messaging.Common; using Microsoft.Extensions.Logging; using Monai.Deploy.Messaging.API; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; -using Monai.Deploy.WorkflowManager.WorkfowExecuter.Services; +using Monai.Deploy.Messaging.Messages; using Monai.Deploy.WorkflowManager.Common.Interfaces; +using Monai.Deploy.WorkflowManager.Configuration; using Monai.Deploy.WorkflowManager.Contracts.Models; +using Monai.Deploy.WorkflowManager.PayloadListener.Services; +using Monai.Deploy.WorkflowManager.PayloadListener.Validators; +using Monai.Deploy.WorkflowManager.WorkfowExecuter.Services; +using Moq; +using NUnit.Framework; namespace Monai.Deploy.WorkflowManager.PayloadListener.Tests.Services { @@ -66,7 +66,6 @@ public void ReceiveWorkflowPayload_WorkFlowRequestIsNotValid_MessageSubscriberRe { var message = CreateMessageReceivedEventArgs(new string[] { "destination" }); - _mockEventPayloadValidator.Setup(p => p.ValidateWorkflowRequest(It.IsAny())).Returns(false); _eventPayloadReceiverService.ReceiveWorkflowPayload(message); @@ -79,7 +78,6 @@ public void ReceiveWorkflowPayload_CreatePayloadFails_MessageSubscriberRejectsTh { var message = CreateMessageReceivedEventArgs(new string[] { "destination" }); - _mockEventPayloadValidator.Setup(p => p.ValidateWorkflowRequest(It.IsAny())).Returns(true); _workflowExecuterService.Setup(p => p.ProcessPayload(It.IsAny(), It.IsAny())).ReturnsAsync(true); @@ -96,7 +94,6 @@ public void ReceiveWorkflowPayload_WorkFlowRequestIsValid_MessageSubscriberAckno { var message = CreateMessageReceivedEventArgs(new string[] { "destination" }); - _mockEventPayloadValidator.Setup(p => p.ValidateWorkflowRequest(It.IsAny())).Returns(true); _workflowExecuterService.Setup(p => p.ProcessPayload(It.IsAny(), It.IsAny())).ReturnsAsync(true); diff --git a/tests/UnitTests/PayloadListener.Tests/Validators/EventPayloadValidatorTests.cs b/tests/UnitTests/PayloadListener.Tests/Validators/EventPayloadValidatorTests.cs index b61ab20c9..273fe44e4 100644 --- a/tests/UnitTests/PayloadListener.Tests/Validators/EventPayloadValidatorTests.cs +++ b/tests/UnitTests/PayloadListener.Tests/Validators/EventPayloadValidatorTests.cs @@ -17,10 +17,10 @@ using System; using System.Collections.Generic; using Microsoft.Extensions.Logging; -using Moq; +using Monai.Deploy.Messaging.Events; using Monai.Deploy.WorkflowManager.PayloadListener.Validators; +using Moq; using NUnit.Framework; -using Monai.Deploy.Messaging.Events; namespace Monai.Deploy.WorkflowManager.PayloadListener.Tests.Validators { @@ -246,7 +246,7 @@ private static WorkflowRequestEvent CreateWorkflowRequestMessageWithNoWorkFlow() Workflows = new List(), FileCount = 2, CorrelationId = Guid.NewGuid().ToString(), - Timestamp = DateTime.Now, + Timestamp = DateTime.UtcNow, CalledAeTitle = "AeTitle", CallingAeTitle = "CallingAeTitle", }; diff --git a/tests/UnitTests/Storage.Tests/Services/DicomServiceTests.cs b/tests/UnitTests/Storage.Tests/Services/DicomServiceTests.cs index 77c1f1bb6..876b04d9c 100644 --- a/tests/UnitTests/Storage.Tests/Services/DicomServiceTests.cs +++ b/tests/UnitTests/Storage.Tests/Services/DicomServiceTests.cs @@ -16,19 +16,19 @@ using System; using System.Collections.Generic; +using System.IO; +using System.Text; using System.Threading; using System.Threading.Tasks; using FluentAssertions; -using Monai.Deploy.Storage.API; using Microsoft.Extensions.Logging; -using Monai.Deploy.WorkflowManager.Storage.Services; -using Moq; -using Xunit; -using System.Text; +using Monai.Deploy.Storage.API; using Monai.Deploy.WorkflowManager.Contracts.Models; using Monai.Deploy.WorkflowManager.Storage.Constants; +using Monai.Deploy.WorkflowManager.Storage.Services; +using Moq; using Newtonsoft.Json; -using System.IO; +using Xunit; namespace Monai.Deploy.WorkflowManager.Storage.Tests.Services { @@ -113,7 +113,7 @@ public async Task GetPayloadPatientDetails_ValidPayloadIdAndBucket_ReturnsValues PatientName = "Jack", PatientId = "patientid", PatientSex = "Male", - PatientDob = new DateTime(1996, 01, 20), + PatientDob = new DateTime(1996, 01, 20, 0, 0, 0, kind: DateTimeKind.Utc), PatientAge = "25", PatientHospitalId = "hospitalid" }; diff --git a/tests/UnitTests/TaskManager.AideClinicalReview.Tests/AideClinicalReviewPluginTests.cs b/tests/UnitTests/TaskManager.AideClinicalReview.Tests/AideClinicalReviewPluginTests.cs index 39c622f3e..824bed621 100644 --- a/tests/UnitTests/TaskManager.AideClinicalReview.Tests/AideClinicalReviewPluginTests.cs +++ b/tests/UnitTests/TaskManager.AideClinicalReview.Tests/AideClinicalReviewPluginTests.cs @@ -17,13 +17,13 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Monai.Deploy.Messaging.API; +using Monai.Deploy.Messaging.Common; using Monai.Deploy.Messaging.Events; +using Monai.Deploy.Messaging.Messages; using Monai.Deploy.WorkflowManager.TaskManager.AideClinicalReview; using Monai.Deploy.WorkflowManager.TaskManager.API; -using Monai.Deploy.Messaging.Common; using Moq; using Xunit; -using Monai.Deploy.Messaging.Messages; namespace TaskManager.AideClinicalReview.Tests { diff --git a/tests/UnitTests/TaskManager.Argo.Tests/ArgoPluginTest.cs b/tests/UnitTests/TaskManager.Argo.Tests/ArgoPluginTest.cs index a604942da..ec8e1af2c 100644 --- a/tests/UnitTests/TaskManager.Argo.Tests/ArgoPluginTest.cs +++ b/tests/UnitTests/TaskManager.Argo.Tests/ArgoPluginTest.cs @@ -547,7 +547,6 @@ public static Dictionary ValiateCanConvertToDictionary(object ob #pragma warning restore CS8603 // Possible null reference return. } - [Theory(DisplayName = "GetStatus - returns ExecutionStatus on success")] [InlineData(Strings.ArgoPhaseSucceeded)] [InlineData(Strings.ArgoPhaseFailed)] @@ -746,8 +745,8 @@ public async Task ArgoPlugin_Ensures_podGC_is_removed() Assert.Equal(TaskExecutionStatus.Accepted, result.Status); Assert.Null(_submittedArgoTemplate?.Spec.PodGC); - } + private void SetUpSimpleArgoWorkFlow(WorkflowTemplate argoTemplate) { Assert.NotNull(argoTemplate); diff --git a/tests/UnitTests/WorkflowExecuter.Tests/Services/ConditionalParameterParserTests.cs b/tests/UnitTests/WorkflowExecuter.Tests/Services/ConditionalParameterParserTests.cs index 926550310..4c35d203d 100644 --- a/tests/UnitTests/WorkflowExecuter.Tests/Services/ConditionalParameterParserTests.cs +++ b/tests/UnitTests/WorkflowExecuter.Tests/Services/ConditionalParameterParserTests.cs @@ -144,7 +144,7 @@ public void ResolveParametersWhenGivenPatientDetailsString_ShouldReturnValue(str PayloadId = "workflow1payload1", PatientDetails = new PatientDetails { - PatientDob = new DateTime(2000, 10, 19), + PatientDob = new DateTime(2000, 10, 19, 0, 0, 0, kind: DateTimeKind.Utc), PatientId = "patientid", PatientName = "patientname", PatientSex = "patientsex", @@ -183,7 +183,7 @@ public List CreateTestData() AeTitle = "Multi_Req", WorkflowId = "workflow1", PayloadId = "workflow1payload1", - StartTime = DateTime.Now, + StartTime = DateTime.UtcNow, Status = Status.Created, InputMetaData = new Dictionary() { @@ -197,8 +197,8 @@ public List CreateTestData() TaskId = "2dbd1af7-b699-4467-8e99-05a0c22422b4", TaskType = "Multi_task", OutputDirectory = "output/dir", - TaskStartTime = new DateTime(2022, 12, 25), - TaskEndTime = new DateTime(2022, 12, 25, 1, 0, 0), + TaskStartTime = new DateTime(2022, 12, 25, 0, 0, 0, DateTimeKind.Utc), + TaskEndTime = new DateTime(2022, 12, 25, 1, 0, 0, DateTimeKind.Utc), Status = TaskExecutionStatus.Succeeded, ResultMetadata = new Dictionary() { @@ -228,6 +228,7 @@ public List CreateTestData() } } } + #region Extra Test Data //new WorkflowInstance() @@ -236,7 +237,7 @@ public List CreateTestData() // AeTitle = "Multi_Req", // WorkflowId = Helper.GetWorkflowByName("Multi_Request_Workflow_Dispatched").WorkflowRevision.WorkflowId, // PayloadId = Helper.GetWorkflowRequestByName("Multi_WF_Dispatched").WorkflowRequestMessage.PayloadId.ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // InputMetaData = new Dictionary() // { @@ -259,7 +260,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Task_Status_Update_Workflow").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Task_Status_Update_Workflow").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // InputMetaData = new Dictionary() // { @@ -282,7 +283,7 @@ public List CreateTestData() // AeTitle = "Task_Update_9", // WorkflowId = Guid.NewGuid().ToString(), // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // InputMetaData = new Dictionary() // { @@ -305,7 +306,7 @@ public List CreateTestData() // AeTitle = "Task_Update_10", // WorkflowId = Guid.NewGuid().ToString(), // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // InputMetaData = new Dictionary() // { @@ -328,7 +329,7 @@ public List CreateTestData() // AeTitle = "Task_Update_11", // WorkflowId = Guid.NewGuid().ToString(), // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // InputMetaData = new Dictionary() // { @@ -351,7 +352,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_1").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_1").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // BucketId = "bucket_1", // InputMetaData = new Dictionary() @@ -375,7 +376,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_2").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_2").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // BucketId = "bucket_1", // InputMetaData = new Dictionary() @@ -399,7 +400,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_3").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_3").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // BucketId = "bucket_1", // InputMetaData = new Dictionary() @@ -423,7 +424,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_1").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_1").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // BucketId = "bucket_1", // InputMetaData = new Dictionary() @@ -454,7 +455,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_1").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_1").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // BucketId = "bucket_1", // InputMetaData = new Dictionary() @@ -485,7 +486,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_1").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_1").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // BucketId = "bucket_1", // InputMetaData = new Dictionary() @@ -516,7 +517,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Multi_Independent_Task_Workflow").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Multi_Independent_Task_Workflow").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // BucketId = "bucket_1", // InputMetaData = new Dictionary() @@ -540,7 +541,7 @@ public List CreateTestData() // AeTitle = Helper.GetWorkflowByName("Multi_Task_Workflow_Invalid_Task_Destination").WorkflowRevision.Workflow.InformaticsGateway.AeTitle, // WorkflowId = Helper.GetWorkflowByName("Multi_Task_Workflow_Invalid_Task_Destination").WorkflowRevision.WorkflowId, // PayloadId = Guid.NewGuid().ToString(), - // StartTime = DateTime.Now, + // StartTime = DateTime.UtcNow, // Status = Status.Created, // BucketId = "bucket_1", // InputMetaData = new Dictionary() @@ -558,10 +559,9 @@ public List CreateTestData() // } // } //} - #endregion + + #endregion Extra Test Data }; } - } - } diff --git a/tests/UnitTests/WorkflowExecuter.Tests/Services/WorkflowExecuterServiceTests.cs b/tests/UnitTests/WorkflowExecuter.Tests/Services/WorkflowExecuterServiceTests.cs index 81eb4cf0e..bacf2cd21 100644 --- a/tests/UnitTests/WorkflowExecuter.Tests/Services/WorkflowExecuterServiceTests.cs +++ b/tests/UnitTests/WorkflowExecuter.Tests/Services/WorkflowExecuterServiceTests.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading; using System.Threading.Tasks; using FluentAssertions; using Microsoft.Extensions.Logging; @@ -27,17 +28,16 @@ using Monai.Deploy.Storage.API; using Monai.Deploy.Storage.Configuration; using Monai.Deploy.WorkflowManager.Common.Extensions; +using Monai.Deploy.WorkflowManager.Common.Interfaces; +using Monai.Deploy.WorkflowManager.ConditionsResolver.Parser; using Monai.Deploy.WorkflowManager.Configuration; using Monai.Deploy.WorkflowManager.Contracts.Models; using Monai.Deploy.WorkflowManager.Database.Interfaces; +using Monai.Deploy.WorkflowManager.Storage.Services; using Monai.Deploy.WorkflowManager.WorkfowExecuter.Common; using Monai.Deploy.WorkflowManager.WorkfowExecuter.Services; using Moq; using Xunit; -using Monai.Deploy.WorkflowManager.Storage.Services; -using Monai.Deploy.WorkflowManager.ConditionsResolver.Parser; -using Monai.Deploy.WorkflowManager.Common.Interfaces; -using System.Threading; namespace Monai.Deploy.WorkflowManager.WorkflowExecuter.Tests.Services { diff --git a/tests/UnitTests/WorkflowManager.Tests/Common/IServiceProviderExtensionsTest.cs b/tests/UnitTests/WorkflowManager.Tests/Common/IServiceProviderExtensionsTest.cs deleted file mode 100644 index dee45785c..000000000 --- a/tests/UnitTests/WorkflowManager.Tests/Common/IServiceProviderExtensionsTest.cs +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright 2021-2022 MONAI Consortium - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using System; -using Microsoft.Extensions.Logging; -using Monai.Deploy.WorkflowManager.Configuration.Exceptions; -using Monai.Deploy.WorkflowManager.Extentions; -using Monai.Deploy.WorkflowManager.Test.SharedTest; -using Moq; -using Xunit; - -namespace Monai.Deploy.WorkflowManager.Test.Common -{ - public class IServiceProviderExtensionsTest - { - private readonly Mock _serviceProvider; - private readonly Mock> _logger; - - public IServiceProviderExtensionsTest() - { - _serviceProvider = new Mock(); - _logger = new Mock>(); - _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); - } - - [Fact(DisplayName = "LocateService shall throw when type is unknown")] - public void LocateService_ShallThrowWhenTypeIsUnknown() - { - var typeString = "TestTest"; - Assert.Throws(() => _serviceProvider.Object.LocateService(_logger.Object, typeString)); - - _logger.VerifyLogging($"Type '{typeString}' cannot be found.", LogLevel.Critical, Times.Once()); - } - - [Fact(DisplayName = "LocateService shall throw when instance of type cannot be found")] - public void LocateService_ShallThrowWhenInstanceOfTypeCannotBeFound() - { - var typeString = GetType().AssemblyQualifiedName; - Assert.Throws(() => _serviceProvider.Object.LocateService(_logger.Object, typeString)); - - _logger.VerifyLogging($"Instance of '{typeString}' cannot be found.", LogLevel.Critical, Times.Once()); - } - - [Fact(DisplayName = "LocateService shall return an instance of specified type")] - public void LocateService_ShallReturnInstance() - { - _serviceProvider.Setup(p => p.GetService(It.IsAny())).Returns(this); - - var typeString = GetType().AssemblyQualifiedName; - var instance = _serviceProvider.Object.LocateService(_logger.Object, typeString); - - Assert.Equal(this, instance); - } - } -} diff --git a/tests/UnitTests/WorkflowManager.Tests/Controllers/PayloadControllerTests.cs b/tests/UnitTests/WorkflowManager.Tests/Controllers/PayloadControllerTests.cs index 0b1e765cf..51da134ce 100644 --- a/tests/UnitTests/WorkflowManager.Tests/Controllers/PayloadControllerTests.cs +++ b/tests/UnitTests/WorkflowManager.Tests/Controllers/PayloadControllerTests.cs @@ -167,6 +167,5 @@ public async Task GetByIdAsync_ServiceException_ReturnProblem() const string expectedInstance = "/payload"; Assert.StartsWith(expectedInstance, ((ProblemDetails)objectResult.Value).Instance); } - } } diff --git a/tests/UnitTests/WorkflowManager.Tests/Controllers/TasksControllerTests.cs b/tests/UnitTests/WorkflowManager.Tests/Controllers/TasksControllerTests.cs index 15927924c..1adfa4c7c 100644 --- a/tests/UnitTests/WorkflowManager.Tests/Controllers/TasksControllerTests.cs +++ b/tests/UnitTests/WorkflowManager.Tests/Controllers/TasksControllerTests.cs @@ -180,7 +180,6 @@ public async Task GetAsync_TaskDoesNotExist_ReturnsBadRequest() WorkflowInstanceId = expectedExecutionId }; - _tasksService.Setup(w => w.GetTaskAsync(It.IsAny(), It.IsAny(), It.IsAny())).ReturnsAsync(() => null); var result = await TasksController.GetAsync(invalidRequest); diff --git a/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowInstanceControllerTests.cs b/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowInstanceControllerTests.cs index 25560b01a..04ceca274 100644 --- a/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowInstanceControllerTests.cs +++ b/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowInstanceControllerTests.cs @@ -53,10 +53,10 @@ public WorkflowsInstanceControllerTests() _logger = new Mock>(); _uriService = new Mock(); + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); WorkflowInstanceController = new WorkflowInstanceController(_workflowInstanceService.Object, _logger.Object, _uriService.Object, _options); } - [Fact] public async Task GetListAsync_WorkflowInstancesExist_ReturnsList() { @@ -458,18 +458,17 @@ public async Task TaskGetFailedAsync_GivenGetAllFailedAsyncReturnsThrowsExceptio responseValue.Detail.Should().Be(problemMessage); const string expectedInstance = "/workflowinstances"; - var expectedErrorMessage = "GetFailedAsync - Failed to get failed workflowInstances"; + var expectedErrorMessage = "Unexpected error occurred in GET /workflowinstances/failed API."; Assert.StartsWith(expectedInstance, responseValue.Instance); _logger.Verify(logger => logger.Log( It.Is(logLevel => logLevel == LogLevel.Error), - It.Is(eventId => eventId.Id == 0), - It.Is((@object, @type) => @object.ToString() == expectedErrorMessage && @type.Name == "FormattedLogValues"), + It.Is(eventId => eventId.Id == 100006), + It.Is((@object, @type) => @object.ToString() == expectedErrorMessage), It.IsAny(), It.IsAny>()), Times.Once); - } } } diff --git a/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowsControllerTests.cs b/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowsControllerTests.cs index a58885354..c194a71fd 100644 --- a/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowsControllerTests.cs +++ b/tests/UnitTests/WorkflowManager.Tests/Controllers/WorkflowsControllerTests.cs @@ -41,6 +41,7 @@ public class WorkflowsControllerTests private readonly Mock _workflowService; private readonly Mock _workflowValidator; private readonly Mock> _logger; + private readonly Mock> _loggerWorkflowValidator; private readonly Mock _uriService; private readonly IOptions _options; @@ -48,11 +49,13 @@ public WorkflowsControllerTests() { _options = Options.Create(new WorkflowManagerOptions()); _workflowService = new Mock(); - _workflowValidator = new Mock(_workflowService.Object); _logger = new Mock>(); + _loggerWorkflowValidator = new Mock>(); + _workflowValidator = new Mock(_workflowService.Object, _loggerWorkflowValidator.Object); _uriService = new Mock(); + _logger.Setup(p => p.IsEnabled(It.IsAny())).Returns(true); WorkflowsController = new WorkflowsController(_workflowService.Object, _workflowValidator.Object, _logger.Object, _uriService.Object, _options); } @@ -165,7 +168,6 @@ public async Task UpdateAsync_InvalidWorkflow_ReturnsBadRequest() AeTitle = "aetitle", DataOrigins = new[] { "test" }, ExportDestinations = new[] { "test" } - }, Tasks = new TaskObject[] { @@ -186,7 +188,6 @@ public async Task UpdateAsync_InvalidWorkflow_ReturnsBadRequest() const string expectedInstance = "/workflows"; Assert.StartsWith(expectedInstance, ((ProblemDetails)objectResult.Value).Instance); - } [Fact] @@ -232,7 +233,6 @@ public async Task UpdateAsync_WorkflowsDoesNotExist_ReturnsNotFound() AeTitle = "aetitle", DataOrigins = new[] { "test" }, ExportDestinations = new[] { "test" } - }, Tasks = new TaskObject[] { @@ -298,7 +298,6 @@ public async Task UpdateAsync_WorkflowsExist_ReturnsWorkflowId() AeTitle = "aetitle", DataOrigins = new[] { "test" }, ExportDestinations = new[] { "test" } - }, Tasks = new TaskObject[] { @@ -367,7 +366,6 @@ public async Task DeleteAsync_WorkflowsExist_SoftDeltesWorkflow() AeTitle = "aetitle", DataOrigins = new[] { "test" }, ExportDestinations = new[] { "test" } - }, Tasks = new TaskObject[] { @@ -440,7 +438,6 @@ public async Task DeleteAsync_WorkflowsDoesntExist_SoftDeltesWorkflow() AeTitle = "aetitle", DataOrigins = new[] { "test" }, ExportDestinations = new[] { "test" } - }, Tasks = new TaskObject[] { diff --git a/tests/UnitTests/WorkflowManager.Tests/DummyMessagingService.cs b/tests/UnitTests/WorkflowManager.Tests/DummyMessagingService.cs index 398101e2a..4f9e37ed3 100644 --- a/tests/UnitTests/WorkflowManager.Tests/DummyMessagingService.cs +++ b/tests/UnitTests/WorkflowManager.Tests/DummyMessagingService.cs @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + using System; using System.Collections.Generic; using System.Threading.Tasks; @@ -39,6 +40,7 @@ internal class DummyMessagePublisherRegistrar : PublisherServiceRegistrationBase { public override IServiceCollection Configure(IServiceCollection services) => services; } + internal class DummyMessageSubscriberRegistrar : SubscriberServiceRegistrationBase { public override IServiceCollection Configure(IServiceCollection services) => services; @@ -49,13 +51,21 @@ internal class DummyMessagingService : IMessageBrokerPublisherService, IMessageB public string Name => "Dummy Messaging Service"; public void Acknowledge(MessageBase message) => throw new NotImplementedException(); + public void Dispose() => throw new NotImplementedException(); + public Task Publish(string topic, Message message) => throw new NotImplementedException(); + public void Reject(MessageBase message, bool requeue = true) => throw new NotImplementedException(); + public Task RequeueWithDelay(MessageBase message) => throw new NotImplementedException(); + public void Subscribe(string topic, string queue, Action messageReceivedCallback, ushort prefetchCount = 0) => throw new NotImplementedException(); + public void Subscribe(string[] topics, string queue, Action messageReceivedCallback, ushort prefetchCount = 0) => throw new NotImplementedException(); + public void SubscribeAsync(string topic, string queue, Func messageReceivedCallback, ushort prefetchCount = 0) => throw new NotImplementedException(); + public void SubscribeAsync(string[] topics, string queue, Func messageReceivedCallback, ushort prefetchCount = 0) => throw new NotImplementedException(); } } diff --git a/tests/UnitTests/WorkflowManager.Tests/DummyStorageService.cs b/tests/UnitTests/WorkflowManager.Tests/DummyStorageService.cs index 4379fcea1..fac408b94 100644 --- a/tests/UnitTests/WorkflowManager.Tests/DummyStorageService.cs +++ b/tests/UnitTests/WorkflowManager.Tests/DummyStorageService.cs @@ -14,7 +14,6 @@ * limitations under the License. */ - using System; using System.Collections.Generic; using System.IO; @@ -45,23 +44,41 @@ internal class DummyStorageService : IStorageService public string Name => "Dummy Storage Service"; public Task CopyObjectAsync(string sourceBucketName, string sourceObjectName, string destinationBucketName, string destinationObjectName, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task CopyObjectWithCredentialsAsync(string sourceBucketName, string sourceObjectName, string destinationBucketName, string destinationObjectName, Credentials credentials, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task CreateFolderAsync(string bucketName, string folderPath, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task CreateFolderWithCredentialsAsync(string bucketName, string folderPath, Credentials credentials, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task CreateTemporaryCredentialsAsync(string bucketName, string folderName, int durationSeconds = 3600, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task GetObjectAsync(string bucketName, string objectName, Action callback, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task GetObjectAsync(string bucketName, string objectName, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task GetObjectWithCredentialsAsync(string bucketName, string objectName, Credentials credentials, Action callback, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task GetObjectWithCredentialsAsync(string bucketName, string objectName, Credentials credentials, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task> ListObjectsAsync(string bucketName, string prefix = "", bool recursive = false, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task> ListObjectsWithCredentialsAsync(string bucketName, Credentials credentials, string prefix = "", bool recursive = false, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task PutObjectAsync(string bucketName, string objectName, Stream data, long size, string contentType, Dictionary metadata, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task PutObjectWithCredentialsAsync(string bucketName, string objectName, Stream data, long size, string contentType, Dictionary metadata, Credentials credentials, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task RemoveObjectAsync(string bucketName, string objectName, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task RemoveObjectsAsync(string bucketName, IEnumerable objectNames, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task RemoveObjectsWithCredentialsAsync(string bucketName, IEnumerable objectNames, Credentials credentials, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task RemoveObjectWithCredentialsAsync(string bucketName, string objectName, Credentials credentials, CancellationToken cancellationToken = default) => throw new NotImplementedException(); + public Task> VerifyObjectExistsAsync(string bucketName, KeyValuePair objectPair) => throw new NotImplementedException(); + public Task> VerifyObjectsExistAsync(string bucketName, Dictionary objectDict) => throw new NotImplementedException(); } } diff --git a/tests/UnitTests/WorkflowManager.Tests/ProgramTest.cs b/tests/UnitTests/WorkflowManager.Tests/ProgramTest.cs index fec44c8e6..8cd7fa5ae 100644 --- a/tests/UnitTests/WorkflowManager.Tests/ProgramTest.cs +++ b/tests/UnitTests/WorkflowManager.Tests/ProgramTest.cs @@ -23,7 +23,8 @@ namespace Monai.Deploy.WorkflowManager.Tests { public class ProgramTest { - const string PlugInDirectoryName = "plug-ins"; + private const string PlugInDirectoryName = "plug-ins"; + [Fact(DisplayName = "Program - runs properly")] public void Startup_RunsProperly() { diff --git a/tests/UnitTests/WorkflowManager.Tests/Validators/WorkflowValidatorTests.cs b/tests/UnitTests/WorkflowManager.Tests/Validators/WorkflowValidatorTests.cs index 967394563..214283a95 100644 --- a/tests/UnitTests/WorkflowManager.Tests/Validators/WorkflowValidatorTests.cs +++ b/tests/UnitTests/WorkflowManager.Tests/Validators/WorkflowValidatorTests.cs @@ -16,6 +16,7 @@ using System; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; using Monai.Deploy.WorkflowManager.Common.Interfaces; using Monai.Deploy.WorkflowManager.Contracts.Models; using Monai.Deploy.WorkflowManager.Validators; @@ -29,15 +30,18 @@ public class WorkflowValidatorTests public WorkflowValidator WorkflowValidator { get; set; } private readonly Mock _workflowService; + private readonly Mock> _logger; public WorkflowValidatorTests() { _workflowService = new Mock(); - this.WorkflowValidator = new WorkflowValidator(_workflowService.Object); + _logger = new Mock>(); + + WorkflowValidator = new WorkflowValidator(_workflowService.Object, _logger.Object); } [Fact] - public async void ValidateWorkflow_ValidatesAWorkflow_ReturnsErrorsAndHasCorrectValidationResultsAsync() + public async Task ValidateWorkflow_ValidatesAWorkflow_ReturnsErrorsAndHasCorrectValidationResultsAsync() { var workflow = new Workflow { @@ -93,7 +97,9 @@ public async void ValidateWorkflow_ValidatesAWorkflow_ReturnsErrorsAndHasCorrect } } }, + #region LoopingTasks + new TaskObject { Id = "taskLoopdesc4", Type = "type", @@ -144,8 +150,11 @@ public async void ValidateWorkflow_ValidatesAWorkflow_ReturnsErrorsAndHasCorrect } } }, - #endregion + + #endregion LoopingTasks + #region SuccessfulTasksPath + new TaskObject { Id = "taskSucessdesc1", Type = "type", @@ -161,8 +170,11 @@ public async void ValidateWorkflow_ValidatesAWorkflow_ReturnsErrorsAndHasCorrect Id = "taskSucessdesc2", Type = "type", }, - #endregion + + #endregion SuccessfulTasksPath + #region SelfReferencingTasks + new TaskObject { Id = "taskdesc1", Type = "type", @@ -261,8 +273,10 @@ public async void ValidateWorkflow_ValidatesAWorkflow_ReturnsErrorsAndHasCorrect } } }, - #endregion - // Unreferenced task + + #endregion SelfReferencingTasks + + // Unreferenced task new TaskObject { Id = "taskdesc3", Type = "type", @@ -369,7 +383,7 @@ public async Task ValidateWorkflow_ValidatesEmptyWorkflow_ReturnsErrorsAndHasCor } [Fact] - public async void ValidateWorkflow_ValidateWorkflow_ReturnsNoErrors() + public async Task ValidateWorkflow_ValidateWorkflow_ReturnsNoErrors() { var workflow = new Workflow { @@ -417,7 +431,9 @@ public async void ValidateWorkflow_ValidateWorkflow_ReturnsNoErrors() } } }, + #region SuccessfulTasksPath + new TaskObject { Id = "taskSucessdesc1", @@ -437,7 +453,9 @@ public async void ValidateWorkflow_ValidateWorkflow_ReturnsNoErrors() Type = "type", Description = "TestDesc", }, - #endregion + + #endregion SuccessfulTasksPath + new TaskObject { Id = "taskdesc1", diff --git a/tests/UnitTests/WorkflowManager.Tests/appsettings.json b/tests/UnitTests/WorkflowManager.Tests/appsettings.json index 318cc13e5..5f1fdf407 100644 --- a/tests/UnitTests/WorkflowManager.Tests/appsettings.json +++ b/tests/UnitTests/WorkflowManager.Tests/appsettings.json @@ -108,4 +108,4 @@ } }, "AllowedHosts": "*" -} +} \ No newline at end of file