private async Task <WorkflowConfiguration> GetWorkflowConfiguration(Guid workflowId, CancellationToken cancellationToken = default)
        {
            var key = workflowId.ToString("D", CultureInfo.InvariantCulture);

            if (Cache.Value.TryGetValue(key, out WorkflowConfiguration workflowConfiguration))
            {
                return(workflowConfiguration);
            }

            IWorkflowParser workflowParser = new WorkflowXmlParser();
            var             content        = await WorkflowEngineBuilder.WorkflowStore.GetWorkflowConfiguration(workflowId, cancellationToken).ConfigureAwait(false);

            if (null == content)
            {
                throw new WorkflowException($"Workflow ID [{workflowId:D}] is referring to non existing workflow configuration");
            }

            workflowConfiguration = workflowParser.Parse(content);

            var workflowRuntimeConfiguration = await WorkflowEngineBuilder.WorkflowRuntimeConfigurationFactory
                                               .GetWorkflowRuntimeConfiguration(workflowConfiguration, cancellationToken)
                                               .ConfigureAwait(false);

            if (null == workflowRuntimeConfiguration)
            {
                throw new WorkflowException($"Workflow ID [{workflowId:D}] has not matching runtime configuration");
            }

            workflowConfiguration.RuntimeConfiguration = workflowRuntimeConfiguration;

            Cache.Value.Put(key, workflowConfiguration);
            return(workflowConfiguration);
        }
        public void Parse_Failed_DoNotAllowDuplicatedEventDeclarationForTheSameState()
        {
            var workflowReader = new WorkflowXmlParser();

            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Diadem.Workflow.Core.UnitTests.WorkflowConfigurations.Basic.flow.package.duplicated.event.01.xml"))
                using (var streamReader = new StreamReader(stream))
                {
                    Assert.Throws <WorkflowConfigurationException>(() => workflowReader.Parse(streamReader.ReadToEnd()));
                }
        }
        public void Parse_Failed_ActivityFailureMustReferToExistingTransition()
        {
            var workflowReader = new WorkflowXmlParser();

            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Diadem.Workflow.Core.UnitTests.WorkflowConfigurations.Basic.flow.package.07.activity.retry.failure.xml"))
                using (var streamReader = new StreamReader(stream))
                {
                    Assert.Throws <WorkflowConfigurationException>(() => workflowReader.Parse(streamReader.ReadToEnd()));
                }
        }
        public void Parse_Simple_Xml()
        {
            WorkflowConfiguration workflowConfiguration;
            var workflowReader = new WorkflowXmlParser();

            using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Diadem.Workflow.Core.UnitTests.WorkflowConfigurations.Basic.flow.package.01.xml"))
                using (var streamReader = new StreamReader(stream))
                {
                    workflowConfiguration = workflowReader.Parse(streamReader.ReadToEnd());
                }

            Assert.IsTrue(string.Equals(workflowConfiguration.Code, "test.v.0.0.1", StringComparison.OrdinalIgnoreCase));
            Assert.IsTrue(workflowConfiguration.States.Count == 4);
        }