From 53ada65c1ddaaf20c217845c9433bc554d20a2f7 Mon Sep 17 00:00:00 2001 From: David Boike Date: Tue, 5 Jun 2018 13:13:48 -0500 Subject: [PATCH 01/11] Support Core sagas - cherry-picked from 4.2 --- .../RuntimeSagaDefinitionReader.cs | 48 ++++- .../AcceptanceTestsHolder.csproj | 1 + ...When_using_intermediate_saga_base_class.cs | 124 ++++++++++++ src/NServiceBus.Persistence.Sql.sln | 6 + ...lowConcatenatingMsgProperties.approved.txt | 15 ++ ...natingMsgPropertiesWithFormat.approved.txt | 15 ++ ...sgPropertiesWithInterpolation.approved.txt | 15 ++ ...MsgPropertiesWithOtherMethods.approved.txt | 15 ++ ...etadataTests.DontAllowForLoop.approved.txt | 7 + ....DontAllowMethodCallInMapping.approved.txt | 7 + ...aTests.DontAllowPassingMapper.approved.txt | 7 + ...adataTests.DontAllowWhileLoop.approved.txt | 7 + ...tMapConflictingCorrelationIds.approved.txt | 7 + ...ataTests.DontMapDelegateCalls.approved.txt | 7 + ...taTests.DontMapSwitchingLogic.approved.txt | 7 + ...s.DontMapWithIntermediateBase.approved.txt | 7 + ...SagaMetadataTests.DualMapping.approved.txt | 15 ++ ...gaMetadataTests.SingleMapping.approved.txt | 15 ++ ...aTests.SingleMappingValueType.approved.txt | 15 ++ ...dditionalMetadataViaAttribute.approved.txt | 18 ++ ...agaMetadataTests.TestSagaInVB.approved.txt | 15 ++ ...gaMetadataTests.ConcatMsgPropertiesSaga.cs | 67 +++++++ ...Tests.ConcatMsgPropertiesWithFormatSaga.cs | 83 ++++++++ ...oncatMsgPropertiesWithInterpolationSaga.cs | 83 ++++++++ ...sts.ConcatMsgPropertiesWithOtherMethods.cs | 78 ++++++++ ...etadataTests.ConflictingCorrelationSaga.cs | 97 ++++++++++ ...reSagaMetadataTests.DelegateCallingSaga.cs | 30 +++ .../CoreSagaMetadataTests.DualMappingSaga.cs | 96 ++++++++++ .../CoreSagaMetadataTests.ForLoopSaga.cs | 71 +++++++ .../CoreSagaMetadataTests.HasBaseSagaClass.cs | 71 +++++++ ...gaMetadataTests.MetadataInAttributeSaga.cs | 61 ++++++ ...gaMetadataTests.MethodCallInMappingSaga.cs | 69 +++++++ ...CoreSagaMetadataTests.PassingMapperSaga.cs | 28 +++ .../CoreSagaMetadataTests.SharedMessages.cs | 25 +++ ...CoreSagaMetadataTests.SingleMappingSaga.cs | 58 ++++++ ...etadataTests.SingleMappingValueTypeSaga.cs | 61 ++++++ ...oreSagaMetadataTests.SwitchingLogicSaga.cs | 110 +++++++++++ .../CoreSagaMetadataTests.WhileLoopSaga.cs | 73 +++++++ .../CoreSagaMetadata/CoreSagaMetadataTests.cs | 168 +++++++++++++++++ ...reSqlSagaNotDecoratedBySqlSagaAttribute.cs | 38 ++++ .../Saga/SagaDefinitionReaderTest.cs | 41 +--- .../ScriptBuilder.Tests.csproj | 1 + .../Saga/AllSagaDefinitionReader.cs | 2 +- src/ScriptBuilder/Saga/InstructionAnalyzer.cs | 178 ++++++++++++++++++ .../Saga/SagaDefinitionReader.cs | 107 +++++++++-- .../ScriptBuilderTask.Tests.csproj | 1 - .../APIApprovals.Approve.approved.txt | 8 + src/SqlPersistence/Saga/RuntimeSagaInfo.cs | 16 +- src/SqlPersistence/Saga/SagaInfoCache.cs | 6 +- src/SqlPersistence/Saga/SqlSaga.cs | 11 -- src/SqlPersistence/Saga/SqlSagaAttribute.cs | 47 +++++ .../Saga/SqlSagaTypeDataReader.cs | 44 ++++- src/VBTestCode/Messages.vb | 26 +++ src/VBTestCode/VBMultiTestSaga.vb | 18 ++ src/VBTestCode/VBTestCode.vbproj | 14 ++ 55 files changed, 2176 insertions(+), 84 deletions(-) create mode 100644 src/AcceptanceTestsHolder/App_Packages/When_using_intermediate_saga_base_class.cs create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowForLoop.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DualMapping.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMapping.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMappingValueType.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt create mode 100644 src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.TestSagaInVB.approved.txt create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithFormatSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithInterpolationSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithOtherMethods.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConflictingCorrelationSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DelegateCallingSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DualMappingSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ForLoopSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.HasBaseSagaClass.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.MetadataInAttributeSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.MethodCallInMappingSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.PassingMapperSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SharedMessages.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingValueTypeSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SwitchingLogicSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.WhileLoopSaga.cs create mode 100644 src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs create mode 100644 src/ScriptBuilder.Tests/Saga/EnsureSqlSagaNotDecoratedBySqlSagaAttribute.cs create mode 100644 src/ScriptBuilder/Saga/InstructionAnalyzer.cs create mode 100644 src/SqlPersistence/Saga/SqlSagaAttribute.cs create mode 100644 src/VBTestCode/Messages.vb create mode 100644 src/VBTestCode/VBMultiTestSaga.vb create mode 100644 src/VBTestCode/VBTestCode.vbproj diff --git a/src/AcceptanceTestHelper/RuntimeSagaDefinitionReader.cs b/src/AcceptanceTestHelper/RuntimeSagaDefinitionReader.cs index 63496efbc..bc857f2d0 100644 --- a/src/AcceptanceTestHelper/RuntimeSagaDefinitionReader.cs +++ b/src/AcceptanceTestHelper/RuntimeSagaDefinitionReader.cs @@ -5,6 +5,7 @@ using System.Runtime.Serialization; using Mono.Cecil; using NServiceBus; +using NServiceBus.Persistence.Sql; using NServiceBus.Persistence.Sql.ScriptBuilder; public static class RuntimeSagaDefinitionReader @@ -40,6 +41,11 @@ public static IEnumerable GetSagaDefinitions(EndpointConfigurati public static SagaDefinition GetSagaDefinition(Type sagaType, BuildSqlDialect sqlDialect) { + if (SagaTypeHasIntermediateBaseClass(sagaType)) + { + throw new Exception("Saga implementations must inherit from either Saga or SqlSaga directly. Deep class hierarchies are not supported."); + } + var saga = (Saga)FormatterServices.GetUninitializedObject(sagaType); var mapper = new ConfigureHowToFindSagaWithMessage(); methodInfo.Invoke(saga, new object[] @@ -53,10 +59,8 @@ public static SagaDefinition GetSagaDefinition(Type sagaType, BuildSqlDialect sq name: mapper.CorrelationProperty, type: CorrelationPropertyTypeReader.GetCorrelationPropertyType(mapper.CorrelationType)); } - var transitionalCorrelationPropertyName = (string)sagaType - .GetProperty("TransitionalCorrelationPropertyName", AnyInstanceMember) - .GetValue(saga); - + + var transitionalCorrelationPropertyName = GetSagaMetadataProperty(sagaType, saga, "TransitionalCorrelationPropertyName", att => att.TransitionalCorrelationProperty); CorrelationProperty transitional = null; if (transitionalCorrelationPropertyName != null) @@ -65,8 +69,8 @@ public static SagaDefinition GetSagaDefinition(Type sagaType, BuildSqlDialect sq var transitionalProperty = sagaDataType.GetProperty(transitionalCorrelationPropertyName, AnyInstanceMember); transitional = new CorrelationProperty(transitionalCorrelationPropertyName, CorrelationPropertyTypeReader.GetCorrelationPropertyType(transitionalProperty.PropertyType)); } - - var tableSuffixOverride = (string)sagaType.GetProperty("TableSuffix", AnyInstanceMember).GetValue(saga); + + var tableSuffixOverride = GetSagaMetadataProperty(sagaType, saga, "TableSuffix", att => att.TableSuffix); var tableSuffix = tableSuffixOverride ?? sagaType.Name; if (sqlDialect == BuildSqlDialect.Oracle) @@ -80,4 +84,36 @@ public static SagaDefinition GetSagaDefinition(Type sagaType, BuildSqlDialect sq correlationProperty: correlationProperty, transitionalCorrelationProperty: transitional); } + + static bool SagaTypeHasIntermediateBaseClass(Type sagaType) + { + var baseType = sagaType.BaseType; + if (!baseType.IsGenericType) + { + // Saga and SqlSaga are both generic types + return true; + } + + var genericBase = baseType.GetGenericTypeDefinition(); + return genericBase != typeof(Saga<>) && genericBase != typeof(SqlSaga<>); + } + + static string GetSagaMetadataProperty(Type sagaType, Saga instance, string sqlSagaPropertyName, Func getSqlSagaAttributeValue) + { + if (sagaType.IsSubclassOfRawGeneric(typeof(SqlSaga<>))) + { + // ReSharper disable once PossibleNullReferenceException + return (string)sagaType + .GetProperty(sqlSagaPropertyName, AnyInstanceMember) + .GetValue(instance); + } + + if (sagaType.IsSubclassOfRawGeneric(typeof(Saga<>))) + { + var attr = sagaType.GetCustomAttribute(); + return (attr != null) ? getSqlSagaAttributeValue(attr) : null; + } + + throw new Exception($"Type '{sagaType.FullName}' is not a Saga."); + } } \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index 3d928d4d4..f945ecb47 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -241,6 +241,7 @@ + diff --git a/src/AcceptanceTestsHolder/App_Packages/When_using_intermediate_saga_base_class.cs b/src/AcceptanceTestsHolder/App_Packages/When_using_intermediate_saga_base_class.cs new file mode 100644 index 000000000..9adfa7be8 --- /dev/null +++ b/src/AcceptanceTestsHolder/App_Packages/When_using_intermediate_saga_base_class.cs @@ -0,0 +1,124 @@ +using System; +using System.Threading.Tasks; +using NServiceBus; +using NServiceBus.AcceptanceTesting; +using NServiceBus.AcceptanceTests; +using NServiceBus.AcceptanceTests.EndpointTemplates; +using NServiceBus.Persistence.Sql; +using NUnit.Framework; + +[TestFixture] +public class When_using_intermediate_saga_base_class : NServiceBusAcceptanceTest +{ + [Test] + public void Ensure_Core_Saga_will_throw() + { + PerformTestOn(); + } + + [Test] + public void Ensure_SqlSaga_will_throw() + { + PerformTestOn(); + } + + void PerformTestOn() + where TEndpointSelection : EndpointConfigurationBuilder + { + var ex = Assert.ThrowsAsync(async () => + { + await Scenario.Define() + .WithEndpoint(c => { c.When(session => session.SendLocal(new StartSaga { Correlation = "Corr" })); }) + .Done(c => c.EndpointsStarted) + .Run() + .ConfigureAwait(false); + }); + + Assert.IsTrue(ex.Message == "Saga implementations must inherit from either Saga or SqlSaga directly. Deep class hierarchies are not supported."); + } + + public class Context : ScenarioContext + { + } + + public class CoreSagaBaseClassEndpoint : EndpointConfigurationBuilder + { + public CoreSagaBaseClassEndpoint() + { + EndpointSetup(); + } + + public class CoreSagaWithBase : BaseSaga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + public override Task Handle(StartSaga message, IMessageHandlerContext context) + { + return Task.FromResult(0); + } + } + + public class BaseSaga : Saga, + IAmStartedByMessages + { + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + + + public virtual Task Handle(StartSaga message, IMessageHandlerContext context) + { + return Task.FromResult(0); + } + } + + } + + public class SqlSagaBaseClassEndpoint : EndpointConfigurationBuilder + { + public SqlSagaBaseClassEndpoint() + { + EndpointSetup(); + } + + public class SqlSagaWithBase : BaseSqlSaga, + IAmStartedByMessages + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureMapping(IMessagePropertyMapper mapper) + { + base.ConfigureMapping(mapper); + mapper.ConfigureMapping(msg => msg.Correlation); + } + + public Task Handle(StartSaga message, IMessageHandlerContext context) + { + return Task.FromResult(0); + } + } + + public class BaseSqlSaga : SqlSaga + { + protected override string CorrelationPropertyName => "Correlation"; + + protected override void ConfigureMapping(IMessagePropertyMapper mapper) + { + + } + } + } + + public class StartSaga : ICommand + { + public string Correlation { get; set; } + } + +} \ No newline at end of file diff --git a/src/NServiceBus.Persistence.Sql.sln b/src/NServiceBus.Persistence.Sql.sln index c860ca907..c5bea50ae 100644 --- a/src/NServiceBus.Persistence.Sql.sln +++ b/src/NServiceBus.Persistence.Sql.sln @@ -38,6 +38,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\GitVersion.yml = ..\GitVersion.yml EndProjectSection EndProject +Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "VBTestCode", "VBTestCode\VBTestCode.vbproj", "{86E76F2D-6743-442E-BDAD-80D6A872D4FA}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -100,6 +102,10 @@ Global {2247EC45-45DE-4D00-9343-C0FBC3C8EFB4}.Debug|Any CPU.Build.0 = Debug|Any CPU {2247EC45-45DE-4D00-9343-C0FBC3C8EFB4}.Release|Any CPU.ActiveCfg = Release|Any CPU {2247EC45-45DE-4D00-9343-C0FBC3C8EFB4}.Release|Any CPU.Build.0 = Release|Any CPU + {86E76F2D-6743-442E-BDAD-80D6A872D4FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86E76F2D-6743-442E-BDAD-80D6A872D4FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86E76F2D-6743-442E-BDAD-80D6A872D4FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86E76F2D-6743-442E-BDAD-80D6A872D4FA}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt new file mode 100644 index 000000000..b9c69233d --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt @@ -0,0 +1,15 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "ConcatMsgPropertiesSaga", + "CorrelationProperty": { + "Type": "String", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": null, + "Name": "CoreSagaMetadataTests/ConcatMsgPropertiesSaga" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt new file mode 100644 index 000000000..4f92ce7ae --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt @@ -0,0 +1,15 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "ConcatMsgPropertiesWithFormatSaga", + "CorrelationProperty": { + "Type": "String", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": null, + "Name": "CoreSagaMetadataTests/ConcatMsgPropertiesWithFormatSaga" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt new file mode 100644 index 000000000..d8b2f3de3 --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt @@ -0,0 +1,15 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "ConcatMsgPropertiesWithInterpolationSaga", + "CorrelationProperty": { + "Type": "String", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": null, + "Name": "CoreSagaMetadataTests/ConcatMsgPropertiesWithInterpolationSaga" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt new file mode 100644 index 000000000..d697bbde0 --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt @@ -0,0 +1,15 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "ConcatMsgPropertiesWithOtherMethods", + "CorrelationProperty": { + "Type": "String", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": null, + "Name": "CoreSagaMetadataTests/ConcatMsgPropertiesWithOtherMethods" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowForLoop.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowForLoop.approved.txt new file mode 100644 index 000000000..75069e7db --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowForLoop.approved.txt @@ -0,0 +1,7 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": true, + "SagaDefinition": null, + "Exception": "Looping & branching statements are not allowed in a ConfigureHowToFindSaga method." +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt new file mode 100644 index 000000000..a0f75781c --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt @@ -0,0 +1,7 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": true, + "HasBranchingLogic": false, + "SagaDefinition": null, + "Exception": "Unable to determine Saga correlation property because an unexpected method call was detected in the ConfigureHowToFindSaga method." +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt new file mode 100644 index 000000000..a0f75781c --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt @@ -0,0 +1,7 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": true, + "HasBranchingLogic": false, + "SagaDefinition": null, + "Exception": "Unable to determine Saga correlation property because an unexpected method call was detected in the ConfigureHowToFindSaga method." +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt new file mode 100644 index 000000000..75069e7db --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt @@ -0,0 +1,7 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": true, + "SagaDefinition": null, + "Exception": "Looping & branching statements are not allowed in a ConfigureHowToFindSaga method." +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt new file mode 100644 index 000000000..8f2c0bcb9 --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt @@ -0,0 +1,7 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": null, + "Exception": "Saga can only have one correlation property identified by .ToSaga() expressions. Fix mappings in ConfigureHowToFindSaga to map to a single correlation property or decorate the saga with [SqlSaga] attribute." +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt new file mode 100644 index 000000000..a0f75781c --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt @@ -0,0 +1,7 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": true, + "HasBranchingLogic": false, + "SagaDefinition": null, + "Exception": "Unable to determine Saga correlation property because an unexpected method call was detected in the ConfigureHowToFindSaga method." +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt new file mode 100644 index 000000000..75069e7db --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt @@ -0,0 +1,7 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": true, + "SagaDefinition": null, + "Exception": "Looping & branching statements are not allowed in a ConfigureHowToFindSaga method." +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt new file mode 100644 index 000000000..cc0c7ce35 --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt @@ -0,0 +1,7 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": true, + "HasBranchingLogic": false, + "SagaDefinition": null, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DualMapping.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DualMapping.approved.txt new file mode 100644 index 000000000..5ac54923c --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DualMapping.approved.txt @@ -0,0 +1,15 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "DualMappingSaga", + "CorrelationProperty": { + "Type": "String", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": null, + "Name": "CoreSagaMetadataTests/DualMappingSaga" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMapping.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMapping.approved.txt new file mode 100644 index 000000000..7275c01d1 --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMapping.approved.txt @@ -0,0 +1,15 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "SingleMappingSaga", + "CorrelationProperty": { + "Type": "String", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": null, + "Name": "CoreSagaMetadataTests/SingleMappingSaga" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMappingValueType.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMappingValueType.approved.txt new file mode 100644 index 000000000..844f95efc --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMappingValueType.approved.txt @@ -0,0 +1,15 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "SingleMappingValueTypeSaga", + "CorrelationProperty": { + "Type": "Int", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": null, + "Name": "CoreSagaMetadataTests/SingleMappingValueTypeSaga" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt new file mode 100644 index 000000000..751676ca9 --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt @@ -0,0 +1,18 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "DifferentTableSuffix", + "CorrelationProperty": { + "Type": "String", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": { + "Type": "String", + "Name": "TransitionalCorrId" + }, + "Name": "CoreSagaMetadataTests/MetadataInAttributeSaga" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.TestSagaInVB.approved.txt b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.TestSagaInVB.approved.txt new file mode 100644 index 000000000..cf4824e4f --- /dev/null +++ b/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.TestSagaInVB.approved.txt @@ -0,0 +1,15 @@ +{ + "HasUnmanagedCalls": false, + "HasUnexpectedCalls": false, + "HasBranchingLogic": false, + "SagaDefinition": { + "TableSuffix": "VBMultiTestSaga", + "CorrelationProperty": { + "Type": "String", + "Name": "Correlation" + }, + "TransitionalCorrelationProperty": null, + "Name": "VBTestCode.VBMultiTestSaga" + }, + "Exception": null +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesSaga.cs new file mode 100644 index 000000000..bd9f25cd9 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesSaga.cs @@ -0,0 +1,67 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class ConcatMsgPropertiesSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Part1 + msg.Part2).ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +ConcatMsgPropertiesSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageC +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldloc.0 +IL_0017: ldtoken UserQuery+MessageC.get_Part1 +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: call System.Linq.Expressions.Expression.Property +IL_002B: ldloc.0 +IL_002C: ldtoken UserQuery+MessageC.get_Part2 +IL_0031: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0036: castclass System.Reflection.MethodInfo +IL_003B: call System.Linq.Expressions.Expression.Property +IL_0040: ldtoken System.String.Concat +IL_0045: call System.Reflection.MethodBase.GetMethodFromHandle +IL_004A: castclass System.Reflection.MethodInfo +IL_004F: call System.Linq.Expressions.Expression.Add +IL_0054: ldc.i4.1 +IL_0055: newarr System.Linq.Expressions.ParameterExpression +IL_005A: dup +IL_005B: ldc.i4.0 +IL_005C: ldloc.0 +IL_005D: stelem.ref +IL_005E: call System.Linq.Expressions.Expression.Lambda +IL_0063: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_0068: ldtoken UserQuery+ConcatMsgPropertiesSaga.SagaData +IL_006D: call System.Type.GetTypeFromHandle +IL_0072: ldstr "saga" +IL_0077: call System.Linq.Expressions.Expression.Parameter +IL_007C: stloc.0 +IL_007D: ldloc.0 +IL_007E: ldtoken UserQuery+ConcatMsgPropertiesSaga+SagaData.get_Correlation +IL_0083: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0088: castclass System.Reflection.MethodInfo +IL_008D: call System.Linq.Expressions.Expression.Property +IL_0092: ldc.i4.1 +IL_0093: newarr System.Linq.Expressions.ParameterExpression +IL_0098: dup +IL_0099: ldc.i4.0 +IL_009A: ldloc.0 +IL_009B: stelem.ref +IL_009C: call System.Linq.Expressions.Expression.Lambda +IL_00A1: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_00A6: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithFormatSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithFormatSaga.cs new file mode 100644 index 000000000..5fb80ec39 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithFormatSaga.cs @@ -0,0 +1,83 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class ConcatMsgPropertiesWithFormatSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => string.Format("{0}{1}", msg.Part1, msg.Part2)).ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +ConcatMsgPropertiesWithFormatSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageC +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldnull +IL_0017: ldtoken System.String.Format +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: ldc.i4.3 +IL_0027: newarr System.Linq.Expressions.Expression +IL_002C: dup +IL_002D: ldc.i4.0 +IL_002E: ldstr "{0}{1}" +IL_0033: ldtoken System.String +IL_0038: call System.Type.GetTypeFromHandle +IL_003D: call System.Linq.Expressions.Expression.Constant +IL_0042: stelem.ref +IL_0043: dup +IL_0044: ldc.i4.1 +IL_0045: ldloc.0 +IL_0046: ldtoken UserQuery+MessageC.get_Part1 +IL_004B: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0050: castclass System.Reflection.MethodInfo +IL_0055: call System.Linq.Expressions.Expression.Property +IL_005A: stelem.ref +IL_005B: dup +IL_005C: ldc.i4.2 +IL_005D: ldloc.0 +IL_005E: ldtoken UserQuery+MessageC.get_Part2 +IL_0063: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0068: castclass System.Reflection.MethodInfo +IL_006D: call System.Linq.Expressions.Expression.Property +IL_0072: stelem.ref +IL_0073: call System.Linq.Expressions.Expression.Call +IL_0078: ldc.i4.1 +IL_0079: newarr System.Linq.Expressions.ParameterExpression +IL_007E: dup +IL_007F: ldc.i4.0 +IL_0080: ldloc.0 +IL_0081: stelem.ref +IL_0082: call System.Linq.Expressions.Expression.Lambda +IL_0087: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_008C: ldtoken UserQuery+ConcatMsgPropertiesWithFormatSaga.SagaData +IL_0091: call System.Type.GetTypeFromHandle +IL_0096: ldstr "saga" +IL_009B: call System.Linq.Expressions.Expression.Parameter +IL_00A0: stloc.0 +IL_00A1: ldloc.0 +IL_00A2: ldtoken UserQuery+ConcatMsgPropertiesWithFormatSaga+SagaData.get_Correlation +IL_00A7: call System.Reflection.MethodBase.GetMethodFromHandle +IL_00AC: castclass System.Reflection.MethodInfo +IL_00B1: call System.Linq.Expressions.Expression.Property +IL_00B6: ldc.i4.1 +IL_00B7: newarr System.Linq.Expressions.ParameterExpression +IL_00BC: dup +IL_00BD: ldc.i4.0 +IL_00BE: ldloc.0 +IL_00BF: stelem.ref +IL_00C0: call System.Linq.Expressions.Expression.Lambda +IL_00C5: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_00CA: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithInterpolationSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithInterpolationSaga.cs new file mode 100644 index 000000000..308d59a20 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithInterpolationSaga.cs @@ -0,0 +1,83 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class ConcatMsgPropertiesWithInterpolationSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => $"{msg.Part1}{msg.Part2}").ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +ConcatMsgPropertiesWithInterpolationSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageC +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldnull +IL_0017: ldtoken System.String.Format +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: ldc.i4.3 +IL_0027: newarr System.Linq.Expressions.Expression +IL_002C: dup +IL_002D: ldc.i4.0 +IL_002E: ldstr "{0}{1}" +IL_0033: ldtoken System.String +IL_0038: call System.Type.GetTypeFromHandle +IL_003D: call System.Linq.Expressions.Expression.Constant +IL_0042: stelem.ref +IL_0043: dup +IL_0044: ldc.i4.1 +IL_0045: ldloc.0 +IL_0046: ldtoken UserQuery+MessageC.get_Part1 +IL_004B: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0050: castclass System.Reflection.MethodInfo +IL_0055: call System.Linq.Expressions.Expression.Property +IL_005A: stelem.ref +IL_005B: dup +IL_005C: ldc.i4.2 +IL_005D: ldloc.0 +IL_005E: ldtoken UserQuery+MessageC.get_Part2 +IL_0063: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0068: castclass System.Reflection.MethodInfo +IL_006D: call System.Linq.Expressions.Expression.Property +IL_0072: stelem.ref +IL_0073: call System.Linq.Expressions.Expression.Call +IL_0078: ldc.i4.1 +IL_0079: newarr System.Linq.Expressions.ParameterExpression +IL_007E: dup +IL_007F: ldc.i4.0 +IL_0080: ldloc.0 +IL_0081: stelem.ref +IL_0082: call System.Linq.Expressions.Expression.Lambda +IL_0087: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_008C: ldtoken UserQuery+ConcatMsgPropertiesWithInterpolationSaga.SagaData +IL_0091: call System.Type.GetTypeFromHandle +IL_0096: ldstr "saga" +IL_009B: call System.Linq.Expressions.Expression.Parameter +IL_00A0: stloc.0 +IL_00A1: ldloc.0 +IL_00A2: ldtoken UserQuery+ConcatMsgPropertiesWithInterpolationSaga+SagaData.get_Correlation +IL_00A7: call System.Reflection.MethodBase.GetMethodFromHandle +IL_00AC: castclass System.Reflection.MethodInfo +IL_00B1: call System.Linq.Expressions.Expression.Property +IL_00B6: ldc.i4.1 +IL_00B7: newarr System.Linq.Expressions.ParameterExpression +IL_00BC: dup +IL_00BD: ldc.i4.0 +IL_00BE: ldloc.0 +IL_00BF: stelem.ref +IL_00C0: call System.Linq.Expressions.Expression.Lambda +IL_00C5: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_00CA: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithOtherMethods.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithOtherMethods.cs new file mode 100644 index 000000000..97b3896cb --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConcatMsgPropertiesWithOtherMethods.cs @@ -0,0 +1,78 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class ConcatMsgPropertiesWithOtherMethods : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Part1.ToUpper() + msg.Part2.ToLowerInvariant()) + .ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +ConcatMsgPropertiesWithOtherMethods.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageC +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldloc.0 +IL_0017: ldtoken UserQuery+MessageC.get_Part1 +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: call System.Linq.Expressions.Expression.Property +IL_002B: ldtoken System.String.ToUpper +IL_0030: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0035: castclass System.Reflection.MethodInfo +IL_003A: call System.Array.Empty +IL_003F: call System.Linq.Expressions.Expression.Call +IL_0044: ldloc.0 +IL_0045: ldtoken UserQuery+MessageC.get_Part2 +IL_004A: call System.Reflection.MethodBase.GetMethodFromHandle +IL_004F: castclass System.Reflection.MethodInfo +IL_0054: call System.Linq.Expressions.Expression.Property +IL_0059: ldtoken System.String.ToLowerInvariant +IL_005E: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0063: castclass System.Reflection.MethodInfo +IL_0068: call System.Array.Empty +IL_006D: call System.Linq.Expressions.Expression.Call +IL_0072: ldtoken System.String.Concat +IL_0077: call System.Reflection.MethodBase.GetMethodFromHandle +IL_007C: castclass System.Reflection.MethodInfo +IL_0081: call System.Linq.Expressions.Expression.Add +IL_0086: ldc.i4.1 +IL_0087: newarr System.Linq.Expressions.ParameterExpression +IL_008C: dup +IL_008D: ldc.i4.0 +IL_008E: ldloc.0 +IL_008F: stelem.ref +IL_0090: call System.Linq.Expressions.Expression.Lambda +IL_0095: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_009A: ldtoken UserQuery+ConcatMsgPropertiesWithOtherMethods.SagaData +IL_009F: call System.Type.GetTypeFromHandle +IL_00A4: ldstr "saga" +IL_00A9: call System.Linq.Expressions.Expression.Parameter +IL_00AE: stloc.0 +IL_00AF: ldloc.0 +IL_00B0: ldtoken UserQuery+ConcatMsgPropertiesWithOtherMethods+SagaData.get_Correlation +IL_00B5: call System.Reflection.MethodBase.GetMethodFromHandle +IL_00BA: castclass System.Reflection.MethodInfo +IL_00BF: call System.Linq.Expressions.Expression.Property +IL_00C4: ldc.i4.1 +IL_00C5: newarr System.Linq.Expressions.ParameterExpression +IL_00CA: dup +IL_00CB: ldc.i4.0 +IL_00CC: ldloc.0 +IL_00CD: stelem.ref +IL_00CE: call System.Linq.Expressions.Expression.Lambda +IL_00D3: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_00D8: ret +*/ diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConflictingCorrelationSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConflictingCorrelationSaga.cs new file mode 100644 index 000000000..baf6883de --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ConflictingCorrelationSaga.cs @@ -0,0 +1,97 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class ConflictingCorrelationSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + public string OtherProperty { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.OtherProperty); + } + } +} +/* IL: +ConflictingCorrelationSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageA +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldloc.0 +IL_0017: ldtoken UserQuery+MessageA.get_Correlation +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: call System.Linq.Expressions.Expression.Property +IL_002B: ldc.i4.1 +IL_002C: newarr System.Linq.Expressions.ParameterExpression +IL_0031: dup +IL_0032: ldc.i4.0 +IL_0033: ldloc.0 +IL_0034: stelem.ref +IL_0035: call System.Linq.Expressions.Expression.Lambda +IL_003A: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_003F: ldtoken UserQuery+ConflictingCorrelationSaga.SagaData +IL_0044: call System.Type.GetTypeFromHandle +IL_0049: ldstr "saga" +IL_004E: call System.Linq.Expressions.Expression.Parameter +IL_0053: stloc.0 +IL_0054: ldloc.0 +IL_0055: ldtoken UserQuery+ConflictingCorrelationSaga+SagaData.get_Correlation +IL_005A: call System.Reflection.MethodBase.GetMethodFromHandle +IL_005F: castclass System.Reflection.MethodInfo +IL_0064: call System.Linq.Expressions.Expression.Property +IL_0069: ldc.i4.1 +IL_006A: newarr System.Linq.Expressions.ParameterExpression +IL_006F: dup +IL_0070: ldc.i4.0 +IL_0071: ldloc.0 +IL_0072: stelem.ref +IL_0073: call System.Linq.Expressions.Expression.Lambda +IL_0078: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_007D: ldarg.1 +IL_007E: ldtoken UserQuery.MessageB +IL_0083: call System.Type.GetTypeFromHandle +IL_0088: ldstr "msg" +IL_008D: call System.Linq.Expressions.Expression.Parameter +IL_0092: stloc.0 +IL_0093: ldloc.0 +IL_0094: ldtoken UserQuery+MessageB.get_Correlation +IL_0099: call System.Reflection.MethodBase.GetMethodFromHandle +IL_009E: castclass System.Reflection.MethodInfo +IL_00A3: call System.Linq.Expressions.Expression.Property +IL_00A8: ldc.i4.1 +IL_00A9: newarr System.Linq.Expressions.ParameterExpression +IL_00AE: dup +IL_00AF: ldc.i4.0 +IL_00B0: ldloc.0 +IL_00B1: stelem.ref +IL_00B2: call System.Linq.Expressions.Expression.Lambda +IL_00B7: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_00BC: ldtoken UserQuery+ConflictingCorrelationSaga.SagaData +IL_00C1: call System.Type.GetTypeFromHandle +IL_00C6: ldstr "saga" +IL_00CB: call System.Linq.Expressions.Expression.Parameter +IL_00D0: stloc.0 +IL_00D1: ldloc.0 +IL_00D2: ldtoken UserQuery+ConflictingCorrelationSaga+SagaData.get_OtherProperty +IL_00D7: call System.Reflection.MethodBase.GetMethodFromHandle +IL_00DC: castclass System.Reflection.MethodInfo +IL_00E1: call System.Linq.Expressions.Expression.Property +IL_00E6: ldc.i4.1 +IL_00E7: newarr System.Linq.Expressions.ParameterExpression +IL_00EC: dup +IL_00ED: ldc.i4.0 +IL_00EE: ldloc.0 +IL_00EF: stelem.ref +IL_00F0: call System.Linq.Expressions.Expression.Lambda +IL_00F5: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_00FA: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DelegateCallingSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DelegateCallingSaga.cs new file mode 100644 index 000000000..6a8464ca5 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DelegateCallingSaga.cs @@ -0,0 +1,30 @@ +using System; +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class DelegateCallingSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + Action action = () => mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + action(); + } + } +} +/* IL: +DelegateCallingSaga.ConfigureHowToFindSaga: +IL_0000: newobj UserQuery+DelegateCallingSaga+<>c__DisplayClass1_0..ctor +IL_0005: dup +IL_0006: ldarg.1 +IL_0007: stfld UserQuery+DelegateCallingSaga+<>c__DisplayClass1_0.mapper +IL_000C: ldftn UserQuery+DelegateCallingSaga+<>c__DisplayClass1_0.b__0 +IL_0012: newobj System.Action..ctor +IL_0017: callvirt System.Action.Invoke +IL_001C: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DualMappingSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DualMappingSaga.cs new file mode 100644 index 000000000..923e8124d --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DualMappingSaga.cs @@ -0,0 +1,96 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class DualMappingSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + mapper.ConfigureMapping(msg => msg.DifferentName).ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +DualMappingSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageA +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldloc.0 +IL_0017: ldtoken UserQuery+MessageA.get_Correlation +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: call System.Linq.Expressions.Expression.Property +IL_002B: ldc.i4.1 +IL_002C: newarr System.Linq.Expressions.ParameterExpression +IL_0031: dup +IL_0032: ldc.i4.0 +IL_0033: ldloc.0 +IL_0034: stelem.ref +IL_0035: call System.Linq.Expressions.Expression.Lambda +IL_003A: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_003F: ldtoken UserQuery+DualMappingSaga.SagaData +IL_0044: call System.Type.GetTypeFromHandle +IL_0049: ldstr "saga" +IL_004E: call System.Linq.Expressions.Expression.Parameter +IL_0053: stloc.0 +IL_0054: ldloc.0 +IL_0055: ldtoken UserQuery+DualMappingSaga+SagaData.get_Correlation +IL_005A: call System.Reflection.MethodBase.GetMethodFromHandle +IL_005F: castclass System.Reflection.MethodInfo +IL_0064: call System.Linq.Expressions.Expression.Property +IL_0069: ldc.i4.1 +IL_006A: newarr System.Linq.Expressions.ParameterExpression +IL_006F: dup +IL_0070: ldc.i4.0 +IL_0071: ldloc.0 +IL_0072: stelem.ref +IL_0073: call System.Linq.Expressions.Expression.Lambda +IL_0078: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_007D: ldarg.1 +IL_007E: ldtoken UserQuery.MessageD +IL_0083: call System.Type.GetTypeFromHandle +IL_0088: ldstr "msg" +IL_008D: call System.Linq.Expressions.Expression.Parameter +IL_0092: stloc.0 +IL_0093: ldloc.0 +IL_0094: ldtoken UserQuery+MessageD.get_DifferentName +IL_0099: call System.Reflection.MethodBase.GetMethodFromHandle +IL_009E: castclass System.Reflection.MethodInfo +IL_00A3: call System.Linq.Expressions.Expression.Property +IL_00A8: ldc.i4.1 +IL_00A9: newarr System.Linq.Expressions.ParameterExpression +IL_00AE: dup +IL_00AF: ldc.i4.0 +IL_00B0: ldloc.0 +IL_00B1: stelem.ref +IL_00B2: call System.Linq.Expressions.Expression.Lambda +IL_00B7: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_00BC: ldtoken UserQuery+DualMappingSaga.SagaData +IL_00C1: call System.Type.GetTypeFromHandle +IL_00C6: ldstr "saga" +IL_00CB: call System.Linq.Expressions.Expression.Parameter +IL_00D0: stloc.0 +IL_00D1: ldloc.0 +IL_00D2: ldtoken UserQuery+DualMappingSaga+SagaData.get_Correlation +IL_00D7: call System.Reflection.MethodBase.GetMethodFromHandle +IL_00DC: castclass System.Reflection.MethodInfo +IL_00E1: call System.Linq.Expressions.Expression.Property +IL_00E6: ldc.i4.1 +IL_00E7: newarr System.Linq.Expressions.ParameterExpression +IL_00EC: dup +IL_00ED: ldc.i4.0 +IL_00EE: ldloc.0 +IL_00EF: stelem.ref +IL_00F0: call System.Linq.Expressions.Expression.Lambda +IL_00F5: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_00FA: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ForLoopSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ForLoopSaga.cs new file mode 100644 index 000000000..41c98b961 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.ForLoopSaga.cs @@ -0,0 +1,71 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class ForLoopSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + for (var i = 0; i < 3; i++) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + } + } +} +/* IL: +ForLoopSaga.ConfigureHowToFindSaga: +IL_0000: ldc.i4.0 +IL_0001: stloc.0 // i +IL_0002: br IL_0088 +IL_0007: ldarg.1 +IL_0008: ldtoken UserQuery.MessageA +IL_000D: call System.Type.GetTypeFromHandle +IL_0012: ldstr "msg" +IL_0017: call System.Linq.Expressions.Expression.Parameter +IL_001C: stloc.1 +IL_001D: ldloc.1 +IL_001E: ldtoken UserQuery+MessageA.get_Correlation +IL_0023: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0028: castclass System.Reflection.MethodInfo +IL_002D: call System.Linq.Expressions.Expression.Property +IL_0032: ldc.i4.1 +IL_0033: newarr System.Linq.Expressions.ParameterExpression +IL_0038: dup +IL_0039: ldc.i4.0 +IL_003A: ldloc.1 +IL_003B: stelem.ref +IL_003C: call System.Linq.Expressions.Expression.Lambda +IL_0041: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_0046: ldtoken UserQuery+ForLoopSaga.SagaData +IL_004B: call System.Type.GetTypeFromHandle +IL_0050: ldstr "saga" +IL_0055: call System.Linq.Expressions.Expression.Parameter +IL_005A: stloc.1 +IL_005B: ldloc.1 +IL_005C: ldtoken UserQuery+ForLoopSaga+SagaData.get_Correlation +IL_0061: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0066: castclass System.Reflection.MethodInfo +IL_006B: call System.Linq.Expressions.Expression.Property +IL_0070: ldc.i4.1 +IL_0071: newarr System.Linq.Expressions.ParameterExpression +IL_0076: dup +IL_0077: ldc.i4.0 +IL_0078: ldloc.1 +IL_0079: stelem.ref +IL_007A: call System.Linq.Expressions.Expression.Lambda +IL_007F: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_0084: ldloc.0 // i +IL_0085: ldc.i4.1 +IL_0086: add +IL_0087: stloc.0 // i +IL_0088: ldloc.0 // i +IL_0089: ldc.i4.3 +IL_008A: blt IL_0007 +IL_008F: ret +*/ diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.HasBaseSagaClass.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.HasBaseSagaClass.cs new file mode 100644 index 000000000..1d6250eef --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.HasBaseSagaClass.cs @@ -0,0 +1,71 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class HasBaseSagaClass : BaseSaga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + base.ConfigureHowToFindSaga(mapper); + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + } + + public class BaseSaga : Saga + where TSaga : class, IContainSagaData, new() + { + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + + } + } +} +/* IL: +HasBaseSagaClass.ConfigureHowToFindSaga: +IL_0000: ldarg.0 +IL_0001: ldarg.1 +IL_0002: call UserQuery+BaseSaga.ConfigureHowToFindSaga +IL_0007: ldarg.1 +IL_0008: ldtoken UserQuery.MessageA +IL_000D: call System.Type.GetTypeFromHandle +IL_0012: ldstr "msg" +IL_0017: call System.Linq.Expressions.Expression.Parameter +IL_001C: stloc.0 +IL_001D: ldloc.0 +IL_001E: ldtoken UserQuery+MessageA.get_Correlation +IL_0023: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0028: castclass System.Reflection.MethodInfo +IL_002D: call System.Linq.Expressions.Expression.Property +IL_0032: ldc.i4.1 +IL_0033: newarr System.Linq.Expressions.ParameterExpression +IL_0038: dup +IL_0039: ldc.i4.0 +IL_003A: ldloc.0 +IL_003B: stelem.ref +IL_003C: call System.Linq.Expressions.Expression.Lambda +IL_0041: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_0046: ldtoken UserQuery+HasBaseSagaClass.SagaData +IL_004B: call System.Type.GetTypeFromHandle +IL_0050: ldstr "saga" +IL_0055: call System.Linq.Expressions.Expression.Parameter +IL_005A: stloc.0 +IL_005B: ldloc.0 +IL_005C: ldtoken UserQuery+HasBaseSagaClass+SagaData.get_Correlation +IL_0061: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0066: castclass System.Reflection.MethodInfo +IL_006B: call System.Linq.Expressions.Expression.Property +IL_0070: ldc.i4.1 +IL_0071: newarr System.Linq.Expressions.ParameterExpression +IL_0076: dup +IL_0077: ldc.i4.0 +IL_0078: ldloc.0 +IL_0079: stelem.ref +IL_007A: call System.Linq.Expressions.Expression.Lambda +IL_007F: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_0084: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.MetadataInAttributeSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.MetadataInAttributeSaga.cs new file mode 100644 index 000000000..87bd92e2a --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.MetadataInAttributeSaga.cs @@ -0,0 +1,61 @@ +using NServiceBus; +using NServiceBus.Persistence.Sql; + +public partial class CoreSagaMetadataTests +{ + [SqlSaga(transitionalCorrelationProperty: "TransitionalCorrId", tableSuffix: "DifferentTableSuffix")] + public class MetadataInAttributeSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + public string TransitionalCorrId { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +MetadataInAttributeSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageA +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldloc.0 +IL_0017: ldtoken UserQuery+MessageA.get_Correlation +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: call System.Linq.Expressions.Expression.Property +IL_002B: ldc.i4.1 +IL_002C: newarr System.Linq.Expressions.ParameterExpression +IL_0031: dup +IL_0032: ldc.i4.0 +IL_0033: ldloc.0 +IL_0034: stelem.ref +IL_0035: call System.Linq.Expressions.Expression.Lambda +IL_003A: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_003F: ldtoken UserQuery+MetadataInAttributeSaga.SagaData +IL_0044: call System.Type.GetTypeFromHandle +IL_0049: ldstr "saga" +IL_004E: call System.Linq.Expressions.Expression.Parameter +IL_0053: stloc.0 +IL_0054: ldloc.0 +IL_0055: ldtoken UserQuery+MetadataInAttributeSaga+SagaData.get_Correlation +IL_005A: call System.Reflection.MethodBase.GetMethodFromHandle +IL_005F: castclass System.Reflection.MethodInfo +IL_0064: call System.Linq.Expressions.Expression.Property +IL_0069: ldc.i4.1 +IL_006A: newarr System.Linq.Expressions.ParameterExpression +IL_006F: dup +IL_0070: ldc.i4.0 +IL_0071: ldloc.0 +IL_0072: stelem.ref +IL_0073: call System.Linq.Expressions.Expression.Lambda +IL_0078: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_007D: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.MethodCallInMappingSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.MethodCallInMappingSaga.cs new file mode 100644 index 000000000..dc907c58e --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.MethodCallInMappingSaga.cs @@ -0,0 +1,69 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class MethodCallInMappingSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => MapInMethod(saga)); + } + + static object MapInMethod(SagaData data) + { + return data.Correlation; + } + } +} +/* IL: +MethodCallInMappingSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageA +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldloc.0 +IL_0017: ldtoken UserQuery+MessageA.get_Correlation +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: call System.Linq.Expressions.Expression.Property +IL_002B: ldc.i4.1 +IL_002C: newarr System.Linq.Expressions.ParameterExpression +IL_0031: dup +IL_0032: ldc.i4.0 +IL_0033: ldloc.0 +IL_0034: stelem.ref +IL_0035: call System.Linq.Expressions.Expression.Lambda +IL_003A: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_003F: ldtoken UserQuery+MethodCallInMappingSaga.SagaData +IL_0044: call System.Type.GetTypeFromHandle +IL_0049: ldstr "saga" +IL_004E: call System.Linq.Expressions.Expression.Parameter +IL_0053: stloc.0 +IL_0054: ldnull +IL_0055: ldtoken UserQuery+MethodCallInMappingSaga.MapInMethod +IL_005A: call System.Reflection.MethodBase.GetMethodFromHandle +IL_005F: castclass System.Reflection.MethodInfo +IL_0064: ldc.i4.1 +IL_0065: newarr System.Linq.Expressions.Expression +IL_006A: dup +IL_006B: ldc.i4.0 +IL_006C: ldloc.0 +IL_006D: stelem.ref +IL_006E: call System.Linq.Expressions.Expression.Call +IL_0073: ldc.i4.1 +IL_0074: newarr System.Linq.Expressions.ParameterExpression +IL_0079: dup +IL_007A: ldc.i4.0 +IL_007B: ldloc.0 +IL_007C: stelem.ref +IL_007D: call System.Linq.Expressions.Expression.Lambda +IL_0082: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_0087: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.PassingMapperSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.PassingMapperSaga.cs new file mode 100644 index 000000000..6ecd03dea --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.PassingMapperSaga.cs @@ -0,0 +1,28 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class PassingMapperSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + PassTheMapper(mapper); + } + + static void PassTheMapper(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +PassingMapperSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: call UserQuery+PassingMapperSaga.PassTheMapper +IL_0006: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SharedMessages.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SharedMessages.cs new file mode 100644 index 000000000..e5c7face9 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SharedMessages.cs @@ -0,0 +1,25 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class MessageA : ICommand + { + public string Correlation { get; set; } + } + + public class MessageB : ICommand + { + public string Correlation { get; set; } + } + + public class MessageC : ICommand + { + public string Part1 { get; set; } + public string Part2 { get; set; } + } + + public class MessageD : ICommand + { + public string DifferentName { get; set; } + } +} diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingSaga.cs new file mode 100644 index 000000000..a97c73781 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingSaga.cs @@ -0,0 +1,58 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class SingleMappingSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +SingleMappingSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageA +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldloc.0 +IL_0017: ldtoken UserQuery+MessageA.get_Correlation +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: call System.Linq.Expressions.Expression.Property +IL_002B: ldc.i4.1 +IL_002C: newarr System.Linq.Expressions.ParameterExpression +IL_0031: dup +IL_0032: ldc.i4.0 +IL_0033: ldloc.0 +IL_0034: stelem.ref +IL_0035: call System.Linq.Expressions.Expression.Lambda +IL_003A: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_003F: ldtoken UserQuery+SingleMappingSaga.SagaData +IL_0044: call System.Type.GetTypeFromHandle +IL_0049: ldstr "saga" +IL_004E: call System.Linq.Expressions.Expression.Parameter +IL_0053: stloc.0 +IL_0054: ldloc.0 +IL_0055: ldtoken UserQuery+SingleMappingSaga+SagaData.get_Correlation +IL_005A: call System.Reflection.MethodBase.GetMethodFromHandle +IL_005F: castclass System.Reflection.MethodInfo +IL_0064: call System.Linq.Expressions.Expression.Property +IL_0069: ldc.i4.1 +IL_006A: newarr System.Linq.Expressions.ParameterExpression +IL_006F: dup +IL_0070: ldc.i4.0 +IL_0071: ldloc.0 +IL_0072: stelem.ref +IL_0073: call System.Linq.Expressions.Expression.Lambda +IL_0078: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_007D: ret +*/ diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingValueTypeSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingValueTypeSaga.cs new file mode 100644 index 000000000..50aa47caa --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingValueTypeSaga.cs @@ -0,0 +1,61 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class SingleMappingValueTypeSaga : Saga + { + public class SagaData : ContainSagaData + { + public int Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + } +} +/* IL: +SingleMappingValueTypeSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.1 +IL_0001: ldtoken UserQuery.MessageA +IL_0006: call System.Type.GetTypeFromHandle +IL_000B: ldstr "msg" +IL_0010: call System.Linq.Expressions.Expression.Parameter +IL_0015: stloc.0 +IL_0016: ldloc.0 +IL_0017: ldtoken UserQuery+MessageA.get_Correlation +IL_001C: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0021: castclass System.Reflection.MethodInfo +IL_0026: call System.Linq.Expressions.Expression.Property +IL_002B: ldc.i4.1 +IL_002C: newarr System.Linq.Expressions.ParameterExpression +IL_0031: dup +IL_0032: ldc.i4.0 +IL_0033: ldloc.0 +IL_0034: stelem.ref +IL_0035: call System.Linq.Expressions.Expression.Lambda +IL_003A: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_003F: ldtoken UserQuery+SingleMappingValueTypeSaga.SagaData +IL_0044: call System.Type.GetTypeFromHandle +IL_0049: ldstr "saga" +IL_004E: call System.Linq.Expressions.Expression.Parameter +IL_0053: stloc.0 +IL_0054: ldloc.0 +IL_0055: ldtoken UserQuery+SingleMappingValueTypeSaga+SagaData.get_Correlation +IL_005A: call System.Reflection.MethodBase.GetMethodFromHandle +IL_005F: castclass System.Reflection.MethodInfo +IL_0064: call System.Linq.Expressions.Expression.Property +IL_0069: ldtoken System.Object +IL_006E: call System.Type.GetTypeFromHandle +IL_0073: call System.Linq.Expressions.Expression.Convert +IL_0078: ldc.i4.1 +IL_0079: newarr System.Linq.Expressions.ParameterExpression +IL_007E: dup +IL_007F: ldc.i4.0 +IL_0080: ldloc.0 +IL_0081: stelem.ref +IL_0082: call System.Linq.Expressions.Expression.Lambda +IL_0087: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_008C: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SwitchingLogicSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SwitchingLogicSaga.cs new file mode 100644 index 000000000..2b977bfbb --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SwitchingLogicSaga.cs @@ -0,0 +1,110 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class SwitchingLogicSaga : Saga + { + int number = 0; + + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + public string OtherProperty { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + if (number > 0) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + else + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + } + } + } +} +/* IL: +SwitchingLogicSaga.ConfigureHowToFindSaga: +IL_0000: ldarg.0 +IL_0001: ldfld UserQuery+SwitchingLogicSaga.number +IL_0006: ldc.i4.0 +IL_0007: ble.s IL_0087 +IL_0009: ldarg.1 +IL_000A: ldtoken UserQuery.MessageA +IL_000F: call System.Type.GetTypeFromHandle +IL_0014: ldstr "msg" +IL_0019: call System.Linq.Expressions.Expression.Parameter +IL_001E: stloc.0 +IL_001F: ldloc.0 +IL_0020: ldtoken UserQuery+MessageA.get_Correlation +IL_0025: call System.Reflection.MethodBase.GetMethodFromHandle +IL_002A: castclass System.Reflection.MethodInfo +IL_002F: call System.Linq.Expressions.Expression.Property +IL_0034: ldc.i4.1 +IL_0035: newarr System.Linq.Expressions.ParameterExpression +IL_003A: dup +IL_003B: ldc.i4.0 +IL_003C: ldloc.0 +IL_003D: stelem.ref +IL_003E: call System.Linq.Expressions.Expression.Lambda +IL_0043: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_0048: ldtoken UserQuery+SwitchingLogicSaga.SagaData +IL_004D: call System.Type.GetTypeFromHandle +IL_0052: ldstr "saga" +IL_0057: call System.Linq.Expressions.Expression.Parameter +IL_005C: stloc.0 +IL_005D: ldloc.0 +IL_005E: ldtoken UserQuery+SwitchingLogicSaga+SagaData.get_Correlation +IL_0063: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0068: castclass System.Reflection.MethodInfo +IL_006D: call System.Linq.Expressions.Expression.Property +IL_0072: ldc.i4.1 +IL_0073: newarr System.Linq.Expressions.ParameterExpression +IL_0078: dup +IL_0079: ldc.i4.0 +IL_007A: ldloc.0 +IL_007B: stelem.ref +IL_007C: call System.Linq.Expressions.Expression.Lambda +IL_0081: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_0086: ret +IL_0087: ldarg.1 +IL_0088: ldtoken UserQuery.MessageB +IL_008D: call System.Type.GetTypeFromHandle +IL_0092: ldstr "msg" +IL_0097: call System.Linq.Expressions.Expression.Parameter +IL_009C: stloc.0 +IL_009D: ldloc.0 +IL_009E: ldtoken UserQuery+MessageB.get_Correlation +IL_00A3: call System.Reflection.MethodBase.GetMethodFromHandle +IL_00A8: castclass System.Reflection.MethodInfo +IL_00AD: call System.Linq.Expressions.Expression.Property +IL_00B2: ldc.i4.1 +IL_00B3: newarr System.Linq.Expressions.ParameterExpression +IL_00B8: dup +IL_00B9: ldc.i4.0 +IL_00BA: ldloc.0 +IL_00BB: stelem.ref +IL_00BC: call System.Linq.Expressions.Expression.Lambda +IL_00C1: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_00C6: ldtoken UserQuery+SwitchingLogicSaga.SagaData +IL_00CB: call System.Type.GetTypeFromHandle +IL_00D0: ldstr "saga" +IL_00D5: call System.Linq.Expressions.Expression.Parameter +IL_00DA: stloc.0 +IL_00DB: ldloc.0 +IL_00DC: ldtoken UserQuery+SwitchingLogicSaga+SagaData.get_Correlation +IL_00E1: call System.Reflection.MethodBase.GetMethodFromHandle +IL_00E6: castclass System.Reflection.MethodInfo +IL_00EB: call System.Linq.Expressions.Expression.Property +IL_00F0: ldc.i4.1 +IL_00F1: newarr System.Linq.Expressions.ParameterExpression +IL_00F6: dup +IL_00F7: ldc.i4.0 +IL_00F8: ldloc.0 +IL_00F9: stelem.ref +IL_00FA: call System.Linq.Expressions.Expression.Lambda +IL_00FF: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_0104: ret +*/ \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.WhileLoopSaga.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.WhileLoopSaga.cs new file mode 100644 index 000000000..74a9669fb --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.WhileLoopSaga.cs @@ -0,0 +1,73 @@ +using NServiceBus; + +public partial class CoreSagaMetadataTests +{ + public class WhileLoopSaga : Saga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + { + var i = 0; + while(i < 3) + { + mapper.ConfigureMapping(msg => msg.Correlation).ToSaga(saga => saga.Correlation); + i++; + } + } + } +} +/* IL: +WhileLoopSaga.ConfigureHowToFindSaga: +IL_0000: ldc.i4.0 +IL_0001: stloc.0 // i +IL_0002: br IL_0088 +IL_0007: ldarg.1 +IL_0008: ldtoken UserQuery.MessageA +IL_000D: call System.Type.GetTypeFromHandle +IL_0012: ldstr "msg" +IL_0017: call System.Linq.Expressions.Expression.Parameter +IL_001C: stloc.1 +IL_001D: ldloc.1 +IL_001E: ldtoken UserQuery+MessageA.get_Correlation +IL_0023: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0028: castclass System.Reflection.MethodInfo +IL_002D: call System.Linq.Expressions.Expression.Property +IL_0032: ldc.i4.1 +IL_0033: newarr System.Linq.Expressions.ParameterExpression +IL_0038: dup +IL_0039: ldc.i4.0 +IL_003A: ldloc.1 +IL_003B: stelem.ref +IL_003C: call System.Linq.Expressions.Expression.Lambda +IL_0041: callvirt NServiceBus.SagaPropertyMapper.ConfigureMapping +IL_0046: ldtoken UserQuery+WhileLoopSaga.SagaData +IL_004B: call System.Type.GetTypeFromHandle +IL_0050: ldstr "saga" +IL_0055: call System.Linq.Expressions.Expression.Parameter +IL_005A: stloc.1 +IL_005B: ldloc.1 +IL_005C: ldtoken UserQuery+WhileLoopSaga+SagaData.get_Correlation +IL_0061: call System.Reflection.MethodBase.GetMethodFromHandle +IL_0066: castclass System.Reflection.MethodInfo +IL_006B: call System.Linq.Expressions.Expression.Property +IL_0070: ldc.i4.1 +IL_0071: newarr System.Linq.Expressions.ParameterExpression +IL_0076: dup +IL_0077: ldc.i4.0 +IL_0078: ldloc.1 +IL_0079: stelem.ref +IL_007A: call System.Linq.Expressions.Expression.Lambda +IL_007F: callvirt NServiceBus.ToSagaExpression.ToSaga +IL_0084: ldloc.0 // i +IL_0085: ldc.i4.1 +IL_0086: add +IL_0087: stloc.0 // i +IL_0088: ldloc.0 // i +IL_0089: ldc.i4.3 +IL_008A: blt IL_0007 +IL_008F: ret +*/ diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs new file mode 100644 index 000000000..b6b6cecc3 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs @@ -0,0 +1,168 @@ +using System; +using System.IO; +using Mono.Cecil; +using NServiceBus.Persistence.Sql.ScriptBuilder; +using NUnit.Framework; + +[TestFixture] +public partial class CoreSagaMetadataTests +{ + ModuleDefinition module; + + public CoreSagaMetadataTests() + { + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "ScriptBuilder.Tests.dll"); + var readerParameters = new ReaderParameters(ReadingMode.Deferred); + module = ModuleDefinition.ReadModule(path, readerParameters); + } + + [Test] + public void SingleMapping() + { + TestSagaDefinition(); + } + + [Test] + public void SingleMappingValueType() + { + TestSagaDefinition(); + } + + [Test] + public void DualMapping() + { + TestSagaDefinition(); + } + + [Test] + public void DontMapWithIntermediateBase() + { + // Won't map to a saga definition (result will be null) but won't throw either. + // Behavior is the same as SqlSaga. Throw will occur at runtime. + TestSagaDefinition(); + } + + [Test] + public void DontAllowMethodCallInMapping() + { + TestSagaDefinition(); + } + + [Test] + public void DontAllowPassingMapper() + { + TestSagaDefinition(); + + } + + [Test] + public void DontMapConflictingCorrelationIds() + { + TestSagaDefinition(); + } + + [Test] + public void DontMapSwitchingLogic() + { + TestSagaDefinition(); + + } + + [Test] + public void DontMapDelegateCalls() + { + TestSagaDefinition(); + } + + [Test] + public void DontAllowForLoop() + { + TestSagaDefinition(); + } + + [Test] + public void DontAllowWhileLoop() + { + TestSagaDefinition(); + } + + [Test] + public void AllowConcatenatingMsgProperties() + { + TestSagaDefinition(); + } + + [Test] + public void AllowConcatenatingMsgPropertiesWithFormat() + { + TestSagaDefinition(); + } + + [Test] + public void AllowConcatenatingMsgPropertiesWithInterpolation() + { + TestSagaDefinition(); + } + + [Test] + public void AllowConcatenatingMsgPropertiesWithOtherMethods() + { + TestSagaDefinition(); + } + + [Test] + public void SupplyAdditionalMetadataViaAttribute() + { + TestSagaDefinition(); + } + + [Test] + public void TestSagaInVB() + { + var vbPath = Path.Combine(TestContext.CurrentContext.TestDirectory, "VBTestCode.dll"); + var vbModule = ModuleDefinition.ReadModule(vbPath, new ReaderParameters(ReadingMode.Deferred)); + + TestSagaDefinition(vbModule); + } + + private void TestSagaDefinition(ModuleDefinition moduleToUse = null) + { + moduleToUse = moduleToUse ?? module; + + var dataType = moduleToUse.GetTypeDefinition(); + var instructions = InstructionAnalyzer.GetConfigureHowToFindSagaInstructions(dataType); + + var results = new SagaInspectionResults + { + HasUnmanagedCalls = InstructionAnalyzer.CallsUnmanagedMethods(instructions), + HasUnexpectedCalls = InstructionAnalyzer.CallsUnexpectedMethods(instructions), + HasBranchingLogic = InstructionAnalyzer.ContainsBranchingLogic(instructions) + }; + + try + { + SagaDefinitionReader.TryGetSagaDefinition(dataType, out results.SagaDefinition); + } + catch (Exception x) + { + results.Exception = x.Message; + } + + TestApprover.VerifyWithJson(results); + } + + class SagaInspectionResults + { + public bool HasUnmanagedCalls; + public bool HasUnexpectedCalls; + public bool HasBranchingLogic; + // ReSharper disable NotAccessedField.Local + public SagaDefinition SagaDefinition; + public string Exception; + // ReSharper restore NotAccessedField.Local + } + + + + +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/EnsureSqlSagaNotDecoratedBySqlSagaAttribute.cs b/src/ScriptBuilder.Tests/Saga/EnsureSqlSagaNotDecoratedBySqlSagaAttribute.cs new file mode 100644 index 000000000..a7d327ac7 --- /dev/null +++ b/src/ScriptBuilder.Tests/Saga/EnsureSqlSagaNotDecoratedBySqlSagaAttribute.cs @@ -0,0 +1,38 @@ +using System; +using System.IO; +using Mono.Cecil; +using NServiceBus; +using NServiceBus.Persistence.Sql; +using NUnit.Framework; + + +[TestFixture] +public class EnsureSqlSagaNotDecoratedBySqlSagaAttribute +{ + [Test] + public void ThrowIfAttributeExists() + { + var path = Path.Combine(TestContext.CurrentContext.TestDirectory, "ScriptBuilder.Tests.dll"); + var readerParameters = new ReaderParameters(ReadingMode.Deferred); + var module = ModuleDefinition.ReadModule(path, readerParameters); + var dataType = module.GetTypeDefinition(); + + var ex = Assert.Throws(() => SagaDefinitionReader.TryGetSagaDefinition(dataType, out _)); + Assert.IsTrue(ex.Message.Contains("attribute is invalid")); + } + + [SqlSaga] + public class SqlSagaWithAttribute : SqlSaga + { + public class SagaData : ContainSagaData + { + public string Correlation { get; set; } + } + + protected override string CorrelationPropertyName => "Correlation"; + + protected override void ConfigureMapping(IMessagePropertyMapper mapper) + { + } + } +} \ No newline at end of file diff --git a/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs b/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs index cb35422a0..4e9e8b3be 100644 --- a/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs +++ b/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs @@ -28,7 +28,7 @@ public void WithGeneric() var sagaType = module.GetTypeDefinition>(); var exception = Assert.Throws(() => { - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out SagaDefinition _); + SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); }); Assert.IsNotNull(exception.Message); #if NET452 @@ -57,7 +57,7 @@ public void Abstract() var sagaType = module.GetTypeDefinition(); var exception = Assert.Throws(() => { - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out SagaDefinition _); + SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); }); Assert.IsNotNull(exception.Message); #if NET452 @@ -74,35 +74,14 @@ public class SagaData : ContainSagaData } [Test] - public void NonSqlSaga() - { - var sagaType = module.GetTypeDefinition(); - var exception = Assert.Throws(() => - { - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out SagaDefinition _); - }); - Assert.IsNotNull(exception.Message); -#if NET452 + SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); + TestApprover.Verify(exception.Message); Approvals.Verify(exception.Message); #endif - } - - public class NonSqlSagaSaga : Saga - { - public class SagaData : ContainSagaData - { - } - - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) - { - } - } - - [Test] public void Simple() { var sagaType = module.GetTypeDefinition(); - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out var definition); + SagaDefinitionReader.TryGetSagaDefinition(sagaType, out var definition); Assert.IsNotNull(definition); #if NET452 @@ -133,7 +112,7 @@ public void WithReadonlyProperty() var sagaType = module.GetTypeDefinition(); var exception = Assert.Throws(() => { - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out SagaDefinition _); + SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); }); Assert.IsNotNull(exception.Message); #if NET452 @@ -159,7 +138,7 @@ protected override void ConfigureMapping(IMessagePropertyMapper mapper) public void WithNoTransitionalCorrelation() { var sagaType = module.GetTypeDefinition(); - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out var definition); + SagaDefinitionReader.TryGetSagaDefinition(sagaType, out var definition); Assert.IsNotNull(definition); #if NET452 ObjectApprover.VerifyWithJson(definition); @@ -184,7 +163,7 @@ protected override void ConfigureMapping(IMessagePropertyMapper mapper) public void WithTableSuffix() { var sagaType = module.GetTypeDefinition(); - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out var definition); + SagaDefinitionReader.TryGetSagaDefinition(sagaType, out var definition); Assert.IsNotNull(definition); #if NET452 ObjectApprover.VerifyWithJson(definition); @@ -210,7 +189,7 @@ protected override void ConfigureMapping(IMessagePropertyMapper mapper) public void WithNoCorrelation() { var sagaType = module.GetTypeDefinition(); - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out var definition); + SagaDefinitionReader.TryGetSagaDefinition(sagaType, out var definition); Assert.IsNotNull(definition); #if NET452 ObjectApprover.VerifyWithJson(definition); @@ -234,7 +213,7 @@ protected override void ConfigureMapping(IMessagePropertyMapper mapper) public void WithStatementBodyProperty() { var sagaType = module.GetTypeDefinition(); - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out var definition); + SagaDefinitionReader.TryGetSagaDefinition(sagaType, out var definition); Assert.IsNotNull(definition); #if NET452 ObjectApprover.VerifyWithJson(definition); diff --git a/src/ScriptBuilder.Tests/ScriptBuilder.Tests.csproj b/src/ScriptBuilder.Tests/ScriptBuilder.Tests.csproj index dfa2c1bb1..fec376291 100644 --- a/src/ScriptBuilder.Tests/ScriptBuilder.Tests.csproj +++ b/src/ScriptBuilder.Tests/ScriptBuilder.Tests.csproj @@ -11,6 +11,7 @@ + diff --git a/src/ScriptBuilder/Saga/AllSagaDefinitionReader.cs b/src/ScriptBuilder/Saga/AllSagaDefinitionReader.cs index 8a595a783..873827474 100644 --- a/src/ScriptBuilder/Saga/AllSagaDefinitionReader.cs +++ b/src/ScriptBuilder/Saga/AllSagaDefinitionReader.cs @@ -20,7 +20,7 @@ public IEnumerable GetSagas(Action allowedMethods; + + static InstructionAnalyzer() + { + allowedMethods = new HashSet(new[] + { + "System.Array::Empty", + "System.Type::GetTypeFromHandle", + "System.Reflection.MethodBase::GetMethodFromHandle", + "System.Linq.Expressions.Expression::Convert", + "System.Linq.Expressions.Expression::Parameter", + "System.Linq.Expressions.Expression::Property", + "System.Linq.Expressions.Expression::Lambda", + "System.Linq.Expressions.Expression::Add", + "System.Linq.Expressions.Expression::Constant" + }, StringComparer.Ordinal); + } + + public static IList GetConfigureHowToFindSagaInstructions(TypeDefinition sagaTypeDefinition) + { + var configureMethod = sagaTypeDefinition.Methods.FirstOrDefault(m => m.Name == "ConfigureHowToFindSaga"); + if (configureMethod == null) + { + throw new ErrorsException("Saga does not contain a ConfigureHowToFindSaga method."); + } + + return configureMethod.Body.Instructions; + } + + public static bool ContainsBranchingLogic(IList instructions) + { + return instructions.Any(instruction => instruction.OpCode.FlowControl == FlowControl.Branch + || instruction.OpCode.FlowControl == FlowControl.Cond_Branch); + } + + public static string GetCorrelationId(IList instructions, string sagaDataTypeName) + { + var loadInstructionsOnSagaData = instructions + .Where(instruction => instruction.OpCode.Code == Code.Ldtoken) + .Select(instruction => new + { + Instruction = instruction, + MethodDefinition = instruction.Operand as MethodDefinition + }) + // Some Ldtokens have operands of type TypeDefinition, for loading types + .Where(x => x.MethodDefinition != null) + // We don't care about the ones where we're loading something from the message + .Where(x => x.MethodDefinition.DeclaringType.FullName == sagaDataTypeName) + .ToArray(); + + if (loadInstructionsOnSagaData.Any(i => !i.MethodDefinition.Name.StartsWith("get_"))) + { + // After having an expression on the saga data, we shouldn't be doing anything + // except accessing properties + throw new ErrorsException("ToSaga() expression in Saga's ConfigureHowToFindSaga method should point to a saga data property."); + } + + var correlationList = loadInstructionsOnSagaData + .Select(i => i.MethodDefinition.Name.Substring(4)) + .Distinct() + .ToArray(); + + if (correlationList.Length > 1) + { + throw new ErrorsException("Saga can only have one correlation property identified by .ToSaga() expressions. Fix mappings in ConfigureHowToFindSaga to map to a single correlation property or decorate the saga with [SqlSaga] attribute."); + } + + return correlationList.FirstOrDefault(); + } + + public static bool CallsUnmanagedMethods(IList instructions) + { + // OpCode Calli is for calling into unmanaged code. Certainly don't need to be doing that inside + // a ConfigureHowToFindSaga method: https://msdn.microsoft.com/en-us/library/d81ee808.aspx + return instructions.Any(instruction => instruction.OpCode.Code == Code.Calli); + } + + public static bool CallsUnexpectedMethods(IList instructions) + { + var methodRefs = instructions + .Where(instruction => instruction.OpCode.Code == Code.Call || instruction.OpCode.Code == Code.Callvirt) + .Select(instruction => instruction.Operand as MethodReference) + .ToArray(); + + if (methodRefs.Any(methodRef => methodRef == null)) + { + // Should not happen, all call/callvirt should have a MethodReference as an operand + throw new Exception("Can't determine method call type for MSIL instruction"); + } + + var interestingCalls = methodRefs + .Where(methodRef => !allowedMethods.Contains($"{methodRef.DeclaringType.FullName}::{methodRef.Name}")) + .Select(methodRef => new MethodRefClassifier + { + MethodRef = methodRef, + IsConfigureMapping = IsConfigureMappingMethodCall(methodRef), + IsToSaga = IsToSagaMethodCall(methodRef), + IsExpressionCall = IsExpressionCall(methodRef) + }) + .Reverse() // <----- Note on reversal below + .ToArray(); + + /* The ability to do Call expressions is necessary on the message mapping side in order to be able to, + * for instance, concatenate 2 message properties together into one value to look up in the saga data, + * i.e. ConfigureMapping(msg => $"{msg.PropA}/{msg.PropB}), and honestly in the message mapping portion + * we don't really care. But in the saga data portion, we want to be more conservative. Because of the way + * IL works, you have to get your arguments set up before you invoke the method with the pointers to + * arguments stored in registers, so that means everything related to ConfigureMapping comes BEFORE that call, + * and everything relating to ToSaga (where the correlation id will come from) comes before THAT call. By + * reversing the order of the methods that are left, we can see ConfigureMapping and ToSaga as signposts to + * determine whether the upcoming calls are either allowed or not. + */ + + var expressionCallsAllowed = false; + foreach (var item in interestingCalls) + { + if (item.IsConfigureMapping) + { + // This expression call (and those after) came before ConfigureMapping, meaning it's an argument of ConfigureMapping. It's OK. + expressionCallsAllowed = true; + } + else if (item.IsToSaga) + { + // This expression call (and those after) came before ToSaga, meaning it's an argument of ToSaga. Don't allow it. + expressionCallsAllowed = false; + } + + item.ExpressionCallsAllowed = expressionCallsAllowed; + } + + var badCalls = interestingCalls + .Where(item => !item.IsConfigureMapping && !item.IsToSaga) + .Where(item => !(item.IsExpressionCall && item.ExpressionCallsAllowed.Value)) + .ToArray(); + + return badCalls.Length > 0; + } + + class MethodRefClassifier + { + public MethodReference MethodRef { get; set; } + public bool IsConfigureMapping { get; set; } + public bool IsToSaga { get; set; } + public bool IsExpressionCall { get; set; } + public bool? ExpressionCallsAllowed { get; set; } + } + + static bool IsConfigureMappingMethodCall(MethodReference methodRef) + { + // FullName would be NServiceBus.SagaPropertyMapper + return methodRef.Name == "ConfigureMapping" + && methodRef.DeclaringType.FullName.StartsWith("NServiceBus.SagaPropertyMapper`"); + } + + static bool IsToSagaMethodCall(MethodReference methodRef) + { + // FullName would be NServiceBus.ToSagaExpression + // Don't validate the entire thing because we won't know the message type, and could be called multiple times + return methodRef.Name == "ToSaga" + && methodRef.DeclaringType.FullName.StartsWith("NServiceBus.ToSagaExpression`"); + } + + static bool IsExpressionCall(MethodReference methodRef) + { + return methodRef.DeclaringType.FullName == "System.Linq.Expressions.Expression" + && methodRef.Name == "Call"; + } + +} diff --git a/src/ScriptBuilder/Saga/SagaDefinitionReader.cs b/src/ScriptBuilder/Saga/SagaDefinitionReader.cs index 766e075a4..69f9cc97c 100644 --- a/src/ScriptBuilder/Saga/SagaDefinitionReader.cs +++ b/src/ScriptBuilder/Saga/SagaDefinitionReader.cs @@ -1,13 +1,19 @@ -using System.Linq; +using System; +using System.Linq; using Mono.Cecil; using NServiceBus.Persistence.Sql; using NServiceBus.Persistence.Sql.ScriptBuilder; static class SagaDefinitionReader { - public static bool TryGetSqlSagaDefinition(TypeDefinition type, out SagaDefinition definition) + public static bool TryGetSagaDefinition(TypeDefinition type, out SagaDefinition definition) { - ValidateIsNotDirectSaga(type); + return TryGetSqlSagaDefinition(type, out definition) + || TryGetCoreSagaDefinition(type, out definition); + } + + static bool TryGetSqlSagaDefinition(TypeDefinition type, out SagaDefinition definition) + { if (!IsSqlSaga(type)) { definition = null; @@ -15,9 +21,14 @@ public static bool TryGetSqlSagaDefinition(TypeDefinition type, out SagaDefiniti } CheckIsValidSaga(type); + if (type.GetSingleAttribute("NServiceBus.Persistence.Sql.SqlSagaAttribute") != null) + { + throw new Exception("[SqlSaga] attribute is invalid on a class inheriting SqlSaga. To provide CorrelationId, TransitionalCorrelationId, or TableSuffix override the corresponding properties on the SqlSaga base class instead."); + } + var correlation = GetCorrelationPropertyName(type); var transitional = GetTransitionalCorrelationPropertyName(type); - var tableSuffix = GetTableSuffix(type); + var tableSuffix = GetSqlSagaTableSuffix(type); SagaDefinitionValidator.ValidateSagaDefinition(correlation, type.FullName, transitional, tableSuffix); @@ -38,6 +49,79 @@ public static bool TryGetSqlSagaDefinition(TypeDefinition type, out SagaDefiniti return true; } + static bool TryGetCoreSagaDefinition(TypeDefinition type, out SagaDefinition definition) + { + var baseType = type.BaseType as GenericInstanceType; + definition = null; + + // Class must directly inherit from NServiceBus.Saga so that no tricks can be pulled from an intermediate class + if (baseType == null || !baseType.FullName.StartsWith("NServiceBus.Saga") || baseType.GenericArguments.Count != 1) + { + return false; + } + + CheckIsValidSaga(type); + + string correlationId = null; + string transitionalId = null; + string tableSuffix = null; + + var attribute = type.GetSingleAttribute("NServiceBus.Persistence.Sql.SqlSagaAttribute"); + if (attribute != null) + { + var args = attribute.ConstructorArguments; + correlationId = (string)args[0].Value; + transitionalId = (string)args[1].Value; + tableSuffix = (string)args[2].Value; + } + + var sagaDataType = GetSagaDataTypeFromSagaType(type); + + if (correlationId == null) + { + correlationId = GetCoreSagaCorrelationId(type, sagaDataType); + } + + SagaDefinitionValidator.ValidateSagaDefinition(correlationId, type.FullName, transitionalId, tableSuffix); + + if (tableSuffix == null) + { + tableSuffix = type.Name; + } + + definition = new SagaDefinition + ( + correlationProperty: BuildConstraintProperty(sagaDataType, correlationId), + transitionalCorrelationProperty: BuildConstraintProperty(sagaDataType, transitionalId), + tableSuffix: tableSuffix, + name: type.FullName + ); + return true; + } + + static string GetCoreSagaCorrelationId(TypeDefinition type, TypeDefinition sagaDataType) + { + var instructions = InstructionAnalyzer.GetConfigureHowToFindSagaInstructions(type); + + if (InstructionAnalyzer.ContainsBranchingLogic(instructions)) + { + throw new ErrorsException("Looping & branching statements are not allowed in a ConfigureHowToFindSaga method."); + } + + if (InstructionAnalyzer.CallsUnmanagedMethods(instructions)) + { + throw new ErrorsException("Calling unmanaged code is not allowed in a ConfigureHowToFindSaga method."); + } + + if (InstructionAnalyzer.CallsUnexpectedMethods(instructions)) + { + throw new ErrorsException("Unable to determine Saga correlation property because an unexpected method call was detected in the ConfigureHowToFindSaga method."); + } + + var correlationId = InstructionAnalyzer.GetCorrelationId(instructions, sagaDataType.FullName); + return correlationId; + } + static string GetCorrelationPropertyName(TypeDefinition type) { var property = type.GetProperty("CorrelationPropertyName"); @@ -67,7 +151,7 @@ static string GetTransitionalCorrelationPropertyName(TypeDefinition type) For example: protected override string TransitionalCorrelationPropertyName => nameof(SagaData.TheProperty);"); } - static string GetTableSuffix(TypeDefinition type) + static string GetSqlSagaTableSuffix(TypeDefinition type) { if (!type.TryGetProperty("TableSuffix", out var property)) { @@ -105,19 +189,6 @@ static bool IsSqlSaga(TypeDefinition type) baseType.FullName.StartsWith("NServiceBus.Persistence.Sql.SqlSaga"); } - static void ValidateIsNotDirectSaga(TypeDefinition type) - { - if (type.BaseType == null) - { - return; - } - var baseTypeFullName = type.BaseType.FullName; - if (baseTypeFullName.StartsWith("NServiceBus.Saga")) - { - throw new ErrorsException($"The type '{type.FullName}' inherits from NServiceBus.Saga which is not supported. Inherit from NServiceBus.Persistence.Sql.SqlSaga."); - } - } - static TypeDefinition GetSagaDataTypeFromSagaType(TypeDefinition sagaType) { var baseType = (GenericInstanceType) sagaType.BaseType; diff --git a/src/ScriptBuilderTask.Tests/ScriptBuilderTask.Tests.csproj b/src/ScriptBuilderTask.Tests/ScriptBuilderTask.Tests.csproj index 383978442..6854a41bc 100644 --- a/src/ScriptBuilderTask.Tests/ScriptBuilderTask.Tests.csproj +++ b/src/ScriptBuilderTask.Tests/ScriptBuilderTask.Tests.csproj @@ -4,7 +4,6 @@ net452 true $(SolutionDir)Test.snk - false true diff --git a/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt b/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt index 838fae35c..56124d798 100644 --- a/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt +++ b/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt @@ -70,6 +70,14 @@ namespace NServiceBus.Persistence.Sql protected override void ConfigureHowToFindSaga(NServiceBus.IConfigureHowToFindSagaWithMessage mapper) { } protected abstract void ConfigureMapping(NServiceBus.Persistence.Sql.IMessagePropertyMapper mapper); } + [System.AttributeUsageAttribute(System.AttributeTargets.Class | System.AttributeTargets.All, Inherited=false)] + public sealed class SqlSagaAttribute : System.Attribute + { + public SqlSagaAttribute(string correlationProperty = null, string transitionalCorrelationProperty = null, string tableSuffix = null) { } + public string CorrelationProperty { get; } + public string TableSuffix { get; } + public string TransitionalCorrelationProperty { get; } + } [System.ObsoleteAttribute("Use `persistence.SqlDialect()` instead. Will be removed i" + "n version 4.0.0.", true)] public enum SqlVariant diff --git a/src/SqlPersistence/Saga/RuntimeSagaInfo.cs b/src/SqlPersistence/Saga/RuntimeSagaInfo.cs index d60e2a399..2d3d042cf 100644 --- a/src/SqlPersistence/Saga/RuntimeSagaInfo.cs +++ b/src/SqlPersistence/Saga/RuntimeSagaInfo.cs @@ -6,6 +6,7 @@ using Newtonsoft.Json; using NServiceBus; using NServiceBus.Persistence.Sql; +using NServiceBus.Sagas; using JsonSerializer = Newtonsoft.Json.JsonSerializer; #pragma warning disable 618 @@ -36,7 +37,7 @@ class RuntimeSagaInfo public RuntimeSagaInfo( Type sagaDataType, RetrieveVersionSpecificJsonSettings versionSpecificSettings, - Type sagaType, + SagaMetadata metadata, JsonSerializer jsonSerializer, Func readerCreator, Func writerCreator, @@ -50,14 +51,13 @@ public RuntimeSagaInfo( deserializers = new ConcurrentDictionary(); } this.versionSpecificSettings = versionSpecificSettings; - SagaType = sagaType; + SagaType = metadata.SagaType; this.jsonSerializer = jsonSerializer; this.readerCreator = readerCreator; this.writerCreator = writerCreator; this.sqlDialect = sqlDialect; CurrentVersion = sagaDataType.Assembly.GetFileVersion(); - ValidateIsSqlSaga(); - var sqlSagaAttributeData = SqlSagaTypeDataReader.GetTypeData(sagaType); + var sqlSagaAttributeData = SqlSagaTypeDataReader.GetTypeData(metadata); var tableSuffix = nameFilter(sqlSagaAttributeData.TableSuffix); TableName = sqlDialect.GetSagaTableName(tablePrefix, tableSuffix); @@ -83,14 +83,6 @@ public RuntimeSagaInfo( } } - void ValidateIsSqlSaga() - { - if (!SagaType.IsSubclassOfRawGeneric(typeof(SqlSaga<>))) - { - throw new Exception($"Type '{SagaType.FullName}' does not inherit from SqlSaga. Change the type to inherit from SqlSaga."); - } - } - public CommandWrapper CreateCommand(DbConnection connection) { return sqlDialect.CreateCommand(connection); diff --git a/src/SqlPersistence/Saga/SagaInfoCache.cs b/src/SqlPersistence/Saga/SagaInfoCache.cs index d255a985c..08e9e95a0 100644 --- a/src/SqlPersistence/Saga/SagaInfoCache.cs +++ b/src/SqlPersistence/Saga/SagaInfoCache.cs @@ -49,7 +49,7 @@ void Initialize(SagaMetadataCollection metadataCollection) { throw new Exception($"The saga data '{sagaDataType.FullName}' is being used by both '{existing.SagaType}' and '{metadata.SagaType.FullName}'. Saga data can only be used by one saga."); } - var sagaInfo = BuildSagaInfo(sagaDataType, metadata.SagaType); + var sagaInfo = BuildSagaInfo(sagaDataType, metadata); cache[sagaDataType] = sagaInfo; if (sagaInfo.CorrelationProperty != null && !metadata.TryGetCorrelationProperty(out var _)) { @@ -67,12 +67,12 @@ public RuntimeSagaInfo GetInfo(Type sagaDataType) throw new Exception($"Could not find RuntimeSagaInfo for {sagaDataType.FullName}."); } - RuntimeSagaInfo BuildSagaInfo(Type sagaDataType, Type sagaType) + RuntimeSagaInfo BuildSagaInfo(Type sagaDataType, SagaMetadata metadata) { return new RuntimeSagaInfo( sagaDataType: sagaDataType, versionSpecificSettings: versionSpecificSettings, - sagaType: sagaType, + metadata: metadata, jsonSerializer: jsonSerializer, readerCreator: readerCreator, writerCreator: writerCreator, diff --git a/src/SqlPersistence/Saga/SqlSaga.cs b/src/SqlPersistence/Saga/SqlSaga.cs index 4474c170e..b729716b6 100644 --- a/src/SqlPersistence/Saga/SqlSaga.cs +++ b/src/SqlPersistence/Saga/SqlSaga.cs @@ -24,16 +24,6 @@ internal void VerifyNoConfigureHowToFindSaga() } } - void VerifyBase() - { - var baseTypeFullName = GetType().BaseType.FullName; - var fullName = typeof(SqlSaga<>).FullName; - if (!baseTypeFullName.StartsWith(fullName)) - { - throw new Exception($"Implementations of {fullName} must inherit from it directly. Deep class hierarchies are not supported."); - } - } - /// /// Gets the name of the correlation property for . /// @@ -70,7 +60,6 @@ public TSagaData Data protected override void ConfigureHowToFindSaga(IConfigureHowToFindSagaWithMessage mapper) { VerifyNoConfigureHowToFindSaga(); - VerifyBase(); var propertyMapper = new PropertyMapper(mapper, GetExpression(), GetType()); ConfigureMapping(propertyMapper); } diff --git a/src/SqlPersistence/Saga/SqlSagaAttribute.cs b/src/SqlPersistence/Saga/SqlSagaAttribute.cs new file mode 100644 index 000000000..664294b0d --- /dev/null +++ b/src/SqlPersistence/Saga/SqlSagaAttribute.cs @@ -0,0 +1,47 @@ +using System; + +namespace NServiceBus.Persistence.Sql +{ + /// + /// Exposes extra configuration options for storing . + /// + [AttributeUsage(AttributeTargets.Class, Inherited = false)] + public sealed class SqlSagaAttribute : Attribute + { + /// + /// Provides a means to identify the Saga correlation property if it cannot be determined by inspecting the ConfigureHowToFindSaga method. + /// Specifying the CorrelationProperty using this attribute will skip the inspection of the ConfigureHowToFindSaga method altogether. + /// + public string CorrelationProperty { get; } + + /// + /// Used to transition between different properties for saga correlation. + /// + public string TransitionalCorrelationProperty { get; } + + /// + /// The name of the table to use when storing the current . + /// Will be appended to the value specified in . + /// + public string TableSuffix { get; } + + /// + /// Exposes extra configuration options for storing . + /// + /// Identifies the Saga correlation property if it cannot be determined by inspecting the ConfigureHowToFindSaga method. + /// Used to transition between different properties for saga correlation. + /// + /// The name of the table to use when storing the current . + /// Will be appended to the value specified in . + /// + public SqlSagaAttribute( + string correlationProperty = null, + string transitionalCorrelationProperty = null, + string tableSuffix = null) + { + CorrelationProperty = correlationProperty; + TransitionalCorrelationProperty = transitionalCorrelationProperty; + TableSuffix = tableSuffix; + } + } +} \ No newline at end of file diff --git a/src/SqlPersistence/Saga/SqlSagaTypeDataReader.cs b/src/SqlPersistence/Saga/SqlSagaTypeDataReader.cs index f21231568..5e0d959ea 100644 --- a/src/SqlPersistence/Saga/SqlSagaTypeDataReader.cs +++ b/src/SqlPersistence/Saga/SqlSagaTypeDataReader.cs @@ -1,11 +1,31 @@ using System; +using System.Linq; using System.Reflection; using System.Runtime.Serialization; +using NServiceBus.Persistence.Sql; +using NServiceBus.Sagas; static class SqlSagaTypeDataReader { - public static SqlSagaTypeData GetTypeData(Type sagaType) + public static SqlSagaTypeData GetTypeData(SagaMetadata metadata) { + var sagaType = metadata.SagaType; + + if (sagaType.IsSubclassOfRawGeneric(typeof(SqlSaga<>))) + { + return GetTypeDataFromSqlSaga(sagaType); + } + + if (sagaType.IsSubclassOfRawGeneric(typeof(NServiceBus.Saga<>))) + { + return GetTypeDataFromCoreSaga(metadata); + } + + throw new Exception($"Type '{sagaType.FullName}' is not a Saga."); + } + + static SqlSagaTypeData GetTypeDataFromSqlSaga(Type sagaType) + { var instance = FormatterServices.GetUninitializedObject(sagaType); string transitionalCorrelationPropertyName = null; @@ -35,6 +55,28 @@ public static SqlSagaTypeData GetTypeData(Type sagaType) }; } + static SqlSagaTypeData GetTypeDataFromCoreSaga(SagaMetadata metadata) + { + var attribute = metadata.SagaType.GetCustomAttributes().OfType().FirstOrDefault(); + + var correlationProperty = attribute?.CorrelationProperty; + + if (correlationProperty == null) + { + if (metadata.TryGetCorrelationProperty(out var property)) + { + correlationProperty = property.Name; + } + } + + return new SqlSagaTypeData + { + TableSuffix = attribute?.TableSuffix ?? metadata.SagaType.Name, + CorrelationProperty = correlationProperty, + TransitionalCorrelationProperty = attribute?.TransitionalCorrelationProperty + }; + } + static string GetPropertyValue(PropertyInfo property, object instance) { return (string) property.GetMethod.Invoke(instance, null); diff --git a/src/VBTestCode/Messages.vb b/src/VBTestCode/Messages.vb new file mode 100644 index 000000000..c90ba7724 --- /dev/null +++ b/src/VBTestCode/Messages.vb @@ -0,0 +1,26 @@ +Imports NServiceBus + +Public Class MessageA + Implements ICommand + + Public Property Correlation As String +End Class + +Public Class MessageB + Implements ICommand + + Public Property Correlation As String +End Class + +Public Class MessageC + Implements ICommand + + Public Property Part1 As String + Public Property Part2 As String +End Class + +Public Class MessageD + Implements ICommand + + Public Property DifferentName As String +End Class \ No newline at end of file diff --git a/src/VBTestCode/VBMultiTestSaga.vb b/src/VBTestCode/VBMultiTestSaga.vb new file mode 100644 index 000000000..c5a1f6971 --- /dev/null +++ b/src/VBTestCode/VBMultiTestSaga.vb @@ -0,0 +1,18 @@ +Imports NServiceBus + +Public Class VBMultiTestSaga + Inherits Saga(Of VBMultiTestSaga.SagaData) + + Public Class SagaData + Inherits ContainSagaData + + Public Property Correlation As String + End Class + + Protected Overrides Sub ConfigureHowToFindSaga(ByVal mapper As SagaPropertyMapper(Of SagaData)) + mapper.ConfigureMapping(Of MessageA)(Function(msg) msg.Correlation).ToSaga(Function(saga) saga.Correlation) + mapper.ConfigureMapping(Of MessageD)(Function(msg) msg.DifferentName).ToSaga(Function(saga) saga.Correlation) + mapper.ConfigureMapping(Of MessageC)(Function(msg) msg.Part1 + msg.Part2 + $"{msg.Part1}{msg.Part2}" + String.Format("{0}{1}", msg.Part1, msg.Part2)) _ + .ToSaga(Function(saga) saga.Correlation) + End Sub +End Class \ No newline at end of file diff --git a/src/VBTestCode/VBTestCode.vbproj b/src/VBTestCode/VBTestCode.vbproj new file mode 100644 index 000000000..623e33a8b --- /dev/null +++ b/src/VBTestCode/VBTestCode.vbproj @@ -0,0 +1,14 @@ + + + + net452;netcoreapp2.0 + true + $(SolutionDir)Test.snk + true + + + + + + + From 40a4d5f8429c87228f4c21aafbf6c70e846f3058 Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 14:33:02 -0500 Subject: [PATCH 02/11] Fix cherry-pick errors --- .../Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs | 3 ++- .../Saga/SagaDefinitionReaderTest.cs | 13 ++++--------- src/VBTestCode/VBTestCode.vbproj | 4 ++-- 3 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs index b6b6cecc3..a5c30af56 100644 --- a/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs +++ b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.cs @@ -3,6 +3,7 @@ using Mono.Cecil; using NServiceBus.Persistence.Sql.ScriptBuilder; using NUnit.Framework; +using ObjectApproval; [TestFixture] public partial class CoreSagaMetadataTests @@ -148,7 +149,7 @@ private void TestSagaDefinition(ModuleDefinition moduleToUse = null) results.Exception = x.Message; } - TestApprover.VerifyWithJson(results); + ObjectApprover.VerifyWithJson(results); } class SagaInspectionResults diff --git a/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs b/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs index 4e9e8b3be..80c49363c 100644 --- a/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs +++ b/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs @@ -3,7 +3,6 @@ using Mono.Cecil; using NServiceBus; using NServiceBus.Persistence.Sql; -using NServiceBus.Persistence.Sql.ScriptBuilder; using NUnit.Framework; #if NET452 using ApprovalTests; @@ -11,7 +10,7 @@ #endif [TestFixture] -public class SagaDefinitionReaderTest: IDisposable +public class SagaDefinitionReaderTest : IDisposable { ModuleDefinition module; @@ -28,7 +27,7 @@ public void WithGeneric() var sagaType = module.GetTypeDefinition>(); var exception = Assert.Throws(() => { - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); + SagaDefinitionReader.TryGetSagaDefinition(sagaType, out _); }); Assert.IsNotNull(exception.Message); #if NET452 @@ -57,7 +56,7 @@ public void Abstract() var sagaType = module.GetTypeDefinition(); var exception = Assert.Throws(() => { - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); + SagaDefinitionReader.TryGetSagaDefinition(sagaType, out _); }); Assert.IsNotNull(exception.Message); #if NET452 @@ -74,10 +73,6 @@ public class SagaData : ContainSagaData } [Test] - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); - TestApprover.Verify(exception.Message); - Approvals.Verify(exception.Message); -#endif public void Simple() { var sagaType = module.GetTypeDefinition(); @@ -112,7 +107,7 @@ public void WithReadonlyProperty() var sagaType = module.GetTypeDefinition(); var exception = Assert.Throws(() => { - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); + SagaDefinitionReader.TryGetSagaDefinition(sagaType, out _); }); Assert.IsNotNull(exception.Message); #if NET452 diff --git a/src/VBTestCode/VBTestCode.vbproj b/src/VBTestCode/VBTestCode.vbproj index 623e33a8b..531ebf9c3 100644 --- a/src/VBTestCode/VBTestCode.vbproj +++ b/src/VBTestCode/VBTestCode.vbproj @@ -1,14 +1,14 @@  - net452;netcoreapp2.0 + net452 true $(SolutionDir)Test.snk true - + From 08707ff53bf7612c8d5bcc4e8f6e9cb91d238382 Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 14:38:38 -0500 Subject: [PATCH 03/11] Lock to references that target netstandard1.5 to avoid breaking change --- src/ScriptBuilderTask/ScriptBuilderTask.csproj | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/ScriptBuilderTask/ScriptBuilderTask.csproj b/src/ScriptBuilderTask/ScriptBuilderTask.csproj index 86ceae5e2..dd5d5a850 100644 --- a/src/ScriptBuilderTask/ScriptBuilderTask.csproj +++ b/src/ScriptBuilderTask/ScriptBuilderTask.csproj @@ -29,10 +29,10 @@ - - - - + + + + From d5c705effbc397f086eec4ae086e646ed0f1d402 Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 14:39:10 -0500 Subject: [PATCH 04/11] DotSettings --- src/NServiceBus.Persistence.Sql.sln.DotSettings | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/NServiceBus.Persistence.Sql.sln.DotSettings b/src/NServiceBus.Persistence.Sql.sln.DotSettings index d21b95021..da38a891f 100644 --- a/src/NServiceBus.Persistence.Sql.sln.DotSettings +++ b/src/NServiceBus.Persistence.Sql.sln.DotSettings @@ -558,9 +558,13 @@ II.2.12 <HandlesEvent /> <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> True True + True True + True + True True True + True True True True From 2f4f757dbb7d5917d173a361b6f6184dd07c3f14 Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 14:42:49 -0500 Subject: [PATCH 05/11] Move test results into subdirectory --- ...SagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt | 0 ...taTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt | 0 ....AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt | 0 ...s.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt | 0 .../CoreSagaMetadataTests.DontAllowForLoop.approved.txt | 0 ...oreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt | 0 .../CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt | 0 .../CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt | 0 ...agaMetadataTests.DontMapConflictingCorrelationIds.approved.txt | 0 .../CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt | 0 .../CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt | 0 ...CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt | 0 .../CoreSagaMetadataTests.DualMapping.approved.txt | 0 .../CoreSagaMetadataTests.SingleMapping.approved.txt | 0 .../CoreSagaMetadataTests.SingleMappingValueType.approved.txt | 0 ...etadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt | 0 .../CoreSagaMetadataTests.TestSagaInVB.approved.txt | 0 17 files changed, 0 insertions(+), 0 deletions(-) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DontAllowForLoop.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.DualMapping.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.SingleMapping.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.SingleMappingValueType.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt (100%) rename src/ScriptBuilder.Tests/{ApprovalFiles => Saga/CoreSagaMetadata}/CoreSagaMetadataTests.TestSagaInVB.approved.txt (100%) diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.AllowConcatenatingMsgProperties.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithFormat.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithInterpolation.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.AllowConcatenatingMsgPropertiesWithOtherMethods.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowForLoop.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontAllowForLoop.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowForLoop.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontAllowForLoop.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontAllowMethodCallInMapping.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontAllowPassingMapper.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontAllowWhileLoop.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontMapConflictingCorrelationIds.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontMapDelegateCalls.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontMapSwitchingLogic.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DontMapWithIntermediateBase.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DualMapping.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DualMapping.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.DualMapping.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.DualMapping.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMapping.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMapping.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMapping.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMapping.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMappingValueType.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingValueType.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SingleMappingValueType.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SingleMappingValueType.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.SupplyAdditionalMetadataViaAttribute.approved.txt diff --git a/src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.TestSagaInVB.approved.txt b/src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.TestSagaInVB.approved.txt similarity index 100% rename from src/ScriptBuilder.Tests/ApprovalFiles/CoreSagaMetadataTests.TestSagaInVB.approved.txt rename to src/ScriptBuilder.Tests/Saga/CoreSagaMetadata/CoreSagaMetadataTests.TestSagaInVB.approved.txt From a20706bba15c1fe1bcb1af6169840c4606f0492a Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 15:01:48 -0500 Subject: [PATCH 06/11] Move tests out of AcceptanceTestsHolder --- .../AcceptanceTestsHolder.csproj | 4 ---- .../NoPersistenceServer.cs | 0 .../When_using_different_persistence.cs | 0 .../When_using_intermediate_saga_base_class.cs | 0 .../When_using_outbox_but_no_sagas.cs | 0 .../MsSqlAcceptanceTests.csproj | 5 ++--- .../MySqlAcceptanceTests.csproj | 15 +++++++++++---- .../When_correlating_on_special_characters.cs | 11 ----------- .../TestPartials/When_sagas_cant_be_found.cs | 9 --------- .../OracleAcceptanceTests.csproj | 5 ++--- .../PostgreSqlAcceptanceTests.csproj | 5 ++--- 11 files changed, 17 insertions(+), 37 deletions(-) rename src/{AcceptanceTestsHolder/App_Packages => AcceptanceTestsShared}/NoPersistenceServer.cs (100%) rename src/{AcceptanceTestsHolder/App_Packages => AcceptanceTestsShared}/When_using_different_persistence.cs (100%) rename src/{AcceptanceTestsHolder/App_Packages => AcceptanceTestsShared}/When_using_intermediate_saga_base_class.cs (100%) rename src/{AcceptanceTestsHolder/App_Packages => AcceptanceTestsShared}/When_using_outbox_but_no_sagas.cs (100%) delete mode 100644 src/MySqlAcceptanceTests/TestPartials/When_correlating_on_special_characters.cs delete mode 100644 src/MySqlAcceptanceTests/TestPartials/When_sagas_cant_be_found.cs diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index f945ecb47..b6fc76459 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -55,7 +55,6 @@ - @@ -241,9 +240,6 @@ - - - diff --git a/src/AcceptanceTestsHolder/App_Packages/NoPersistenceServer.cs b/src/AcceptanceTestsShared/NoPersistenceServer.cs similarity index 100% rename from src/AcceptanceTestsHolder/App_Packages/NoPersistenceServer.cs rename to src/AcceptanceTestsShared/NoPersistenceServer.cs diff --git a/src/AcceptanceTestsHolder/App_Packages/When_using_different_persistence.cs b/src/AcceptanceTestsShared/When_using_different_persistence.cs similarity index 100% rename from src/AcceptanceTestsHolder/App_Packages/When_using_different_persistence.cs rename to src/AcceptanceTestsShared/When_using_different_persistence.cs diff --git a/src/AcceptanceTestsHolder/App_Packages/When_using_intermediate_saga_base_class.cs b/src/AcceptanceTestsShared/When_using_intermediate_saga_base_class.cs similarity index 100% rename from src/AcceptanceTestsHolder/App_Packages/When_using_intermediate_saga_base_class.cs rename to src/AcceptanceTestsShared/When_using_intermediate_saga_base_class.cs diff --git a/src/AcceptanceTestsHolder/App_Packages/When_using_outbox_but_no_sagas.cs b/src/AcceptanceTestsShared/When_using_outbox_but_no_sagas.cs similarity index 100% rename from src/AcceptanceTestsHolder/App_Packages/When_using_outbox_but_no_sagas.cs rename to src/AcceptanceTestsShared/When_using_outbox_but_no_sagas.cs diff --git a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj index 271954fb2..4e2ab99b9 100644 --- a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj +++ b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj @@ -19,15 +19,14 @@ - + - - + \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index a5e6bcf80..7fad684e8 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -4,7 +4,6 @@ net452 true $(SolutionDir)Test.snk - $(DefineConstants);MySQL @@ -20,14 +19,22 @@ - + - - + + + + + + + + + + \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/TestPartials/When_correlating_on_special_characters.cs b/src/MySqlAcceptanceTests/TestPartials/When_correlating_on_special_characters.cs deleted file mode 100644 index efc1d5a5f..000000000 --- a/src/MySqlAcceptanceTests/TestPartials/When_correlating_on_special_characters.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ -#if RELEASE - using NUnit.Framework; - // So this test does not run on CI as server install does not support unicode - [Explicit("MySqlUnicode")] -#endif - partial class When_correlating_special_chars - { - } -} \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/TestPartials/When_sagas_cant_be_found.cs b/src/MySqlAcceptanceTests/TestPartials/When_sagas_cant_be_found.cs deleted file mode 100644 index d818f5a87..000000000 --- a/src/MySqlAcceptanceTests/TestPartials/When_sagas_cant_be_found.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using NUnit.Framework; - - [Explicit] - public partial class When_sagas_cant_be_found - { - } -} \ No newline at end of file diff --git a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj index 5da784d28..c90da7f12 100644 --- a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj +++ b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj @@ -19,14 +19,13 @@ - + - - + \ No newline at end of file diff --git a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj index 271954fb2..4e2ab99b9 100644 --- a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj +++ b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj @@ -19,15 +19,14 @@ - + - - + \ No newline at end of file From 6e8490c3187ef68e39c7cc149904d20c0a5ae795 Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 15:29:47 -0500 Subject: [PATCH 07/11] Replace partial+explicit with compile remove --- src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj | 2 -- .../Partials/When_Deferring_a_message.cs | 9 --------- .../Partials/When_running_saga_tests.cs | 9 --------- src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj | 7 +++++++ ...requesting_immediate_dispatch_using_scope_suppress.cs | 9 --------- src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj | 2 ++ src/OracleAcceptanceTests/OracleAcceptanceTests.csproj | 5 +++++ .../PostgreSqlAcceptanceTests.csproj | 6 ++++++ 8 files changed, 20 insertions(+), 29 deletions(-) delete mode 100644 src/AcceptanceTestsHolder/Partials/When_Deferring_a_message.cs delete mode 100644 src/AcceptanceTestsHolder/Partials/When_running_saga_tests.cs delete mode 100644 src/MsSqlAcceptanceTests/TestPartials/When_requesting_immediate_dispatch_using_scope_suppress.cs diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index b6fc76459..c1ca597fd 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -240,9 +240,7 @@ - - diff --git a/src/AcceptanceTestsHolder/Partials/When_Deferring_a_message.cs b/src/AcceptanceTestsHolder/Partials/When_Deferring_a_message.cs deleted file mode 100644 index 8df43e863..000000000 --- a/src/AcceptanceTestsHolder/Partials/When_Deferring_a_message.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace NServiceBus.AcceptanceTests.DelayedDelivery -{ - using NUnit.Framework; - - [Explicit("Flaky test that does not matter to sql")] - public partial class When_deferring_a_message - { - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/Partials/When_running_saga_tests.cs b/src/AcceptanceTestsHolder/Partials/When_running_saga_tests.cs deleted file mode 100644 index 6d808891f..000000000 --- a/src/AcceptanceTestsHolder/Partials/When_running_saga_tests.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace NServiceBus.AcceptanceTests.SelfVerification -{ - using NUnit.Framework; - - [Explicit("Since these do not apply to sql")] - public partial class When_running_saga_tests - { - } -} \ No newline at end of file diff --git a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj index 4e2ab99b9..1e749de63 100644 --- a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj +++ b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj @@ -29,4 +29,11 @@ + + + + + + + \ No newline at end of file diff --git a/src/MsSqlAcceptanceTests/TestPartials/When_requesting_immediate_dispatch_using_scope_suppress.cs b/src/MsSqlAcceptanceTests/TestPartials/When_requesting_immediate_dispatch_using_scope_suppress.cs deleted file mode 100644 index 22c063bb4..000000000 --- a/src/MsSqlAcceptanceTests/TestPartials/When_requesting_immediate_dispatch_using_scope_suppress.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using NUnit.Framework; - - [Explicit("SQL transport does not support immediate dispatch via scope suppress")] - public partial class When_requesting_immediate_dispatch_using_scope_suppress - { - } -} \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index 7fad684e8..29571df11 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -35,6 +35,8 @@ + + \ No newline at end of file diff --git a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj index c90da7f12..f11e9e13f 100644 --- a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj +++ b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj @@ -28,4 +28,9 @@ + + + + + \ No newline at end of file diff --git a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj index 4e2ab99b9..c4afa9f46 100644 --- a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj +++ b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj @@ -29,4 +29,10 @@ + + + + + + \ No newline at end of file From e971d7c44fa9978067cccb511ee9bc13d1671bdc Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 15:32:38 -0500 Subject: [PATCH 08/11] Remove AcceptanceTestsHolder --- .../AcceptanceTestsHolder.csproj | 259 ------------------ .../Audit/When_a_message_is_audited.cs | 134 --------- .../Audit/When_a_replymessage_is_audited.cs | 125 --------- .../Audit/When_audit_is_overridden_in_code.cs | 68 ----- .../Audit/When_auditing.cs | 111 -------- ..._auditing_message_with_TimeToBeReceived.cs | 102 ------- .../ConfigureEndpointInMemoryPersistence.cs | 18 -- .../ConfigureEndpointLearningPersistence.cs | 34 --- .../ConfigureEndpointLearningTransport.cs | 33 --- .../ConfigureEndpointMsmqTransport.cs | 82 ------ .../ConventionEnforcementTests.cs | 59 ---- ..._received_message_without_correlationid.cs | 92 ------- .../When_sending_with_no_correlation_id.cs | 55 ---- .../When_using_a_custom_correlation_id.cs | 69 ----- .../When_sending_databus_properties.cs | 96 ------- ...ing_databus_properties_with_unobtrusive.cs | 89 ------ .../DataBus/When_using_custom_IDataBus.cs | 100 ------- .../When_Deferring_a_message.cs | 66 ----- .../When_deferring_a_message_to_the_past.cs | 59 ---- .../When_deferring_to_non_local.cs | 79 ------ .../NSB.AcceptanceTests/DeterministicGuid.cs | 21 -- .../EndpointTemplates/ConfigureExtensions.cs | 38 --- .../EndpointTemplates/DefaultPublisher.cs | 17 -- .../EndpointTemplates/DefaultServer.cs | 59 ---- .../EndpointConfigurationExtensions.cs | 12 - ...intCustomizationConfigurationExtensions.cs | 53 ---- .../IConfigureEndpointTestExecution.cs | 30 -- .../EndpointTemplates/Requires.cs | 55 ---- ...rverWithNoDefaultPersistenceDefinitions.cs | 53 ---- .../EndpointTemplates/TestSuiteConstraints.cs | 27 -- ...n_forwarding_is_configured_for_endpoint.cs | 75 ----- ...When_requesting_message_to_be_forwarded.cs | 75 ----- .../When_message_has_empty_id_header.cs | 69 ----- .../When_message_has_no_id_header.cs | 65 ----- .../NServiceBusAcceptanceTest.cs | 36 --- .../When_a_duplicate_message_arrives.cs | 109 -------- .../Outbox/When_a_message_is_audited.cs | 98 ------- .../When_blowing_up_just_after_dispatch.cs | 82 ------ .../When_dispatching_forwarded_messages.cs | 97 ------- .../Outbox/When_receiving_a_message.cs | 67 ----- .../Pipeline/When_a_message_is_audited.cs | 104 ------- .../Pipeline/When_a_message_is_faulted.cs | 101 ------- .../Pipeline/When_a_message_is_sent.cs | 78 ------ .../When_handling_current_message_later.cs | 109 -------- .../When_sending_to_another_endpoint.cs | 102 ------- ...ctional_message_is_moved_to_error_queue.cs | 143 ---------- ...hen_custom_policy_always_moves_to_error.cs | 73 ----- ...ngle_delayed_retry_before_move_to_error.cs | 83 ------ ..._policy_moves_to_overridden_error_queue.cs | 87 ------ ...retries_with_immediate_retries_disabled.cs | 76 ----- .../When_error_is_overridden_in_code.cs | 70 ----- .../When_immediate_retries_disabled.cs | 70 ----- .../When_immediate_retries_fail.cs | 79 ------ .../When_immediate_retries_with_dtc_on.cs | 84 ------ ...ediate_retries_with_native_transactions.cs | 76 ----- .../When_message_fails_retries.cs | 60 ---- ...s_deferred_by_delayed_retries_using_dtc.cs | 86 ------ ...ssage_is_moved_to_error_queue_using_dtc.cs | 99 ------- ...hen_message_with_TimeToBeReceived_fails.cs | 105 ------- ...ctional_message_is_moved_to_error_queue.cs | 145 ---------- ...iveonly_message_is_moved_to_error_queue.cs | 146 ---------- .../Recoverability/When_transactions_off.cs | 88 ------ ...onscope_message_is_moved_to_error_queue.cs | 144 ---------- .../When_extending_event_routing.cs | 78 ------ ...ulti_subscribing_to_a_polymorphic_event.cs | 136 --------- .../When_publishing_from_sendonly.cs | 119 -------- ...en_publishing_to_scaled_out_subscribers.cs | 108 -------- .../When_subscribing_to_a_base_event.cs | 80 ------ ..._event_with_a_route_for_a_derived_event.cs | 111 -------- .../When_subscribing_to_a_derived_event.cs | 101 ------- ...with_routes_to_base_and_specific_events.cs | 121 -------- ...When_subscribing_to_multiple_publishers.cs | 72 ----- ...hen_subscribing_to_scaled_out_publisher.cs | 70 ----- .../When_unsubscribing_from_event.cs | 146 ---------- ...n_unsubscribing_to_scaled_out_publisher.cs | 72 ----- ...embly_level_message_mapping_for_pub_sub.cs | 112 -------- ...scribe_with_missing_routing_information.cs | 43 --- ...When_using_legacy_routing_configuration.cs | 94 ------- ...ulti_subscribing_to_a_polymorphic_event.cs | 96 ------- .../When_publishing_from_sendonly.cs | 65 ----- ...en_publishing_to_scaled_out_subscribers.cs | 99 ------- .../When_subscribing_to_a_base_event.cs | 83 ------ .../When_subscribing_to_a_derived_event.cs | 98 ------- .../When_unsubscribing_from_event.cs | 128 --------- .../Routing/SubscriptionBehavior.cs | 54 ---- .../Routing/SubscriptionBehaviorExtensions.cs | 26 -- .../Routing/SubscriptionEventArgs.cs | 15 - .../When_base_event_from_2_publishers.cs | 125 --------- ...nfigure_routes_for_unobtrusive_messages.cs | 99 ------- .../Routing/When_extending_command_routing.cs | 101 ------- .../Routing/When_multiple_mappings_exists.cs | 97 ------- .../Routing/When_overriding_local_address.cs | 72 ----- .../Routing/When_publishing.cs | 202 -------------- ...t_implementing_two_unrelated_interfaces.cs | 152 ---------- .../Routing/When_publishing_an_interface.cs | 104 ------- ...ublishing_an_interface_with_unobtrusive.cs | 106 ------- .../When_publishing_using_root_type.cs | 92 ------- ...lishing_with_only_local_messagehandlers.cs | 108 -------- ...ublishing_with_overridden_local_address.cs | 81 ------ ...ng_publishers_unobtrusive_messages_code.cs | 74 ----- ..._publishers_unobtrusive_messages_config.cs | 73 ----- .../Routing/When_replying_to_message.cs | 114 -------- ..._message_with_interface_and_unobtrusive.cs | 99 ------- .../When_routing_reply_to_any_instance.cs | 99 ------- .../When_routing_reply_to_specific_address.cs | 107 -------- ...When_routing_reply_to_specific_instance.cs | 99 ------- .../Routing/When_sending_a_base_command.cs | 108 -------- ...age_with_routing_configured_by_assembly.cs | 55 ---- ...message_with_routing_configured_by_type.cs | 45 --- ...ge_with_routing_configured_via_mappings.cs | 74 ----- .../When_using_custom_routing_strategy.cs | 138 ---------- .../Routing/When_using_instance_ids.cs | 86 ------ ..._to_a_message_sent_to_specific_instance.cs | 85 ------ ..._base_class_mapped_is_handled_by_a_saga.cs | 93 ------- ...When_a_base_class_message_starts_a_saga.cs | 90 ------ .../When_an_endpoint_replies_to_a_saga.cs | 120 -------- ...hen_auto_correlated_property_is_changed.cs | 78 ------ .../When_correlating_on_special_characters.cs | 91 ------ .../When_forgetting_to_set_a_corr_property.cs | 85 ------ ...essage_with_handler_and_timeout_handler.cs | 80 ------ .../Sagas/When_message_has_a_saga_id.cs | 111 -------- .../When_receiving_that_completes_the_saga.cs | 168 ------------ ...When_receiving_that_should_start_a_saga.cs | 74 ----- ...t_should_start_a_saga_with_interception.cs | 25 -- ...hould_start_a_saga_without_interception.cs | 25 -- ..._replies_to_message_published_by_a_saga.cs | 123 --------- ..._between_sagas_first_handler_responding.cs | 120 -------- ...tween_sagas_response_from_noninitiating.cs | 137 --------- ...hen_req_resp_between_sagas_with_timeout.cs | 131 --------- .../When_saga_exists_for_start_message.cs | 85 ------ .../When_saga_handles_unmapped_message.cs | 126 --------- .../When_saga_has_a_non_empty_constructor.cs | 94 ------- .../Sagas/When_saga_id_changed.cs | 75 ----- ...en_saga_is_mapped_to_complex_expression.cs | 97 ------- ...ga_message_goes_through_delayed_retries.cs | 112 -------- .../Sagas/When_saga_started_concurrently.cs | 153 ----------- .../Sagas/When_sagas_cant_be_found.cs | 212 -------------- .../When_sagas_share_timeout_messages.cs | 112 -------- .../Sagas/When_sending_from_a_saga_handle.cs | 114 -------- .../Sagas/When_sending_from_a_saga_timeout.cs | 112 -------- ...n_started_by_base_event_from_other_saga.cs | 109 -------- ...When_started_by_event_from_another_saga.cs | 167 ----------- .../Sagas/When_timeout_hit_not_found_saga.cs | 116 -------- ...n_two_sagas_subscribe_to_the_same_event.cs | 169 ------------ ..._updating_existing_correlation_property.cs | 87 ------ .../Sagas/When_using_ReplyToOriginator.cs | 102 ------- ...en_using_a_received_message_for_timeout.cs | 80 ------ .../Sagas/When_using_contain_saga_data.cs | 83 ------ .../Sagas/when_receiving_multiple_timeouts.cs | 160 ----------- .../when_reply_from_saga_not_found_handler.cs | 113 -------- .../Satellites/When_a_message_is_available.cs | 74 ----- ..._txmode_does_not_match_endpoints_txmode.cs | 70 ----- .../ScenarioDescriptors/EnvironmentHelper.cs | 19 -- .../ScenarioDescriptors/TypeScanner.cs | 40 --- .../When_scheduling_a_recurring_task.cs | 76 ----- .../When_running_saga_tests.cs | 74 ----- .../When_using_custom_components.cs | 70 ----- .../When_configuring_custom_xml_namespace.cs | 83 ------ .../Serialization/When_no_content_type.cs | 71 ----- ...terface_message_where_child_is_excluded.cs | 80 ------ ...en_registering_additional_deserializers.cs | 144 ---------- .../When_registering_custom_serializer.cs | 109 -------- ...registering_deserializers_with_settings.cs | 138 ---------- .../When_sanitizing_xml_messages.cs | 88 ------ .../When_serializing_a_message.cs | 83 ------ .../Serialization/When_skip_wrapping_xml.cs | 92 ------- .../When_wrapping_is_not_skipped.cs | 94 ------- ...l_serializer_used_with_unobtrusive_mode.cs | 82 ------ .../When_TimeToBeReceived_has_expired.cs | 73 ----- ...TimeToBeReceived_has_expired_convention.cs | 83 ------ .../When_TimeToBeReceived_has_not_expired.cs | 55 ---- ...ToBeReceived_used_with_unobtrusive_mode.cs | 120 -------- .../Timeout/CyclingOutageTimeoutPersister.cs | 113 -------- ...eout_storage_is_unavailable_temporarily.cs | 88 ------ .../Tx/FakePromotableResourceManager.cs | 49 ---- ...immediate_dispatch_using_scope_suppress.cs | 75 ----- ...g_immediate_dispatch_with_at_least_once.cs | 74 ----- ...ng_immediate_dispatch_with_at_most_once.cs | 70 ----- ...ng_immediate_dispatch_with_exactly_once.cs | 71 ----- .../When_sending_inside_ambient_tx.cs | 109 -------- .../NSB.AcceptanceTests/Tx/Issue_2481.cs | 60 ---- .../Tx/When_receiving_with_dtc_enabled.cs | 84 ------ ...ing_with_native_multi_queue_transaction.cs | 87 ------ ...hen_receiving_with_the_default_settings.cs | 56 ---- ...n_sending_within_an_ambient_transaction.cs | 133 --------- ...iple_versions_of_a_message_is_published.cs | 129 --------- src/AcceptanceTestsHolder/AssemblyInfo.cs | 4 - .../TestSuiteConstraints.cs | 23 -- src/AcceptanceTestsHolder/packages.config | 7 - src/NServiceBus.Persistence.Sql.sln | 9 +- 190 files changed, 1 insertion(+), 16885 deletions(-) delete mode 100644 src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_a_message_is_audited.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_a_replymessage_is_audited.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_audit_is_overridden_in_code.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_auditing.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_auditing_message_with_TimeToBeReceived.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointInMemoryPersistence.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningPersistence.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConventionEnforcementTests.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_replying_to_received_message_without_correlationid.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_sending_with_no_correlation_id.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_using_a_custom_correlation_id.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_sending_databus_properties.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_sending_databus_properties_with_unobtrusive.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_using_custom_IDataBus.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_Deferring_a_message.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_deferring_a_message_to_the_past.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_deferring_to_non_local.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DeterministicGuid.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ConfigureExtensions.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultPublisher.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultServer.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointConfigurationExtensions.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointCustomizationConfigurationExtensions.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/IConfigureEndpointTestExecution.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/Requires.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ServerWithNoDefaultPersistenceDefinitions.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/TestSuiteConstraints.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Forwarding/When_forwarding_is_configured_for_endpoint.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Forwarding/When_requesting_message_to_be_forwarded.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/MessageId/When_message_has_empty_id_header.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/MessageId/When_message_has_no_id_header.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_a_duplicate_message_arrives.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_a_message_is_audited.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_blowing_up_just_after_dispatch.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_dispatching_forwarded_messages.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_receiving_a_message.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_audited.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_faulted.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_sent.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_handling_current_message_later.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_sending_to_another_endpoint.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_cross_q_transactional_message_is_moved_to_error_queue.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_always_moves_to_error.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_does_single_delayed_retry_before_move_to_error.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_moves_to_overridden_error_queue.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_delayed_retries_with_immediate_retries_disabled.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_error_is_overridden_in_code.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_disabled.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_fail.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_with_dtc_on.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_with_native_transactions.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_fails_retries.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_is_deferred_by_delayed_retries_using_dtc.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_is_moved_to_error_queue_using_dtc.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_with_TimeToBeReceived_fails.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_non_transactional_message_is_moved_to_error_queue.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_receiveonly_message_is_moved_to_error_queue.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_transactions_off.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_transactionscope_message_is_moved_to_error_queue.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_extending_event_routing.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_multi_subscribing_to_a_polymorphic_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_publishing_from_sendonly.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_publishing_to_scaled_out_subscribers.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_base_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_base_event_with_a_route_for_a_derived_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_derived_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_event_with_routes_to_base_and_specific_events.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_multiple_publishers.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_scaled_out_publisher.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_unsubscribing_from_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_unsubscribing_to_scaled_out_publisher.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_assembly_level_message_mapping_for_pub_sub.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_autosubscribe_with_missing_routing_information.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_legacy_routing_configuration.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_multi_subscribing_to_a_polymorphic_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_from_sendonly.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_to_scaled_out_subscribers.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_subscribing_to_a_base_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_subscribing_to_a_derived_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_unsubscribing_from_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionBehavior.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionBehaviorExtensions.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionEventArgs.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_base_event_from_2_publishers.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_configure_routes_for_unobtrusive_messages.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_extending_command_routing.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_multiple_mappings_exists.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_overriding_local_address.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_event_implementing_two_unrelated_interfaces.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_interface.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_interface_with_unobtrusive.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_using_root_type.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_with_only_local_messagehandlers.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_with_overridden_local_address.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_registering_publishers_unobtrusive_messages_code.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_registering_publishers_unobtrusive_messages_config.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_replying_to_message.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_replying_to_message_with_interface_and_unobtrusive.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_any_instance.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_specific_address.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_specific_instance.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_a_base_command.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_by_assembly.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_by_type.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_via_mappings.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_custom_routing_strategy.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_instance_ids.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/when_replying_to_a_message_sent_to_specific_instance.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_a_base_class_mapped_is_handled_by_a_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_a_base_class_message_starts_a_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_an_endpoint_replies_to_a_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_auto_correlated_property_is_changed.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlating_on_special_characters.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_forgetting_to_set_a_corr_property.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_handling_message_with_handler_and_timeout_handler.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_message_has_a_saga_id.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_completes_the_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga_with_interception.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga_without_interception.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replies_to_message_published_by_a_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_first_handler_responding.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_response_from_noninitiating.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_with_timeout.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_exists_for_start_message.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_handles_unmapped_message.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_has_a_non_empty_constructor.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_id_changed.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_is_mapped_to_complex_expression.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_message_goes_through_delayed_retries.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_started_concurrently.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sagas_cant_be_found.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sagas_share_timeout_messages.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sending_from_a_saga_handle.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sending_from_a_saga_timeout.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_started_by_base_event_from_other_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_started_by_event_from_another_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_timeout_hit_not_found_saga.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_two_sagas_subscribe_to_the_same_event.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_updating_existing_correlation_property.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_ReplyToOriginator.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_a_received_message_for_timeout.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_contain_saga_data.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_receiving_multiple_timeouts.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_reply_from_saga_not_found_handler.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Satellites/When_a_message_is_available.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Satellites/When_satellite_txmode_does_not_match_endpoints_txmode.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ScenarioDescriptors/EnvironmentHelper.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ScenarioDescriptors/TypeScanner.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Scheduling/When_scheduling_a_recurring_task.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/SelfVerification/When_running_saga_tests.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/SelfVerification/When_using_custom_components.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_configuring_custom_xml_namespace.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_no_content_type.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_receiving_interface_message_where_child_is_excluded.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_additional_deserializers.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_custom_serializer.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_deserializers_with_settings.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_sanitizing_xml_messages.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_serializing_a_message.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_skip_wrapping_xml.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_wrapping_is_not_skipped.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_xml_serializer_used_with_unobtrusive_mode.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_expired.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_expired_convention.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_not_expired.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_used_with_unobtrusive_mode.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Timeout/CyclingOutageTimeoutPersister.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Timeout/When_timeout_storage_is_unavailable_temporarily.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/FakePromotableResourceManager.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_using_scope_suppress.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_at_least_once.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_at_most_once.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_exactly_once.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_sending_inside_ambient_tx.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/Issue_2481.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_dtc_enabled.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_native_multi_queue_transaction.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_the_default_settings.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_sending_within_an_ambient_transaction.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Versioning/When_multiple_versions_of_a_message_is_published.cs delete mode 100644 src/AcceptanceTestsHolder/AssemblyInfo.cs delete mode 100644 src/AcceptanceTestsHolder/TestSuiteConstraints.cs delete mode 100644 src/AcceptanceTestsHolder/packages.config diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj deleted file mode 100644 index c1ca597fd..000000000 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ /dev/null @@ -1,259 +0,0 @@ - - - - - Debug - AnyCPU - {8B2246AB-4FAA-481D-AC1B-0A3F24E48CC8} - Library - Properties - AcceptanceTestsHolder - AcceptanceTestsHolder - v4.5.2 - 512 - - - - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - - - pdbonly - true - bin\Release\ - TRACE - prompt - - - - ..\packages\NServiceBus.AcceptanceTesting.6.4.2\lib\net452\NServiceBus.AcceptanceTesting.dll - - - ..\packages\NServiceBus.6.4.2\lib\net452\NServiceBus.Core.dll - - - ..\packages\NUnit.3.7.1\lib\net45\nunit.framework.dll - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Designer - - - - - {e3cf4cb1-9f87-4f81-b6b0-b599035c1bce} - SqlPersistence - - - - - \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_a_message_is_audited.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_a_message_is_audited.cs deleted file mode 100644 index f5a1f2117..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_a_message_is_audited.cs +++ /dev/null @@ -1,134 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Audit -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using MessageMutator; - using NUnit.Framework; - - public class When_a_message_is_audited : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_preserve_the_original_body() - { - var context = await Scenario.Define(c => { c.RunId = Guid.NewGuid(); }) - .WithEndpoint(b => b.When((session, c) => session.SendLocal(new MessageToBeAudited - { - RunId = c.RunId - }))) - .WithEndpoint() - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(context.OriginalBodyChecksum, context.AuditChecksum, "The body of the message sent to audit should be the same as the original message coming off the queue"); - } - - public static byte Checksum(byte[] data) - { - var longSum = data.Sum(x => (long) x); - return unchecked((byte) longSum); - } - - public class Context : ScenarioContext - { - public Guid RunId { get; set; } - public bool Done { get; set; } - public byte OriginalBodyChecksum { get; set; } - public byte AuditChecksum { get; set; } - } - - public class EndpointWithAuditOn : EndpointConfigurationBuilder - { - public EndpointWithAuditOn() - { - EndpointSetup(c => c - .AuditProcessedMessagesTo()); - } - - class BodyMutator : IMutateIncomingTransportMessages, INeedInitialization - { - public Context Context { get; set; } - - public Task MutateIncoming(MutateIncomingTransportMessageContext context) - { - var originalBody = context.Body; - - Context.OriginalBodyChecksum = Checksum(originalBody); - - // modifying the body by adding a line break - var modifiedBody = new byte[originalBody.Length + 1]; - - Buffer.BlockCopy(originalBody, 0, modifiedBody, 0, originalBody.Length); - - modifiedBody[modifiedBody.Length - 1] = 13; - - context.Body = modifiedBody; - return Task.FromResult(0); - } - - public void Customize(EndpointConfiguration configuration) - { - configuration.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); - } - } - - public class MessageToBeAuditedHandler : IHandleMessages - { - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - class AuditSpyEndpoint : EndpointConfigurationBuilder - { - public AuditSpyEndpoint() - { - EndpointSetup(); - } - - class BodySpy : IMutateIncomingTransportMessages, INeedInitialization - { - public Context Context { get; set; } - - public Task MutateIncoming(MutateIncomingTransportMessageContext transportMessage) - { - Context.AuditChecksum = Checksum(transportMessage.Body); - return Task.FromResult(0); - } - - public void Customize(EndpointConfiguration configuration) - { - configuration.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); - } - } - - public class MessageToBeAuditedHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - if (message.RunId != TestContext.RunId) - { - return Task.FromResult(0); - } - - TestContext.Done = true; - - return Task.FromResult(0); - } - } - } - - - public class MessageToBeAudited : IMessage - { - public Guid RunId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_a_replymessage_is_audited.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_a_replymessage_is_audited.cs deleted file mode 100644 index f5acc70a3..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_a_replymessage_is_audited.cs +++ /dev/null @@ -1,125 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Audit -{ - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using MessageMutator; - using NUnit.Framework; - using AcceptanceTesting.Customization; - - public class When_a_replymessage_is_audited : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_audit_the_message() - { - var context = await Scenario.Define() - .WithEndpoint() - .WithEndpoint(b => b.When(session => session.Send(new Request()))) - .WithEndpoint() - .Done(c => c.MessageAudited) - .Run(); - - Assert.True(context.MessageProcessed); - Assert.True(context.MessageAudited); - } - - public static byte Checksum(byte[] data) - { - var longSum = data.Sum(x => (long) x); - return unchecked((byte) longSum); - } - - public class Context : ScenarioContext - { - public bool MessageAudited { get; set; } - public bool MessageProcessed { get; set; } - } - - public class Server : EndpointConfigurationBuilder - { - public Server() - { - EndpointSetup(); - } - - class RequestHandler : IHandleMessages - { - public Task Handle(Request message, IMessageHandlerContext context) - { - var replyOptions = new ReplyOptions(); - - replyOptions.SetHeader("MyHeader", "SomeValue"); - - return context.Reply(new ResponseToBeAudited(), replyOptions); - } - } - } - - public class EndpointWithAuditOn : EndpointConfigurationBuilder - { - public EndpointWithAuditOn() - { - EndpointSetup(c => - { - c.DisableFeature(); - c.AuditProcessedMessagesTo(); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(Request), typeof(Server)); - }); - } - - public class MessageToBeAuditedHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(ResponseToBeAudited message, IMessageHandlerContext context) - { - Assert.AreEqual(context.MessageHeaders["MyHeader"], "SomeValue"); - TestContext.MessageProcessed = true; - return Task.FromResult(0); - } - } - } - - class AuditSpyEndpoint : EndpointConfigurationBuilder - { - public AuditSpyEndpoint() - { - EndpointSetup(); - } - - class BodySpy : IMutateIncomingTransportMessages, INeedInitialization - { - public Context Context { get; set; } - - public Task MutateIncoming(MutateIncomingTransportMessageContext transportMessage) - { - Context.MessageAudited = true; - return Task.FromResult(0); - } - - public void Customize(EndpointConfiguration configuration) - { - configuration.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); - } - } - - public class MessageToBeAuditedHandler : IHandleMessages - { - public Task Handle(ResponseToBeAudited message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - public class ResponseToBeAudited : IMessage - { - } - - public class Request : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_audit_is_overridden_in_code.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_audit_is_overridden_in_code.cs deleted file mode 100644 index 1e7a3dbf6..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_audit_is_overridden_in_code.cs +++ /dev/null @@ -1,68 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Audit -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_audit_is_overridden_in_code : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_audit_to_target_queue() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MessageToBeAudited()))) - .WithEndpoint() - .Done(c => c.MessageAudited) - .Run(); - - Assert.True(context.MessageAudited); - } - - public class UserEndpoint : EndpointConfigurationBuilder - { - public UserEndpoint() - { - EndpointSetup(c => c.AuditProcessedMessagesTo("audit_with_code_target")); - } - - class Handler : IHandleMessages - { - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - public class AuditSpy : EndpointConfigurationBuilder - { - public AuditSpy() - { - EndpointSetup() - .CustomEndpointName("audit_with_code_target"); - } - - class AuditMessageHandler : IHandleMessages - { - public Context MyContext { get; set; } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - MyContext.MessageAudited = true; - return Task.FromResult(0); - } - } - } - - public class Context : ScenarioContext - { - public bool MessageAudited { get; set; } - } - - - public class MessageToBeAudited : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_auditing.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_auditing.cs deleted file mode 100644 index 73960b7af..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_auditing.cs +++ /dev/null @@ -1,111 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Audit -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_auditing : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_be_forwarded_to_auditQueue_when_auditing_is_disabled() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MessageToBeAudited()))) - .WithEndpoint() - .Done(c => c.IsMessageHandlingComplete) - .Run(); - - Assert.IsFalse(context.IsMessageHandledByTheAuditEndpoint); - } - - [Test] - public async Task Should_be_forwarded_to_auditQueue_when_auditing_is_enabled() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MessageToBeAudited()))) - .WithEndpoint() - .Done(c => c.IsMessageHandlingComplete && c.IsMessageHandledByTheAuditEndpoint) - .Run(); - - Assert.IsTrue(context.IsMessageHandledByTheAuditEndpoint); - } - - public class Context : ScenarioContext - { - public bool IsMessageHandlingComplete { get; set; } - public bool IsMessageHandledByTheAuditEndpoint { get; set; } - } - - public class EndpointWithAuditOff : EndpointConfigurationBuilder - { - public EndpointWithAuditOff() - { - // Although the AuditProcessedMessagesTo seems strange here, this test tries to fake the scenario where - // even though the user has specified audit config, because auditing is explicitly turned - // off, no messages should be audited. - EndpointSetup(c => - { - c.DisableFeature(); - c.AuditProcessedMessagesTo(); - }); - } - - class MessageToBeAuditedHandler : IHandleMessages - { - public Context MyContext { get; set; } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - MyContext.IsMessageHandlingComplete = true; - return Task.FromResult(0); - } - } - } - - public class EndpointWithAuditOn : EndpointConfigurationBuilder - { - public EndpointWithAuditOn() - { - EndpointSetup(c => c.AuditProcessedMessagesTo()); - } - - class MessageToBeAuditedHandler : IHandleMessages - { - public Context MyContext { get; set; } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - MyContext.IsMessageHandlingComplete = true; - return Task.FromResult(0); - } - } - } - - public class EndpointThatHandlesAuditMessages : EndpointConfigurationBuilder - { - public EndpointThatHandlesAuditMessages() - { - EndpointSetup(); - } - - class AuditMessageHandler : IHandleMessages - { - public Context MyContext { get; set; } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - MyContext.IsMessageHandledByTheAuditEndpoint = true; - return Task.FromResult(0); - } - } - } - - - public class MessageToBeAudited : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_auditing_message_with_TimeToBeReceived.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_auditing_message_with_TimeToBeReceived.cs deleted file mode 100644 index 6fd8ba231..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Audit/When_auditing_message_with_TimeToBeReceived.cs +++ /dev/null @@ -1,102 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Audit -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_auditing_message_with_TimeToBeReceived : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_honor_TimeToBeReceived_for_audit_message() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MessageToBeAudited()))) - .WithEndpoint() - .Done(c => c.IsMessageHandlingComplete && c.TTBRHasExpiredAndMessageIsStillInAuditQueue) - .Run(); - - Assert.IsTrue(context.IsMessageHandlingComplete); - } - - class Context : ScenarioContext - { - public bool IsMessageHandlingComplete { get; set; } - public DateTime? FirstTimeProcessedByAudit { get; set; } - public bool TTBRHasExpiredAndMessageIsStillInAuditQueue { get; set; } - } - - class EndpointWithAuditOn : EndpointConfigurationBuilder - { - public EndpointWithAuditOn() - { - EndpointSetup(c => c.AuditProcessedMessagesTo()); - } - - class MessageToBeAuditedHandler : IHandleMessages - { - public MessageToBeAuditedHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - testContext.IsMessageHandlingComplete = true; - return Task.FromResult(0); - } - - Context testContext; - } - } - - class EndpointThatHandlesAuditMessages : EndpointConfigurationBuilder - { - public EndpointThatHandlesAuditMessages() - { - EndpointSetup(); - } - - class AuditMessageHandler : IHandleMessages - { - public AuditMessageHandler(Context textContext) - { - this.textContext = textContext; - } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - var auditProcessingStarted = DateTime.Now; - if (textContext.FirstTimeProcessedByAudit == null) - { - textContext.FirstTimeProcessedByAudit = auditProcessingStarted; - } - - var ttbr = TimeSpan.Parse(context.MessageHeaders[Headers.TimeToBeReceived]); - var ttbrExpired = auditProcessingStarted > textContext.FirstTimeProcessedByAudit.Value + ttbr; - if (ttbrExpired) - { - textContext.TTBRHasExpiredAndMessageIsStillInAuditQueue = true; - var timeElapsedSinceFirstHandlingOfAuditMessage = auditProcessingStarted - textContext.FirstTimeProcessedByAudit.Value; - Console.WriteLine("Audit message not removed because of TTBR({0}) after {1}. Succeeded.", ttbr, timeElapsedSinceFirstHandlingOfAuditMessage); - } - else - { - return context.HandleCurrentMessageLater(); - } - - return Task.FromResult(0); - } - - Context textContext; - } - } - - [TimeToBeReceived("00:00:03")] - public class MessageToBeAudited : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointInMemoryPersistence.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointInMemoryPersistence.cs deleted file mode 100644 index 53978e8e3..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointInMemoryPersistence.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.AcceptanceTesting.Support; - -public class ConfigureEndpointInMemoryPersistence : IConfigureEndpointTestExecution -{ - public Task Configure(string endpointName, EndpointConfiguration configuration, RunSettings settings, PublisherMetadata publisherMetadata) - { - configuration.UsePersistence(); - return Task.FromResult(0); - } - - public Task Cleanup() - { - // Nothing required for in-memory persistence - return Task.FromResult(0); - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningPersistence.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningPersistence.cs deleted file mode 100644 index 0e40ae4a9..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningPersistence.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.IO; -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.AcceptanceTesting.Support; -using NServiceBus.Persistence; - -public class ConfigureEndpointLearningPersistence : IConfigureEndpointTestExecution -{ - public Task Configure(string endpointName, EndpointConfiguration configuration, RunSettings settings, PublisherMetadata publisherMetadata) - { - //can't use bindir since that will be to long on the build agents - storageDir = Path.Combine(@"c:\temp", Guid.NewGuid().ToString("N")); - - configuration.UsePersistence(); - configuration.UsePersistence(); - - configuration.UsePersistence() - .SagaStorageDirectory(storageDir); - - return Task.FromResult(0); - } - - public Task Cleanup() - { - if (Directory.Exists(storageDir)) - { - Directory.Delete(storageDir, true); - } - return Task.FromResult(0); - } - - string storageDir; -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs deleted file mode 100644 index f25f722f3..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.IO; -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.AcceptanceTesting.Support; -using NServiceBus.Transport; - -public class ConfigureEndpointLearningTransport : IConfigureEndpointTestExecution -{ - public Task Cleanup() - { - if (Directory.Exists(storageDir)) - { - Directory.Delete(storageDir, true); - } - - return Task.FromResult(0); - } - - public Task Configure(string endpointName, EndpointConfiguration configuration, RunSettings settings, PublisherMetadata publisherMetadata) - { - storageDir = Path.Combine(@"c:\temp", "att_tests"); //can't use bindir since that will be to long on the build agents - - //we want the tests to be exposed to concurrency - configuration.LimitMessageProcessingConcurrencyTo(PushRuntimeSettings.Default.MaxConcurrency); - - configuration.UseTransport() - .StorageDirectory(storageDir); - - return Task.FromResult(0); - } - - string storageDir; -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs deleted file mode 100644 index 79199b7c7..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Messaging; -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.AcceptanceTesting.Support; -using NServiceBus.AcceptanceTests.ScenarioDescriptors; -using NServiceBus.Configuration.AdvanceExtensibility; -using NServiceBus.Transport; - -public class ConfigureEndpointMsmqTransport : IConfigureEndpointTestExecution -{ - const string DefaultConnectionString = "cacheSendConnection=false;journal=false;"; - - public Task Configure(string endpointName, EndpointConfiguration configuration, RunSettings settings, PublisherMetadata publisherMetadata) - { - queueBindings = configuration.GetSettings().Get(); - var connectionString = - EnvironmentHelper.GetEnvironmentVariable($"{nameof(MsmqTransport)}.ConnectionString") - ?? DefaultConnectionString; - var transportConfig = configuration.UseTransport(); - - transportConfig.ConnectionString(connectionString); - - var routingConfig = transportConfig.Routing(); - - foreach (var publisher in publisherMetadata.Publishers) - { - foreach (var eventType in publisher.Events) - { - routingConfig.RegisterPublisher(eventType, publisher.PublisherName); - } - } - - return Task.FromResult(0); - } - - public Task Cleanup() - { - var allQueues = MessageQueue.GetPrivateQueuesByMachine("localhost"); - var queuesToBeDeleted = new List(); - - foreach (var messageQueue in allQueues) - { - using (messageQueue) - { - if (queueBindings.ReceivingAddresses.Any(ra => - { - var indexOfAt = ra.IndexOf("@", StringComparison.Ordinal); - if (indexOfAt >= 0) - { - ra = ra.Substring(0, indexOfAt); - } - return messageQueue.QueueName.StartsWith(@"private$\" + ra, StringComparison.OrdinalIgnoreCase); - })) - { - queuesToBeDeleted.Add(messageQueue.Path); - } - } - } - - foreach (var queuePath in queuesToBeDeleted) - { - try - { - MessageQueue.Delete(queuePath); - Console.WriteLine("Deleted '{0}' queue", queuePath); - } - catch (Exception) - { - Console.WriteLine("Could not delete queue '{0}'", queuePath); - } - } - - MessageQueue.ClearConnectionCache(); - - return Task.FromResult(0); - } - - QueueBindings queueBindings; -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConventionEnforcementTests.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConventionEnforcementTests.cs deleted file mode 100644 index ea28ad893..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConventionEnforcementTests.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace NServiceBus.AcceptanceTests -{ - using System; - using System.Linq; - using System.Reflection; - using NUnit.Framework; - - [TestFixture] - public class ConventionEnforcementTests : NServiceBusAcceptanceTest - { - [Test] - public void Ensure_all_tests_derive_from_a_common_base_class() - { - var testTypes = Assembly.GetExecutingAssembly().GetTypes() - .Where(HasTestMethod); - - var missingBaseClass = testTypes - .Where(t => t.BaseType == null || !typeof(NServiceBusAcceptanceTest).IsAssignableFrom(t)) - .ToList(); - - CollectionAssert.IsEmpty(missingBaseClass, string.Join(",", missingBaseClass)); - } - - [Test] - public void Ensure_all_messages_are_public() - { - var testTypes = Assembly.GetExecutingAssembly().GetTypes(); - - var missingBaseClass = testTypes - .Where(t => !t.IsPublic && !t.IsNestedPublic) - .Where(t => - typeof(ICommand).IsAssignableFrom(t) || - typeof(IMessage).IsAssignableFrom(t) || - typeof(IEvent).IsAssignableFrom(t) - ) - .ToList(); - - CollectionAssert.IsEmpty(missingBaseClass, string.Join(",", missingBaseClass)); - } - - [Test] - public void Ensure_all_sagadatas_are_public() - { - var testTypes = Assembly.GetExecutingAssembly().GetTypes(); - - var sagaDatas = testTypes - .Where(t => !t.IsPublic && !t.IsNestedPublic) - .Where(t => typeof(IContainSagaData).IsAssignableFrom(t)) - .ToList(); - - CollectionAssert.IsEmpty(sagaDatas, string.Join(",", sagaDatas)); - } - - static bool HasTestMethod(Type t) - { - return t.GetMethods().Any(m => m.GetCustomAttributes().Any()); - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_replying_to_received_message_without_correlationid.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_replying_to_received_message_without_correlationid.cs deleted file mode 100644 index 20649ee71..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_replying_to_received_message_without_correlationid.cs +++ /dev/null @@ -1,92 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Correlation -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using MessageMutator; - using NUnit.Framework; - - public class When_replying_to_received_message_without_correlationid : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_use_the_incoming_message_id_as_the_correlation_id() - { - const string mycustomid = "mycustomid"; - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => - { - var sendOptions = new SendOptions(); - sendOptions.RouteToThisEndpoint(); - sendOptions.SetMessageId(mycustomid); - return session.Send(new MyRequest(), sendOptions); - })) - .Done(c => c.GotResponse) - .Run(); - - Assert.AreEqual(mycustomid, context.CorrelationIdReceived, "Correlation id should match MessageId"); - } - - public class Context : ScenarioContext - { - public bool GotResponse { get; set; } - public string CorrelationIdReceived { get; set; } - } - - public class CorrelationEndpoint : EndpointConfigurationBuilder - { - public CorrelationEndpoint() - { - EndpointSetup(c => c.RegisterComponents( - components => { components.ConfigureComponent(DependencyLifecycle.InstancePerCall); })); - } - - public class MyRequestHandler : IHandleMessages - { - public Task Handle(MyRequest message, IMessageHandlerContext context) - { - return context.Reply(new MyResponse()); - } - } - - public class MyResponseHandler : IHandleMessages - { - public MyResponseHandler(Context context) - { - this.context = context; - } - - public Task Handle(MyResponse message, IMessageHandlerContext c) - { - context.CorrelationIdReceived = c.MessageHeaders[Headers.CorrelationId]; - context.GotResponse = true; - - return Task.FromResult(0); - } - - readonly Context context; - } - - class RemoveCorrelationId : IMutateIncomingTransportMessages - { - public Task MutateIncoming(MutateIncomingTransportMessageContext context) - { - if (context.Headers[Headers.MessageIntent] != MessageIntentEnum.Reply.ToString()) - { - context.Headers.Remove(Headers.CorrelationId); - } - - return Task.FromResult(0); - } - } - } - - public class MyRequest : IMessage - { - } - - public class MyResponse : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_sending_with_no_correlation_id.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_sending_with_no_correlation_id.cs deleted file mode 100644 index 4a11ea168..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_sending_with_no_correlation_id.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Correlation -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_sending_with_no_correlation_id : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_use_the_message_id_as_the_correlation_id() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MyRequest()))) - .Done(c => c.GotRequest) - .Run(); - - Assert.AreEqual(context.MessageIdReceived, context.CorrelationIdReceived, "Correlation id should match MessageId"); - } - - public class Context : ScenarioContext - { - public string MessageIdReceived { get; set; } - public bool GotRequest { get; set; } - public string CorrelationIdReceived { get; set; } - } - - public class CorrelationEndpoint : EndpointConfigurationBuilder - { - public CorrelationEndpoint() - { - EndpointSetup(); - } - - public class MyResponseHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MyRequest message, IMessageHandlerContext context) - { - TestContext.CorrelationIdReceived = context.MessageHeaders[Headers.CorrelationId]; - TestContext.MessageIdReceived = context.MessageId; - TestContext.GotRequest = true; - - return Task.FromResult(0); - } - } - } - - - public class MyRequest : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_using_a_custom_correlation_id.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_using_a_custom_correlation_id.cs deleted file mode 100644 index 4572dfe72..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_using_a_custom_correlation_id.cs +++ /dev/null @@ -1,69 +0,0 @@ - -namespace NServiceBus.AcceptanceTests.Correlation -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_using_a_custom_correlation_id : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_use_the_given_id_as_the_transport_level_correlation_id() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => - { - var options = new SendOptions(); - -#pragma warning disable 618 - options.SetCorrelationId(CorrelationId); -#pragma warning restore 618 - - options.RouteToThisEndpoint(); - - return session.Send(new MessageWithCustomCorrelationId(), options); - })) - .Done(c => c.GotRequest) - .Run(); - - Assert.AreEqual(CorrelationId, context.CorrelationIdReceived, "Correlation ids should match"); - } - - static string CorrelationId = "my_custom_correlation_id"; - - public class Context : ScenarioContext - { - public bool GotRequest { get; set; } - - public string CorrelationIdReceived { get; set; } - } - - public class CorrelationEndpoint : EndpointConfigurationBuilder - { - public CorrelationEndpoint() - { - EndpointSetup(); - } - - public class SendMessageWithCorrelationHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageWithCustomCorrelationId message, IMessageHandlerContext context) - { - TestContext.CorrelationIdReceived = context.MessageHeaders[Headers.CorrelationId]; - - TestContext.GotRequest = true; - - return Task.FromResult(0); - } - } - } - - - public class MessageWithCustomCorrelationId : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_sending_databus_properties.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_sending_databus_properties.cs deleted file mode 100644 index e3ed5b22b..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_sending_databus_properties.cs +++ /dev/null @@ -1,96 +0,0 @@ -namespace NServiceBus.AcceptanceTests.DataBus -{ - using System; - using System.IO; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using MessageMutator; - using NUnit.Framework; - - public class When_sending_databus_properties : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_receive_messages_with_largepayload_correctly() - { - var payloadToSend = new byte[PayloadSize]; - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.Send(new MyMessageWithLargePayload - { - Payload = new DataBusProperty(payloadToSend) - }))) - .WithEndpoint() - .Done(c => c.ReceivedPayload != null) - .Run(); - - Assert.AreEqual(payloadToSend, context.ReceivedPayload, "The large payload should be marshalled correctly using the databus"); - } - - const int PayloadSize = 100; - - public class Context : ScenarioContext - { - public byte[] ReceivedPayload { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(builder => - { - var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"databus\sender"); - builder.UseDataBus().BasePath(basePath); - builder.UseSerialization(); - - builder.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessageWithLargePayload), typeof(Receiver)); - }); - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(builder => - { - var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"databus\sender"); - builder.UseDataBus().BasePath(basePath); - builder.UseSerialization(); - builder.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); - }); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessageWithLargePayload messageWithLargePayload, IMessageHandlerContext context) - { - Context.ReceivedPayload = messageWithLargePayload.Payload.Value; - - return Task.FromResult(0); - } - } - - public class Mutator : IMutateIncomingTransportMessages - { - public Task MutateIncoming(MutateIncomingTransportMessageContext context) - { - if (context.Body.Length > PayloadSize) - { - throw new Exception(); - } - return Task.FromResult(0); - } - } - } - - public class MyMessageWithLargePayload : ICommand - { - public DataBusProperty Payload { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_sending_databus_properties_with_unobtrusive.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_sending_databus_properties_with_unobtrusive.cs deleted file mode 100644 index 6ac7d839b..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_sending_databus_properties_with_unobtrusive.cs +++ /dev/null @@ -1,89 +0,0 @@ -namespace NServiceBus.AcceptanceTests.DataBus -{ - using System.IO; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_sending_databus_properties_with_unobtrusive : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_receive_messages_with_largepayload_correctly() - { - var payloadToSend = new byte[PayloadSize]; - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.Send(new MyMessageWithLargePayload - { - Payload = payloadToSend - }))) - .WithEndpoint() - .Done(c => c.ReceivedPayload != null) - .Run(); - - Assert.AreEqual(payloadToSend, context.ReceivedPayload, "The large payload should be marshalled correctly using the databus"); - } - - const int PayloadSize = 100; - - public class Context : ScenarioContext - { - public byte[] ReceivedPayload { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(builder => - { - builder.Conventions() - .DefiningCommandsAs(t => t.Namespace != null && t.FullName == typeof(MyMessageWithLargePayload).FullName) - .DefiningDataBusPropertiesAs(t => t.Name.Contains("Payload")); - - var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"databus\sender"); - builder.UseDataBus().BasePath(basePath); - builder.UseSerialization(); - - builder.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessageWithLargePayload), typeof(Receiver)); - }).ExcludeType(); // remove that type from assembly scanning to simulate what would happen with true unobtrusive mode - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(builder => - { - builder.Conventions() - .DefiningCommandsAs(t => t.Namespace != null && t.FullName == typeof(MyMessageWithLargePayload).FullName) - .DefiningDataBusPropertiesAs(t => t.Name.Contains("Payload")); - - var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"databus\sender"); - builder.UseDataBus().BasePath(basePath); - builder.UseSerialization(); - }); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessageWithLargePayload messageWithLargePayload, IMessageHandlerContext context) - { - Context.ReceivedPayload = messageWithLargePayload.Payload; - - return Task.FromResult(0); - } - } - } - - public class MyMessageWithLargePayload - { - public byte[] Payload { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_using_custom_IDataBus.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_using_custom_IDataBus.cs deleted file mode 100644 index a97f1b937..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DataBus/When_using_custom_IDataBus.cs +++ /dev/null @@ -1,100 +0,0 @@ -namespace NServiceBus.AcceptanceTests.DataBus -{ - using System; - using System.IO; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.DataBus; - using NUnit.Framework; - - public class When_using_custom_IDataBus : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_be_able_to_register_via_fluent() - { - var context = await Scenario.Define(c => { c.TempPath = Path.GetTempFileName(); }) - .WithEndpoint(b => b.When(session => session.Send(new MyMessageWithLargePayload - { - Payload = new DataBusProperty(PayloadToSend) - }))) - .WithEndpoint() - .Done(c => c.ReceivedPayload != null) - .Run(); - - Assert.AreEqual(PayloadToSend, context.ReceivedPayload, "The large payload should be marshalled correctly using the databus"); - } - - static byte[] PayloadToSend = new byte[1024*10]; - - public class Context : ScenarioContext - { - public string TempPath { get; set; } - public byte[] ReceivedPayload { get; set; } - } - - public class SenderViaFluent : EndpointConfigurationBuilder - { - public SenderViaFluent() - { - EndpointSetup(b => - { - b.UseDataBus(typeof(MyDataBus)); - b.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessageWithLargePayload), typeof(ReceiverViaFluent)); - }); - } - } - - public class ReceiverViaFluent : EndpointConfigurationBuilder - { - public ReceiverViaFluent() - { - EndpointSetup(b => b.UseDataBus(typeof(MyDataBus))); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessageWithLargePayload messageWithLargePayload, IMessageHandlerContext context) - { - Context.ReceivedPayload = messageWithLargePayload.Payload.Value; - - return Task.FromResult(0); - } - } - } - - public class MyDataBus : IDataBus - { - public Context Context { get; set; } - - public Task Get(string key) - { - var fileStream = new FileStream(Context.TempPath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true); - return Task.FromResult((Stream) fileStream); - } - - public Task Put(Stream stream, TimeSpan timeToBeReceived) - { - using (var destination = File.OpenWrite(Context.TempPath)) - { - stream.CopyTo(destination); - } - return Task.FromResult("key"); - } - - public Task Start() - { - return Task.FromResult(0); - } - } - - - public class MyMessageWithLargePayload : ICommand - { - public DataBusProperty Payload { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_Deferring_a_message.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_Deferring_a_message.cs deleted file mode 100644 index ee42f3900..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_Deferring_a_message.cs +++ /dev/null @@ -1,66 +0,0 @@ -namespace NServiceBus.AcceptanceTests.DelayedDelivery -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public partial class When_deferring_a_message : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_delay_delivery() - { - var delay = TimeSpan.FromSeconds(2); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => - { - var options = new SendOptions(); - - options.DelayDeliveryWith(delay); - options.RouteToThisEndpoint(); - - c.SentAt = DateTime.UtcNow; - - return session.Send(new MyMessage(), options); - })) - .Done(c => c.WasCalled) - .Run(); - - Assert.GreaterOrEqual(context.ReceivedAt - context.SentAt, delay); - } - - public class Context : ScenarioContext - { - public bool WasCalled { get; set; } - public DateTime SentAt { get; set; } - public DateTime ReceivedAt { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - Context.ReceivedAt = DateTime.UtcNow; - Context.WasCalled = true; - return Task.FromResult(0); - } - } - } - - public class MyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_deferring_a_message_to_the_past.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_deferring_a_message_to_the_past.cs deleted file mode 100644 index 0273296a1..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_deferring_a_message_to_the_past.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace NServiceBus.AcceptanceTests.DelayedDelivery -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_deferring_a_message_to_the_past : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_deliver_message() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((bus, c) => - { - var options = new SendOptions(); - - options.DoNotDeliverBefore(DateTime.Now.AddHours(-1)); - options.RouteToThisEndpoint(); - - return bus.Send(new MyMessage(), options); - })) - .Done(c => c.MessageReceived) - .Run(); - - Assert.IsTrue(context.MessageReceived); - } - - public class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - Context.MessageReceived = true; - return Task.FromResult(0); - } - } - } - - public class MyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_deferring_to_non_local.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_deferring_to_non_local.cs deleted file mode 100644 index dbf1056d7..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_deferring_to_non_local.cs +++ /dev/null @@ -1,79 +0,0 @@ -namespace NServiceBus.AcceptanceTests.DelayedDelivery -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_deferring_to_non_local : NServiceBusAcceptanceTest - { - [Test] - public async Task Message_should_be_received() - { - var delay = TimeSpan.FromSeconds(2); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => - { - var options = new SendOptions(); - - options.DelayDeliveryWith(delay); - - c.SentAt = DateTime.UtcNow; - - return session.Send(new MyMessage(), options); - })) - .WithEndpoint() - .Done(c => c.WasCalled) - .Run(); - - Assert.GreaterOrEqual(context.ReceivedAt - context.SentAt, delay); - } - - public class Context : ScenarioContext - { - public bool WasCalled { get; set; } - public DateTime SentAt { get; set; } - public DateTime ReceivedAt { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => - { - config.EnableFeature(); - config.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessage), typeof(Receiver)); - }); - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - Context.ReceivedAt = DateTime.UtcNow; - Context.WasCalled = true; - return Task.FromResult(0); - } - } - } - - public class MyMessage : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DeterministicGuid.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DeterministicGuid.cs deleted file mode 100644 index 97248bb16..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DeterministicGuid.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace NServiceBus.Utils -{ - using System; - using System.Security.Cryptography; - using System.Text; - - static class DeterministicGuid - { - public static Guid Create(params object[] data) - { - // use MD5 hash to get a 16-byte hash of the string - using (var provider = new MD5CryptoServiceProvider()) - { - var inputBytes = Encoding.Default.GetBytes(string.Concat(data)); - var hashBytes = provider.ComputeHash(inputBytes); - // generate a guid from the hash: - return new Guid(hashBytes); - } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ConfigureExtensions.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ConfigureExtensions.cs deleted file mode 100644 index 4b3f0780f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ConfigureExtensions.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace NServiceBus.AcceptanceTests.EndpointTemplates -{ - using System.Threading.Tasks; - using AcceptanceTesting.Support; - using ObjectBuilder; - - public static class ConfigureExtensions - { - public static async Task DefineTransport(this EndpointConfiguration config, RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointCustomizationConfiguration) - { - var transportConfiguration = TestSuiteConstraints.Current.CreateTransportConfiguration(); - await transportConfiguration.Configure(endpointCustomizationConfiguration.EndpointName, config, runDescriptor.Settings, endpointCustomizationConfiguration.PublisherMetadata); - runDescriptor.OnTestCompleted(_ => transportConfiguration.Cleanup()); - } - - public static async Task DefinePersistence(this EndpointConfiguration config, RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointCustomizationConfiguration) - { - var persistenceConfiguration = TestSuiteConstraints.Current.CreatePersistenceConfiguration(); - await persistenceConfiguration.Configure(endpointCustomizationConfiguration.EndpointName, config, runDescriptor.Settings, endpointCustomizationConfiguration.PublisherMetadata); - runDescriptor.OnTestCompleted(_ => persistenceConfiguration.Cleanup()); - } - - public static void RegisterComponentsAndInheritanceHierarchy(this EndpointConfiguration builder, RunDescriptor runDescriptor) - { - builder.RegisterComponents(r => { RegisterInheritanceHierarchyOfContextOnContainer(runDescriptor, r); }); - } - - static void RegisterInheritanceHierarchyOfContextOnContainer(RunDescriptor runDescriptor, IConfigureComponents r) - { - var type = runDescriptor.ScenarioContext.GetType(); - while (type != typeof(object)) - { - r.RegisterSingleton(type, runDescriptor.ScenarioContext); - type = type.BaseType; - } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultPublisher.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultPublisher.cs deleted file mode 100644 index 3948a4536..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultPublisher.cs +++ /dev/null @@ -1,17 +0,0 @@ -namespace NServiceBus.AcceptanceTests.EndpointTemplates -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting.Support; - using NServiceBus.Config.ConfigurationSource; - - public class DefaultPublisher : IEndpointSetupTemplate - { -#pragma warning disable CS0618 - public Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, IConfigurationSource configSource, Action configurationBuilderCustomization) -#pragma warning restore CS0618 - { - return new DefaultServer().GetConfiguration(runDescriptor, endpointConfiguration, configSource, configurationBuilderCustomization); - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultServer.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultServer.cs deleted file mode 100644 index d541e885a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultServer.cs +++ /dev/null @@ -1,59 +0,0 @@ -namespace NServiceBus.AcceptanceTests.EndpointTemplates -{ - using System; - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting.Customization; - using AcceptanceTesting.Support; - using Configuration.AdvanceExtensibility; - using Features; - using NServiceBus.Config.ConfigurationSource; - - public class DefaultServer : IEndpointSetupTemplate - { - public DefaultServer() - { - typesToInclude = new List(); - } - - public DefaultServer(List typesToInclude) - { - this.typesToInclude = typesToInclude; - } - -#pragma warning disable CS0618 - public async Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, IConfigurationSource configSource, Action configurationBuilderCustomization) -#pragma warning restore CS0618 - { - var types = endpointConfiguration.GetTypesScopedByTestClass(); - - typesToInclude.AddRange(types); - - var configuration = new EndpointConfiguration(endpointConfiguration.EndpointName); - - configuration.TypesToIncludeInScan(typesToInclude); - configuration.CustomConfigurationSource(configSource); - configuration.EnableInstallers(); - - configuration.DisableFeature(); - - var recoverability = configuration.Recoverability(); - recoverability.Delayed(delayed => delayed.NumberOfRetries(0)); - recoverability.Immediate(immediate => immediate.NumberOfRetries(0)); - configuration.SendFailedMessagesTo("error"); - - await configuration.DefineTransport(runDescriptor, endpointConfiguration).ConfigureAwait(false); - - configuration.RegisterComponentsAndInheritanceHierarchy(runDescriptor); - - await configuration.DefinePersistence(runDescriptor, endpointConfiguration).ConfigureAwait(false); - - configuration.GetSettings().SetDefault("ScaleOut.UseSingleBrokerQueue", true); - configurationBuilderCustomization(configuration); - - return configuration; - } - - List typesToInclude; - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointConfigurationExtensions.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointConfigurationExtensions.cs deleted file mode 100644 index eba7cd771..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointConfigurationExtensions.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace NServiceBus.AcceptanceTests -{ - using Configuration.AdvanceExtensibility; - - public static class EndpointConfigurationExtensions - { - public static TransportExtensions ConfigureTransport(this EndpointConfiguration endpointConfiguration) - { - return new TransportExtensions(endpointConfiguration.GetSettings()); - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointCustomizationConfigurationExtensions.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointCustomizationConfigurationExtensions.cs deleted file mode 100644 index 9b0b73cb1..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointCustomizationConfigurationExtensions.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace NServiceBus.AcceptanceTests.EndpointTemplates -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Reflection; - using AcceptanceTesting.Support; - using Hosting.Helpers; - - public static class EndpointCustomizationConfigurationExtensions - { - public static IEnumerable GetTypesScopedByTestClass(this EndpointCustomizationConfiguration endpointConfiguration) - { - var assemblies = new AssemblyScanner().GetScannableAssemblies(); - - var types = assemblies.Assemblies - //exclude all test types by default - .Where(a => - { - var references = a.GetReferencedAssemblies(); - - return references.All(an => an.Name != "nunit.framework"); - }) - .SelectMany(a => a.GetTypes()); - - types = types.Union(GetNestedTypeRecursive(endpointConfiguration.BuilderType.DeclaringType, endpointConfiguration.BuilderType)); - - types = types.Union(endpointConfiguration.TypesToInclude); - - return types.Where(t => !endpointConfiguration.TypesToExclude.Contains(t)).ToList(); - } - - static IEnumerable GetNestedTypeRecursive(Type rootType, Type builderType) - { - if (rootType == null) - { - throw new InvalidOperationException("Make sure you nest the endpoint infrastructure inside the TestFixture as nested classes"); - } - - yield return rootType; - - if (typeof(IEndpointConfigurationFactory).IsAssignableFrom(rootType) && rootType != builderType) - { - yield break; - } - - foreach (var nestedType in rootType.GetNestedTypes(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).SelectMany(t => GetNestedTypeRecursive(t, builderType))) - { - yield return nestedType; - } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/IConfigureEndpointTestExecution.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/IConfigureEndpointTestExecution.cs deleted file mode 100644 index eabc6c73f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/IConfigureEndpointTestExecution.cs +++ /dev/null @@ -1,30 +0,0 @@ -namespace NServiceBus.AcceptanceTesting.Support -{ - using System.Threading.Tasks; - - /// - /// Provide a mechanism in acceptance tests for transports and persistences - /// to configure an endpoint for a test and then clean up afterwards. - /// - public interface IConfigureEndpointTestExecution - { - /// - /// Gives the transport/persistence a chance to configure before the test starts. - /// - /// The endpoint name. - /// The EndpointConfiguration instance. - /// Settings from the RunDescriptor specifying Transport, Persistence, - /// connection strings, Serializer, Builder, and other details. Transports must call configuration.UseTransport<T>(). - /// Persistence must call configuration.UsePersistence<T>(). - /// Metadata about publishers and the events they own. - /// An async Task. - Task Configure(string endpointName, EndpointConfiguration configuration, RunSettings settings, PublisherMetadata publisherMetadata); - - /// - /// Gives the transport/persistence a chance to clean up after the test is complete. Implementations of this class may store - /// private variables during Configure to use during the cleanup phase. - /// - /// An async Task. - Task Cleanup(); - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/Requires.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/Requires.cs deleted file mode 100644 index 9985dbaac..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/Requires.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace NServiceBus.AcceptanceTests -{ - using NUnit.Framework; - - static class Requires - { - public static void DtcSupport() - { - if (!TestSuiteConstraints.Current.SupportsDtc) - { - Assert.Ignore("Ignoring this test because it requires DTC transaction support from the transport."); - } - } - - public static void CrossQueueTransactionSupport() - { - if (!TestSuiteConstraints.Current.SupportsCrossQueueTransactions) - { - Assert.Ignore("Ignoring this test because it requires cross queue transaction support from the transport."); - } - } - - public static void NativePubSubSupport() - { - if (!TestSuiteConstraints.Current.SupportsNativePubSub) - { - Assert.Ignore("Ignoring this test because it requires native publish subscribe support from the transport."); - } - } - - public static void MessageDrivenPubSub() - { - if (TestSuiteConstraints.Current.SupportsNativePubSub) - { - Assert.Ignore("Ignoring this test because it requires message driven publish subscribe but this test suite uses native publish subscribe."); - } - } - - public static void TimeoutStorage() - { - if (TestSuiteConstraints.Current.SupportsNativeDeferral) - { - Assert.Ignore("Ignoring this test because it requires the timeout manager but this transport provides native deferral."); - } - } - - public static void OutboxPersistence() - { - if (!TestSuiteConstraints.Current.SupportsOutbox) - { - Assert.Ignore("Ignoring this tests because it requires a persistence providing an Outbox storage."); - } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ServerWithNoDefaultPersistenceDefinitions.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ServerWithNoDefaultPersistenceDefinitions.cs deleted file mode 100644 index 68f66bc1e..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ServerWithNoDefaultPersistenceDefinitions.cs +++ /dev/null @@ -1,53 +0,0 @@ -namespace NServiceBus.AcceptanceTests.EndpointTemplates -{ - using System; - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting.Customization; - using AcceptanceTesting.Support; - using Features; - using NServiceBus.Config.ConfigurationSource; - - public class ServerWithNoDefaultPersistenceDefinitions : IEndpointSetupTemplate - { - public ServerWithNoDefaultPersistenceDefinitions() - { - typesToInclude = new List(); - } - - public ServerWithNoDefaultPersistenceDefinitions(List typesToInclude) - { - this.typesToInclude = typesToInclude; - } - -#pragma warning disable CS0618 - public async Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, IConfigurationSource configSource, Action configurationBuilderCustomization) -#pragma warning restore CS0618 - { - var types = endpointConfiguration.GetTypesScopedByTestClass(); - - typesToInclude.AddRange(types); - - var builder = new EndpointConfiguration(endpointConfiguration.EndpointName); - builder.TypesToIncludeInScan(typesToInclude); - builder.CustomConfigurationSource(configSource); - builder.EnableInstallers(); - - builder.DisableFeature(); - builder.Recoverability() - .Delayed(delayed => delayed.NumberOfRetries(0)) - .Immediate(immediate => immediate.NumberOfRetries(0)); - builder.SendFailedMessagesTo("error"); - - await builder.DefineTransport(runDescriptor, endpointConfiguration).ConfigureAwait(false); - - builder.RegisterComponentsAndInheritanceHierarchy(runDescriptor); - - configurationBuilderCustomization(builder); - - return builder; - } - - List typesToInclude; - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/TestSuiteConstraints.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/TestSuiteConstraints.cs deleted file mode 100644 index e80051131..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/TestSuiteConstraints.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace NServiceBus.AcceptanceTests -{ - using AcceptanceTesting.Support; - - public interface ITestSuiteConstraints - { - bool SupportsDtc { get; } - - bool SupportsCrossQueueTransactions { get; } - - bool SupportsNativePubSub { get; } - - bool SupportsNativeDeferral { get; } - - bool SupportsOutbox { get; } - - IConfigureEndpointTestExecution CreateTransportConfiguration(); - - IConfigureEndpointTestExecution CreatePersistenceConfiguration(); - } - - // ReSharper disable once PartialTypeWithSinglePart - public partial class TestSuiteConstraints : ITestSuiteConstraints - { - public static TestSuiteConstraints Current = new TestSuiteConstraints(); - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Forwarding/When_forwarding_is_configured_for_endpoint.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Forwarding/When_forwarding_is_configured_for_endpoint.cs deleted file mode 100644 index ca21eed33..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Forwarding/When_forwarding_is_configured_for_endpoint.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Forwarding -{ - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_forwarding_is_configured_for_endpoint : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_forward_message() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.SendLocal(new MessageToForward()))) - .WithEndpoint() - .Done(c => c.GotForwardedMessage) - .Run(); - - Assert.IsTrue(context.GotForwardedMessage); - CollectionAssert.AreEqual(context.ForwardedHeaders, context.ReceivedHeaders, "Headers should be preserved on the forwarded message"); - } - - public class Context : ScenarioContext - { - public bool GotForwardedMessage { get; set; } - public IReadOnlyDictionary ForwardedHeaders { get; set; } - public IReadOnlyDictionary ReceivedHeaders { get; set; } - } - - public class ForwardReceiver : EndpointConfigurationBuilder - { - public ForwardReceiver() - { - EndpointSetup() - .CustomEndpointName("endpoint_forward_receiver"); - } - - public class MessageToForwardHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToForward message, IMessageHandlerContext context) - { - Context.ForwardedHeaders = context.MessageHeaders; - Context.GotForwardedMessage = true; - return Task.FromResult(0); - } - } - } - - public class EndpointThatForwards : EndpointConfigurationBuilder - { - public EndpointThatForwards() - { - EndpointSetup(c => c.ForwardReceivedMessagesTo("endpoint_forward_receiver")); - } - - public class MessageToForwardHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToForward message, IMessageHandlerContext context) - { - Context.ReceivedHeaders = context.MessageHeaders; - return Task.FromResult(0); - } - } - } - - public class MessageToForward : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Forwarding/When_requesting_message_to_be_forwarded.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Forwarding/When_requesting_message_to_be_forwarded.cs deleted file mode 100644 index 308fb6d12..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Forwarding/When_requesting_message_to_be_forwarded.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Forwarding -{ - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_requesting_message_to_be_forwarded : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_forward_message() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.SendLocal(new MessageToForward()))) - .WithEndpoint() - .Done(c => c.GotForwardedMessage) - .Run(); - - Assert.IsTrue(context.GotForwardedMessage); - CollectionAssert.AreEqual(context.ForwardedHeaders, context.ReceivedHeaders, "Headers should be preserved on the forwarded message"); - } - - public class Context : ScenarioContext - { - public bool GotForwardedMessage { get; set; } - public IReadOnlyDictionary ForwardedHeaders { get; set; } - public IReadOnlyDictionary ReceivedHeaders { get; set; } - } - - public class ForwardReceiver : EndpointConfigurationBuilder - { - public ForwardReceiver() - { - EndpointSetup() - .CustomEndpointName("message_forward_receiver"); - } - - public class MessageToForwardHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToForward message, IMessageHandlerContext context) - { - Context.ForwardedHeaders = context.MessageHeaders; - Context.GotForwardedMessage = true; - return Task.FromResult(0); - } - } - } - - public class EndpointThatForwards : EndpointConfigurationBuilder - { - public EndpointThatForwards() - { - EndpointSetup(); - } - - public class MessageToForwardHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToForward message, IMessageHandlerContext context) - { - Context.ReceivedHeaders = context.MessageHeaders; - return context.ForwardCurrentMessageTo("message_forward_receiver"); - } - } - } - - public class MessageToForward : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/MessageId/When_message_has_empty_id_header.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/MessageId/When_message_has_empty_id_header.cs deleted file mode 100644 index 0eaf1f5de..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/MessageId/When_message_has_empty_id_header.cs +++ /dev/null @@ -1,69 +0,0 @@ -namespace NServiceBus.AcceptanceTests.MessageId -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_message_has_empty_id_header : NServiceBusAcceptanceTest - { - [Test] - public async Task A_message_id_is_generated_by_the_transport_layer() - { - var context = await Scenario.Define() - .WithEndpoint(g => g.When(b => b.SendLocal(new Message()))) - .Done(c => c.MessageReceived) - .Run(); - - Assert.IsFalse(string.IsNullOrWhiteSpace(context.MessageId)); - Assert.AreEqual(context.MessageId, context.Headers[Headers.MessageId], "Should populate the NServiceBus.MessageId header with the new value"); - } - - class CorruptionBehavior : IBehavior - { - public Task Invoke(IDispatchContext context, Func next) - { - context.Operations.First().Message.Headers[Headers.MessageId] = ""; - - return next(context); - } - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - public string MessageId { get; set; } - public IReadOnlyDictionary Headers { get; set; } - } - - class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => c.Pipeline.Register("CorruptionBehavior", new CorruptionBehavior(), "Corrupting the message id")); - } - - class Handler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(Message message, IMessageHandlerContext context) - { - TestContext.MessageId = context.MessageId; - TestContext.Headers = context.MessageHeaders; - TestContext.MessageReceived = true; - - return Task.FromResult(0); - } - } - } - - public class Message : IMessage - { - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/MessageId/When_message_has_no_id_header.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/MessageId/When_message_has_no_id_header.cs deleted file mode 100644 index 08686c312..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/MessageId/When_message_has_no_id_header.cs +++ /dev/null @@ -1,65 +0,0 @@ -namespace NServiceBus.AcceptanceTests.MessageId -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_message_has_no_id_header : NServiceBusAcceptanceTest - { - [Test] - public async Task A_message_id_is_generated_by_the_transport_layer_on_receiving_side() - { - var context = await Scenario.Define() - .WithEndpoint(g => g.When(b => b.SendLocal(new Message()))) - .Done(c => c.MessageReceived) - .Run(); - - Assert.IsFalse(string.IsNullOrWhiteSpace(context.MessageId)); - } - - class CorruptionBehavior : IBehavior - { - public Task Invoke(IDispatchContext context, Func next) - { - context.Operations.First().Message.Headers[Headers.MessageId] = null; - - return next(context); - } - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - public string MessageId { get; set; } - } - - class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => c.Pipeline.Register("CorruptionBehavior", new CorruptionBehavior(), "Corrupting the message id")); - } - - class Handler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(Message message, IMessageHandlerContext context) - { - TestContext.MessageId = context.MessageId; - TestContext.MessageReceived = true; - - return Task.FromResult(0); - } - } - } - - public class Message : IMessage - { - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs deleted file mode 100644 index 5c2528036..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs +++ /dev/null @@ -1,36 +0,0 @@ -namespace NServiceBus.AcceptanceTests -{ - using System.Linq; - using System.Threading; - using AcceptanceTesting.Customization; - using NUnit.Framework; - - /// - /// Base class for all the NSB test that sets up our conventions - /// - [TestFixture] - // ReSharper disable once PartialTypeWithSinglePart - public abstract partial class NServiceBusAcceptanceTest - { - [SetUp] - public void SetUp() - { - Conventions.EndpointNamingConvention = t => - { - var classAndEndpoint = t.FullName.Split('.').Last(); - - var testName = classAndEndpoint.Split('+').First(); - - testName = testName.Replace("When_", ""); - - var endpointBuilder = classAndEndpoint.Split('+').Last(); - - testName = Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(testName); - - testName = testName.Replace("_", ""); - - return testName + "." + endpointBuilder; - }; - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_a_duplicate_message_arrives.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_a_duplicate_message_arrives.cs deleted file mode 100644 index 67132fd08..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_a_duplicate_message_arrives.cs +++ /dev/null @@ -1,109 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Outbox -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_a_duplicate_message_arrives : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_invoke_handler_for_a_duplicate_message() - { - Requires.OutboxPersistence(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(async session => - { - var duplicateMessageId = Guid.NewGuid().ToString(); - - var options = new SendOptions(); - - options.SetMessageId(duplicateMessageId); - options.RouteToThisEndpoint(); - - await session.Send(new PlaceOrder(), options); - await session.Send(new PlaceOrder(), options); - await session.SendLocal(new PlaceOrder - { - Terminator = true - }); - })) - .WithEndpoint() - .Done(c => c.Done && c.MessagesReceivedByDownstreamEndpoint >= 2 && c.MessagesReceivedByOutboxEndpoint >= 2) - .Run(); - - Assert.AreEqual(2, context.MessagesReceivedByDownstreamEndpoint); - Assert.AreEqual(2, context.MessagesReceivedByOutboxEndpoint); - } - - public class Context : ScenarioContext - { - public int MessagesReceivedByDownstreamEndpoint { get; set; } - public bool Done { get; set; } - public int MessagesReceivedByOutboxEndpoint { get; set; } - } - - public class DownstreamEndpoint : EndpointConfigurationBuilder - { - public DownstreamEndpoint() - { - EndpointSetup(b => { b.LimitMessageProcessingConcurrencyTo(1); }); - } - - class SendOrderAcknowledgementHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(SendOrderAcknowledgement message, IMessageHandlerContext context) - { - Context.MessagesReceivedByDownstreamEndpoint++; - if (message.Terminator) - { - Context.Done = true; - } - return Task.FromResult(0); - } - } - } - - public class OutboxEndpoint : EndpointConfigurationBuilder - { - public OutboxEndpoint() - { - EndpointSetup(b => - { - b.LimitMessageProcessingConcurrencyTo(1); // We limit to one to avoid race conditions on dispatch and this allows us to reliable check whether deduplication happens properly - b.EnableOutbox(); - b.ConfigureTransport().Routing().RouteToEndpoint(typeof(SendOrderAcknowledgement), typeof(DownstreamEndpoint)); - }); - } - - class PlaceOrderHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(PlaceOrder message, IMessageHandlerContext context) - { - Context.MessagesReceivedByOutboxEndpoint++; - return context.Send(new SendOrderAcknowledgement - { - Terminator = message.Terminator - }); - } - } - } - - public class PlaceOrder : ICommand - { - public bool Terminator { get; set; } - } - - public class SendOrderAcknowledgement : IMessage - { - public bool Terminator { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_a_message_is_audited.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_a_message_is_audited.cs deleted file mode 100644 index c4f5fe236..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_a_message_is_audited.cs +++ /dev/null @@ -1,98 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Outbox -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_a_message_is_audited : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_dispatch_audit_message_immediately() - { - Requires.OutboxPersistence(); - - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new MessageToBeAudited())) - .DoNotFailOnErrorMessages()) - .WithEndpoint() - .Done(c => c.MessageAudited) - .Run(); - - Assert.True(context.MessageAudited); - } - - class Context : ScenarioContext - { - public bool MessageAudited { get; set; } - } - - class EndpointWithAuditOn : EndpointConfigurationBuilder - { - public EndpointWithAuditOn() - { - EndpointSetup( - b => - { - b.EnableOutbox(); - b.Pipeline.Register("BlowUpAfterDispatchBehavior", new BlowUpAfterDispatchBehavior(), "For testing"); - b.AuditProcessedMessagesTo(); - }); - } - - class BlowUpAfterDispatchBehavior : IBehavior - { - public async Task Invoke(IBatchDispatchContext context, Func next) - { - if (!context.Operations.Any(op => op.Message.Headers[Headers.EnclosedMessageTypes].Contains(typeof(MessageToBeAudited).Name))) - { - await next(context).ConfigureAwait(false); - return; - } - - await next(context).ConfigureAwait(false); - - throw new SimulatedException(); - } - } - - public class MessageToBeAuditedHandler : IHandleMessages - { - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - class AuditSpyEndpoint : EndpointConfigurationBuilder - { - public AuditSpyEndpoint() - { - EndpointSetup(); - } - - public class MessageToBeAuditedHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - Context.MessageAudited = true; - return Task.FromResult(0); - } - } - } - - - public class MessageToBeAudited : IMessage - { - public string RunId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_blowing_up_just_after_dispatch.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_blowing_up_just_after_dispatch.cs deleted file mode 100644 index 491b61ccd..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_blowing_up_just_after_dispatch.cs +++ /dev/null @@ -1,82 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Outbox -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_blowing_up_just_after_dispatch : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_still_release_the_outgoing_messages_to_the_transport() - { - Requires.OutboxPersistence(); - - var context = await Scenario.Define() - .WithEndpoint(b => b - .DoNotFailOnErrorMessages() // PlaceOrder should fail due to exception after dispatch - .When(session => session.SendLocal(new PlaceOrder()))) - .Done(c => c.OrderAckReceived == 1) - .Run(TimeSpan.FromSeconds(20)); - - Assert.AreEqual(1, context.OrderAckReceived, "Order ack should have been received since outbox dispatch isn't part of the receive tx"); - } - - public class Context : ScenarioContext - { - public int OrderAckReceived { get; set; } - } - - public class NonDtcReceivingEndpoint : EndpointConfigurationBuilder - { - public NonDtcReceivingEndpoint() - { - EndpointSetup( - b => - { - b.EnableOutbox(); - b.Pipeline.Register("BlowUpAfterDispatchBehavior", new BlowUpAfterDispatchBehavior(), "For testing"); - }); - } - - class BlowUpAfterDispatchBehavior : IBehavior - { - public async Task Invoke(IBatchDispatchContext context, Func next) - { - await next(context).ConfigureAwait(false); - - throw new SimulatedException(); - } - } - - class PlaceOrderHandler : IHandleMessages - { - public Task Handle(PlaceOrder message, IMessageHandlerContext context) - { - return context.SendLocal(new SendOrderAcknowledgment()); - } - } - - class SendOrderAcknowledgmentHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(SendOrderAcknowledgment message, IMessageHandlerContext context) - { - Context.OrderAckReceived++; - return Task.FromResult(0); - } - } - } - - public class PlaceOrder : ICommand - { - } - - public class SendOrderAcknowledgment : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_dispatching_forwarded_messages.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_dispatching_forwarded_messages.cs deleted file mode 100644 index 4668f6a97..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_dispatching_forwarded_messages.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Outbox -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_dispatching_forwarded_messages : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_be_dispatched_immediately() - { - Requires.OutboxPersistence(); - - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new MessageToBeForwarded())) - .DoNotFailOnErrorMessages()) - .WithEndpoint() - .Done(c => c.Done) - .Run(); - - Assert.IsTrue(context.Done); - } - - class Context : ScenarioContext - { - public bool Done { get; set; } - } - - class EndpointWithAuditOn : EndpointConfigurationBuilder - { - public EndpointWithAuditOn() - { - EndpointSetup( - b => - { - b.EnableOutbox(); - b.Pipeline.Register("BlowUpAfterDispatchBehavior", new BlowUpAfterDispatchBehavior(), "For testing"); - b.ForwardReceivedMessagesTo(Conventions.EndpointNamingConvention(typeof(ForwardingSpyEndpoint))); - }); - } - - class BlowUpAfterDispatchBehavior : IBehavior - { - public async Task Invoke(IBatchDispatchContext context, Func next) - { - if (!context.Operations.Any(op => op.Message.Headers[Headers.EnclosedMessageTypes].Contains(typeof(MessageToBeForwarded).Name))) - { - await next(context).ConfigureAwait(false); - return; - } - - await next(context).ConfigureAwait(false); - - throw new SimulatedException(); - } - } - - public class MessageToBeForwardedHandler : IHandleMessages - { - public Task Handle(MessageToBeForwarded message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - class ForwardingSpyEndpoint : EndpointConfigurationBuilder - { - public ForwardingSpyEndpoint() - { - EndpointSetup(); - } - - public class MessageToBeAuditedHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToBeForwarded message, IMessageHandlerContext context) - { - Context.Done = true; - return Task.FromResult(0); - } - } - } - - public class MessageToBeForwarded : IMessage - { - public string RunId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_receiving_a_message.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_receiving_a_message.cs deleted file mode 100644 index 027b97c26..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_receiving_a_message.cs +++ /dev/null @@ -1,67 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Outbox -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_receiving_a_message_not_found_in_the_outbox : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_handle_it() - { - Requires.OutboxPersistence(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new PlaceOrder()))) - .Done(c => c.OrderAckReceived == 1) - .Run(TimeSpan.FromSeconds(20)); - - Assert.AreEqual(1, context.OrderAckReceived, "Order ack should have been received"); - } - - class Context : ScenarioContext - { - public int OrderAckReceived { get; set; } - } - - public class NonDtcReceivingEndpoint : EndpointConfigurationBuilder - { - public NonDtcReceivingEndpoint() - { - EndpointSetup(b => - { - b.EnableOutbox(); - }); - } - - class PlaceOrderHandler : IHandleMessages - { - public Task Handle(PlaceOrder message, IMessageHandlerContext context) - { - return context.SendLocal(new SendOrderAcknowledgement()); - } - } - - class SendOrderAcknowledgementHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(SendOrderAcknowledgement message, IMessageHandlerContext context) - { - Context.OrderAckReceived++; - return Task.FromResult(0); - } - } - } - - public class PlaceOrder : ICommand - { - } - - public class SendOrderAcknowledgement : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_audited.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_audited.cs deleted file mode 100644 index a8c72ef44..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_audited.cs +++ /dev/null @@ -1,104 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Pipeline -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_a_message_is_audited : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_flow_causation_headers() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new FirstMessage()))) - .WithEndpoint() - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(context.OriginRelatedTo, context.RelatedTo, "The RelatedTo header in audit message should be be equal to RelatedTo header in origin."); - Assert.AreEqual(context.OriginConversationId, context.ConversationId, "The ConversationId header in audit message should be be equal to ConversationId header in origin."); - } - - public class Context : ScenarioContext - { - public bool Done { get; set; } - public string RelatedTo { get; set; } - public string ConversationId { get; set; } - public string OriginRelatedTo { get; set; } - public string OriginConversationId { get; set; } - } - - public class CausationEndpoint : EndpointConfigurationBuilder - { - public CausationEndpoint() - { - EndpointSetup(c => c.AuditProcessedMessagesTo()); - } - - public Context Context { get; set; } - - public class MessageSentInsideHandlersHandler : IHandleMessages - { - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - - public class FirstMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(FirstMessage message, IMessageHandlerContext context) - { - TestContext.OriginRelatedTo = context.MessageId; - TestContext.OriginConversationId = context.MessageHeaders.ContainsKey(Headers.ConversationId) ? context.MessageHeaders[Headers.ConversationId] : null; - - return context.SendLocal(new MessageToBeAudited()); - } - } - } - - class AuditSpyEndpoint : EndpointConfigurationBuilder - { - public AuditSpyEndpoint() - { - EndpointSetup(); - } - - public class MessageToBeAuditedHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) - { - TestContext.RelatedTo = context.MessageHeaders.ContainsKey(Headers.RelatedTo) ? context.MessageHeaders[Headers.RelatedTo] : null; - TestContext.ConversationId = context.MessageHeaders.ContainsKey(Headers.ConversationId) ? context.MessageHeaders[Headers.ConversationId] : null; - TestContext.Done = true; - - return Task.FromResult(0); - } - } - - public class FirstMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(FirstMessage message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - public class FirstMessage : IMessage - { - } - - public class MessageToBeAudited : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_faulted.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_faulted.cs deleted file mode 100644 index af4099b0a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_faulted.cs +++ /dev/null @@ -1,101 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Pipeline -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_a_message_is_faulted : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_flow_causation_headers() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new FirstMessage())).DoNotFailOnErrorMessages()) - .WithEndpoint() - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(context.OriginRelatedTo, context.RelatedTo, "The RelatedTo header in fault message should be be equal to RelatedTo header in origin."); - Assert.AreEqual(context.OriginConversationId, context.ConversationId, "The ConversationId header in fault message should be be equal to ConversationId header in origin."); - } - - public class Context : ScenarioContext - { - public bool Done { get; set; } - public string RelatedTo { get; set; } - public string ConversationId { get; set; } - public string OriginRelatedTo { get; set; } - public string OriginConversationId { get; set; } - } - - public class CausationEndpoint : EndpointConfigurationBuilder - { - public CausationEndpoint() - { - EndpointSetup(c => c.SendFailedMessagesTo()); - } - - public Context Context { get; set; } - - public class FirstMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(FirstMessage message, IMessageHandlerContext context) - { - TestContext.OriginRelatedTo = context.MessageId; - TestContext.OriginConversationId = context.MessageHeaders.ContainsKey(Headers.ConversationId) ? context.MessageHeaders[Headers.ConversationId] : null; - - return context.SendLocal(new MessageThatFails()); - } - } - - public class MessageSentInsideHandlersHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageThatFails message, IMessageHandlerContext context) - { - throw new SimulatedException(); - } - } - } - - class EndpointThatHandlesErrorMessages : EndpointConfigurationBuilder - { - public EndpointThatHandlesErrorMessages() - { - EndpointSetup(); - } - - class ErrorMessageHandler : IHandleMessages - { - public ErrorMessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(MessageThatFails message, IMessageHandlerContext context) - { - testContext.RelatedTo = context.MessageHeaders.ContainsKey(Headers.RelatedTo) ? context.MessageHeaders[Headers.RelatedTo] : null; - testContext.ConversationId = context.MessageHeaders.ContainsKey(Headers.ConversationId) ? context.MessageHeaders[Headers.ConversationId] : null; - testContext.Done = true; - - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class FirstMessage : IMessage - { - } - - public class MessageThatFails : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_sent.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_sent.cs deleted file mode 100644 index 0b8d1fef8..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_a_message_is_sent.cs +++ /dev/null @@ -1,78 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Pipeline -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_a_message_is_sent : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_flow_causation_headers() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MessageSentOutsideOfHandler()))) - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(context.FirstConversationId, context.ConversationIdReceived, "Conversation id should flow to outgoing messages"); - Assert.AreEqual(context.MessageIdOfFirstMessage, context.RelatedToReceived, "RelatedToId on outgoing messages should be set to the message id of the message causing it to be sent"); - } - - public class Context : ScenarioContext - { - public bool Done { get; set; } - public string FirstConversationId { get; set; } - public string ConversationIdReceived { get; set; } - public string MessageIdOfFirstMessage { get; set; } - public string RelatedToReceived { get; set; } - } - - public class CausationEndpoint : EndpointConfigurationBuilder - { - public CausationEndpoint() - { - EndpointSetup(); - } - - public Context Context { get; set; } - - public class MessageSentOutsideHandlersHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageSentOutsideOfHandler message, IMessageHandlerContext context) - { - TestContext.FirstConversationId = context.MessageHeaders[Headers.ConversationId]; - TestContext.MessageIdOfFirstMessage = context.MessageId; - - return context.SendLocal(new MessageSentInsideHandler()); - } - } - - public class MessageSentInsideHandlersHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageSentInsideHandler message, IMessageHandlerContext context) - { - TestContext.ConversationIdReceived = context.MessageHeaders[Headers.ConversationId]; - - TestContext.RelatedToReceived = context.MessageHeaders[Headers.RelatedTo]; - - TestContext.Done = true; - - return Task.FromResult(0); - } - } - } - - public class MessageSentOutsideOfHandler : IMessage - { - } - - public class MessageSentInsideHandler : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_handling_current_message_later.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_handling_current_message_later.cs deleted file mode 100644 index 14621d715..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_handling_current_message_later.cs +++ /dev/null @@ -1,109 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Pipeline -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using UnitOfWork; - - public class When_handling_current_message_later : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_commit_unit_of_work_and_execute_subsequent_handlers() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => b.When((session, c) => session.SendLocal(new SomeMessage - { - Id = c.Id - }))) - .Done(c => c.Done) - .Run(); - - Assert.True(context.UoWCommited); - Assert.That(context.FirstHandlerInvocationCount, Is.EqualTo(2)); - Assert.That(context.SecondHandlerInvocationCount, Is.EqualTo(1)); - } - - public class Context : ScenarioContext - { - public Guid Id { get; set; } - public bool Done { get; set; } - public int FirstHandlerInvocationCount { get; set; } - public int SecondHandlerInvocationCount { get; set; } - public bool UoWCommited { get; set; } - } - - public class MyEndpoint : EndpointConfigurationBuilder - { - public MyEndpoint() - { - EndpointSetup(b => - { - b.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.InstancePerCall)); - b.ExecuteTheseHandlersFirst(typeof(FirstHandler), typeof(SecondHandler)); - }); - } - - class CheckUnitOfWorkOutcome : IManageUnitsOfWork - { - public Context Context { get; set; } - - public Task Begin() - { - return Task.FromResult(0); - } - - public Task End(Exception ex = null) - { - Context.UoWCommited = ex == null; - return Task.FromResult(0); - } - } - - class FirstHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(SomeMessage message, IMessageHandlerContext context) - { - if (message.Id != TestContext.Id) - { - return Task.FromResult(0); - } - TestContext.FirstHandlerInvocationCount++; - - if (TestContext.FirstHandlerInvocationCount == 1) - { - return context.HandleCurrentMessageLater(); - } - - return Task.FromResult(0); - } - } - - class SecondHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(SomeMessage message, IMessageHandlerContext context) - { - if (message.Id != Context.Id) - { - return Task.FromResult(0); - } - - Context.SecondHandlerInvocationCount++; - Context.Done = true; - - return Task.FromResult(0); - } - } - } - - public class SomeMessage : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_sending_to_another_endpoint.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_sending_to_another_endpoint.cs deleted file mode 100644 index 8edf9760d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_sending_to_another_endpoint.cs +++ /dev/null @@ -1,102 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Pipeline -{ - using System; - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_sending_to_another_endpoint : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_receive_the_message() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => b.When((session, c) => - { - var sendOptions = new SendOptions(); - - sendOptions.SetHeader("MyHeader", "MyHeaderValue"); - sendOptions.SetMessageId("MyMessageId"); - - return session.Send(new MyMessage - { - Id = c.Id - }, sendOptions); - })) - .WithEndpoint() - .Done(c => c.WasCalled) - .Run(); - - Assert.True(context.WasCalled, "The message handler should be called"); - Assert.AreEqual(1, context.TimesCalled, "The message handler should only be invoked once"); - Assert.AreEqual("StaticHeaderValue", context.ReceivedHeaders["MyStaticHeader"], "Static headers should be attached to outgoing messages"); - Assert.AreEqual("MyHeaderValue", context.MyHeader, "Static headers should be attached to outgoing messages"); - } - - public class Context : ScenarioContext - { - public bool WasCalled { get; set; } - - public int TimesCalled { get; set; } - - public IReadOnlyDictionary ReceivedHeaders { get; set; } - - public Guid Id { get; set; } - - public string MyHeader { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.AddHeaderToAllOutgoingMessages("MyStaticHeader", "StaticHeaderValue"); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessage), typeof(Receiver)); - }); - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(); - } - - public class MyMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - if (TestContext.Id != message.Id) - { - return Task.FromResult(0); - } - - Assert.AreEqual(context.MessageId, "MyMessageId"); - - TestContext.TimesCalled++; - - TestContext.MyHeader = context.MessageHeaders["MyHeader"]; - - TestContext.ReceivedHeaders = context.MessageHeaders; - - TestContext.WasCalled = true; - - return Task.FromResult(0); - } - } - } - - public class MyMessage : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_cross_q_transactional_message_is_moved_to_error_queue.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_cross_q_transactional_message_is_moved_to_error_queue.cs deleted file mode 100644 index 226dfaae5..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_cross_q_transactional_message_is_moved_to_error_queue.cs +++ /dev/null @@ -1,143 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_cross_q_transactional_message_is_moved_to_error_queue : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_dispatch_outgoing_messages() - { - Requires.CrossQueueTransactionSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.DoNotFailOnErrorMessages() - .When((session, c) => session.SendLocal(new InitiatingMessage - { - Id = c.TestRunId - })) - ) - .WithEndpoint() - .Done(c => c.MessageMovedToErrorQueue) - .Run(); - - Assert.IsFalse(context.OutgoingMessageSent, "Outgoing messages should not be sent"); - Assert.IsTrue(context.FailedMessages.Any()); } - - class Context : ScenarioContext - { - public bool MessageMovedToErrorQueue { get; set; } - public bool OutgoingMessageSent { get; set; } - } - - class EndpointWithOutgoingMessages : EndpointConfigurationBuilder - { - public EndpointWithOutgoingMessages() - { - EndpointSetup((config, context) => - { - config.ConfigureTransport() - .Transactions(TransportTransactionMode.SendsAtomicWithReceive); - config.Pipeline.Register(new ThrowingBehavior(), "Behavior that always throws"); - config.SendFailedMessagesTo(Conventions.EndpointNamingConvention(typeof(ErrorSpy))); - }); - } - - class InitiatingHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public async Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - await context.Send(Conventions.EndpointNamingConvention(typeof(ErrorSpy)), new SubsequentMessage - { - Id = initiatingMessage.Id - }); - } - } - } - } - - class EndpointWithFailingHandler : EndpointConfigurationBuilder - { - public EndpointWithFailingHandler() - { - EndpointSetup((config, context) => { config.SendFailedMessagesTo(Conventions.EndpointNamingConvention(typeof(ErrorSpy))); }); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Task Handle(InitiatingMessage message, IMessageHandlerContext context) - { - throw new SimulatedException("message should be moved to the error queue"); - } - } - } - - class ErrorSpy : EndpointConfigurationBuilder - { - public ErrorSpy() - { - EndpointSetup(config => config.LimitMessageProcessingConcurrencyTo(1)); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - TestContext.MessageMovedToErrorQueue = true; - } - - return Task.FromResult(0); - } - } - - class SubsequentMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(SubsequentMessage message, IMessageHandlerContext context) - { - if (message.Id == TestContext.TestRunId) - { - TestContext.OutgoingMessageSent = true; - } - - return Task.FromResult(0); - } - } - } - - class ThrowingBehavior : IBehavior - { - public async Task Invoke(ITransportReceiveContext context, Func next) - { - await next(context).ConfigureAwait(false); - - throw new SimulatedException(); - } - } - - public class InitiatingMessage : IMessage - { - public Guid Id { get; set; } - } - - public class SubsequentMessage : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_always_moves_to_error.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_always_moves_to_error.cs deleted file mode 100644 index 29dd9ef90..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_always_moves_to_error.cs +++ /dev/null @@ -1,73 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_custom_policy_always_moves_to_error : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_execute_only_once_and_send_to_error_queue() - { - var messageId = Guid.NewGuid().ToString(); - - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(bus => - { - var sendOptions = new SendOptions(); - sendOptions.RouteToThisEndpoint(); - sendOptions.SetMessageId(messageId); - return bus.Send(new MessageToBeRetried(), sendOptions); - }) - .DoNotFailOnErrorMessages()) - .Done(c => c.FailedMessages.Any()) - .Run(); - - Assert.AreEqual(1, context.Count); - Assert.AreEqual(messageId, context.FailedMessages.Single().Value.Single().MessageId); - } - - class Context : ScenarioContext - { - public int Count { get; set; } - } - - public class RetryEndpoint : EndpointConfigurationBuilder - { - public RetryEndpoint() - { - EndpointSetup((configure, context) => - { - configure.EnableFeature(); - configure.Recoverability() - .CustomPolicy((cfg, errorContext) => RecoverabilityAction.MoveToError(cfg.Failed.ErrorQueue)); - }); - } - - class MessageToBeRetriedHandler : IHandleMessages - { - public MessageToBeRetriedHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(MessageToBeRetried message, IMessageHandlerContext context) - { - testContext.Count ++; - throw new SimulatedException(); - } - - Context testContext; - } - } - - public class MessageToBeRetried : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_does_single_delayed_retry_before_move_to_error.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_does_single_delayed_retry_before_move_to_error.cs deleted file mode 100644 index 84d09f18c..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_does_single_delayed_retry_before_move_to_error.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Transport; - - public class When_custom_policy_does_single_delayed_retry_before_move_to_error : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_execute_twice_and_send_to_error_queue() - { - var messageId = Guid.NewGuid().ToString(); - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(bus => - { - var sendOptions = new SendOptions(); - sendOptions.RouteToThisEndpoint(); - sendOptions.SetMessageId(messageId); - return bus.Send(new MessageToBeRetried(), sendOptions); - }) - .DoNotFailOnErrorMessages()) - .Done(c => c.FailedMessages.Any()) - .Run(); - - Assert.AreEqual(context.Count, 2); - Assert.AreEqual(messageId, context.FailedMessages.Single().Value.Single().MessageId); - } - - class Context : ScenarioContext - { - public int Count { get; set; } - } - - public class RetryEndpoint : EndpointConfigurationBuilder - { - public RetryEndpoint() - { - EndpointSetup((configure, context) => - { - configure.EnableFeature(); - configure.Recoverability() - .CustomPolicy(RetryPolicy); - }); - } - - RecoverabilityAction RetryPolicy(RecoverabilityConfig config, ErrorContext context) - { - if (context.DelayedDeliveriesPerformed == 0) - { - return RecoverabilityAction.DelayedRetry(TimeSpan.FromMilliseconds(10)); - } - - return RecoverabilityAction.MoveToError(config.Failed.ErrorQueue); - } - - class MessageToBeRetriedHandler : IHandleMessages - { - public MessageToBeRetriedHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(MessageToBeRetried message, IMessageHandlerContext context) - { - testContext.Count ++; - throw new SimulatedException(); - } - - Context testContext; - } - } - - public class MessageToBeRetried : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_moves_to_overridden_error_queue.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_moves_to_overridden_error_queue.cs deleted file mode 100644 index fda18906f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_custom_policy_moves_to_overridden_error_queue.cs +++ /dev/null @@ -1,87 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_custom_policy_moves_to_overridden_error_queue : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_move_to_defined_error_queue() - { - var context = await Scenario.Define() - .WithEndpoint(b => b - .DoNotFailOnErrorMessages() - .When((session, ctx) => session.SendLocal(new InitiatingMessage - { - Id = ctx.TestRunId - })) - ) - .WithEndpoint() - .Done(c => c.MessageMovedToErrorQueue) - .Run(); - - Assert.IsTrue(context.MessageMovedToErrorQueue); - } - - class Context : ScenarioContext - { - public bool MessageMovedToErrorQueue { get; set; } - } - - class EndpointWithFailingHandler : EndpointConfigurationBuilder - { - public EndpointWithFailingHandler() - { - EndpointSetup((config, context) => - { - config.Recoverability().CustomPolicy((c, ec) => - RecoverabilityAction.MoveToError(Conventions.EndpointNamingConvention(typeof(ErrorSpy)))); - - config.SendFailedMessagesTo("error"); - }); - } - - class InitiatingHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - throw new SimulatedException(); - } - } - } - - class ErrorSpy : EndpointConfigurationBuilder - { - public ErrorSpy() - { - EndpointSetup(); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - TestContext.MessageMovedToErrorQueue = true; - } - - return Task.FromResult(0); - } - } - } - - public class InitiatingMessage : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_delayed_retries_with_immediate_retries_disabled.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_delayed_retries_with_immediate_retries_disabled.cs deleted file mode 100644 index e18024685..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_delayed_retries_with_immediate_retries_disabled.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_delayed_retries_with_immediate_retries_disabled : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_reschedule_message_the_configured_number_of_times() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => b - .When((session, ctx) => session.SendLocal(new MessageToBeRetried {Id = ctx.Id})) - .DoNotFailOnErrorMessages()) - .Done(c => c.FailedMessages.Any()) - .Run(); - - Assert.AreEqual(ConfiguredNumberOfDelayedRetries + 1, context.ReceiveCount, "Message should be delivered 4 times. Once initially and retried 3 times by Delayed Retries"); - } - - const int ConfiguredNumberOfDelayedRetries = 3; - - class Context : ScenarioContext - { - public Guid Id { get; set; } - public int ReceiveCount { get; set; } - } - - public class RetryEndpoint : EndpointConfigurationBuilder - { - public RetryEndpoint() - { - EndpointSetup((configure, context) => - { - configure.EnableFeature(); - var recoverability = configure.Recoverability(); - recoverability.Delayed(settings => settings.TimeIncrease(TimeSpan.FromMilliseconds(1)).NumberOfRetries(ConfiguredNumberOfDelayedRetries)); - recoverability.Immediate(settings => settings.NumberOfRetries(0)); - }); - } - - class MessageToBeRetriedHandler : IHandleMessages - { - public MessageToBeRetriedHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(MessageToBeRetried message, IMessageHandlerContext context) - { - if (testContext.Id == message.Id) - { - testContext.ReceiveCount++; - - throw new SimulatedException(); - } - - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class MessageToBeRetried : IMessage - { - public Guid Id { get; set; } - } - - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_error_is_overridden_in_code.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_error_is_overridden_in_code.cs deleted file mode 100644 index 0620ac1cc..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_error_is_overridden_in_code.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_error_is_overridden_in_code : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_error_to_target_queue() - { - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new Message())) - .DoNotFailOnErrorMessages()) - .WithEndpoint() - .Done(c => c.MessageReceived) - .Run(); - - Assert.True(context.MessageReceived); - } - - public class UserEndpoint : EndpointConfigurationBuilder - { - public UserEndpoint() - { - EndpointSetup(b => { b.SendFailedMessagesTo("error_with_code_source"); }); - } - - class Handler : IHandleMessages - { - public Task Handle(Message message, IMessageHandlerContext context) - { - throw new SimulatedException(); - } - } - } - - public class ErrorSpy : EndpointConfigurationBuilder - { - public ErrorSpy() - { - EndpointSetup() - .CustomEndpointName("error_with_code_source"); - } - - class Handler : IHandleMessages - { - public Context MyContext { get; set; } - - public Task Handle(Message message, IMessageHandlerContext context) - { - MyContext.MessageReceived = true; - return Task.FromResult(0); - } - } - } - - public class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - } - - - public class Message : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_disabled.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_disabled.cs deleted file mode 100644 index 960616182..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_disabled.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_immediate_retries_disabled : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_retry_the_message_using_immediate_retries() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => - { - b.DoNotFailOnErrorMessages(); - b.When((session, c) => session.SendLocal(new MessageToBeRetried - { - ContextId = c.Id - })); - }) - .Done(c => c.GaveUp) - .Run(); - - Assert.AreEqual(1, context.NumberOfTimesInvoked, "No Immediate Retry should be in use if NumberOfRetries is set to 0"); - } - - class Context : ScenarioContext - { - public Guid Id { get; set; } - public int NumberOfTimesInvoked { get; set; } - - public bool GaveUp { get; set; } - } - - public class RetryEndpoint : EndpointConfigurationBuilder - { - public RetryEndpoint() - { - EndpointSetup((configure, context) => - { - var scenarioContext = (Context) context.ScenarioContext; - configure.Recoverability().Immediate(immediate => immediate.NumberOfRetries(0)); - configure.Notifications.Errors.MessageSentToErrorQueue += (sender, message) => scenarioContext.GaveUp = true; - }); - } - - class MessageToBeRetriedHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToBeRetried message, IMessageHandlerContext context) - { - if (Context.Id != message.ContextId) - { - return Task.FromResult(0); - } - Context.NumberOfTimesInvoked++; - throw new SimulatedException(); - } - } - } - - public class MessageToBeRetried : IMessage - { - public Guid ContextId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_fail.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_fail.cs deleted file mode 100644 index ec69ec5da..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_fail.cs +++ /dev/null @@ -1,79 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_immediate_retries_fail : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_do_delayed_retries() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => b - .When((session, ctx) => session.SendLocal(new MessageToBeRetried - { - Id = ctx.Id - })) - .DoNotFailOnErrorMessages()) - .Done(c => c.NumberOfRetriesAttempted >= 1) - .Run(); - - Assert.GreaterOrEqual(1, context.NumberOfRetriesAttempted, "Should retry one or more times"); - } - - static TimeSpan Delay = TimeSpan.FromMilliseconds(1); - - class Context : ScenarioContext - { - public Guid Id { get; set; } - - public int NumberOfTimesInvoked { get; set; } - - public int NumberOfRetriesAttempted => NumberOfTimesInvoked - 1 < 0 ? 0 : NumberOfTimesInvoked - 1; - } - - public class DelayedRetryEndpoint : EndpointConfigurationBuilder - { - public DelayedRetryEndpoint() - { - EndpointSetup(config => - { - config.EnableFeature(); - config.Recoverability().Immediate(i => i.NumberOfRetries(0)); - config.Recoverability() - .Delayed(settings => - { - settings.NumberOfRetries(1); - settings.TimeIncrease(Delay); - }); - }); - } - - class MessageToBeRetriedHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageToBeRetried message, IMessageHandlerContext context) - { - if (message.Id != TestContext.Id) - { - return Task.FromResult(0); // messages from previous test runs must be ignored - } - - TestContext.NumberOfTimesInvoked++; - - throw new SimulatedException(); - } - } - } - - public class MessageToBeRetried : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_with_dtc_on.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_with_dtc_on.cs deleted file mode 100644 index b8047c6f3..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_with_dtc_on.cs +++ /dev/null @@ -1,84 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_immediate_retries_with_dtc_on : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_do_the_configured_number_of_retries() - { - Requires.DtcSupport(); - - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => b - .When((session, c) => session.SendLocal(new MessageToBeRetried - { - Id = c.Id - })) - .DoNotFailOnErrorMessages()) - .Done(c => c.GaveUpOnRetries) - .Run(); - - Assert.AreEqual(maxretries + 1, context.NumberOfTimesInvoked, $"The Immediate Retries should retry {maxretries} times"); - Assert.AreEqual(maxretries, context.Logs.Count(l => l.Message - .StartsWith($"Immediate Retry is going to retry message '{context.PhysicalMessageId}' because of an exception:"))); - } - - const int maxretries = 4; - - class Context : ScenarioContext - { - public Guid Id { get; set; } - - public int NumberOfTimesInvoked { get; set; } - - public bool GaveUpOnRetries { get; set; } - - public string PhysicalMessageId { get; set; } - } - - public class RetryEndpoint : EndpointConfigurationBuilder - { - public RetryEndpoint() - { - EndpointSetup((b, context) => - { - var scenarioContext = (Context) context.ScenarioContext; - b.Notifications.Errors.MessageSentToErrorQueue += (sender, message) => scenarioContext.GaveUpOnRetries = true; - var recoverability = b.Recoverability(); - recoverability.Immediate(settings => settings.NumberOfRetries(maxretries)); - recoverability.Delayed(settings => settings.NumberOfRetries(0)); - }); - } - - class MessageToBeRetriedHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageToBeRetried message, IMessageHandlerContext context) - { - if (message.Id != TestContext.Id) - { - return Task.FromResult(0); // messages from previous test runs must be ignored - } - - TestContext.PhysicalMessageId = context.MessageId; - TestContext.NumberOfTimesInvoked++; - - throw new SimulatedException(); - } - } - } - - - public class MessageToBeRetried : IMessage - { - public Guid Id { get; set; } - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_with_native_transactions.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_with_native_transactions.cs deleted file mode 100644 index 3e7c85c6f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_immediate_retries_with_native_transactions.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_immediate_retries_with_native_transactions : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_do_the_configured_number_of_retries_with_native_transactions() - { - var context = await Scenario.Define() - .WithEndpoint(b => b - .When((session, c) => session.SendLocal(new MessageToBeRetried())) - .DoNotFailOnErrorMessages()) - .Done(c => c.ForwardedToErrorQueue) - .Run(); - - Assert.True(context.ForwardedToErrorQueue); - Assert.AreEqual(numberOfRetries + 1, context.NumberOfTimesInvoked, "Message should be retried 5 times immediately"); - Assert.AreEqual(numberOfRetries, context.Logs.Count(l => l.Message - .StartsWith($"Immediate Retry is going to retry message '{context.MessageId}' because of an exception:"))); - } - - const int numberOfRetries = 5; - - class Context : ScenarioContext - { - public int NumberOfTimesInvoked { get; set; } - - public bool ForwardedToErrorQueue { get; set; } - - public string MessageId { get; set; } - } - - public class RetryEndpoint : EndpointConfigurationBuilder - { - public RetryEndpoint() - { - EndpointSetup((config, context) => - { - var scenarioContext = (Context) context.ScenarioContext; - config.Notifications.Errors.MessageSentToErrorQueue += (sender, message) => scenarioContext.ForwardedToErrorQueue = true; - - var recoverability = config.Recoverability(); - recoverability.Immediate(immediate => immediate.NumberOfRetries(numberOfRetries)); - recoverability.Delayed(delayed => delayed.NumberOfRetries(0)); //disable the delayed retries - - config.ConfigureTransport() - .Transactions(TransportTransactionMode.ReceiveOnly); - }); - } - - class MessageToBeRetriedHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageToBeRetried message, IMessageHandlerContext context) - { - TestContext.MessageId = context.MessageId; - TestContext.NumberOfTimesInvoked++; - - throw new SimulatedException(); - } - } - } - - public class MessageToBeRetried : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_fails_retries.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_fails_retries.cs deleted file mode 100644 index 3aeb52b13..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_fails_retries.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Support; - using EndpointTemplates; - using NUnit.Framework; - - public class When_message_fails_retries : NServiceBusAcceptanceTest - { - [Test] - public void Should_forward_message_to_error_queue() - { - var exception = Assert.ThrowsAsync(async () => await Scenario.Define() - .WithEndpoint(b => b - .When((session, c) => session.SendLocal(new MessageWhichFailsRetries()))) - .Done(c => c.FailedMessages.Any()) - .Run()); - - Assert.AreEqual(1, exception.ScenarioContext.FailedMessages.Count); - - var testContext = (Context) exception.ScenarioContext; - Assert.AreEqual(typeof(MessageWhichFailsRetries).AssemblyQualifiedName, exception.FailedMessage.Headers[Headers.EnclosedMessageTypes]); - Assert.AreEqual(testContext.PhysicalMessageId, exception.FailedMessage.MessageId); - Assert.IsAssignableFrom(typeof(SimulatedException), exception.FailedMessage.Exception); - - Assert.AreEqual(1, testContext.Logs.Count(l => l.Message - .StartsWith($"Moving message '{testContext.PhysicalMessageId}' to the error queue 'error' because processing failed due to an exception:"))); - } - - public class RetryEndpoint : EndpointConfigurationBuilder - { - public RetryEndpoint() - { - EndpointSetup(); - } - - class MessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageWhichFailsRetries message, IMessageHandlerContext context) - { - TestContext.PhysicalMessageId = context.MessageId; - throw new SimulatedException(); - } - } - } - - class Context : ScenarioContext - { - public string PhysicalMessageId { get; set; } - } - - public class MessageWhichFailsRetries : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_is_deferred_by_delayed_retries_using_dtc.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_is_deferred_by_delayed_retries_using_dtc.cs deleted file mode 100644 index 3a8ad592e..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_is_deferred_by_delayed_retries_using_dtc.cs +++ /dev/null @@ -1,86 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Threading.Tasks; - using System.Transactions; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_message_is_deferred_by_delayed_retries_using_dtc : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_commit_distributed_transaction() - { - Requires.DtcSupport(); - - var context = await Scenario.Define(c => c.Id = Guid.NewGuid()) - .WithEndpoint(b => b.DoNotFailOnErrorMessages() - .When((session, c) => session.SendLocal(new MessageToFail - { - Id = c.Id - })) - ) - .Done(c => c.FailedMessages.Any()) - .Run(); - - Assert.GreaterOrEqual(context.NumberOfRetriesAttempted, 3, "Should retry at least three times"); - Assert.That(context.TransactionStatuses, Is.All.Not.EqualTo(TransactionStatus.Committed)); - } - - class Context : ScenarioContext - { - public Guid Id { get; set; } - public List TransactionStatuses { get; } = new List(); - public int NumberOfProcessingAttempts { get; set; } - public int NumberOfRetriesAttempted => NumberOfProcessingAttempts - 1 < 0 ? 0 : NumberOfProcessingAttempts - 1; - } - - class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => - { - config.EnableFeature(); - var recoverability = config.Recoverability(); - recoverability.Delayed(settings => - { - settings.NumberOfRetries(3); - settings.TimeIncrease(TimeSpan.FromSeconds(1)); - }); - }); - } - - class FailingHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageToFail message, IMessageHandlerContext context) - { - if (message.Id == TestContext.Id) - { - TestContext.NumberOfProcessingAttempts++; - - Transaction.Current.TransactionCompleted += CaptureTransactionStatus; - } - - throw new SimulatedException(); - } - - void CaptureTransactionStatus(object sender, TransactionEventArgs args) - { - TestContext.TransactionStatuses.Add(args.Transaction.TransactionInformation.Status); - } - } - } - - public class MessageToFail : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_is_moved_to_error_queue_using_dtc.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_is_moved_to_error_queue_using_dtc.cs deleted file mode 100644 index 0ee6ac3d0..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_is_moved_to_error_queue_using_dtc.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Collections.Generic; - using System.Threading.Tasks; - using System.Transactions; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_message_is_moved_to_error_queue_using_dtc : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_commit_distributed_transaction() - { - Requires.DtcSupport(); - - var context = await Scenario.Define(c => c.Id = Guid.NewGuid()) - .WithEndpoint(b => b.DoNotFailOnErrorMessages() - .When((session, ctx) => session.SendLocal(new MessageToFail - { - Id = ctx.Id - })) - ) - .WithEndpoint() - .Done(c => c.MessageMovedToErrorQueue) - .Run(); - - Assert.That(context.TransactionStatuses, Is.All.Not.EqualTo(TransactionStatus.Committed)); - } - - class Context : ScenarioContext - { - public Guid Id { get; set; } - public bool MessageMovedToErrorQueue { get; set; } - public List TransactionStatuses { get; } = new List(); - } - - class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => - { - config.SendFailedMessagesTo(Conventions.EndpointNamingConvention(typeof(ErrorSpy))); - }); - } - - class FailingHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageToFail message, IMessageHandlerContext context) - { - if (message.Id == TestContext.Id) - { - Transaction.Current.TransactionCompleted += CaptureTransactionStatus; - } - - throw new SimulatedException(); - } - - void CaptureTransactionStatus(object sender, TransactionEventArgs args) - { - TestContext.TransactionStatuses.Add(args.Transaction.TransactionInformation.Status); - } - } - } - - class ErrorSpy : EndpointConfigurationBuilder - { - public ErrorSpy() - { - EndpointSetup(); - } - - class Handler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageToFail message, IMessageHandlerContext context) - { - if (message.Id == TestContext.Id) - { - TestContext.MessageMovedToErrorQueue = true; - } - - return Task.FromResult(0); - } - } - } - - public class MessageToFail : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_with_TimeToBeReceived_fails.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_with_TimeToBeReceived_fails.cs deleted file mode 100644 index 1a58bcac0..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_message_with_TimeToBeReceived_fails.cs +++ /dev/null @@ -1,105 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_message_with_TimeToBeReceived_fails : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_honor_TimeToBeReceived_for_error_message() - { - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new MessageThatFails())) - .DoNotFailOnErrorMessages()) - .WithEndpoint() - .Done(c => c.MessageFailed && c.TTBRHasExpiredAndMessageIsStillInErrorQueue) - .Run(); - - Assert.IsTrue(context.MessageFailed); - Assert.IsTrue(context.TTBRHasExpiredAndMessageIsStillInErrorQueue); - } - - class Context : ScenarioContext - { - public bool MessageFailed { get; set; } - public DateTime? FirstTimeProcessedByErrorHandler { get; set; } - public bool TTBRHasExpiredAndMessageIsStillInErrorQueue { get; set; } - } - - class EndpointThatThrows : EndpointConfigurationBuilder - { - public EndpointThatThrows() - { - EndpointSetup(c => c.SendFailedMessagesTo()); - } - - class ThrowingMessageHandler : IHandleMessages - { - public ThrowingMessageHandler(Context context) - { - this.context = context; - } - - public Task Handle(MessageThatFails message, IMessageHandlerContext context1) - { - context.MessageFailed = true; - throw new SimulatedException(); - } - - Context context; - } - } - - class EndpointThatHandlesErrorMessages : EndpointConfigurationBuilder - { - public EndpointThatHandlesErrorMessages() - { - EndpointSetup(); - } - - class ErrorMessageHandler : IHandleMessages - { - public ErrorMessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(MessageThatFails message, IMessageHandlerContext context) - { - var errorProcessingStarted = DateTime.Now; - if (testContext.FirstTimeProcessedByErrorHandler == null) - { - testContext.FirstTimeProcessedByErrorHandler = errorProcessingStarted; - } - - var ttbr = TimeSpan.Parse(context.MessageHeaders[Headers.TimeToBeReceived]); - var ttbrExpired = errorProcessingStarted > testContext.FirstTimeProcessedByErrorHandler.Value + ttbr; - if (ttbrExpired) - { - testContext.TTBRHasExpiredAndMessageIsStillInErrorQueue = true; - var timeElapsedSinceFirstHandlingOfErrorMessage = errorProcessingStarted - testContext.FirstTimeProcessedByErrorHandler.Value; - Console.WriteLine("Error message not removed because of TTBR({0}) after {1}. Succeeded.", ttbr, timeElapsedSinceFirstHandlingOfErrorMessage); - } - else - { - return context.HandleCurrentMessageLater(); - } - - return Task.FromResult(0); // ignore messages from previous test runs - } - - Context testContext; - } - } - - [TimeToBeReceived("00:00:03")] - public class MessageThatFails : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_non_transactional_message_is_moved_to_error_queue.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_non_transactional_message_is_moved_to_error_queue.cs deleted file mode 100644 index 7a28aadc5..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_non_transactional_message_is_moved_to_error_queue.cs +++ /dev/null @@ -1,145 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_non_transactional_message_is_moved_to_error_queue : NServiceBusAcceptanceTest - { - static string ErrorSpyAddress => Conventions.EndpointNamingConvention(typeof(ErrorSpy)); - - [Test] - public async Task Should_dispatch_outgoing_messages() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.DoNotFailOnErrorMessages() - .When((session, c) => session.SendLocal(new InitiatingMessage - { - Id = c.TestRunId - })) - ) - .WithEndpoint() - .Done(c => c.MessageMovedToErrorQueue && c.OutgoingMessageSent) - .Run(); - - Assert.IsTrue(context.FailedMessages.Any(), "Messages should have failed"); - } - - class Context : ScenarioContext - { - public bool MessageMovedToErrorQueue { get; set; } - public bool OutgoingMessageSent { get; set; } - } - - class EndpointWithOutgoingMessages : EndpointConfigurationBuilder - { - public EndpointWithOutgoingMessages() - { - EndpointSetup((config, context) => - { - config.ConfigureTransport() - .Transactions(TransportTransactionMode.None); - config.Pipeline.Register(new ThrowingBehavior(), "Behavior that always throws"); - config.SendFailedMessagesTo(ErrorSpyAddress); - }); - } - - class InitiatingHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - var message = new SubsequentMessage - { - Id = initiatingMessage.Id - }; - return context.Send(ErrorSpyAddress, message); - } - return Task.FromResult(0); - } - } - } - - class EndpointWithFailingHandler : EndpointConfigurationBuilder - { - public EndpointWithFailingHandler() - { - EndpointSetup((config, context) => { config.SendFailedMessagesTo(Conventions.EndpointNamingConvention(typeof(ErrorSpy))); }); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Task Handle(InitiatingMessage message, IMessageHandlerContext context) - { - throw new SimulatedException("message should be moved to the error queue"); - } - } - } - - class ErrorSpy : EndpointConfigurationBuilder - { - public ErrorSpy() - { - EndpointSetup(config => config.LimitMessageProcessingConcurrencyTo(1)); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - TestContext.MessageMovedToErrorQueue = true; - } - - return Task.FromResult(0); - } - } - - class SubsequentMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(SubsequentMessage message, IMessageHandlerContext context) - { - if (message.Id == TestContext.TestRunId) - { - TestContext.OutgoingMessageSent = true; - } - - return Task.FromResult(0); - } - } - } - - class ThrowingBehavior : IBehavior - { - public async Task Invoke(ITransportReceiveContext context, Func next) - { - await next(context).ConfigureAwait(false); - - throw new SimulatedException(); - } - } - - public class InitiatingMessage : IMessage - { - public Guid Id { get; set; } - } - - public class SubsequentMessage : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_receiveonly_message_is_moved_to_error_queue.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_receiveonly_message_is_moved_to_error_queue.cs deleted file mode 100644 index 119ae529b..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_receiveonly_message_is_moved_to_error_queue.cs +++ /dev/null @@ -1,146 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_receiveonly_message_is_moved_to_error_queue : NServiceBusAcceptanceTest - { - static string ErrorSpyAddress => Conventions.EndpointNamingConvention(typeof(ErrorSpy)); - - [Test] - public async Task Should_dispatch_outgoing_messages() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.DoNotFailOnErrorMessages() - .When((session, c) => session.SendLocal(new InitiatingMessage - { - Id = c.TestRunId - })) - ) - .WithEndpoint() - .Done(c => c.MessageMovedToErrorQueue && c.OutgoingMessageSent) - .Run(); - - Assert.IsTrue(context.FailedMessages.Any(), "Messages should have failed"); - } - - class Context : ScenarioContext - { - public bool MessageMovedToErrorQueue { get; set; } - public bool OutgoingMessageSent { get; set; } - } - - class EndpointWithOutgoingMessages : EndpointConfigurationBuilder - { - public EndpointWithOutgoingMessages() - { - EndpointSetup((config, context) => - { - config.ConfigureTransport() - .Transactions(TransportTransactionMode.ReceiveOnly); - config.Pipeline.Register(new ThrowingBehavior(), "Behavior that always throws"); - config.SendFailedMessagesTo(ErrorSpyAddress); - }); - } - - class InitiatingHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - var message = new SubsequentMessage - { - Id = initiatingMessage.Id - }; - return context.Send(ErrorSpyAddress, message); - } - - return Task.FromResult(0); - } - } - } - - class EndpointWithFailingHandler : EndpointConfigurationBuilder - { - public EndpointWithFailingHandler() - { - EndpointSetup((config, context) => { config.SendFailedMessagesTo(Conventions.EndpointNamingConvention(typeof(ErrorSpy))); }); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Task Handle(InitiatingMessage message, IMessageHandlerContext context) - { - throw new SimulatedException("message should be moved to the error queue"); - } - } - } - - class ErrorSpy : EndpointConfigurationBuilder - { - public ErrorSpy() - { - EndpointSetup(config => config.LimitMessageProcessingConcurrencyTo(1)); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - TestContext.MessageMovedToErrorQueue = true; - } - - return Task.FromResult(0); - } - } - - class SubsequentMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(SubsequentMessage message, IMessageHandlerContext context) - { - if (message.Id == TestContext.TestRunId) - { - TestContext.OutgoingMessageSent = true; - } - - return Task.FromResult(0); - } - } - } - - class ThrowingBehavior : IBehavior - { - public async Task Invoke(ITransportReceiveContext context, Func next) - { - await next(context).ConfigureAwait(false); - - throw new SimulatedException(); - } - } - - public class InitiatingMessage : IMessage - { - public Guid Id { get; set; } - } - - public class SubsequentMessage : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_transactions_off.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_transactions_off.cs deleted file mode 100644 index a3f501d6b..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_transactions_off.cs +++ /dev/null @@ -1,88 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_transactions_off : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_do_any_retries() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => b - .When(async (session, ctx) => - { - await session.SendLocal(new MessageToBeRetried - { - Id = ctx.Id - }); - await session.SendLocal(new MessageToBeRetried - { - Id = ctx.Id, - SecondMessage = true - }); - }) - .DoNotFailOnErrorMessages()) - .Done(c => c.SecondMessageReceived && c.NumberOfTimesInvoked >= 1) - .Run(); - - Assert.AreEqual(1, context.NumberOfTimesInvoked, "No retries should be in use if transactions are off"); - } - - public class Context : ScenarioContext - { - public Guid Id { get; set; } - - public int NumberOfTimesInvoked { get; set; } - - public bool SecondMessageReceived { get; set; } - } - - public class RetryEndpoint : EndpointConfigurationBuilder - { - public RetryEndpoint() - { - EndpointSetup((config, context) => - { - config.ConfigureTransport().Transactions(TransportTransactionMode.None); - var recoverability = config.Recoverability(); - recoverability.Immediate(i => i.NumberOfRetries(3)); - recoverability.Delayed(d => d.NumberOfRetries(3)); - }); - } - - class MessageToBeRetriedHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToBeRetried message, IMessageHandlerContext context) - { - if (message.Id != Context.Id) - { - return Task.FromResult(0); // messages from previous test runs must be ignored - } - - if (message.SecondMessage) - { - Context.SecondMessageReceived = true; - return Task.FromResult(0); - } - - Context.NumberOfTimesInvoked++; - - throw new SimulatedException(); - } - } - } - - public class MessageToBeRetried : IMessage - { - public Guid Id { get; set; } - - public bool SecondMessage { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_transactionscope_message_is_moved_to_error_queue.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_transactionscope_message_is_moved_to_error_queue.cs deleted file mode 100644 index cbfb5e085..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_transactionscope_message_is_moved_to_error_queue.cs +++ /dev/null @@ -1,144 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Recoverability -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_transactionscope_message_is_moved_to_error_queue : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_dispatch_outgoing_messages() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.DoNotFailOnErrorMessages() - .When((session, c) => session.SendLocal(new InitiatingMessage - { - Id = c.TestRunId - })) - ) - .WithEndpoint() - .Done(c => c.MessageMovedToErrorQueue) - .Run(); - - Assert.IsFalse(context.OutgoingMessageSent, "Outgoing messages should not be sent"); - Assert.IsTrue(context.FailedMessages.Any(), "There should be failed messages registered in this scenario"); - } - - class Context : ScenarioContext - { - public bool MessageMovedToErrorQueue { get; set; } - public bool OutgoingMessageSent { get; set; } - } - - class EndpointWithOutgoingMessages : EndpointConfigurationBuilder - { - public EndpointWithOutgoingMessages() - { - EndpointSetup((config, context) => - { - config.ConfigureTransport() - .Transactions(TransportTransactionMode.TransactionScope); - config.Pipeline.Register(new ThrowingBehavior(), "Behavior that always throws"); - config.SendFailedMessagesTo(Conventions.EndpointNamingConvention(typeof(ErrorSpy))); - }); - } - - class InitiatingHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public async Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - await context.Send(Conventions.EndpointNamingConvention(typeof(ErrorSpy)), new SubsequentMessage - { - Id = initiatingMessage.Id - }); - } - } - } - } - - class EndpointWithFailingHandler : EndpointConfigurationBuilder - { - public EndpointWithFailingHandler() - { - EndpointSetup((config, context) => { config.SendFailedMessagesTo(Conventions.EndpointNamingConvention(typeof(ErrorSpy))); }); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Task Handle(InitiatingMessage message, IMessageHandlerContext context) - { - throw new SimulatedException("message should be moved to the error queue"); - } - } - } - - class ErrorSpy : EndpointConfigurationBuilder - { - public ErrorSpy() - { - EndpointSetup(config => config.LimitMessageProcessingConcurrencyTo(1)); - } - - class InitiatingMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiatingMessage initiatingMessage, IMessageHandlerContext context) - { - if (initiatingMessage.Id == TestContext.TestRunId) - { - TestContext.MessageMovedToErrorQueue = true; - } - - return Task.FromResult(0); - } - } - - class SubsequentMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(SubsequentMessage message, IMessageHandlerContext context) - { - if (message.Id == TestContext.TestRunId) - { - TestContext.OutgoingMessageSent = true; - } - - return Task.FromResult(0); - } - } - } - - class ThrowingBehavior : IBehavior - { - public async Task Invoke(ITransportReceiveContext context, Func next) - { - await next(context).ConfigureAwait(false); - - throw new SimulatedException(); - } - } - - public class InitiatingMessage : IMessage - { - public Guid Id { get; set; } - } - - public class SubsequentMessage : IMessage - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_extending_event_routing.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_extending_event_routing.cs deleted file mode 100644 index a301ff69b..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_extending_event_routing.cs +++ /dev/null @@ -1,78 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using Features; - using NServiceBus.Routing.MessageDrivenSubscriptions; - using NUnit.Framework; - - public class When_extending_event_routing : NServiceBusAcceptanceTest - { - static string PublisherEndpoint => Conventions.EndpointNamingConvention(typeof(Publisher)); - - [Test] - public async Task Should_route_events_correctly() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.Subscribed, session => session.Publish()) - ) - .WithEndpoint(b => b.When(async (session, c) => { await session.Subscribe(); })) - .Done(c => c.MessageDelivered) - .Run(); - - Assert.True(context.MessageDelivered); - } - - public class Context : ScenarioContext - { - public bool MessageDelivered { get; set; } - public bool Subscribed { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => b.OnEndpointSubscribed((s, context) => { context.Subscribed = true; })); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.DisableFeature(); - c.GetSettings().GetOrCreate() - .AddOrReplacePublishers("CustomRoutingFeature", new List - { - new PublisherTableEntry(typeof(MyEvent), PublisherAddress.CreateFromEndpointName(PublisherEndpoint)) - }); - }); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent evnt, IMessageHandlerContext context) - { - Context.MessageDelivered = true; - return Task.FromResult(0); - } - } - } - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_multi_subscribing_to_a_polymorphic_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_multi_subscribing_to_a_polymorphic_event.cs deleted file mode 100644 index 46a994698..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_multi_subscribing_to_a_polymorphic_event.cs +++ /dev/null @@ -1,136 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_multi_subscribing_to_a_polymorphic_event : NServiceBusAcceptanceTest - { - [Test] - public async Task Both_events_should_be_delivered() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.Publisher1HasASubscriberForIMyEvent, (session, c) => - { - c.AddTrace("Publishing MyEvent1"); - return session.Publish(new MyEvent1()); - })) - .WithEndpoint(b => b.When(c => c.Publisher2HasDetectedASubscriberForEvent2, (session, c) => - { - c.AddTrace("Publishing MyEvent2"); - return session.Publish(new MyEvent2()); - })) - .WithEndpoint(b => b.When(async (session, c) => - { - c.AddTrace("Subscriber1 subscribing to both events"); - await session.Subscribe(); - await session.Subscribe(); - })) - .Done(c => c.SubscriberGotIMyEvent && c.SubscriberGotMyEvent2) - .Run(); - - Assert.True(context.SubscriberGotIMyEvent); - Assert.True(context.SubscriberGotMyEvent2); - - } - - public class Context : ScenarioContext - { - public bool SubscriberGotIMyEvent { get; set; } - public bool SubscriberGotMyEvent2 { get; set; } - public bool Publisher1HasASubscriberForIMyEvent { get; set; } - public bool Publisher2HasDetectedASubscriberForEvent2 { get; set; } - } - - public class Publisher1 : EndpointConfigurationBuilder - { - public Publisher1() - { - EndpointSetup(b => - { - //Immediate Retries on since subscription storages can throw on concurrency violation and need to retry - b.Recoverability().Immediate(immediate => immediate.NumberOfRetries(5)); - b.OnEndpointSubscribed((args, context) => - { - context.AddTrace("Publisher1 OnEndpointSubscribed " + args.MessageType); - if (args.MessageType.Contains(typeof(IMyEvent).Name)) - { - context.Publisher1HasASubscriberForIMyEvent = true; - } - }); - }); - } - } - - public class Publisher2 : EndpointConfigurationBuilder - { - public Publisher2() - { - EndpointSetup(b => - { - // Immediate Retries on since subscription storages can throw on concurrency violation and need to retry - b.Recoverability().Immediate(immediate => immediate.NumberOfRetries(5)); - - b.OnEndpointSubscribed((args, context) => - { - context.AddTrace("Publisher2 OnEndpointSubscribed " + args.MessageType); - - if (args.MessageType.Contains(typeof(MyEvent2).Name)) - { - context.Publisher2HasDetectedASubscriberForEvent2 = true; - } - }); - }); - } - } - - public class Subscriber1 : EndpointConfigurationBuilder - { - public Subscriber1() - { - EndpointSetup(c => c.DisableFeature(), - metadata => - { - metadata.RegisterPublisherFor(typeof(Publisher1)); - metadata.RegisterPublisherFor(typeof(Publisher2)); - }); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IMyEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.AddTrace($"Got event '{messageThatIsEnlisted}'"); - if (messageThatIsEnlisted is MyEvent2) - { - Context.SubscriberGotMyEvent2 = true; - } - else - { - Context.SubscriberGotIMyEvent = true; - } - - return Task.FromResult(0); - } - } - } - - public class MyEvent1 : IMyEvent - { - } - - public class MyEvent2 : IMyEvent - { - } - - public interface IMyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_publishing_from_sendonly.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_publishing_from_sendonly.cs deleted file mode 100644 index 453d2ae91..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_publishing_from_sendonly.cs +++ /dev/null @@ -1,119 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Collections.Generic; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Extensibility; - using Features; - using NServiceBus; - using NUnit.Framework; - using Persistence; - using Unicast.Subscriptions; - using Unicast.Subscriptions.MessageDrivenSubscriptions; - - public class When_publishing_from_sendonly : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_be_delivered_to_all_subscribers() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.Publish(new MyEvent()))) - .WithEndpoint() - .Done(c => c.SubscriberGotTheEvent) - .Run(); - - Assert.True(context.SubscriberGotTheEvent); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotTheEvent { get; set; } - } - - public class SendOnlyPublisher : EndpointConfigurationBuilder - { - public SendOnlyPublisher() - { - EndpointSetup(b => - { - b.SendOnly(); - b.UsePersistence(typeof(HardCodedPersistence)); - b.DisableFeature(); - }); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => c.DisableFeature()); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.SubscriberGotTheEvent = true; - - return Task.FromResult(0); - } - } - } - - - public class MyEvent : IEvent - { - } - - public class HardCodedPersistence : PersistenceDefinition - { - internal HardCodedPersistence() - { - Supports(s => s.EnableFeatureByDefault()); - } - } - - public class HardCodedPersistenceFeature : Feature - { - protected override void Setup(FeatureConfigurationContext context) - { - context.Container.ConfigureComponent(DependencyLifecycle.SingleInstance); - } - } - - public class HardcodedSubscriptionManager : ISubscriptionStorage - { - public HardcodedSubscriptionManager() - { - addressTask = Task.FromResult(new[] - { - new Unicast.Subscriptions.MessageDrivenSubscriptions.Subscriber("publishingFromSendonly.subscriber", null) - }.AsEnumerable()); - } - - public Task Subscribe(Unicast.Subscriptions.MessageDrivenSubscriptions.Subscriber subscriber, MessageType messageType, ContextBag context) - { - return Task.FromResult(0); - } - - public Task Unsubscribe(Unicast.Subscriptions.MessageDrivenSubscriptions.Subscriber subscriber, MessageType messageType, ContextBag context) - { - return Task.FromResult(0); - } - - public Task> GetSubscriberAddressesForMessage(IEnumerable messageTypes, ContextBag context) - { - return addressTask; - } - - Task> addressTask; - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_publishing_to_scaled_out_subscribers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_publishing_to_scaled_out_subscribers.cs deleted file mode 100644 index 9a16e4174..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_publishing_to_scaled_out_subscribers.cs +++ /dev/null @@ -1,108 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_publishing_to_scaled_out_subscribers : NServiceBusAcceptanceTest - { - [Test] - public async Task Each_event_should_be_delivered_to_single_instance_of_each_subscriber() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.SubscribersCounter == 4, async (session, c) => { await session.Publish(new MyEvent()); })) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("1"))) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("2"))) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("1"))) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("2"))) - .Done(c => c.ProcessedByA > 0 && c.ProcessedByB > 0) - .Run(); - - Assert.AreEqual(1, context.ProcessedByA); - Assert.AreEqual(1, context.ProcessedByB); - - } - - public class Context : ScenarioContext - { - public int SubscribersCounter => subscribersCounter; - - public int ProcessedByA => processedByA; - - public int ProcessedByB => processedByB; - - public void IncrementA() - { - Interlocked.Increment(ref processedByA); - } - - public void IncrementB() - { - Interlocked.Increment(ref processedByB); - } - - public void IncrementSubscribersCounter() - { - Interlocked.Increment(ref subscribersCounter); - } - - int processedByA; - int processedByB; - int subscribersCounter; - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(c => { c.OnEndpointSubscribed((s, context) => { context.IncrementSubscribersCounter(); }); }); - } - } - - public class SubscriberA : EndpointConfigurationBuilder - { - public SubscriberA() - { - EndpointSetup(publisherMetadata: metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent message, IMessageHandlerContext context) - { - Context.IncrementA(); - return Task.FromResult(0); - } - } - } - - public class SubscriberB : EndpointConfigurationBuilder - { - public SubscriberB() - { - EndpointSetup(publisherMetadata: metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent message, IMessageHandlerContext context) - { - Context.IncrementB(); - return Task.FromResult(0); - } - } - } - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_base_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_base_event.cs deleted file mode 100644 index e751a73d3..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_base_event.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_subscribing_to_a_base_event : NServiceBusAcceptanceTest - { - [Test] - public async Task Both_base_and_specific_events_should_be_delivered() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.SubscriberSubscribed, async session => - { - await session.Publish(new SpecificEvent()); - await session.Publish(); - })) - .WithEndpoint(b => b.When(async (session, c) => await session.Subscribe())) - .Done(c => c.SubscriberGotBaseEvent && c.SubscriberGotSpecificEvent) - .Run(); - - Assert.True(context.SubscriberGotBaseEvent); - Assert.True(context.SubscriberGotSpecificEvent); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotBaseEvent { get; set; } - public bool SubscriberGotSpecificEvent { get; set; } - public bool SubscriberSubscribed { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => b.OnEndpointSubscribed((args, context) => { context.SubscriberSubscribed = true; })); - } - } - - public class GeneralSubscriber : EndpointConfigurationBuilder - { - public GeneralSubscriber() - { - EndpointSetup(c => { c.DisableFeature(); }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IBaseEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - if (messageThatIsEnlisted is SpecificEvent) - { - Context.SubscriberGotSpecificEvent = true; - } - else - { - Context.SubscriberGotBaseEvent = true; - } - return Task.FromResult(0); - } - } - } - - public class SpecificEvent : IBaseEvent - { - } - - public interface IBaseEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_base_event_with_a_route_for_a_derived_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_base_event_with_a_route_for_a_derived_event.cs deleted file mode 100644 index 47830ca4d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_base_event_with_a_route_for_a_derived_event.cs +++ /dev/null @@ -1,111 +0,0 @@ -// disable obsolete warnings. Test will be removed in next major version -#pragma warning disable CS0618 -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NServiceBus.Config; - using NUnit.Framework; - - public class When_subscribing_to_a_base_event_with_a_route_for_a_derived_event : NServiceBusAcceptanceTest - { - [Test] - public async Task Event_should_be_delivered() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.SubscriberSubscribedToOne, async session => { await session.Publish(new EventOne()); })) - .WithEndpoint(b => b.When(c => c.SubscriberSubscribedToTwo, async session => { await session.Publish(new EventTwo()); })) - .WithEndpoint(b => b.When(async (session, c) => await session.Subscribe())) - .Done(c => c.SubscriberGotEventOne) - .Run(); - - Assert.IsTrue(context.SubscriberGotEventOne); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotEventOne { get; set; } - public bool SubscriberGotEventTwo { get; set; } - - public bool SubscriberSubscribedToOne { get; set; } - public bool SubscriberSubscribedToTwo { get; set; } - } - - public class PublisherOne : EndpointConfigurationBuilder - { - public PublisherOne() - { - EndpointSetup(b => b.OnEndpointSubscribed((args, context) => { context.SubscriberSubscribedToOne = true; })); - } - } - - public class PublisherTwo : EndpointConfigurationBuilder - { - public PublisherTwo() - { - EndpointSetup(b => b.OnEndpointSubscribed((args, context) => { context.SubscriberSubscribedToTwo = true; })); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.DisableFeature(); - }).WithConfig(u => - { - u.MessageEndpointMappings.Add(new MessageEndpointMapping - { - AssemblyName = typeof(EventOne).Assembly.FullName, - TypeFullName = typeof(EventOne).FullName, - Endpoint = Conventions.EndpointNamingConvention(typeof(PublisherOne)) - }); - u.MessageEndpointMappings.Add(new MessageEndpointMapping - { - AssemblyName = typeof(EventTwo).Assembly.FullName, - TypeFullName = typeof(EventTwo).FullName, - Endpoint = Conventions.EndpointNamingConvention(typeof(PublisherTwo)) - }); - }); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IBaseEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - if (messageThatIsEnlisted is EventOne) - { - Context.SubscriberGotEventOne = true; - } - if (messageThatIsEnlisted is EventTwo) - { - Context.SubscriberGotEventTwo = true; - } - return Task.FromResult(0); - } - } - } - - public class EventOne : IBaseEvent - { - } - - public class EventTwo : IBaseEvent - { - } - - public interface IBaseEvent : IEvent - { - } - } -} -#pragma warning restore CS0618 \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_derived_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_derived_event.cs deleted file mode 100644 index 8ca253411..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_a_derived_event.cs +++ /dev/null @@ -1,101 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_subscribing_to_a_derived_event : NServiceBusAcceptanceTest - { - [Test] - public async Task Base_event_should_not_be_delivered() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.SubscriberSubscribed, async session => - { - await session.Publish(); - await session.Send(new Done()); - })) - .WithEndpoint(b => b.When(async (session, c) => await session.Subscribe())) - .Done(c => c.Done) - .Run(); - - Assert.IsFalse(context.SubscriberGotEvent); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotEvent { get; set; } - - public bool SubscriberSubscribed { get; set; } - - public bool Done { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => - { - b.OnEndpointSubscribed((args, context) => - { - context.SubscriberSubscribed = true; - }); - b.ConfigureTransport().Routing().RouteToEndpoint(typeof(Done), typeof(Subscriber)); - }); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.DisableFeature(); - c.LimitMessageProcessingConcurrencyTo(1); //To ensure Done is processed after the event. - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(SpecificEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.SubscriberGotEvent = true; - return Task.FromResult(0); - } - } - - public class DoneHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(Done message, IMessageHandlerContext context) - { - Context.Done = true; - return Task.FromResult(0); - } - } - } - - public class SpecificEvent : IBaseEvent - { - } - - public interface IBaseEvent : IEvent - { - } - - public class Done : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_event_with_routes_to_base_and_specific_events.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_event_with_routes_to_base_and_specific_events.cs deleted file mode 100644 index fce732641..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_event_with_routes_to_base_and_specific_events.cs +++ /dev/null @@ -1,121 +0,0 @@ -// disable obsolete warnings. Test will be removed in next major version -#pragma warning disable CS0618 -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NServiceBus.Config; - using NUnit.Framework; - using AcceptanceTesting.Customization; - - public class When_subscribing_to_event_with_routes_to_base_and_specific_events : NServiceBusAcceptanceTest - { - [Test] - public async Task Event_from_both_publishers_should_be_delivered() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.SubscriberSubscribedToOne, async session => - { - await session.Publish(new EventOne()); - })) - .WithEndpoint(b => b.When(c => c.SubscriberSubscribedToTwo, async session => - { - await session.Publish(new EventTwo()); - })) - .WithEndpoint(b => b.When(async (session, c) => await session.Subscribe())) - .Done(c => c.SubscriberGotEventOne) - .Run(); - - Assert.IsTrue(context.SubscriberGotEventOne); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotEventOne { get; set; } - public bool SubscriberSubscribedToOne { get; set; } - public bool SubscriberSubscribedToTwo { get; set; } - } - - public class PublisherOne : EndpointConfigurationBuilder - { - public PublisherOne() - { - EndpointSetup(b => b.OnEndpointSubscribed((args, context) => - { - context.SubscriberSubscribedToOne = true; - })); - } - } - - public class PublisherTwo : EndpointConfigurationBuilder - { - public PublisherTwo() - { - EndpointSetup(b => b.OnEndpointSubscribed((args, context) => - { - context.SubscriberSubscribedToTwo = true; - })); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.DisableFeature(); - }, metadata => - { - metadata.RegisterPublisherFor(typeof(PublisherTwo)); - metadata.RegisterPublisherFor(typeof(PublisherOne)); - }).WithConfig(u => - { - u.MessageEndpointMappings.Add(new MessageEndpointMapping - { - AssemblyName = typeof(EventTwo).Assembly.FullName, - TypeFullName = typeof(EventTwo).FullName, - Endpoint = Conventions.EndpointNamingConvention(typeof(PublisherTwo)) - }); - u.MessageEndpointMappings.Add(new MessageEndpointMapping - { - AssemblyName = typeof(IBaseEvent).Assembly.FullName, - TypeFullName = typeof(IBaseEvent).FullName, - Endpoint = Conventions.EndpointNamingConvention(typeof(PublisherOne)) - }); - }); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IBaseEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - if (messageThatIsEnlisted is EventOne) - { - Context.SubscriberGotEventOne = true; - } - return Task.FromResult(0); - } - } - } - - public class EventOne : IBaseEvent - { - } - - public class EventTwo : IBaseEvent - { - } - - public interface IBaseEvent : IEvent - { - } - } -} -#pragma warning restore CS0618 \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_multiple_publishers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_multiple_publishers.cs deleted file mode 100644 index 9a104d3f8..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_multiple_publishers.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_subscribing_to_multiple_publishers : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_subscribe_to_all_registered_publishers_of_same_type() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(s => s.Subscribe())) - .WithEndpoint(e => e - .CustomConfig(cfg => - { - cfg.OverrideLocalAddress("Publisher1"); - cfg.OnEndpointSubscribed((args, ctx) => ctx.SubscribedToPublisher1 = true); - })) - .WithEndpoint(e => e - .CustomConfig(cfg => - { - cfg.OverrideLocalAddress("Publisher2"); - cfg.OnEndpointSubscribed((args, ctx) => ctx.SubscribedToPublisher2 = true); - })) - .Done(c => c.SubscribedToPublisher1 && c.SubscribedToPublisher2) - .Run(); - - Assert.That(context.SubscribedToPublisher1, Is.True); - Assert.That(context.SubscribedToPublisher2, Is.True); - - } - - class Context : ScenarioContext - { - public bool SubscribedToPublisher1 { get; set; } - public bool SubscribedToPublisher2 { get; set; } - } - - class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.DisableFeature(); - }, metadata => - { - metadata.RegisterPublisherFor("Publisher1"); - metadata.RegisterPublisherFor("Publisher2"); - }); - } - } - - class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(); - } - } - - public class SomeEvent : IEvent - { - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_scaled_out_publisher.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_scaled_out_publisher.cs deleted file mode 100644 index e260d92ed..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_scaled_out_publisher.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using NServiceBus.Routing; - using NUnit.Framework; - - public class When_subscribing_to_scaled_out_publisher : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_send_subscription_message_to_each_instance() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("1"))) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("2"))) - .WithEndpoint(b => b.When(s => s.Subscribe())) - .Done(c => c.PublisherReceivedSubscription.Count >= 2) - .Run(); - - // each instance should receive a subscription message - Assert.That(context.PublisherReceivedSubscription, Does.Contain("1")); - Assert.That(context.PublisherReceivedSubscription, Does.Contain("2")); - Assert.That(context.PublisherReceivedSubscription.Count, Is.EqualTo(2)); - } - - class Context : ScenarioContext - { - public List PublisherReceivedSubscription { get; } = new List(); - } - - class ScaledOutPublisher : EndpointConfigurationBuilder - { - public ScaledOutPublisher() - { - // store the instance discriminator of each instance receiving a subscription message: - EndpointSetup(c => c - .OnEndpointSubscribed((subscription, context) => - context.PublisherReceivedSubscription.Add(c.GetSettings().Get("EndpointInstanceDiscriminator")))); - } - } - - class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup( - c => - { - var publisherName = Conventions.EndpointNamingConvention(typeof(ScaledOutPublisher)); - c.GetSettings().GetOrCreate().AddOrReplaceInstances("test", new List - { - new EndpointInstance(publisherName, "1"), - new EndpointInstance(publisherName, "2") - }); - }, - metadata => metadata.RegisterPublisherFor(typeof(ScaledOutPublisher))); - } - } - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_unsubscribing_from_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_unsubscribing_from_event.cs deleted file mode 100644 index 4968d9093..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_unsubscribing_from_event.cs +++ /dev/null @@ -1,146 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_unsubscribing_from_event : NServiceBusAcceptanceTest - { - [Test] - public async Task ShouldNoLongerReceiveEvent() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(c => c - .When( - ctx => ctx.Subscriber1Subscribed && ctx.Subscriber2Subscribed, - s => s.Publish(new Event())) - .When( - ctx => ctx.Subscriber2Unsubscribed, - async s => - { - await s.Publish(new Event()); - await s.Publish(new Event()); - await s.Publish(new Event()); - })) - .WithEndpoint(c => c - .When(s => s.Subscribe())) - .WithEndpoint(c => c - .When(s => s.Subscribe()) - .When( - ctx => ctx.Subscriber2ReceivedMessages >= 1, - s => s.Unsubscribe())) - .Done(c => c.Subscriber1ReceivedMessages >= 4) - .Run(); - - Assert.AreEqual(4, context.Subscriber1ReceivedMessages); - Assert.AreEqual(1, context.Subscriber2ReceivedMessages); - Assert.IsTrue(context.Subscriber2Unsubscribed); - } - - public class Context : ScenarioContext - { - public bool Subscriber1Subscribed { get; set; } - public bool Subscriber2Subscribed { get; set; } - public bool Subscriber2Unsubscribed { get; set; } - public int Subscriber1ReceivedMessages; - public int Subscriber2ReceivedMessages; - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(c => - { - c.OnEndpointSubscribed((args, ctx) => - { - if (args.SubscriberReturnAddress.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber1)))) - { - ctx.Subscriber1Subscribed = true; - } - - if (args.SubscriberReturnAddress.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber2)))) - { - ctx.Subscriber2Subscribed = true; - } - }); - c.OnEndpointUnsubscribed((args, ctx) => - { - if (args.SubscriberReturnAddress.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber2)))) - { - ctx.Subscriber2Unsubscribed = true; - } - }); - }); - } - } - - public class Subscriber1 : EndpointConfigurationBuilder - { - public Subscriber1() - { - EndpointSetup(c => - { - c.DisableFeature(); - c.LimitMessageProcessingConcurrencyTo(1); - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class EventHandler : IHandleMessages - { - public EventHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(Event message, IMessageHandlerContext context) - { - Interlocked.Increment(ref testContext.Subscriber1ReceivedMessages); - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class Subscriber2 : EndpointConfigurationBuilder - { - public Subscriber2() - { - EndpointSetup(c => - { - c.DisableFeature(); - c.LimitMessageProcessingConcurrencyTo(1); - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class EventHandler : IHandleMessages - { - public EventHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(Event message, IMessageHandlerContext context) - { - Interlocked.Increment(ref testContext.Subscriber2ReceivedMessages); - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class Event : IEvent - { - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_unsubscribing_to_scaled_out_publisher.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_unsubscribing_to_scaled_out_publisher.cs deleted file mode 100644 index e8742af8a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_unsubscribing_to_scaled_out_publisher.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using NServiceBus.Routing; - using NUnit.Framework; - - public class When_unsubscribing_to_scaled_out_publisher : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_send_unsubscribe_message_to_each_instance() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("1"))) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("2"))) - .WithEndpoint(b => b.When(s => s.Unsubscribe())) - .Done(c => c.PublisherReceivedUnsubscribeMessage.Count >= 2) - .Run(); - - // each instance should receive an unsubscribe message - Assert.That(context.PublisherReceivedUnsubscribeMessage, Does.Contain("1")); - Assert.That(context.PublisherReceivedUnsubscribeMessage, Does.Contain("2")); - Assert.That(context.PublisherReceivedUnsubscribeMessage.Count, Is.EqualTo(2)); - } - - class Context : ScenarioContext - { - public List PublisherReceivedUnsubscribeMessage { get; } = new List(); - } - - class ScaledOutPublisher : EndpointConfigurationBuilder - { - public ScaledOutPublisher() - { - // store the instance discriminator of each instance receiving a unsubscribe message: - EndpointSetup(c => - { - c.OnEndpointUnsubscribed((subscription, context) => - context.PublisherReceivedUnsubscribeMessage.Add(c.GetSettings().Get("EndpointInstanceDiscriminator"))); - }); - } - } - - class Unsubscriber : EndpointConfigurationBuilder - { - public Unsubscriber() - { - EndpointSetup( - c => - { - var publisherName = Conventions.EndpointNamingConvention(typeof(ScaledOutPublisher)); - c.GetSettings().GetOrCreate().AddOrReplaceInstances("test", new List - { - new EndpointInstance(publisherName, "1"), - new EndpointInstance(publisherName, "2") - }); - }, - metadata => metadata.RegisterPublisherFor(typeof(ScaledOutPublisher))); - } - } - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_assembly_level_message_mapping_for_pub_sub.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_assembly_level_message_mapping_for_pub_sub.cs deleted file mode 100644 index 61fbb8670..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_assembly_level_message_mapping_for_pub_sub.cs +++ /dev/null @@ -1,112 +0,0 @@ -// disable obsolete warnings. Test will be removed in next major version -#pragma warning disable CS0618 -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NServiceBus.Config; - using NUnit.Framework; - - public class When_using_assembly_level_message_mapping_for_pub_sub : NServiceBusAcceptanceTest - { - [Test] - public async Task The_mapping_should_not_cause_publishing_to_non_subscribers() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint() - .WithEndpoint(b => - b.When(c => c.EndpointsStarted, async session => - { - await session.Publish(new MyEvent()); - await session.Send(new DoneCommand()); - }) - ) - .Done(c => c.CommandReceived || c.EventReceived) - .Run(); - - Assert.IsFalse(context.EventReceived); - Assert.IsTrue(context.CommandReceived); - } - - public class Context : ScenarioContext - { - public bool EventReceived { get; set; } - public bool CommandReceived { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup() - .WithConfig(c => - { - c.MessageEndpointMappings = new MessageEndpointMappingCollection(); - c.MessageEndpointMappings.Add(new MessageEndpointMapping - { - Endpoint = Conventions.EndpointNamingConvention(typeof(OtherEndpoint)), - AssemblyName = typeof(Publisher).Assembly.GetName().Name - }); - }); - } - } - - public class OtherEndpoint : EndpointConfigurationBuilder - { - public OtherEndpoint() - { - EndpointSetup(c => - { - // do not subscribe to the event since we don't want to receive it. - c.DisableFeature(); - }); - } - - public class EventHandler : IHandleMessages - { - public EventHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(MyEvent message, IMessageHandlerContext context) - { - testContext.EventReceived = true; - return Task.FromResult(0); - } - - Context testContext; - } - - public class DoneHandler : IHandleMessages - { - public DoneHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(DoneCommand message, IMessageHandlerContext context) - { - testContext.CommandReceived = true; - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class MyEvent : IEvent - { - } - - public class DoneCommand : ICommand - { - } - } -} -#pragma warning restore CS0618 \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_autosubscribe_with_missing_routing_information.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_autosubscribe_with_missing_routing_information.cs deleted file mode 100644 index 78f0accf9..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_autosubscribe_with_missing_routing_information.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_using_autosubscribe_with_missing_routing_information : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_skip_events_with_missing_routes() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint() - .Done(c => c.EndpointsStarted) - .Run(); - - Assert.True(context.EndpointsStarted); - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(); - } - - public class MyEventHandler : IHandleMessages - { - public Task Handle(MyEvent @event, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_legacy_routing_configuration.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_legacy_routing_configuration.cs deleted file mode 100644 index f05e12d01..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_legacy_routing_configuration.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.MessageDrivenSubscriptions -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_using_legacy_routing_configuration : NServiceBusAcceptanceTest - { - [Test] - public async Task Events_routes_and_command_routes_should_be_kept_separate() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.Subscribed, async session => - { - await session.Publish(new MyEvent()); - await session.Send(new DoneCommand()); - }) - ) - .WithEndpoint(b => b.When(session => session.Subscribe())) - .Done(c => c.Done) - .Run(); - - Assert.True(context.HandlerInvoked == 1); - } - - public class Context : ScenarioContext - { - public int HandlerInvoked { get; set; } - public bool Subscribed { get; set; } - public bool Done { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => - { - b.OnEndpointSubscribed((s, context) => { context.Subscribed = true; }); - b.ConfigureTransport().Routing().RouteToEndpoint(typeof(DoneCommand), typeof(Subscriber)); - }); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.DisableFeature(); - c.LimitMessageProcessingConcurrencyTo(1); - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.HandlerInvoked++; - return Task.FromResult(0); - } - } - - public class DoneHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(DoneCommand message, IMessageHandlerContext context) - { - Context.Done = true; - return Task.FromResult(0); - } - } - } - - public class DoneCommand : ICommand - { - } - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_multi_subscribing_to_a_polymorphic_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_multi_subscribing_to_a_polymorphic_event.cs deleted file mode 100644 index 137b67c74..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_multi_subscribing_to_a_polymorphic_event.cs +++ /dev/null @@ -1,96 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.NativePublishSubscribe -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_multi_subscribing_to_a_polymorphic_event : NServiceBusAcceptanceTest - { - [Test] - public async Task Both_events_should_be_delivered() - { - Requires.NativePubSubSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.EndpointsStarted, (session, c) => - { - c.AddTrace("Publishing MyEvent1"); - return session.Publish(new MyEvent1()); - })) - .WithEndpoint(b => b.When(c => c.EndpointsStarted, (session, c) => - { - c.AddTrace("Publishing MyEvent2"); - return session.Publish(new MyEvent2()); - })) - .WithEndpoint() - .Done(c => c.SubscriberGotIMyEvent && c.SubscriberGotMyEvent2) - .Run(); - - Assert.True(context.SubscriberGotIMyEvent); - Assert.True(context.SubscriberGotMyEvent2); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotIMyEvent { get; set; } - public bool SubscriberGotMyEvent2 { get; set; } - } - - public class Publisher1 : EndpointConfigurationBuilder - { - public Publisher1() - { - EndpointSetup(); - } - } - - public class Publisher2 : EndpointConfigurationBuilder - { - public Publisher2() - { - EndpointSetup(); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IMyEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.AddTrace($"Got event '{messageThatIsEnlisted}'"); - if (messageThatIsEnlisted is MyEvent2) - { - Context.SubscriberGotMyEvent2 = true; - } - else - { - Context.SubscriberGotIMyEvent = true; - } - - return Task.FromResult(0); - } - } - } - - public class MyEvent1 : IMyEvent - { - } - - public class MyEvent2 : IMyEvent - { - } - - public interface IMyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_from_sendonly.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_from_sendonly.cs deleted file mode 100644 index 608bad8d4..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_from_sendonly.cs +++ /dev/null @@ -1,65 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.NativePublishSubscribe -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NServiceBus; - using NUnit.Framework; - - public class When_publishing_from_sendonly : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_be_delivered_to_all_subscribers() - { - Requires.NativePubSubSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.Publish(new MyEvent()))) - .WithEndpoint() - .Done(c => c.SubscriberGotTheEvent) - .Run(); - - Assert.True(context.SubscriberGotTheEvent); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotTheEvent { get; set; } - } - - public class SendOnlyPublisher : EndpointConfigurationBuilder - { - public SendOnlyPublisher() - { - EndpointSetup(b => - { - b.SendOnly(); - }); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.SubscriberGotTheEvent = true; - - return Task.FromResult(0); - } - } - } - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_to_scaled_out_subscribers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_to_scaled_out_subscribers.cs deleted file mode 100644 index 88dd4350a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_to_scaled_out_subscribers.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.NativePublishSubscribe -{ - using System.Threading; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_publishing_to_scaled_out_subscribers : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_route_event_to_shared_queue() - { - Requires.NativePubSubSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.EndpointsStarted, async (session, c) => { await session.Publish(new MyEvent()); })) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("1"))) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("2"))) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("1"))) - .WithEndpoint(b => b.CustomConfig(c => c.MakeInstanceUniquelyAddressable("2"))) - .Done(c => c.SubscriberACounter > 0 && c.SubscriberBCounter > 0) - .Run(); - - Assert.IsTrue(context.SubscriberACounter == 1); - Assert.IsTrue(context.SubscriberBCounter == 1); - } - - public class Context : ScenarioContext - { - public int SubscriberACounter => subscriberACounter; - - public int SubscriberBCounter => subscriberBCounter; - - public void IncrementSubscriberACounter() - { - Interlocked.Increment(ref subscriberACounter); - } - - public void IncrementSubscriberBCounter() - { - Interlocked.Increment(ref subscriberBCounter); - } - - int subscriberACounter; - int subscriberBCounter; - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(); - } - } - - public class SubscriberA : EndpointConfigurationBuilder - { - public SubscriberA() - { - EndpointSetup(); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent message, IMessageHandlerContext context) - { - Context.IncrementSubscriberACounter(); - return Task.FromResult(0); - } - } - } - - public class SubscriberB : EndpointConfigurationBuilder - { - public SubscriberB() - { - EndpointSetup(); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent message, IMessageHandlerContext context) - { - Context.IncrementSubscriberBCounter(); - return Task.FromResult(0); - } - } - } - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_subscribing_to_a_base_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_subscribing_to_a_base_event.cs deleted file mode 100644 index b8420536a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_subscribing_to_a_base_event.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.NativePublishSubscribe -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_subscribing_to_a_base_event : NServiceBusAcceptanceTest - { - [Test] - public async Task Both_base_and_specific_events_should_be_delivered() - { - Requires.NativePubSubSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.SubscriberSubscribed, async session => - { - await session.Publish(new SpecificEvent()); - await session.Publish(); - })) - .WithEndpoint(b => b.When(async (session, c) => - { - await session.Subscribe(); - c.SubscriberSubscribed = true; - })) - .Done(c => c.SubscriberGotBaseEvent && c.SubscriberGotSpecificEvent) - .Run(); - - Assert.True(context.SubscriberGotBaseEvent); - Assert.True(context.SubscriberGotSpecificEvent); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotBaseEvent { get; set; } - public bool SubscriberGotSpecificEvent { get; set; } - public bool SubscriberSubscribed { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(); - } - } - - public class GeneralSubscriber : EndpointConfigurationBuilder - { - public GeneralSubscriber() - { - EndpointSetup(c => { c.DisableFeature(); }); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IBaseEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - if (messageThatIsEnlisted is SpecificEvent) - { - Context.SubscriberGotSpecificEvent = true; - } - else - { - Context.SubscriberGotBaseEvent = true; - } - return Task.FromResult(0); - } - } - } - - public class SpecificEvent : IBaseEvent - { - } - - public interface IBaseEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_subscribing_to_a_derived_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_subscribing_to_a_derived_event.cs deleted file mode 100644 index 308ca19bd..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_subscribing_to_a_derived_event.cs +++ /dev/null @@ -1,98 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.NativePublishSubscribe -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_subscribing_to_a_derived_event : NServiceBusAcceptanceTest - { - [Test] - public async Task Base_event_should_not_be_delivered() - { - Requires.NativePubSubSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.SubscriberSubscribed, async session => - { - await session.Publish(); - await session.Send(new Done()); - })) - .WithEndpoint(b => b.When(async (session, c) => - { - await session.Subscribe(); - c.SubscriberSubscribed = true; - })) - .Done(c => c.Done) - .Run(); - - Assert.IsFalse(context.SubscriberGotEvent); - } - - public class Context : ScenarioContext - { - public bool SubscriberGotEvent { get; set; } - - public bool SubscriberSubscribed { get; set; } - - public bool Done { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => - b.ConfigureTransport().Routing().RouteToEndpoint(typeof(Done), typeof(Subscriber))); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.DisableFeature(); - c.LimitMessageProcessingConcurrencyTo(1); //To ensure Done is processed after the event. - }); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(SpecificEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.SubscriberGotEvent = true; - return Task.FromResult(0); - } - } - - public class DoneHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(Done message, IMessageHandlerContext context) - { - Context.Done = true; - return Task.FromResult(0); - } - } - } - - public class SpecificEvent : IBaseEvent - { - } - - public interface IBaseEvent : IEvent - { - } - - public class Done : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_unsubscribing_from_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_unsubscribing_from_event.cs deleted file mode 100644 index ba35008d1..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_unsubscribing_from_event.cs +++ /dev/null @@ -1,128 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing.NativePublishSubscribe -{ - using System.Threading; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_unsubscribing_from_event : NServiceBusAcceptanceTest - { - [Test] - public async Task ShouldNoLongerReceiveEvent() - { - Requires.NativePubSubSupport(); - - var context = await Scenario.Define() - .WithEndpoint(c => c - .When( - ctx => ctx.Subscriber1Subscribed && ctx.Subscriber2Subscribed, - s => s.Publish(new Event())) - .When( - ctx => ctx.Subscriber2Unsubscribed, - async s => - { - await s.Publish(new Event()); - await s.Publish(new Event()); - await s.Publish(new Event()); - })) - .WithEndpoint(c => c - .When(async (s, ctx) => - { - await s.Subscribe(); - ctx.Subscriber1Subscribed = true; - })) - .WithEndpoint(c => c - .When(async (s, ctx) => - { - await s.Subscribe(); - ctx.Subscriber2Subscribed = true; - }) - .When( - ctx => ctx.Subscriber2ReceivedMessages >= 1, - async (s, ctx) => - { - await s.Unsubscribe(); - ctx.Subscriber2Unsubscribed = true; - })) - .Done(c => c.Subscriber1ReceivedMessages >= 4) - .Run(); - - Assert.AreEqual(4, context.Subscriber1ReceivedMessages); - Assert.AreEqual(1, context.Subscriber2ReceivedMessages); - Assert.IsTrue(context.Subscriber2Unsubscribed); - } - - public class Context : ScenarioContext - { - public bool Subscriber1Subscribed; - public bool Subscriber2Subscribed; - public bool Subscriber2Unsubscribed; - public int Subscriber1ReceivedMessages; - public int Subscriber2ReceivedMessages; - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(); - } - } - - public class Subscriber1 : EndpointConfigurationBuilder - { - public Subscriber1() - { - EndpointSetup(c => { c.DisableFeature(); }); - } - - public class EventHandler : IHandleMessages - { - public EventHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(Event message, IMessageHandlerContext context) - { - Interlocked.Increment(ref testContext.Subscriber1ReceivedMessages); - - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class Subscriber2 : EndpointConfigurationBuilder - { - public Subscriber2() - { - EndpointSetup(c => { c.DisableFeature(); }); - } - - public class EventHandler : IHandleMessages - { - public EventHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(Event message, IMessageHandlerContext context) - { - Interlocked.Increment(ref testContext.Subscriber2ReceivedMessages); - - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class Event : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionBehavior.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionBehavior.cs deleted file mode 100644 index ef573220a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionBehavior.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using NServiceBus.Pipeline; - using Transport; - - class SubscriptionBehavior : IBehavior where TContext : ScenarioContext - { - public SubscriptionBehavior(Action action, TContext scenarioContext, MessageIntentEnum intentToHandle) - { - this.action = action; - this.scenarioContext = scenarioContext; - this.intentToHandle = intentToHandle; - } - - public async Task Invoke(ITransportReceiveContext context, Func next) - { - await next(context).ConfigureAwait(false); - var subscriptionMessageType = GetSubscriptionMessageTypeFrom(context.Message); - if (subscriptionMessageType != null) - { - string returnAddress; - if (!context.Message.Headers.TryGetValue(Headers.SubscriberTransportAddress, out returnAddress)) - { - context.Message.Headers.TryGetValue(Headers.ReplyToAddress, out returnAddress); - } - - var intent = (MessageIntentEnum)Enum.Parse(typeof(MessageIntentEnum), context.Message.Headers[Headers.MessageIntent], true); - if (intent != intentToHandle) - { - return; - } - - action(new SubscriptionEventArgs - { - MessageType = subscriptionMessageType, - SubscriberReturnAddress = returnAddress - }, scenarioContext); - } - } - - static string GetSubscriptionMessageTypeFrom(IncomingMessage msg) - { - string headerValue; - return msg.Headers.TryGetValue(Headers.SubscriptionMessageType, out headerValue) ? headerValue : null; - } - - Action action; - TContext scenarioContext; - MessageIntentEnum intentToHandle; - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionBehaviorExtensions.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionBehaviorExtensions.cs deleted file mode 100644 index a2b5c7893..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionBehaviorExtensions.cs +++ /dev/null @@ -1,26 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System; - using AcceptanceTesting; - - static class SubscriptionBehaviorExtensions - { - public static void OnEndpointSubscribed(this EndpointConfiguration configuration, Action action) where TContext : ScenarioContext - { - configuration.Pipeline.Register("NotifySubscriptionBehavior", builder => - { - var context = builder.Build(); - return new SubscriptionBehavior(action, context, MessageIntentEnum.Subscribe); - }, "Provides notifications when endpoints subscribe"); - } - - public static void OnEndpointUnsubscribed(this EndpointConfiguration configuration, Action action) where TContext : ScenarioContext - { - configuration.Pipeline.Register("NotifyUnsubscriptionBehavior", builder => - { - var context = builder.Build(); - return new SubscriptionBehavior(action, context, MessageIntentEnum.Unsubscribe); - }, "Provides notifications when endpoints unsubscribe"); - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionEventArgs.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionEventArgs.cs deleted file mode 100644 index fb19ac575..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/SubscriptionEventArgs.cs +++ /dev/null @@ -1,15 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - public class SubscriptionEventArgs - { - /// - /// The address of the subscriber. - /// - public string SubscriberReturnAddress { get; set; } - - /// - /// The type of message the client subscribed to. - /// - public string MessageType { get; set; } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_base_event_from_2_publishers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_base_event_from_2_publishers.cs deleted file mode 100644 index b79cc0f39..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_base_event_from_2_publishers.cs +++ /dev/null @@ -1,125 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_base_event_from_2_publishers : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_receive_events_from_all_publishers() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.SubscribedToPublisher1, session => session.Publish(new DerivedEvent1())) - ) - .WithEndpoint(b => - b.When(c => c.SubscribedToPublisher2, session => session.Publish(new DerivedEvent2())) - ) - .WithEndpoint(b => b.When(c => c.EndpointsStarted, async (session, c) => - { - await session.Subscribe(); - await session.Subscribe(); - - if (c.HasNativePubSubSupport) - { - c.SubscribedToPublisher1 = true; - c.SubscribedToPublisher2 = true; - } - })) - .Done(c => c.GotTheEventFromPublisher1 && c.GotTheEventFromPublisher2) - .Run(); - - Assert.True(context.GotTheEventFromPublisher1); - Assert.True(context.GotTheEventFromPublisher2); - } - - public class Context : ScenarioContext - { - public bool GotTheEventFromPublisher1 { get; set; } - public bool GotTheEventFromPublisher2 { get; set; } - public bool SubscribedToPublisher1 { get; set; } - public bool SubscribedToPublisher2 { get; set; } - } - - public class Publisher1 : EndpointConfigurationBuilder - { - public Publisher1() - { - EndpointSetup(b => b.OnEndpointSubscribed((s, context) => - { - context.AddTrace("Publisher1 SubscriberReturnAddress=" + s.SubscriberReturnAddress); - if (s.SubscriberReturnAddress.Contains("Subscriber1")) - { - context.SubscribedToPublisher1 = true; - } - })); - } - } - - public class Publisher2 : EndpointConfigurationBuilder - { - public Publisher2() - { - EndpointSetup(b => b.OnEndpointSubscribed((s, context) => - { - context.AddTrace("Publisher2 SubscriberReturnAddress=" + s.SubscriberReturnAddress); - - if (s.SubscriberReturnAddress.Contains("Subscriber1")) - { - context.SubscribedToPublisher2 = true; - } - })); - } - } - - public class Subscriber1 : EndpointConfigurationBuilder - { - public Subscriber1() - { - EndpointSetup(c => c.DisableFeature(), - metadata => - { - metadata.RegisterPublisherFor(typeof(Publisher1)); - metadata.RegisterPublisherFor(typeof(Publisher2)); - }); - } - - public class BaseEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(BaseEvent message, IMessageHandlerContext context) - { - if (message.GetType().FullName.Contains("DerivedEvent1")) - { - Context.GotTheEventFromPublisher1 = true; - } - if (message.GetType().FullName.Contains("DerivedEvent2")) - { - Context.GotTheEventFromPublisher2 = true; - } - - return Task.FromResult(0); - } - } - } - - - public class BaseEvent : IEvent - { - } - - - public class DerivedEvent1 : BaseEvent - { - } - - - public class DerivedEvent2 : BaseEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_configure_routes_for_unobtrusive_messages.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_configure_routes_for_unobtrusive_messages.cs deleted file mode 100644 index a96196d09..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_configure_routes_for_unobtrusive_messages.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using NUnit.Framework; - - public class When_configure_routes_for_unobtrusive_messages : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_use_routes_from_routing_api() - { - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(s => s.Send(new SomeCommand()))) - .WithEndpoint() - .Done(c => c.ReceivedMessage) - .Run(); - - Assert.That(context.ReceivedMessage, Is.True); - } - - [Test] - public async Task Should_use_routes_from_endpoint_mapping() - { - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(s => s.Send(new SomeCommand()))) - .WithEndpoint() - .Done(c => c.ReceivedMessage) - .Run(); - - Assert.That(context.ReceivedMessage, Is.True); - } - - public class Context : ScenarioContext - { - public bool ReceivedMessage { get; set; } - } - - public class SendingEndpointUsingRoutingApi : EndpointConfigurationBuilder - { - public SendingEndpointUsingRoutingApi() - { - EndpointSetup(c => - { - c.Conventions().DefiningCommandsAs(t => t == typeof(SomeCommand)); - - var routing = new RoutingSettings(c.GetSettings()); - routing.RouteToEndpoint(typeof(SomeCommand).Assembly, Conventions.EndpointNamingConvention(typeof(ReceivingEndpoint))); - }).ExcludeType(); //exclude type to simulate an unobtrusive message assembly which isn't automatically loaded. - } - } - - public class SendingEndpointUsingEndpointMapping : EndpointConfigurationBuilder - { - public SendingEndpointUsingEndpointMapping() - { - EndpointSetup(c => - { - c.Conventions().DefiningCommandsAs(t => t == typeof(SomeCommand)); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(SomeCommand), typeof(ReceivingEndpoint)); - }).ExcludeType(); //exclude type to simulate an unobtrusive message assembly which isn't automatically loaded. - } - } - - public class ReceivingEndpoint : EndpointConfigurationBuilder - { - public ReceivingEndpoint() - { - EndpointSetup(c => c - .Conventions() - .DefiningCommandsAs(t => t == typeof(SomeCommand))); - } - - public class CommandHandler : IHandleMessages - { - Context testContext; - - public CommandHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(SomeCommand message, IMessageHandlerContext context) - { - testContext.ReceivedMessage = true; - return Task.FromResult(0); - } - } - } - - public class SomeCommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_extending_command_routing.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_extending_command_routing.cs deleted file mode 100644 index 6bdfcbc12..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_extending_command_routing.cs +++ /dev/null @@ -1,101 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Collections.Generic; - using System.Linq; - using System.Threading; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using NServiceBus.Routing; - using NUnit.Framework; - - public class When_extending_command_routing : NServiceBusAcceptanceTest - { - static string ReceiverEndpoint => Conventions.EndpointNamingConvention(typeof(Receiver)); - - [Test] - public async Task Should_route_commands_correctly() - { - var ctx = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.EndpointsStarted, async session => - { - await session.Send(new MyCommand()); - await session.Send(new MyCommand()); - await session.Send(new MyCommand()); - await session.Send(new MyCommand()); - }) - ) - .WithEndpoint() - .Done(c => c.MessageDelivered >= 4) - .Run(); - - Assert.IsTrue(ctx.MessageDelivered >= 4); - } - - public class Context : ScenarioContext - { - public int MessageDelivered; - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.GetSettings().GetOrCreate() - .AddOrReplaceRoutes("CustomRoutingFeature", new List - { - new RouteTableEntry(typeof(MyCommand), UnicastRoute.CreateFromEndpointName(ReceiverEndpoint)) - }); - c.GetSettings().GetOrCreate() - .AddOrReplaceInstances("CustomRoutingFeature", new List - { - new EndpointInstance(ReceiverEndpoint, "XYZ"), - new EndpointInstance(ReceiverEndpoint, "ABC") - }); - c.GetSettings().GetOrCreate() - .SetDistributionStrategy(new XyzDistributionStrategy(ReceiverEndpoint)); - }); - } - - class XyzDistributionStrategy : DistributionStrategy - { - public XyzDistributionStrategy(string endpoint) : base(endpoint, DistributionStrategyScope.Send) - { - } - - public override string SelectReceiver(string[] receiverAddresses) - { - return receiverAddresses.First(x => x.Contains("XYZ")); - } - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(c => c.MakeInstanceUniquelyAddressable("XYZ")); - } - - public class MyCommandHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyCommand evnt, IMessageHandlerContext context) - { - Interlocked.Increment(ref Context.MessageDelivered); - return Task.FromResult(0); - } - } - } - - public class MyCommand : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_multiple_mappings_exists.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_multiple_mappings_exists.cs deleted file mode 100644 index 01262e0d1..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_multiple_mappings_exists.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_multiple_mappings_exists : NServiceBusAcceptanceTest - { - [Test] - public async Task First_registration_should_be_the_final_destination() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.Send(new MyCommand1()))) - .WithEndpoint() - .WithEndpoint() - .Done(c => c.WasCalled1 || c.WasCalled2) - .Run(); - - Assert.IsTrue(context.WasCalled1); - Assert.IsFalse(context.WasCalled2); - } - - public class Context : ScenarioContext - { - public bool WasCalled1 { get; set; } - public bool WasCalled2 { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - var routing = c.ConfigureTransport().Routing(); - routing.RouteToEndpoint(typeof(MyCommand1), typeof(Receiver1)); - routing.RouteToEndpoint(typeof(MyCommand2), typeof(Receiver2)); - }); - } - } - - public class Receiver1 : EndpointConfigurationBuilder - { - public Receiver1() - { - EndpointSetup(); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyBaseCommand message, IMessageHandlerContext context) - { - Context.WasCalled1 = true; - return Task.Delay(2000); // Just to be sure the other receiver is finished - } - } - } - - public class Receiver2 : EndpointConfigurationBuilder - { - public Receiver2() - { - EndpointSetup(); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyBaseCommand message, IMessageHandlerContext context) - { - Context.WasCalled2 = true; - return Task.Delay(2000); // Just to be sure the other receiver is finished - } - } - } - - - public abstract class MyBaseCommand : ICommand - { - } - - - public class MyCommand1 : MyBaseCommand - { - } - - - public class MyCommand2 : MyBaseCommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_overriding_local_address.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_overriding_local_address.cs deleted file mode 100644 index d4150783f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_overriding_local_address.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_overriding_local_address : NServiceBusAcceptanceTest - { - public static string ReceiverEndpointName => Conventions.EndpointNamingConvention(typeof(Receiver)); - public static string ReceiverQueueName => "q_" + ReceiverEndpointName; - - [Test] - public async Task Should_use_the_provided_address_as_input_queue_name() - { - var context = await Scenario.Define() - .WithEndpoint(e => e.When(c => - { - var options = new SendOptions(); - options.SetDestination(ReceiverQueueName); - return c.Send(new Message(), options); - })) - .WithEndpoint() - .Done(c => c.ReceivedMessage) - .Run(); - - Assert.That(context.ReceivedMessage, Is.True); - } - - public class Context : ScenarioContext - { - public bool ReceivedMessage { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => { }); - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(c => c.OverrideLocalAddress(ReceiverQueueName)); - } - - public class MessageHandler : IHandleMessages - { - public MessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(Message message, IMessageHandlerContext context) - { - testContext.ReceivedMessage = true; - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class Message : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing.cs deleted file mode 100644 index fda4ea374..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing.cs +++ /dev/null @@ -1,202 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_publishing : NServiceBusAcceptanceTest - { - [Test] - public async Task Issue_1851() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.Subscriber3Subscribed, session => session.Publish()) - ) - .WithEndpoint(b => b.When(async (session, ctx) => - { - await session.Subscribe(); - - if (ctx.HasNativePubSubSupport) - { - ctx.Subscriber3Subscribed = true; - } - })) - .Done(c => c.Subscriber3GotTheEvent) - .Run(); - - Assert.True(context.Subscriber3GotTheEvent); - } - - [Test] - public async Task Should_be_delivered_to_all_subscribers() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.Subscriber1Subscribed && c.Subscriber2Subscribed, (session, c) => - { - c.AddTrace("Both subscribers is subscribed, going to publish MyEvent"); - - var options = new PublishOptions(); - - options.SetHeader("MyHeader", "SomeValue"); - return session.Publish(new MyEvent(), options); - }) - ) - .WithEndpoint(b => b.When(async (session, ctx) => - { - await session.Subscribe(); - if (ctx.HasNativePubSubSupport) - { - ctx.Subscriber1Subscribed = true; - ctx.AddTrace("Subscriber1 is now subscribed (at least we have asked the broker to be subscribed)"); - } - else - { - ctx.AddTrace("Subscriber1 has now asked to be subscribed to MyEvent"); - } - })) - .WithEndpoint(b => b.When(async (session, ctx) => - { - await session.Subscribe(); - - if (ctx.HasNativePubSubSupport) - { - ctx.Subscriber2Subscribed = true; - ctx.AddTrace("Subscriber2 is now subscribed (at least we have asked the broker to be subscribed)"); - } - else - { - ctx.AddTrace("Subscriber2 has now asked to be subscribed to MyEvent"); - } - })) - .Done(c => c.Subscriber1GotTheEvent && c.Subscriber2GotTheEvent) - .Run(TimeSpan.FromSeconds(10)); - - Assert.True(context.Subscriber1GotTheEvent); - Assert.True(context.Subscriber2GotTheEvent); - } - - public class Context : ScenarioContext - { - public bool Subscriber1GotTheEvent { get; set; } - public bool Subscriber2GotTheEvent { get; set; } - public bool Subscriber3GotTheEvent { get; set; } - public bool Subscriber1Subscribed { get; set; } - public bool Subscriber2Subscribed { get; set; } - public bool Subscriber3Subscribed { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => - { - b.OnEndpointSubscribed((s, context) => - { - if (s.SubscriberReturnAddress.Contains("Subscriber1")) - { - context.Subscriber1Subscribed = true; - context.AddTrace("Subscriber1 is now subscribed"); - } - - if (s.SubscriberReturnAddress.Contains("Subscriber2")) - { - context.AddTrace("Subscriber2 is now subscribed"); - context.Subscriber2Subscribed = true; - } - }); - b.DisableFeature(); - }); - } - } - - public class Publisher3 : EndpointConfigurationBuilder - { - public Publisher3() - { - EndpointSetup(b => b.OnEndpointSubscribed((s, context) => - { - if (s.SubscriberReturnAddress.Contains("Subscriber3")) - { - context.Subscriber3Subscribed = true; - } - })); - } - } - - public class Subscriber3 : EndpointConfigurationBuilder - { - public Subscriber3() - { - EndpointSetup(c => c.DisableFeature(), - metadata => metadata.RegisterPublisherFor(typeof(Publisher3))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IFoo messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.Subscriber3GotTheEvent = true; - return Task.FromResult(0); - } - } - } - - public class Subscriber1 : EndpointConfigurationBuilder - { - public Subscriber1() - { - EndpointSetup(c => c.DisableFeature(), - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MyEvent message, IMessageHandlerContext context) - { - Assert.AreEqual(context.MessageHeaders["MyHeader"], "SomeValue"); - TestContext.Subscriber1GotTheEvent = true; - return Task.FromResult(0); - } - } - } - - public class Subscriber2 : EndpointConfigurationBuilder - { - public Subscriber2() - { - EndpointSetup(c => c.DisableFeature(), - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.Subscriber2GotTheEvent = true; - return Task.FromResult(0); - } - } - } - - public interface IFoo : IEvent - { - } - - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_event_implementing_two_unrelated_interfaces.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_event_implementing_two_unrelated_interfaces.cs deleted file mode 100644 index 289626640..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_event_implementing_two_unrelated_interfaces.cs +++ /dev/null @@ -1,152 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_publishing_an_event_implementing_two_unrelated_interfaces : NServiceBusAcceptanceTest - { - [Test] - public async Task Event_should_be_published_using_instance_type() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => - b.When(c => c.EventASubscribed && c.EventBSubscribed, (session, ctx) => - { - var message = new CompositeEvent - { - ContextId = ctx.Id - }; - return session.Publish(message); - })) - .WithEndpoint(b => b.When(async (session, ctx) => - { - await session.Subscribe(); - await session.Subscribe(); - - if (ctx.HasNativePubSubSupport) - { - ctx.EventASubscribed = true; - ctx.EventBSubscribed = true; - } - })) - .Done(c => c.GotEventA && c.GotEventB) - .Run(TimeSpan.FromSeconds(20)); - - Assert.True(context.GotEventA); - Assert.True(context.GotEventB); - } - - public class Context : ScenarioContext - { - public Guid Id { get; set; } - public bool EventASubscribed { get; set; } - public bool EventBSubscribed { get; set; } - public bool GotEventA { get; set; } - public bool GotEventB { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => - { - b.UseSerialization(); - b.OnEndpointSubscribed((s, context) => - { - if (s.SubscriberReturnAddress.Contains("Subscriber")) - { - if (s.MessageType == typeof(IEventA).AssemblyQualifiedName) - { - context.EventASubscribed = true; - } - if (s.MessageType == typeof(IEventB).AssemblyQualifiedName) - { - context.EventBSubscribed = true; - } - } - }); - }); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.UseSerialization(); - c.Conventions().DefiningMessagesAs(t => t != typeof(CompositeEvent) && typeof(IMessage).IsAssignableFrom(t) && - typeof(IMessage) != t && - typeof(IEvent) != t && - typeof(ICommand) != t); - - c.Conventions().DefiningEventsAs(t => t != typeof(CompositeEvent) && typeof(IEvent).IsAssignableFrom(t) && typeof(IEvent) != t); - c.DisableFeature(); - }, - metadata => - { - metadata.RegisterPublisherFor(typeof(Publisher)); - metadata.RegisterPublisherFor(typeof(Publisher)); - }); - } - - public class EventAHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IEventA @event, IMessageHandlerContext context) - { - if (@event.ContextId != Context.Id) - { - return Task.FromResult(0); - } - Context.GotEventA = true; - - return Task.FromResult(0); - } - } - - public class EventBHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IEventB @event, IMessageHandlerContext context) - { - if (@event.ContextId != Context.Id) - { - return Task.FromResult(0); - } - - Context.GotEventB = true; - - return Task.FromResult(0); - } - } - } - - public class CompositeEvent : IEventA, IEventB - { - public Guid ContextId { get; set; } - public string StringProperty { get; set; } - public int IntProperty { get; set; } - } - - public interface IEventA : IEvent - { - Guid ContextId { get; set; } - string StringProperty { get; set; } - } - - public interface IEventB : IEvent - { - Guid ContextId { get; set; } - int IntProperty { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_interface.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_interface.cs deleted file mode 100644 index ff8677b43..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_interface.cs +++ /dev/null @@ -1,104 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_publishing_an_interface : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_receive_event_for_non_xml() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.Subscribed, (session, ctx) => session.Publish())) - .WithEndpoint(b => b.When(async (session, ctx) => - { - await session.Subscribe(); - if (ctx.HasNativePubSubSupport) - { - ctx.Subscribed = true; - } - })) - .Done(c => c.GotTheEvent) - .Run(); - - Assert.True(context.GotTheEvent); - Assert.AreEqual(typeof(MyEvent), context.EventTypePassedToRouting); - } - - public class Context : ScenarioContext - { - public bool GotTheEvent { get; set; } - public bool Subscribed { get; set; } - public Type EventTypePassedToRouting { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(c => - { - c.UseSerialization(); - c.Pipeline.Register("EventTypeSpy", new EventTypeSpy((Context)ScenarioContext), "EventTypeSpy"); - c.OnEndpointSubscribed((s, context) => - { - if (s.SubscriberReturnAddress.Contains("Subscriber")) - { - context.Subscribed = true; - } - }); - }); - } - - class EventTypeSpy : IBehavior - { - public EventTypeSpy(Context testContext) - { - this.testContext = testContext; - } - - public Task Invoke(IOutgoingLogicalMessageContext context, Func next) - { - testContext.EventTypePassedToRouting = context.Message.MessageType; - return next(context); - } - - Context testContext; - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.UseSerialization(); - c.DisableFeature(); - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent @event, IMessageHandlerContext context) - { - Context.GotTheEvent = true; - return Task.FromResult(0); - } - } - } - - public interface MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_interface_with_unobtrusive.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_interface_with_unobtrusive.cs deleted file mode 100644 index 363adfafa..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_an_interface_with_unobtrusive.cs +++ /dev/null @@ -1,106 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_publishing_an_interface_with_unobtrusive : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_receive_event_for_non_xml() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.Subscribed, (session, ctx) => session.Publish())) - .WithEndpoint(b => b.When(async (session, ctx) => - { - await session.Subscribe(); - if (ctx.HasNativePubSubSupport) - { - ctx.Subscribed = true; - } - })) - .Done(c => c.GotTheEvent) - .Run(); - - Assert.True(context.GotTheEvent); - Assert.AreEqual(typeof(MyEvent), context.EventTypePassedToRouting); - } - - public class Context : ScenarioContext - { - public bool GotTheEvent { get; set; } - public bool Subscribed { get; set; } - public Type EventTypePassedToRouting { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(c => - { - c.UseSerialization(); - c.Conventions().DefiningEventsAs(t => t.Namespace != null && t.Name.EndsWith("Event")); - c.Pipeline.Register("EventTypeSpy", typeof(EventTypeSpy), "EventTypeSpy"); - c.OnEndpointSubscribed((s, context) => - { - if (s.SubscriberReturnAddress.Contains("Subscriber")) - { - context.Subscribed = true; - } - }); - }).ExcludeType(); // remove that type from assembly scanning to simulate what would happen with true unobtrusive mode - } - - class EventTypeSpy : IBehavior - { - public EventTypeSpy(Context testContext) - { - this.testContext = testContext; - } - - public Task Invoke(IOutgoingLogicalMessageContext context, Func next) - { - testContext.EventTypePassedToRouting = context.Message.MessageType; - return next(context); - } - - Context testContext; - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => - { - c.UseSerialization(); - c.Conventions().DefiningEventsAs(t => t.Namespace != null && t.Name.EndsWith("Event")); - c.DisableFeature(); - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent @event, IMessageHandlerContext context) - { - Context.GotTheEvent = true; - return Task.FromResult(0); - } - } - } - - public interface MyEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_using_root_type.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_using_root_type.cs deleted file mode 100644 index f9af81595..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_using_root_type.cs +++ /dev/null @@ -1,92 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_publishing_using_root_type : NServiceBusAcceptanceTest - { - [Test] - public async Task Event_should_be_published_using_instance_type() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.Subscriber1Subscribed, session => - { - IMyEvent message = new EventMessage(); - - return session.Publish(message); - })) - .WithEndpoint(b => b.When(async (session, ctx) => - { - await session.Subscribe(); - - if (ctx.HasNativePubSubSupport) - { - ctx.Subscriber1Subscribed = true; - } - })) - .Done(c => c.Subscriber1GotTheEvent) - .Run(TimeSpan.FromSeconds(20)); - - Assert.True(context.Subscriber1GotTheEvent); - } - - public class Context : ScenarioContext - { - public bool Subscriber1GotTheEvent { get; set; } - public bool Subscriber1Subscribed { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => b.OnEndpointSubscribed((s, context) => - { - if (s.SubscriberReturnAddress.Contains("Subscriber1")) - { - context.Subscriber1Subscribed = true; - } - })); - } - } - - public class Subscriber1 : EndpointConfigurationBuilder - { - public Subscriber1() - { - EndpointSetup(c => c.DisableFeature(), p => p.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(EventMessage messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.Subscriber1GotTheEvent = true; - return Task.FromResult(0); - } - } - } - - - public class EventMessage : IMyEvent - { - public Guid EventId { get; set; } - public DateTime? Time { get; set; } - public TimeSpan Duration { get; set; } - } - - public interface IMyEvent : IEvent - { - Guid EventId { get; set; } - DateTime? Time { get; set; } - TimeSpan Duration { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_with_only_local_messagehandlers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_with_only_local_messagehandlers.cs deleted file mode 100644 index a23577fc9..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_with_only_local_messagehandlers.cs +++ /dev/null @@ -1,108 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_publishing_with_only_local_messagehandlers : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_trigger_the_catch_all_handler_for_message_driven_subscriptions() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.LocalEndpointSubscribed, session => session.Publish(new EventHandledByLocalEndpoint()))) - .Done(c => c.CatchAllHandlerGotTheMessage) - .Run(); - - Assert.True(context.CatchAllHandlerGotTheMessage); - } - - [Test] - public async Task Should_trigger_the_catch_all_handler_for_publishers_with_centralized_pubsub() - { - Requires.NativePubSubSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => - { - b.When(session => session.Subscribe()); - b.When(c => c.EndpointsStarted, session => session.Publish(new EventHandledByLocalEndpoint())); - }) - .Done(c => c.CatchAllHandlerGotTheMessage) - .Run(); - - Assert.True(context.CatchAllHandlerGotTheMessage); - } - - public class Context : ScenarioContext - { - public bool CatchAllHandlerGotTheMessage { get; set; } - - public bool LocalEndpointSubscribed { get; set; } - } - - public class MessageDrivenPublisher : EndpointConfigurationBuilder - { - public MessageDrivenPublisher() - { - EndpointSetup(b => b.OnEndpointSubscribed((s, context) => { context.LocalEndpointSubscribed = true; }), - metadata => metadata.RegisterPublisherFor(typeof(MessageDrivenPublisher))); - } - - class CatchAllHandler : IHandleMessages //not enough for auto subscribe to work - { - public Context Context { get; set; } - - public Task Handle(IEvent message, IMessageHandlerContext context) - { - Context.CatchAllHandlerGotTheMessage = true; - - return Task.FromResult(0); - } - } - - class DummyHandler : IHandleMessages //explicit handler for the event is needed - { - public Task Handle(EventHandledByLocalEndpoint message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - public class CentralizedStoragePublisher : EndpointConfigurationBuilder - { - public CentralizedStoragePublisher() - { - EndpointSetup(publisherMetadata: metadata => metadata.RegisterPublisherFor(typeof(CentralizedStoragePublisher))); - } - - class CatchAllHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(IEvent message, IMessageHandlerContext context) - { - Context.CatchAllHandlerGotTheMessage = true; - return Task.FromResult(0); - } - } - - class DummyHandler : IHandleMessages //explicit handler for the event is needed - { - public Task Handle(EventHandledByLocalEndpoint message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - public class EventHandledByLocalEndpoint : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_with_overridden_local_address.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_with_overridden_local_address.cs deleted file mode 100644 index 18176251d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_with_overridden_local_address.cs +++ /dev/null @@ -1,81 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_publishing_with_overridden_local_address : NServiceBusAcceptanceTest - { - [Test, Explicit("This test fails against RabbitMQ")] - public async Task Should_be_delivered_to_all_subscribers() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.Subscriber1Subscribed, session => session.Publish(new MyEvent())) - ) - .WithEndpoint(b => b.When(async (session, ctx) => - { - await session.Subscribe(); - - if (ctx.HasNativePubSubSupport) - { - ctx.Subscriber1Subscribed = true; - } - })) - .Done(c => c.Subscriber1GotTheEvent) - .Run(); - - Assert.True(context.Subscriber1GotTheEvent); - } - - public class Context : ScenarioContext - { - public bool Subscriber1GotTheEvent { get; set; } - public bool Subscriber1Subscribed { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => b.OnEndpointSubscribed((s, context) => - { - if (s.SubscriberReturnAddress.Contains("myinputqueue")) - { - context.Subscriber1Subscribed = true; - } - })); - } - } - - public class Subscriber1 : EndpointConfigurationBuilder - { - public Subscriber1() - { - EndpointSetup(builder => - { - builder.DisableFeature(); - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyEvent messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.Subscriber1GotTheEvent = true; - return Task.FromResult(0); - } - } - } - - - public class MyEvent : IEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_registering_publishers_unobtrusive_messages_code.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_registering_publishers_unobtrusive_messages_code.cs deleted file mode 100644 index 6456f6996..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_registering_publishers_unobtrusive_messages_code.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_registering_publishers_unobtrusive_messages_code : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_deliver_event() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(c => c.Subscribed, s => s.Publish(new SomeEvent()))) - .WithEndpoint() - .Done(c => c.ReceivedMessage) - .Run(); - - Assert.That(context.Subscribed, Is.True); - Assert.That(context.ReceivedMessage, Is.True); - } - - public class Context : ScenarioContext - { - public bool Subscribed { get; set; } - public bool ReceivedMessage { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(c => - { - c.OnEndpointSubscribed((e, ctx) => ctx.Subscribed = true); - c.Conventions().DefiningEventsAs(t => t == typeof(SomeEvent)); - }).ExcludeType(); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup( - c => c.Conventions().DefiningEventsAs(t => t == typeof(SomeEvent)), - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class EventHandler : IHandleMessages - { - Context testContext; - - public EventHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(SomeEvent message, IMessageHandlerContext context) - { - testContext.ReceivedMessage = true; - return Task.FromResult(0); - } - } - } - - public class SomeEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_registering_publishers_unobtrusive_messages_config.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_registering_publishers_unobtrusive_messages_config.cs deleted file mode 100644 index 1865a08ce..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_registering_publishers_unobtrusive_messages_config.cs +++ /dev/null @@ -1,73 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_registering_publishers_unobtrusive_messages_config : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_deliver_event() - { - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(c => c.Subscribed, s => s.Publish(new SomeEvent()))) - .WithEndpoint() - .Done(c => c.ReceivedMessage) - .Run(); - - Assert.That(context.Subscribed, Is.True); - Assert.That(context.ReceivedMessage, Is.True); - } - - public class Context : ScenarioContext - { - public bool Subscribed { get; set; } - public bool ReceivedMessage { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(c => - { - c.OnEndpointSubscribed((e, ctx) => ctx.Subscribed = true); - c.Conventions().DefiningEventsAs(t => t == typeof(SomeEvent)); - }).ExcludeType(); - } - } - - public class Subscriber : EndpointConfigurationBuilder - { - public Subscriber() - { - EndpointSetup(c => c.Conventions().DefiningEventsAs(t => t == typeof(SomeEvent)), - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class EventHandler : IHandleMessages - { - Context testContext; - - public EventHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(SomeEvent message, IMessageHandlerContext context) - { - testContext.ReceivedMessage = true; - return Task.FromResult(0); - } - } - } - - public class SomeEvent - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_replying_to_message.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_replying_to_message.cs deleted file mode 100644 index 1ea012edc..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_replying_to_message.cs +++ /dev/null @@ -1,114 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - using Conventions = AcceptanceTesting.Customization.Conventions; - - public class When_replying_to_message : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_reply_to_originator() - { - var ctx = await Scenario.Define() - .WithEndpoint(c => c - .When(b => b.Send(new MyMessage()))) - .WithEndpoint() - .WithEndpoint() - .Done(c => c.SendingEndpointGotResponse) - .Run(); - - Assert.IsTrue(ctx.SendingEndpointGotResponse); - Assert.IsFalse(ctx.OtherEndpointGotResponse); - } - - [Test] - public async Task Should_reply_to_configured_return_address() - { - var ctx = await Scenario.Define() - .WithEndpoint(c => c - .CustomConfig(b => b.OverridePublicReturnAddress(Conventions.EndpointNamingConvention(typeof(OtherEndpoint)))) - .When(b => b.Send(new MyMessage()))) - .WithEndpoint() - .WithEndpoint() - .Done(c => c.OtherEndpointGotResponse) - .Run(); - - Assert.IsTrue(ctx.OtherEndpointGotResponse); - Assert.IsFalse(ctx.SendingEndpointGotResponse); - } - - public class Context : ScenarioContext - { - public bool SendingEndpointGotResponse { get; set; } - public bool OtherEndpointGotResponse { get; set; } - } - - public class SendingEndpoint : EndpointConfigurationBuilder - { - public SendingEndpoint() - { - EndpointSetup(c => - { - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessage), typeof(ReplyingEndpoint)); - }); - } - - public class ResponseHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyReply messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.SendingEndpointGotResponse = true; - return Task.FromResult(0); - } - } - } - - public class OtherEndpoint : EndpointConfigurationBuilder - { - public OtherEndpoint() - { - EndpointSetup(); - } - - public class ResponseHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyReply messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.OtherEndpointGotResponse = true; - return Task.FromResult(0); - } - } - } - - public class ReplyingEndpoint : EndpointConfigurationBuilder - { - public ReplyingEndpoint() - { - EndpointSetup(); - } - - public class MessageHandler : IHandleMessages - { - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - return context.Reply(new MyReply()); - } - } - } - - public class MyMessage : IMessage - { - } - - public class MyReply : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_replying_to_message_with_interface_and_unobtrusive.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_replying_to_message_with_interface_and_unobtrusive.cs deleted file mode 100644 index 0ac233a65..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_replying_to_message_with_interface_and_unobtrusive.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_replying_to_message_with_interface_and_unobtrusive : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_reply_to_originator() - { - var ctx = await Scenario.Define() - .WithEndpoint(c => c - .When(b => b.Send(new MyMessage()))) - .WithEndpoint() - .WithEndpoint() - .Done(c => c.SendingEndpointGotResponse) - .Run(); - - Assert.IsTrue(ctx.SendingEndpointGotResponse); - Assert.IsFalse(ctx.OtherEndpointGotResponse); - } - - public class Context : ScenarioContext - { - public bool SendingEndpointGotResponse { get; set; } - public bool OtherEndpointGotResponse { get; set; } - } - - public class SendingEndpoint : EndpointConfigurationBuilder - { - public SendingEndpoint() - { - EndpointSetup(c => - { - c.Conventions().DefiningMessagesAs(t => t.Namespace != null && t.Name.StartsWith("My")); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessage), typeof(ReplyingEndpoint)); - }); - } - - public class ResponseHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyReply messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.SendingEndpointGotResponse = true; - return Task.FromResult(0); - } - } - } - - public class OtherEndpoint : EndpointConfigurationBuilder - { - public OtherEndpoint() - { - EndpointSetup(c => c.Conventions().DefiningMessagesAs(t => t.Namespace != null && t.Name.StartsWith("My"))); - } - - public class ResponseHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyReply messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.OtherEndpointGotResponse = true; - return Task.FromResult(0); - } - } - } - - public class ReplyingEndpoint : EndpointConfigurationBuilder - { - public ReplyingEndpoint() - { - EndpointSetup(c => c.Conventions().DefiningMessagesAs(t => t.Namespace != null && t.Name.StartsWith("My"))) - .ExcludeType(); // remove that type from assembly scanning to simulate what would happen with true unobtrusive mode - } - - public class MessageHandler : IHandleMessages - { - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - return context.Reply(m => { }); - } - } - } - - public class MyMessage - { - } - - public interface MyReply - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_any_instance.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_any_instance.cs deleted file mode 100644 index d8804238e..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_any_instance.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - [TestFixture] - public class When_routing_reply_to_any_instance : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_route_reply_to_shared_queue() - { - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(s => - { - var options = new SendOptions(); - options.RouteReplyToAnyInstance(); - return s.Send(new RequestReplyMessage(), options); - })) - .WithEndpoint() - .Done(c => c.ReplyReceived) - .Run(); - - Assert.IsTrue(context.ReplyReceived); - StringAssert.DoesNotContain(instanceDiscriminator, context.ReplyToAddress); - } - - const string instanceDiscriminator = "instance-42"; - - class Context : ScenarioContext - { - public string ReplyToAddress { get; set; } - public bool ReplyReceived { get; set; } - } - - class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.MakeInstanceUniquelyAddressable(instanceDiscriminator); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(RequestReplyMessage), typeof(Replier)); - }); - } - - class ReplyMessageHandler : IHandleMessages - { - public ReplyMessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(ReplyMessage message, IMessageHandlerContext context) - { - testContext.ReplyReceived = true; - return Task.FromResult(0); - } - - Context testContext; - } - } - - class Replier : EndpointConfigurationBuilder - { - public Replier() - { - EndpointSetup(); - } - - class RequestReplyMessageHandler : IHandleMessages - { - public RequestReplyMessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(RequestReplyMessage message, IMessageHandlerContext context) - { - testContext.ReplyToAddress = context.ReplyToAddress; - return context.Reply(new ReplyMessage()); - } - - Context testContext; - } - } - - public class RequestReplyMessage : ICommand - { - } - - public class ReplyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_specific_address.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_specific_address.cs deleted file mode 100644 index 741baa6db..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_specific_address.cs +++ /dev/null @@ -1,107 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - [TestFixture] - public class When_routing_reply_to_specific_address : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_route_reply_to_instance_specific_queue() - { - var replyHandlerAddress = Conventions.EndpointNamingConvention(typeof(ReplyHandler)); - - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(s => - { - var options = new SendOptions(); - options.RouteReplyTo(replyHandlerAddress); - return s.Send(new RequestReplyMessage(), options); - })) - .WithEndpoint() - .WithEndpoint() - .Done(c => c.ReplyReceived) - .Run(); - - Assert.IsTrue(context.ReplyReceived); - StringAssert.Contains(replyHandlerAddress, context.ReplyToAddress); - } - - class Context : ScenarioContext - { - public string ReplyToAddress { get; set; } - public bool ReplyReceived { get; set; } - } - - class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(RequestReplyMessage), typeof(Replier)); - }); - } - } - - class Replier : EndpointConfigurationBuilder - { - public Replier() - { - EndpointSetup(); - } - - class RequestReplyMessageHandler : IHandleMessages - { - public RequestReplyMessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(RequestReplyMessage message, IMessageHandlerContext context) - { - testContext.ReplyToAddress = context.ReplyToAddress; - return context.Reply(new ReplyMessage()); - } - - Context testContext; - } - } - - class ReplyHandler : EndpointConfigurationBuilder - { - public ReplyHandler() - { - EndpointSetup(); - } - - class ReplyMessageHandler : IHandleMessages - { - public ReplyMessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(ReplyMessage message, IMessageHandlerContext context) - { - testContext.ReplyReceived = true; - return Task.FromResult(0); - } - - Context testContext; - } - } - - public class RequestReplyMessage : ICommand - { - } - - public class ReplyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_specific_instance.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_specific_instance.cs deleted file mode 100644 index dd3a8f9a5..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_routing_reply_to_specific_instance.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - [TestFixture] - class When_routing_reply_to_specific_instance : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_route_reply_to_instance_specific_queue() - { - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(s => - { - var options = new SendOptions(); - options.RouteReplyToThisInstance(); - return s.Send(new RequestReplyMessage(), options); - })) - .WithEndpoint() - .Done(c => c.ReplyReceived) - .Run(); - - Assert.IsTrue(context.ReplyReceived); - StringAssert.Contains(instanceDiscriminator, context.ReplyToAddress); - } - - const string instanceDiscriminator = "instance-42"; - - class Context : ScenarioContext - { - public string ReplyToAddress { get; set; } - public bool ReplyReceived { get; set; } - } - - class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.MakeInstanceUniquelyAddressable(instanceDiscriminator); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(RequestReplyMessage), typeof(Replier)); - }); - } - - class ReplyMessageHandler : IHandleMessages - { - public ReplyMessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(ReplyMessage message, IMessageHandlerContext context) - { - testContext.ReplyReceived = true; - return Task.FromResult(0); - } - - Context testContext; - } - } - - class Replier : EndpointConfigurationBuilder - { - public Replier() - { - EndpointSetup(); - } - - class RequestReplyMessageHandler : IHandleMessages - { - public RequestReplyMessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(RequestReplyMessage message, IMessageHandlerContext context) - { - testContext.ReplyToAddress = context.ReplyToAddress; - return context.Reply(new ReplyMessage()); - } - - Context testContext; - } - } - - public class RequestReplyMessage : ICommand - { - } - - public class ReplyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_a_base_command.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_a_base_command.cs deleted file mode 100644 index 907e0bcb9..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_a_base_command.cs +++ /dev/null @@ -1,108 +0,0 @@ -// disable obsolete warnings. Test will be removed in next major version -#pragma warning disable CS0618 -namespace NServiceBus.AcceptanceTests.Routing -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.Config; - using NUnit.Framework; - - public class When_sending_a_base_command : NServiceBusAcceptanceTest - { - [Test] - public async Task Route_for_derived_command_should_be_used() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(c => c.EndpointsStarted, async session => - { - await session.Send(new BaseCommand()); - })) - .WithEndpoint() - .WithEndpoint() - .Done(c => c.UsedBaseRoute || c.UsedDerivedRoute) - .Run(); - - Assert.True(context.UsedDerivedRoute); - Assert.False(context.UsedBaseRoute); - } - - public class Context : ScenarioContext - { - public bool UsedDerivedRoute { get; set; } - public bool UsedBaseRoute { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup() - .WithConfig(c => - { - // This scenario is only supported when using MessageEndpointMappings - c.MessageEndpointMappings.Add(new MessageEndpointMapping - { - AssemblyName = typeof(BaseCommand).Assembly.FullName, - TypeFullName = typeof(BaseCommand).FullName, - Endpoint = Conventions.EndpointNamingConvention(typeof(QueueSpy)) - }); - c.MessageEndpointMappings.Add(new MessageEndpointMapping - { - AssemblyName = typeof(DerivedCommand).Assembly.FullName, - TypeFullName = typeof(DerivedCommand).FullName, - Endpoint = Conventions.EndpointNamingConvention(typeof(Receiver)) - }); - }); - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(BaseCommand messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.UsedDerivedRoute = true; - return Task.FromResult(0); - } - } - } - - public class QueueSpy : EndpointConfigurationBuilder - { - public QueueSpy() - { - EndpointSetup(); - } - - public class MyEventHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(BaseCommand messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.UsedBaseRoute = true; - return Task.FromResult(0); - } - } - } - - public class BaseCommand : ICommand - { - } - - public class DerivedCommand : BaseCommand - { - } - } -} -#pragma warning restore CS0618 \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_by_assembly.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_by_assembly.cs deleted file mode 100644 index 4b636d9dc..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_by_assembly.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace NServiceBus.AcceptanceTests.BestPractices -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_sending_non_message_with_routing_configured_by_assembly : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_throw_when_sending() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(async (session, c) => - { - try - { - await session.Send(new NonMessage()); - } - catch (Exception ex) - { - c.Exception = ex; - c.GotTheException = true; - } - })) - .Done(c => c.GotTheException) - .Run(); - - StringAssert.Contains("No destination specified for message", context.Exception.ToString()); - } - - public class Context : ScenarioContext - { - public bool GotTheException { get; set; } - public Exception Exception { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup((c, r) => - { - var routing = c.ConfigureTransport().Routing(); - routing.RouteToEndpoint(typeof(NonMessage).Assembly, "Destination"); - }); - } - } - - public class NonMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_by_type.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_by_type.cs deleted file mode 100644 index 8baced46b..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_by_type.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace NServiceBus.AcceptanceTests.BestPractices -{ - using System; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - //All other variants of configuration-time routing checks are covered by unit tests. - public class When_sending_non_message_with_routing_configured_by_type : NServiceBusAcceptanceTest - { - [Test] - public void Should_throw_when_configuring_routing() - { - var exception = Assert.ThrowsAsync(async () => await Scenario.Define() - .WithEndpoint(c => c - .When(b => b.Send(new NonMessage()))) - .Done(c => c.EndpointsStarted) - .Run()); - - StringAssert.Contains("Cannot configure routing for type", exception.ToString()); - } - - public class Context : ScenarioContext - { - public bool GotTheException { get; set; } - public Exception Exception { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup((c, r) => - { - var routing = c.ConfigureTransport().Routing(); - routing.RouteToEndpoint(typeof(NonMessage), "Destination"); - }); - } - } - - public class NonMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_via_mappings.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_via_mappings.cs deleted file mode 100644 index 4ab66aedd..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_sending_non_message_with_routing_configured_via_mappings.cs +++ /dev/null @@ -1,74 +0,0 @@ -// disable obsolete warnings. Test will be removed in next major version -#pragma warning disable CS0618 -namespace NServiceBus.AcceptanceTests.BestPractices -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NServiceBus.Config; - using NUnit.Framework; - - public class When_sending_non_message_with_routing_configured_via_mappings : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_throw_when_sending() - { - var context = await Scenario.Define() - .WithEndpoint() - .WithEndpoint(b => b.When(async (session, c) => - { - try - { - await session.Send(new NonMessage()); - } - catch (Exception ex) - { - c.Exception = ex; - c.GotTheException = true; - } - })) - .Done(c => c.GotTheException) - .Run(); - - StringAssert.Contains("No destination specified for messag", context.Exception.ToString()); - } - - public class Context : ScenarioContext - { - public bool GotTheException { get; set; } - public Exception Exception { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup() - .WithConfig(c => - { - c.MessageEndpointMappings.Add(new MessageEndpointMapping - { - AssemblyName = typeof(NonMessage).Assembly.FullName, - TypeFullName = typeof(NonMessage).FullName, - Endpoint = Conventions.EndpointNamingConvention(typeof(Receiver)) - }); - }); - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(); - } - } - - public class NonMessage - { - } - } -} -#pragma warning restore CS0618 \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_custom_routing_strategy.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_custom_routing_strategy.cs deleted file mode 100644 index 8f06ee50c..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_custom_routing_strategy.cs +++ /dev/null @@ -1,138 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Routing -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Threading; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using NServiceBus.Routing; - using NUnit.Framework; - using Settings; - - public class When_using_custom_routing_strategy : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_route_commands_correctly() - { - var ctx = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.EndpointsStarted, async session => - { - await session.Send(new MyCommand { Instance = Discriminator1 }); - await session.Send(new MyCommand { Instance = Discriminator2 }); - await session.Send(new MyCommand { Instance = Discriminator1 }); - await session.Send(new MyCommand { Instance = Discriminator2 }); - }) - ) - .WithEndpoint(b => b.CustomConfig(cfg => cfg.MakeInstanceUniquelyAddressable(Discriminator1))) - .WithEndpoint(b => b.CustomConfig(cfg => cfg.MakeInstanceUniquelyAddressable(Discriminator2))) - .Done(c => c.MessageDeliveredReceiver1 >= 2 && c.MessageDeliveredReceiver2 >=2) - .Run(); - - Assert.AreEqual(2, ctx.MessageDeliveredReceiver1); - Assert.AreEqual(2, ctx.MessageDeliveredReceiver2); - } - - static string Discriminator1 = "553E9649"; - static string Discriminator2 = "F9D0022C"; - - public class Context : ScenarioContext - { - public int MessageDeliveredReceiver1; - public int MessageDeliveredReceiver2; - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - var receiverEndpoint = Conventions.EndpointNamingConvention(typeof(Receiver)); - - EndpointSetup(c => - { - c.GetSettings().GetOrCreate() - .AddOrReplaceRoutes("CustomRoutingFeature", new List - { - new RouteTableEntry(typeof(MyCommand), UnicastRoute.CreateFromEndpointName(receiverEndpoint)) - }); - c.GetSettings().GetOrCreate() - .AddOrReplaceInstances("CustomRoutingFeature", new List - { - new EndpointInstance(receiverEndpoint, Discriminator1), - new EndpointInstance(receiverEndpoint, Discriminator2) - }); - c.GetSettings().GetOrCreate() - .SetDistributionStrategy(new ContentBasedRoutingStrategy(receiverEndpoint)); - }); - } - - class ContentBasedRoutingStrategy : DistributionStrategy - { - public ContentBasedRoutingStrategy(string endpoint) : base(endpoint, DistributionStrategyScope.Send) - { - } - - public override string SelectReceiver(string[] receiverAddresses) - { - throw new NotImplementedException(); // should never be called - } - - public override string SelectDestination(DistributionContext context) - { - var message = context.Message.Instance as MyCommand; - if (message != null) - { - var address = context.ToTransportAddress(new EndpointInstance(Endpoint, message.Instance)); - return context.ReceiverAddresses.Single(a => a.Contains(address)); - } - throw new InvalidOperationException("Unable to route!"); - } - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(); - } - - public class MyCommandHandler : IHandleMessages - { - public MyCommandHandler(Context testContext, ReadOnlySettings settings) - { - this.testContext = testContext; - this.settings = settings; - } - - public Task Handle(MyCommand message, IMessageHandlerContext context) - { - var instanceDiscriminator = settings.Get("EndpointInstanceDiscriminator"); - - if (instanceDiscriminator == Discriminator1) - { - Interlocked.Increment(ref testContext.MessageDeliveredReceiver1); - } - if (instanceDiscriminator == Discriminator2) - { - Interlocked.Increment(ref testContext.MessageDeliveredReceiver2); - } - - return Task.FromResult(0); - } - - Context testContext; - ReadOnlySettings settings; - } - } - - public class MyCommand : ICommand - { - public string Instance { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_instance_ids.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_instance_ids.cs deleted file mode 100644 index 967b3668a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_instance_ids.cs +++ /dev/null @@ -1,86 +0,0 @@ -namespace NServiceBus.AcceptanceTests.ScaleOut -{ - using System.Collections.Generic; - using System.Threading; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using NServiceBus.Routing; - using NUnit.Framework; - - public class When_using_instance_ids : NServiceBusAcceptanceTest - { - static string ReceiverEndpoint => Conventions.EndpointNamingConvention(typeof(Receiver)); - - [Test] - public async Task Should_be_addressable_both_by_shared_queue_and_specific_queue() - { - var context = await Scenario.Define() - .WithEndpoint() - .WithEndpoint(b => b.When(s => s.Send(new MyMessage()))) - .WithEndpoint(b => b.When(s => s.Send(new MyMessage()))) - .Done(c => c.MessagesReceived > 1) - .Run(); - - Assert.AreEqual(2, context.MessagesReceived); - } - - public class Context : ScenarioContext - { - public int MessagesReceived; - } - - public class UnawareSender : EndpointConfigurationBuilder - { - public UnawareSender() - { - EndpointSetup((c, r) => - { - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessage), ReceiverEndpoint); - }); - } - } - - public class AwareSender : EndpointConfigurationBuilder - { - public AwareSender() - { - EndpointSetup((c, r) => - { - var routing = c.ConfigureTransport().Routing(); - routing.RouteToEndpoint(typeof(MyMessage), ReceiverEndpoint); - c.GetSettings().GetOrCreate() - .AddOrReplaceInstances("testing", new List - { - new EndpointInstance(ReceiverEndpoint, "XYZ") - }); - }); - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(c => { c.MakeInstanceUniquelyAddressable("XYZ"); }); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - Interlocked.Increment(ref Context.MessagesReceived); - return Task.FromResult(0); - } - } - } - - public class MyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/when_replying_to_a_message_sent_to_specific_instance.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/when_replying_to_a_message_sent_to_specific_instance.cs deleted file mode 100644 index 1ca4d320d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/when_replying_to_a_message_sent_to_specific_instance.cs +++ /dev/null @@ -1,85 +0,0 @@ -namespace NServiceBus.AcceptanceTests.ScaleOut -{ - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using NServiceBus.Routing; - using NUnit.Framework; - - public class When_replying_to_a_message_sent_to_specific_instance : NServiceBusAcceptanceTest - { - static string ReceiverEndpoint => Conventions.EndpointNamingConvention(typeof(Receiver)); - - [Test] - public async Task Reply_address_should_be_set_to_shared_endpoint_queue() - { - var context = await Scenario.Define() - .WithEndpoint() - .WithEndpoint(b => b.When(s => s.Send(new MyRequest()))) - .Done(c => c.ReplyToAddress != null) - .Run(); - - StringAssert.DoesNotContain("XZY", context.ReplyToAddress); - } - - public class Context : ScenarioContext - { - public string ReplyToAddress { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup((c, r) => - { - var routing = c.ConfigureTransport().Routing(); - routing.RouteToEndpoint(typeof(MyRequest), ReceiverEndpoint); - c.GetSettings().GetOrCreate() - .AddOrReplaceInstances("testing", new List - { - new EndpointInstance(ReceiverEndpoint, "XYZ") - }); - }); - } - - public class MyResponseHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyResponse message, IMessageHandlerContext context) - { - Context.ReplyToAddress = context.MessageHeaders[Headers.ReplyToAddress]; - return Task.FromResult(0); - } - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(c => { c.MakeInstanceUniquelyAddressable("XYZ"); }); - } - - public class MyRequestHandler : IHandleMessages - { - public Task Handle(MyRequest message, IMessageHandlerContext context) - { - return context.Reply(new MyResponse()); - } - } - } - - public class MyRequest : IMessage - { - } - - public class MyResponse : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_a_base_class_mapped_is_handled_by_a_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_a_base_class_mapped_is_handled_by_a_saga.cs deleted file mode 100644 index 1dff004cf..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_a_base_class_mapped_is_handled_by_a_saga.cs +++ /dev/null @@ -1,93 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - using static When_a_base_class_mapped_is_handled_by_a_saga.SagaEndpoint.BaseClassIsMappedSaga; - - [TestFixture] - public class When_a_base_class_mapped_is_handled_by_a_saga : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_find_existing_instance() - { - var correlationId = Guid.NewGuid(); - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => - { - var startSagaMessage = new StartSagaMessage - { - SomeId = correlationId - }; - return session.SendLocal(startSagaMessage); - })) - .Done(c => c.SecondMessageFoundExistingSaga) - .Run(TimeSpan.FromSeconds(20)); - - Assert.True(context.SecondMessageFoundExistingSaga); - } - - public class Context : ScenarioContext - { - public bool SecondMessageFoundExistingSaga { get; set; } - } - - public class SagaEndpoint : EndpointConfigurationBuilder - { - public SagaEndpoint() - { - EndpointSetup(); - } - - public class BaseClassIsMappedSaga : SqlSaga, - IAmStartedByMessages, - IAmStartedByMessages - { - public Context TestContext { get; set; } - - public Task Handle(SecondSagaMessage message, IMessageHandlerContext context) - { - TestContext.SecondMessageFoundExistingSaga = true; - return Task.FromResult(0); - } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - var sagaMessage = new SecondSagaMessage - { - SomeId = message.SomeId - }; - return context.SendLocal(sagaMessage); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - - protected override string CorrelationPropertyName => nameof(BaseClassIsMappedSagaData.SomeId); - - public class BaseClassIsMappedSagaData : ContainSagaData - { - public virtual Guid SomeId { get; set; } - } - } - } - - public class StartSagaMessage : SagaMessageBase - { - } - - public class SecondSagaMessage : SagaMessageBase - { - } - - public class SagaMessageBase : IMessage - { - public Guid SomeId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_a_base_class_message_starts_a_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_a_base_class_message_starts_a_saga.cs deleted file mode 100644 index 0976aa5cb..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_a_base_class_message_starts_a_saga.cs +++ /dev/null @@ -1,90 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - [TestFixture] - public class When_a_base_class_message_starts_a_saga : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_find_existing_instance() - { - var correlationId = Guid.NewGuid(); - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => - { - var startSagaMessage = new StartSagaMessage - { - SomeId = correlationId - }; - return session.SendLocal(startSagaMessage); - })) - .Done(c => c.SecondMessageFoundExistingSaga) - .Run(TimeSpan.FromSeconds(20)); - - Assert.True(context.SecondMessageFoundExistingSaga); - } - - public class Context : ScenarioContext - { - public bool SecondMessageFoundExistingSaga { get; set; } - } - - public class SagaEndpoint : EndpointConfigurationBuilder - { - public SagaEndpoint() - { - EndpointSetup(); - } - - public class BaseClassStartsSaga : SqlSaga, - IAmStartedByMessages - { - public Context TestContext { get; set; } - - public Task Handle(StartSagaMessageBase message, IMessageHandlerContext context) - { - if (Data.SomeId != Guid.Empty) - { - TestContext.SecondMessageFoundExistingSaga = true; - } - else - { - var startSagaMessage = new StartSagaMessage - { - SomeId = message.SomeId - }; - return context.SendLocal(startSagaMessage); - } - - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - - protected override string CorrelationPropertyName => nameof(BaseClassStartsSagaData.SomeId); - - public class BaseClassStartsSagaData : ContainSagaData - { - public virtual Guid SomeId { get; set; } - } - } - } - - public class StartSagaMessage : StartSagaMessageBase - { - } - - public class StartSagaMessageBase : IMessage - { - public Guid SomeId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_an_endpoint_replies_to_a_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_an_endpoint_replies_to_a_saga.cs deleted file mode 100644 index 81b11634d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_an_endpoint_replies_to_a_saga.cs +++ /dev/null @@ -1,120 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - // Repro for issue https://github.com/NServiceBus/NServiceBus/issues/1277 to test the fix - // making sure that the saga correlation still works. - public class When_an_endpoint_replies_to_a_saga : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_correlate_all_saga_messages_properly() - { - var context = await Scenario.Define(c => { c.RunId = Guid.NewGuid(); }) - .WithEndpoint(b => b.When((session, ctx) => session.SendLocal(new StartSaga - { - RunId = ctx.RunId - }))) - .WithEndpoint() - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(context.RunId, context.ResponseRunId); - } - - public class Context : ScenarioContext - { - public Guid RunId { get; set; } - public Guid ResponseRunId { get; set; } - public bool Done { get; set; } - } - - public class EndpointThatRepliesToSagaMessage : EndpointConfigurationBuilder - { - public EndpointThatRepliesToSagaMessage() - { - EndpointSetup(); - } - - class DoSomethingHandler : IHandleMessages - { - public Task Handle(DoSomething message, IMessageHandlerContext context) - { - return context.Reply(new DoSomethingResponse - { - RunId = message.RunId - }); - } - } - } - - public class EndpointThatHostsASaga : EndpointConfigurationBuilder - { - public EndpointThatHostsASaga() - { - EndpointSetup(c => - { - c.EnableFeature(); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(DoSomething), typeof(EndpointThatRepliesToSagaMessage)); - }); - } - - public class CorrelationTestSaga : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - return context.Send(new DoSomething - { - RunId = message.RunId - }); - } - - public Task Handle(DoSomethingResponse message, IMessageHandlerContext context) - { - TestContext.Done = true; - TestContext.ResponseRunId = message.RunId; - MarkAsComplete(); - return Task.FromResult(0); - } - - protected override string CorrelationPropertyName => nameof(CorrelationTestSagaData.RunId); - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.RunId); - mapper.ConfigureMapping(m => m.RunId); - } - - public class CorrelationTestSagaData : ContainSagaData - { - public virtual Guid RunId { get; set; } - } - } - } - - public class StartSaga : ICommand - { - public Guid RunId { get; set; } - } - - public class DoSomething : ICommand - { - public Guid RunId { get; set; } - } - - public class DoSomethingResponse : IMessage - { - public Guid RunId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_auto_correlated_property_is_changed.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_auto_correlated_property_is_changed.cs deleted file mode 100644 index 6f08b4429..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_auto_correlated_property_is_changed.cs +++ /dev/null @@ -1,78 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Support; - using EndpointTemplates; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - [TestFixture] - public class When_auto_correlated_property_is_changed : NServiceBusAcceptanceTest - { - [Test] - public void Should_throw() - { - var exception = Assert.ThrowsAsync(async () => - await Scenario.Define() - .WithEndpoint( - b => b.When(session => session.SendLocal(new StartSaga - { - DataId = Guid.NewGuid() - }))) - .Done(c => c.FailedMessages.Any()) - .Run()); - - Assert.IsTrue(((Context)exception.ScenarioContext).ModifiedCorrelationProperty); - Assert.AreEqual(1, exception.ScenarioContext.FailedMessages.Count); - StringAssert.Contains( - "Changing the value of correlated properties at runtime is currently not supported", - exception.FailedMessage.Exception.Message); - } - - public class Context : ScenarioContext - { - public bool ModifiedCorrelationProperty { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(); - } - - public class CorrIdChangedSaga : SqlSaga, - IAmStartedByMessages - { - public Context TestContext { get; set; } - - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.DataId = Guid.NewGuid(); - TestContext.ModifiedCorrelationProperty = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - protected override string CorrelationPropertyName => nameof(CorrIdChangedSagaData.DataId); - - public class CorrIdChangedSagaData : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - } - - public class StartSaga : ICommand - { - public Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlating_on_special_characters.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlating_on_special_characters.cs deleted file mode 100644 index 5d2cfebc3..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlating_on_special_characters.cs +++ /dev/null @@ -1,91 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - partial class When_correlating_special_chars : NServiceBusAcceptanceTest - { - [Test] - public async Task Saga_persistence_and_correlation_should_work() - { - const string propertyValue = "ʕノ•ᴥ•ʔノ ︵ ┻━┻"; - - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(s => s.SendLocal(new MessageWithSpecialPropertyValues - { - SpecialCharacterValues = propertyValue - }))) - .Done(c => c.RehydratedValueForCorrelatedHandler != null) - .Run(); - - Assert.AreEqual(propertyValue, context.RehydratedValueForCorrelatedHandler); - } - - public class Context : ScenarioContext - { - public string RehydratedValueForCorrelatedHandler { get; set; } - } - - public class SpecialCharacterSagaEndpoint : EndpointConfigurationBuilder - { - public SpecialCharacterSagaEndpoint() - { - EndpointSetup(); - } - - public class SagaDataWithSpecialPropertyValues : ContainSagaData - { - public virtual string SpecialCharacterValues { get; set; } - } - - public class SagaSpecialValues : - SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - Context testContext; - - public SagaSpecialValues(Context testContext) - { - this.testContext = testContext; - } - - protected override string CorrelationPropertyName => nameof(SagaDataWithSpecialPropertyValues.SpecialCharacterValues); - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SpecialCharacterValues); - mapper.ConfigureMapping(m => m.SpecialCharacterValues); - } - - public Task Handle(MessageWithSpecialPropertyValues message, IMessageHandlerContext context) - { - return context.SendLocal(new FollowupMessageWithSpecialPropertyValues - { - SpecialCharacterValues = message.SpecialCharacterValues - }); - } - - public Task Handle(FollowupMessageWithSpecialPropertyValues message, IMessageHandlerContext context) - { - testContext.RehydratedValueForCorrelatedHandler = Data.SpecialCharacterValues; - return Task.FromResult(0); - } - } - } - - public class MessageWithSpecialPropertyValues : ICommand - { - public string SpecialCharacterValues { get; set; } - } - - public class FollowupMessageWithSpecialPropertyValues : ICommand - { - public string SpecialCharacterValues { get; set; } - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_forgetting_to_set_a_corr_property.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_forgetting_to_set_a_corr_property.cs deleted file mode 100644 index 7f911efbd..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_forgetting_to_set_a_corr_property.cs +++ /dev/null @@ -1,85 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - public class When_forgetting_to_set_a_corr_property : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_matter() - { - var id = Guid.NewGuid(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new StartSagaMessage - { - SomeId = id - }))) - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(context.SomeId, id); - } - - public class Context : ScenarioContext - { - public Guid SomeId { get; set; } - public bool Done { get; set; } - } - - public class NullPropertyEndpoint : EndpointConfigurationBuilder - { - public NullPropertyEndpoint() - { - EndpointSetup(); - } - - public class NullCorrPropertySaga : SqlSaga, IAmStartedByMessages - { - public Context Context { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - //oops I forgot Data.SomeId = message.SomeId - if (message.SecondMessage) - { - Context.SomeId = Data.SomeId; - Context.Done = true; - return Task.FromResult(0); - } - - return context.SendLocal(new StartSagaMessage - { - SomeId = message.SomeId, - SecondMessage = true - }); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - - protected override string CorrelationPropertyName => nameof(NullCorrPropertySagaData.SomeId); - } - - public class NullCorrPropertySagaData : IContainSagaData - { - public virtual Guid SomeId { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - public bool SecondMessage { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_handling_message_with_handler_and_timeout_handler.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_handling_message_with_handler_and_timeout_handler.cs deleted file mode 100644 index 0be6f9eec..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_handling_message_with_handler_and_timeout_handler.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - public class When_handling_message_with_handler_and_timeout_handler : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_invoke_timeout_handler() - { - var context = await Scenario.Define() - .WithEndpoint(g => g.When(session => session.SendLocal(new StartSagaMessage - { - SomeId = Guid.NewGuid() - }))) - .Done(c => c.HandlerInvoked || c.TimeoutHandlerInvoked) - .Run(); - - Assert.True(context.HandlerInvoked, "Regular handler should be invoked"); - Assert.False(context.TimeoutHandlerInvoked, "Timeout handler should not be invoked"); - } - - public class Context : ScenarioContext - { - public bool TimeoutHandlerInvoked { get; set; } - public bool HandlerInvoked { get; set; } - } - - public class TimeoutSagaEndpoint : EndpointConfigurationBuilder - { - public TimeoutSagaEndpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class HandlerAndTimeoutSaga : SqlSaga, IAmStartedByMessages, - IHandleTimeouts - { - public Context TestContext { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - TestContext.HandlerInvoked = true; - return Task.FromResult(0); - } - - public Task Timeout(StartSagaMessage message, IMessageHandlerContext context) - { - TestContext.TimeoutHandlerInvoked = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - - protected override string CorrelationPropertyName => nameof(HandlerAndTimeoutSagaData.SomeId); - } - - public class HandlerAndTimeoutSagaData : IContainSagaData - { - public virtual Guid SomeId { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - public class StartSagaMessage : IMessage - { - public Guid SomeId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_message_has_a_saga_id.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_message_has_a_saga_id.cs deleted file mode 100644 index 7828819d0..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_message_has_a_saga_id.cs +++ /dev/null @@ -1,111 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NServiceBus.Sagas; - using NUnit.Framework; - using Persistence.Sql; - - public class When_message_has_a_saga_id : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_start_a_new_saga_if_not_found() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => - { - var message = new MessageWithSagaId - { - DataId = Guid.NewGuid() - }; - var options = new SendOptions(); - - options.SetHeader(Headers.SagaId, Guid.NewGuid().ToString()); - options.SetHeader(Headers.SagaType, typeof(SagaEndpoint.MessageWithSagaIdSaga).AssemblyQualifiedName); - options.RouteToThisEndpoint(); - return session.Send(message, options); - })) - .Done(c => c.Done) - .Run(); - - Assert.True(context.NotFoundHandlerCalled); - Assert.False(context.MessageHandlerCalled); - Assert.False(context.TimeoutHandlerCalled); - } - - public class Context : ScenarioContext - { - public bool NotFoundHandlerCalled { get; set; } - public bool MessageHandlerCalled { get; set; } - public bool TimeoutHandlerCalled { get; set; } - public bool OtherSagaStarted { get; set; } - public bool Done { get; set; } - } - - public class SagaEndpoint : EndpointConfigurationBuilder - { - public SagaEndpoint() - { - EndpointSetup(c => c.EnableFeature()); - } - - public class MessageWithSagaIdSaga : SqlSaga, - IAmStartedByMessages, - IHandleTimeouts, - IHandleSagaNotFound - { - protected override string CorrelationPropertyName => nameof(MessageWithSagaIdSagaData.DataId); - - public Context TestContext { get; set; } - - public Task Handle(MessageWithSagaId message, IMessageHandlerContext context) - { - TestContext.MessageHandlerCalled = true; - return Task.FromResult(0); - } - - public Task Handle(object message, IMessageProcessingContext context) - { - TestContext.NotFoundHandlerCalled = true; - return Task.FromResult(0); - } - - public Task Timeout(MessageWithSagaId state, IMessageHandlerContext context) - { - TestContext.TimeoutHandlerCalled = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class MessageWithSagaIdSagaData : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - - class MessageWithSagaIdHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageWithSagaId message, IMessageHandlerContext context) - { - TestContext.Done = true; - - return Task.FromResult(0); - } - } - } - - public class MessageWithSagaId : IMessage - { - public Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_completes_the_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_completes_the_saga.cs deleted file mode 100644 index 75df9e1f4..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_completes_the_saga.cs +++ /dev/null @@ -1,168 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - public class When_receiving_that_completes_the_saga : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_hydrate_and_complete_the_existing_instance() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => - { - b.When((session, ctx) => session.SendLocal(new StartSagaMessage - { - SomeId = ctx.Id - })); - b.When(ctx => ctx.StartSagaMessageReceived, (session, c) => - { - c.AddTrace("CompleteSagaMessage sent"); - - return session.SendLocal(new CompleteSagaMessage - { - SomeId = c.Id - }); - }); - }) - .Done(c => c.SagaCompleted) - .Run(); - - Assert.True(context.SagaCompleted); - } - - [Test] - public async Task Should_ignore_messages_afterwards() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => - { - b.When((session, c) => session.SendLocal(new StartSagaMessage - { - SomeId = c.Id - })); - b.When(c => c.StartSagaMessageReceived, (session, c) => - { - c.AddTrace("CompleteSagaMessage sent"); - return session.SendLocal(new CompleteSagaMessage - { - SomeId = c.Id - }); - }); - b.When(c => c.SagaCompleted, (session, c) => session.SendLocal(new AnotherMessage - { - SomeId = c.Id - })); - }) - .Done(c => c.AnotherMessageReceived) - .Run(); - - Assert.True(context.AnotherMessageReceived, "AnotherMessage should have been delivered to the handler outside the saga"); - Assert.False(context.SagaReceivedAnotherMessage, "AnotherMessage should not be delivered to the saga after completion"); - } - - public class Context : ScenarioContext - { - public Guid Id { get; set; } - public bool StartSagaMessageReceived { get; set; } - public bool SagaCompleted { get; set; } - public bool AnotherMessageReceived { get; set; } - public bool SagaReceivedAnotherMessage { get; set; } - } - - public class ReceiveCompletesSagaEndpoint : EndpointConfigurationBuilder - { - public ReceiveCompletesSagaEndpoint() - { - EndpointSetup(b => - { - b.EnableFeature(); - b.ExecuteTheseHandlersFirst(typeof(TestSaga10)); - b.LimitMessageProcessingConcurrencyTo(1); // This test only works if the endpoints processes messages sequentially - }); - } - - public class TestSaga10 : SqlSaga, - IAmStartedByMessages, - IHandleMessages, - IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - Context.AddTrace("Saga started"); - - Data.SomeId = message.SomeId; - - Context.StartSagaMessageReceived = true; - - return Task.FromResult(0); - } - - public Task Handle(AnotherMessage message, IMessageHandlerContext context) - { - Context.AddTrace("AnotherMessage received"); - Context.SagaReceivedAnotherMessage = true; - return Task.FromResult(0); - } - - public Task Handle(CompleteSagaMessage message, IMessageHandlerContext context) - { - Context.AddTrace("CompleteSagaMessage received"); - MarkAsComplete(); - Context.SagaCompleted = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - mapper.ConfigureMapping(m => m.SomeId); - mapper.ConfigureMapping(m => m.SomeId); - } - - protected override string CorrelationPropertyName => nameof(TestSagaData10.SomeId); - } - - public class TestSagaData10 : IContainSagaData - { - public virtual Guid SomeId { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - public class CompletionHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(AnotherMessage message, IMessageHandlerContext context) - { - Context.AnotherMessageReceived = true; - return Task.FromResult(0); - } - } - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - } - - public class CompleteSagaMessage : ICommand - { - public Guid SomeId { get; set; } - } - - public class AnotherMessage : ICommand - { - public Guid SomeId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga.cs deleted file mode 100644 index e18e431cb..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NServiceBus.Persistence.Sql; - - public class When_receiving_that_should_start_a_saga : NServiceBusAcceptanceTest - { - public class SagaEndpointContext : ScenarioContext - { - public bool InterceptingHandlerCalled { get; set; } - - public bool SagaStarted { get; set; } - - public bool InterceptSaga { get; set; } - } - - public class SagaEndpoint : EndpointConfigurationBuilder - { - public SagaEndpoint() - { - EndpointSetup(b => b.ExecuteTheseHandlersFirst(typeof(InterceptingHandler))); - } - - public class TestSaga03 : SqlSaga, IAmStartedByMessages - { - public SagaEndpointContext Context { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - Context.SagaStarted = true; - Data.SomeId = message.SomeId; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - - protected override string CorrelationPropertyName => nameof(TestSagaData03.SomeId); - - public class TestSagaData03 : ContainSagaData - { - public virtual string SomeId { get; set; } - } - } - - public class InterceptingHandler : IHandleMessages - { - public SagaEndpointContext TestContext { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - TestContext.InterceptingHandlerCalled = true; - - if (TestContext.InterceptSaga) - { - context.DoNotContinueDispatchingCurrentMessageToHandlers(); - } - - return Task.FromResult(0); - } - } - } - - - public class StartSagaMessage : ICommand - { - public string SomeId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga_with_interception.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga_with_interception.cs deleted file mode 100644 index 5d6aeda79..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga_with_interception.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using NUnit.Framework; - - public class When_receiving_that_should_start_a_saga_with_interception : When_receiving_that_should_start_a_saga - { - [Test] - public async Task Should_not_start_saga_if_a_interception_handler_has_been_invoked() - { - var context = await Scenario.Define(c => { c.InterceptSaga = true; }) - .WithEndpoint(b => b.When(session => session.SendLocal(new StartSagaMessage - { - SomeId = Guid.NewGuid().ToString() - }))) - .Done(c => c.InterceptingHandlerCalled) - .Run(); - - Assert.True(context.InterceptingHandlerCalled, "The intercepting handler should be called"); - Assert.False(context.SagaStarted, "The saga should not have been started since the intercepting handler stops the pipeline"); - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga_without_interception.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga_without_interception.cs deleted file mode 100644 index 169716e47..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_that_should_start_a_saga_without_interception.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using NUnit.Framework; - - public class When_receiving_that_should_start_a_saga_without_interception : When_receiving_that_should_start_a_saga - { - [Test] - public async Task Should_start_the_saga_and_call_messagehandlers() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new StartSagaMessage - { - SomeId = Guid.NewGuid().ToString() - }))) - .Done(c => c.InterceptingHandlerCalled && c.SagaStarted) - .Run(); - - Assert.True(context.InterceptingHandlerCalled, "The message handler should be called"); - Assert.True(context.SagaStarted, "The saga should have been started"); - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replies_to_message_published_by_a_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replies_to_message_published_by_a_saga.cs deleted file mode 100644 index 4bbda4b9f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replies_to_message_published_by_a_saga.cs +++ /dev/null @@ -1,123 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Routing; - using NServiceBus.Persistence.Sql; - - public class When_replies_to_message_published_by_a_saga : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_reply_to_a_message_published_by_a_saga() - { - var context = await Scenario.Define() - .WithEndpoint - (b => b.When(c => c.Subscribed, session => session.SendLocal(new StartSaga - { - DataId = Guid.NewGuid() - })) - ) - .WithEndpoint(b => b.When(async (session, c) => - { - await session.Subscribe(); - if (c.HasNativePubSubSupport) - { - c.Subscribed = true; - } - })) - .Done(c => c.DidSagaReplyMessageGetCorrelated) - .Run(); - - Assert.True(context.DidSagaReplyMessageGetCorrelated); - } - - public class Context : ScenarioContext - { - public bool DidSagaReplyMessageGetCorrelated { get; set; } - public bool Subscribed { get; set; } - } - - public class ReplyEndpoint : EndpointConfigurationBuilder - { - public ReplyEndpoint() - { - EndpointSetup(b => b.DisableFeature(), metadata => metadata.RegisterPublisherFor(typeof(SagaEndpoint))); - } - - class DidSomethingHandler : IHandleMessages - { - public Task Handle(DidSomething message, IMessageHandlerContext context) - { - return context.Reply(new DidSomethingResponse - { - ReceivedDataId = message.DataId - }); - } - } - } - - public class SagaEndpoint : EndpointConfigurationBuilder - { - public SagaEndpoint() - { - EndpointSetup(b => - { - b.EnableFeature(); - b.OnEndpointSubscribed((s, context) => { context.Subscribed = true; }); - }); - } - - public class ReplyToPubMsgSaga : SqlSaga, IAmStartedByMessages, IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - return context.Publish(new DidSomething - { - DataId = message.DataId - }); - } - - public Task Handle(DidSomethingResponse message, IMessageHandlerContext context) - { - Context.DidSagaReplyMessageGetCorrelated = message.ReceivedDataId == Data.DataId; - MarkAsComplete(); - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - protected override string CorrelationPropertyName => nameof(ReplyToPubMsgSagaData.DataId); - - public class ReplyToPubMsgSagaData : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - } - - public class StartSaga : ICommand - { - public Guid DataId { get; set; } - } - - public class DidSomething : IEvent - { - public Guid DataId { get; set; } - } - - public class DidSomethingResponse : IMessage - { - public Guid ReceivedDataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_first_handler_responding.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_first_handler_responding.cs deleted file mode 100644 index a6e92e7b0..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_first_handler_responding.cs +++ /dev/null @@ -1,120 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - public class When_req_resp_between_sagas_first_handler_responding : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_autocorrelate_the_response_back_to_the_requesting_saga_from_the_first_handler() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new InitiateRequestingSaga()))) - .Done(c => c.DidRequestingSagaGetTheResponse) - .Run(); - - Assert.True(context.DidRequestingSagaGetTheResponse); - } - - public class Context : ScenarioContext - { - public bool DidRequestingSagaGetTheResponse { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class RequestingSaga1 : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext context) - { - return context.SendLocal(new RequestToRespondingSaga - { - SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse //wont be needed in the future - }); - } - - public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context) - { - TestContext.DidRequestingSagaGetTheResponse = true; - - MarkAsComplete(); - - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.SomeCorrelationId); - } - - protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData1.CorrIdForResponse); - - public class RequestResponseRequestingSagaData1 : ContainSagaData - { - public virtual Guid CorrIdForResponse { get; set; } //wont be needed in the future - } - } - - public class RespondingSaga1 : SqlSaga, - IAmStartedByMessages - { - public Context TestContext { get; set; } - - public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext context) - { - // Both reply and reply to originator work here since the sender of the incoming message is the requesting saga - // also note we don't set the correlation ID since auto correlation happens to work for this special case - // where we reply from the first handler - return context.Reply(new ResponseFromOtherSaga()); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs); - } - - protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData1.CorrIdForRequest); - - public class RequestResponseRespondingSagaData1 : ContainSagaData - { - public virtual Guid CorrIdForRequest { get; set; } - } - } - } - - public class InitiateRequestingSaga : ICommand - { - public InitiateRequestingSaga() - { - Id = Guid.NewGuid(); - } - - public Guid Id { get; set; } - } - - public class RequestToRespondingSaga : ICommand - { - public Guid SomeIdThatTheResponseSagaCanCorrelateBackToUs { get; set; } - } - - public class ResponseFromOtherSaga : IMessage - { - public Guid SomeCorrelationId { get; set; } - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_response_from_noninitiating.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_response_from_noninitiating.cs deleted file mode 100644 index 46b812a2f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_response_from_noninitiating.cs +++ /dev/null @@ -1,137 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - public class When_req_resp_between_sagas_response_from_noninitiating : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_autocorrelate_the_response_back() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new InitiateRequestingSaga()))) - .Done(c => c.DidRequestingSagaGetTheResponse) - .Run(); - - Assert.True(context.DidRequestingSagaGetTheResponse); - } - - public class Context : ScenarioContext - { - public bool DidRequestingSagaGetTheResponse { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class RequestingSaga2 : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext context) - { - return context.SendLocal(new RequestToRespondingSaga - { - SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse //wont be needed in the future - }); - } - - public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context) - { - TestContext.DidRequestingSagaGetTheResponse = true; - - MarkAsComplete(); - - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.SomeCorrelationId); - } - - protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData2.CorrIdForResponse); - - public class RequestResponseRequestingSagaData2 : ContainSagaData - { - public virtual Guid CorrIdForResponse { get; set; } //wont be needed in the future - } - } - - public class RespondingSaga2 : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext context) - { - return context.SendLocal(new SendReplyFromNonInitiatingHandler - { - SagaIdSoWeCanCorrelate = Data.CorrIdForRequest - }); - } - - public Task Handle(SendReplyFromNonInitiatingHandler message, IMessageHandlerContext context) - { - //reply to originator must be used here since the sender of the incoming message the timeoutmanager and not the requesting saga - return ReplyToOriginator(context, new ResponseFromOtherSaga //change this line to Bus.Reply(new ResponseFromOtherSaga and see it fail - { - SomeCorrelationId = Data.CorrIdForRequest //wont be needed in the future - }); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs); - //this line is just needed so we can test the non initiating handler case - mapper.ConfigureMapping(m => m.SagaIdSoWeCanCorrelate); - } - - protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData2.CorrIdForRequest); - - public class RequestResponseRespondingSagaData2 : ContainSagaData - { - public virtual Guid CorrIdForRequest { get; set; } - } - } - } - - public class InitiateRequestingSaga : ICommand - { - public InitiateRequestingSaga() - { - Id = Guid.NewGuid(); - } - - public Guid Id { get; set; } - } - - public class RequestToRespondingSaga : ICommand - { - public Guid SomeIdThatTheResponseSagaCanCorrelateBackToUs { get; set; } - } - - public class ResponseFromOtherSaga : IMessage - { - public Guid SomeCorrelationId { get; set; } - } - - public class SendReplyFromNonInitiatingHandler : ICommand - { - public Guid SagaIdSoWeCanCorrelate { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_with_timeout.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_with_timeout.cs deleted file mode 100644 index c454baf18..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_with_timeout.cs +++ /dev/null @@ -1,131 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - public class When_req_resp_between_sagas_with_timeout : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_autocorrelate_the_response_back_to_the_requesting_saga_from_timeouts() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new InitiateRequestingSaga()))) - .Done(c => c.DidRequestingSagaGetTheResponse) - .Run(TimeSpan.FromSeconds(15)); - - Assert.True(context.DidRequestingSagaGetTheResponse); - } - - public class Context : ScenarioContext - { - public bool DidRequestingSagaGetTheResponse { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class RequestingSaga3 : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext context) - { - return context.SendLocal(new RequestToRespondingSaga - { - SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse //wont be needed in the future - }); - } - - public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context) - { - TestContext.DidRequestingSagaGetTheResponse = true; - - MarkAsComplete(); - - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.SomeCorrelationId); - } - - protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData3.CorrIdForResponse); - - public class RequestResponseRequestingSagaData3 : ContainSagaData - { - public virtual Guid CorrIdForResponse { get; set; } //wont be needed in the future - } - } - - public class RespondingSaga3 : SqlSaga, - IAmStartedByMessages, - IHandleTimeouts - { - public Context TestContext { get; set; } - - public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext context) - { - return RequestTimeout(context, TimeSpan.FromMilliseconds(1)); - } - - public Task Timeout(DelayReply state, IMessageHandlerContext context) - { - //reply to originator must be used here since the sender of the incoming message the timeoutmanager and not the requesting saga - return ReplyToOriginator(context, new ResponseFromOtherSaga //change this line to Bus.Reply(new ResponseFromOtherSaga and see it fail - { - SomeCorrelationId = Data.CorrIdForRequest //wont be needed in the future - }); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs); - } - - protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData3.CorrIdForRequest); - - public class RequestResponseRespondingSagaData3 : ContainSagaData - { - public virtual Guid CorrIdForRequest { get; set; } - } - - public class DelayReply - { - } - } - } - - public class InitiateRequestingSaga : ICommand - { - public InitiateRequestingSaga() - { - Id = Guid.NewGuid(); - } - - public Guid Id { get; set; } - } - - public class RequestToRespondingSaga : ICommand - { - public Guid SomeIdThatTheResponseSagaCanCorrelateBackToUs { get; set; } - } - - public class ResponseFromOtherSaga : IMessage - { - public Guid SomeCorrelationId { get; set; } - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_exists_for_start_message.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_exists_for_start_message.cs deleted file mode 100644 index c8843c542..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_exists_for_start_message.cs +++ /dev/null @@ -1,85 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Collections.Generic; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using Persistence.Sql; - - public class When_saga_exists_for_start_message : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_hydrate_and_invoke_the_existing_instance() - { - var someId = Guid.NewGuid(); - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(async session => - { - await session.SendLocal( - new StartSagaMessage - { - SomeId = someId - }); - await session.SendLocal( - new StartSagaMessage - { - SomeId = someId - }); - })) - .Done(c => c.SagaIds.Count >= 2) - .Run(); - - Assert.AreEqual(2, context.SagaIds.Count); - Assert.AreEqual(context.SagaIds[0], context.SagaIds[1]); - } - - public class Context : ScenarioContext - { - public IList SagaIds { get; } = new List(); - } - - public class ExistingSagaInstanceEndpoint : EndpointConfigurationBuilder - { - public ExistingSagaInstanceEndpoint() - { - EndpointSetup(c => c.LimitMessageProcessingConcurrencyTo(1)); - } - - public class TestSaga05 : SqlSaga, IAmStartedByMessages - { - public Context TestContext { get; set; } - protected override string CorrelationPropertyName => nameof(TestSagaData05.SomeId); - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - TestContext.SagaIds.Add(Data.Id); - - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - } - - public class TestSagaData05 : IContainSagaData - { - public virtual Guid SomeId { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - - public bool SecondMessage { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_handles_unmapped_message.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_handles_unmapped_message.cs deleted file mode 100644 index 96e1b4875..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_handles_unmapped_message.cs +++ /dev/null @@ -1,126 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using Persistence.Sql; - - public class When_saga_handles_unmapped_message : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_throw_on_unmapped_uncorrelated_msg() - { - var id = Guid.NewGuid(); - - var context = await Scenario.Define() - .WithEndpoint(b => - { - b.DoNotFailOnErrorMessages(); - - b.When(session => session.SendLocal(new StartSagaMessage - { - SomeId = id - })); - }) - .Done(c => c.MappedEchoReceived && (c.EchoReceived || c.FailedMessages.Any())) - .Run(); - - Assert.AreEqual(true, context.StartReceived); - Assert.AreEqual(true, context.OutboundReceived); - Assert.AreEqual(true, context.MappedEchoReceived); - Assert.AreEqual(false, context.EchoReceived); - Assert.AreEqual(1, context.FailedMessages.Count); - } - - public class Context : ScenarioContext - { - public bool StartReceived { get; set; } - public bool OutboundReceived { get; set; } - public bool EchoReceived { get; set; } - public bool MappedEchoReceived { get; set; } - } - - public class UnmappedMsgEndpoint : EndpointConfigurationBuilder - { - public UnmappedMsgEndpoint() - { - EndpointSetup(); - } - - public class UnmappedMsgSaga : SqlSaga, - IAmStartedByMessages, - IHandleMessages, - IHandleMessages - { - protected override string CorrelationPropertyName => nameof(UnmappedMsgSagaData.SomeId); - - public Context Context { get; set; } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(msg => msg.SomeId); - mapper.ConfigureMapping(msg => msg.SomeId); - // No mapping for EchoMessage, so saga can't possibly be found - } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - Context.StartReceived = true; - return context.SendLocal(new OutboundMessage { SomeId = message.SomeId }); - } - - public Task Handle(MappedEchoMessage message, IMessageHandlerContext context) - { - Context.MappedEchoReceived = true; - return Task.FromResult(0); - } - - public Task Handle(EchoMessage message, IMessageHandlerContext context) - { - Context.EchoReceived = true; - return Task.FromResult(0); - } - } - - public class UnmappedMsgSagaData : ContainSagaData - { - public virtual Guid SomeId { get; set; } - } - - public class OutboundMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public async Task Handle(OutboundMessage message, IMessageHandlerContext context) - { - Context.OutboundReceived = true; - await context.SendLocal(new EchoMessage { SomeId = message.SomeId }); - await context.SendLocal(new MappedEchoMessage { SomeId = message.SomeId }); - } - } - } - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - } - - public class OutboundMessage : ICommand - { - public Guid SomeId { get; set; } - } - - public class EchoMessage : ICommand - { - public Guid SomeId { get; set; } - } - - public class MappedEchoMessage : ICommand - { - public Guid SomeId { get; set; } - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_has_a_non_empty_constructor.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_has_a_non_empty_constructor.cs deleted file mode 100644 index 200687bc5..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_has_a_non_empty_constructor.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using Persistence.Sql; - - public class When_saga_has_a_non_empty_constructor : NServiceBusAcceptanceTest - { - [Test] - public Task Should_hydrate_and_invoke_the_existing_instance() - { - return Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new StartSagaMessage - { - SomeId = IdThatSagaIsCorrelatedOn - }))) - .Done(c => c.SecondMessageReceived) - .Run(); - } - - static Guid IdThatSagaIsCorrelatedOn = Guid.NewGuid(); - - public class Context : ScenarioContext - { - public bool SecondMessageReceived { get; set; } - } - - public class NonEmptySagaCtorEndpt : EndpointConfigurationBuilder - { - public NonEmptySagaCtorEndpt() - { - EndpointSetup(); - } - - public class TestSaga11 : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - protected override string CorrelationPropertyName => nameof(TestSagaData11.SomeId); - - public TestSaga11(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - Data.SomeId = message.SomeId; - return context.SendLocal(new OtherMessage - { - SomeId = message.SomeId - }); - } - - public Task Handle(OtherMessage message, IMessageHandlerContext context) - { - testContext.SecondMessageReceived = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - mapper.ConfigureMapping(m => m.SomeId); - } - - Context testContext; - } - - public class TestSagaData11 : IContainSagaData - { - public virtual Guid SomeId { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - } - - - public class OtherMessage : ICommand - { - public Guid SomeId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_id_changed.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_id_changed.cs deleted file mode 100644 index a707d63b8..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_id_changed.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Support; - using EndpointTemplates; - using NUnit.Framework; - using Persistence.Sql; - - [TestFixture] - public class When_saga_id_changed : NServiceBusAcceptanceTest - { - [Test] - public void Should_throw() - { - var exception = Assert.ThrowsAsync(async () => - await Scenario.Define() - .WithEndpoint( - b => b.When(session => session.SendLocal(new StartSaga - { - DataId = Guid.NewGuid() - }))) - .Done(c => c.FailedMessages.Any()) - .Run()); - - Assert.That(exception.ScenarioContext.FailedMessages, Has.Count.EqualTo(1)); - Assert.That(((Context) exception.ScenarioContext).MessageId, Is.EqualTo(exception.FailedMessage.MessageId), "Message should be moved to errorqueue"); - Assert.That(exception.FailedMessage.Exception.Message, Contains.Substring("A modification of IContainSagaData.Id has been detected. This property is for infrastructure purposes only and should not be modified. SagaType:")); - } - - public class Context : ScenarioContext - { - public string MessageId { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(); - } - - public class SagaIdChangedSaga : SqlSaga, - IAmStartedByMessages - { - public Context TestContext { get; set; } - - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.Id = Guid.NewGuid(); - TestContext.MessageId = context.MessageId; - return Task.FromResult(0); - } - - protected override string CorrelationPropertyName => nameof(SagaIdChangedSagaData.DataId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class SagaIdChangedSagaData : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - } - - public class StartSaga : ICommand - { - public Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_is_mapped_to_complex_expression.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_is_mapped_to_complex_expression.cs deleted file mode 100644 index db0f7e8d7..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_is_mapped_to_complex_expression.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - public class When_saga_is_mapped_to_complex_expression : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_hydrate_and_invoke_the_existing_instance() - { - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new StartSagaMessage - { - Key = "Part1_Part2" - })) - .When(c => c.FirstMessageReceived, session => session.SendLocal(new OtherMessage - { - Part1 = "Part1", - Part2 = "Part2" - }))) - .Done(c => c.SecondMessageReceived) - .Run(); - - Assert.IsTrue(context.SecondMessageReceived); - Assert.AreEqual(context.SagaIdWhenStartSagaMessageReceived, context.SagaIdWhenOtherMessageReceived); - } - - public class Context : ScenarioContext - { - public bool FirstMessageReceived { get; set; } - public bool SecondMessageReceived { get; set; } - public Guid SagaIdWhenStartSagaMessageReceived { get; set; } - public Guid SagaIdWhenOtherMessageReceived { get; set; } - } - - public class SagaEndpoint : EndpointConfigurationBuilder - { - public SagaEndpoint() - { - //note: the concurrency checks for the InMemory persister doesn't seem to work so limiting to 1 for now - EndpointSetup(c => c.LimitMessageProcessingConcurrencyTo(1)); - } - - public class TestSaga02 : SqlSaga, - IAmStartedByMessages, IAmStartedByMessages - { - public Context Context { get; set; } - - public Task Handle(OtherMessage message, IMessageHandlerContext context) - { - Context.SagaIdWhenOtherMessageReceived = Data.Id; - Context.SecondMessageReceived = true; - return Task.FromResult(0); - } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - Context.FirstMessageReceived = true; - Context.SagaIdWhenStartSagaMessageReceived = Data.Id; - return Task.FromResult(0); - } - - protected override string CorrelationPropertyName => nameof(TestSagaData02.KeyValue); - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Key); - mapper.ConfigureMapping(m => m.Part1 + "_" + m.Part2); - } - } - - public class TestSagaData02 : IContainSagaData - { - public virtual string KeyValue { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - public class StartSagaMessage : ICommand - { - public string Key { get; set; } - } - - public class OtherMessage : ICommand - { - public string Part2 { get; set; } - public string Part1 { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_message_goes_through_delayed_retries.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_message_goes_through_delayed_retries.cs deleted file mode 100644 index 375bc11e4..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_message_goes_through_delayed_retries.cs +++ /dev/null @@ -1,112 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - - //repro for issue: https://github.com/NServiceBus/NServiceBus/issues/1020 - public class When_saga_message_goes_through_delayed_retries : NServiceBusAcceptanceTest - { - [Test] - public Task Should_invoke_the_correct_handle_methods_on_the_saga() - { - return Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new StartSagaMessage - { - SomeId = Guid.NewGuid() - }))) - .Done(c => c.SecondMessageProcessed) - .Run(); - } - - public class Context : ScenarioContext - { - public bool SecondMessageProcessed { get; set; } - public int NumberOfTimesInvoked { get; set; } - } - - public class DelayedRetryEndpoint : EndpointConfigurationBuilder - { - public DelayedRetryEndpoint() - { - EndpointSetup(b => - { - b.EnableFeature(); - var recoverability = b.Recoverability(); - recoverability.Delayed(settings => - { - settings.NumberOfRetries(1); - settings.TimeIncrease(TimeSpan.FromMilliseconds(1)); - }); - }); - } - - public class DelayedRetryTestingSaga : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - protected override string CorrelationPropertyName => nameof(DelayedRetryTestingSagaData.SomeId); - - public Context TestContext { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - Data.SomeId = message.SomeId; - - return context.SendLocal(new SecondSagaMessage - { - SomeId = Data.SomeId - }); - } - - public Task Handle(SecondSagaMessage message, IMessageHandlerContext context) - { - TestContext.NumberOfTimesInvoked++; - - if (TestContext.NumberOfTimesInvoked < 2) - { - throw new SimulatedException(); - } - - TestContext.SecondMessageProcessed = true; - - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - mapper.ConfigureMapping(m => m.SomeId); - } - } - - public class DelayedRetryTestingSagaData : IContainSagaData - { - public virtual Guid SomeId { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - } - - public class SecondSagaMessage : ICommand - { - public Guid SomeId { get; set; } - } - - public class SomeTimeout - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_started_concurrently.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_started_concurrently.cs deleted file mode 100644 index fb526553b..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_saga_started_concurrently.cs +++ /dev/null @@ -1,153 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - using Persistence.Sql; - - public class When_saga_started_concurrently : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_start_single_saga() - { - var context = await Scenario.Define(c => { c.SomeId = Guid.NewGuid().ToString(); }) - .WithEndpoint(b => - { - b.When((session, ctx) => - { - var t1 = session.SendLocal(new StartMessageOne - { - SomeId = ctx.SomeId - }); - var t2 = session.SendLocal(new StartMessageTwo - { - SomeId = ctx.SomeId - }); - return Task.WhenAll(t1, t2); - }); - }) - .Done(c => c.PlacedSagaId != Guid.Empty && c.BilledSagaId != Guid.Empty) - .Run(); - - Assert.AreNotEqual(Guid.Empty, context.PlacedSagaId); - Assert.AreNotEqual(Guid.Empty, context.BilledSagaId); - Assert.AreEqual(context.PlacedSagaId, context.BilledSagaId, "Both messages should have been handled by the same saga, but SagaIds don't match."); - } - - public class Context : ScenarioContext - { - public string SomeId { get; set; } - public Guid PlacedSagaId { get; set; } - public Guid BilledSagaId { get; set; } - public bool SagaCompleted { get; set; } - } - - public class ConcurrentHandlerEndpoint : EndpointConfigurationBuilder - { - public ConcurrentHandlerEndpoint() - { - EndpointSetup(b => - { - b.LimitMessageProcessingConcurrencyTo(2); - b.Recoverability().Immediate(immediate => immediate.NumberOfRetries(3)); - }); - } - - public class ConcurrentlyStartedSaga : SqlSaga, - IAmStartedByMessages, - IAmStartedByMessages - { - protected override string CorrelationPropertyName => nameof(ConcurrentlyStartedSagaData.OrderId); - - public Context Context { get; set; } - - public async Task Handle(StartMessageOne message, IMessageHandlerContext context) - { - Data.Placed = true; - await context.SendLocal(new SuccessfulProcessing - { - SagaId = Data.Id, - Type = nameof(StartMessageOne) - }); - CheckForCompletion(context); - } - - public async Task Handle(StartMessageTwo message, IMessageHandlerContext context) - { - Data.Billed = true; - await context.SendLocal(new SuccessfulProcessing - { - SagaId = Data.Id, - Type = nameof(StartMessageTwo) - }); - CheckForCompletion(context); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(msg => msg.SomeId); - mapper.ConfigureMapping(msg => msg.SomeId); - } - - void CheckForCompletion(IMessageHandlerContext context) - { - if (!Data.Billed || !Data.Placed) - { - return; - } - MarkAsComplete(); - Context.SagaCompleted = true; - } - } - - public class ConcurrentlyStartedSagaData : ContainSagaData - { - public virtual string OrderId { get; set; } - public virtual bool Placed { get; set; } - public virtual bool Billed { get; set; } - } - - // Intercepts the messages sent out by the saga - class LogSuccessfulHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(SuccessfulProcessing message, IMessageHandlerContext context) - { - if (message.Type == nameof(StartMessageOne)) - { - Context.PlacedSagaId = message.SagaId; - } - else if (message.Type == nameof(StartMessageTwo)) - { - Context.BilledSagaId = message.SagaId; - } - else - { - throw new Exception("Unknown type"); - } - - return Task.FromResult(0); - } - } - } - - public class StartMessageOne : ICommand - { - public string SomeId { get; set; } - } - - public class StartMessageTwo : ICommand - { - public string SomeId { get; set; } - } - - public class SuccessfulProcessing : ICommand - { - public string Type { get; set; } - public Guid SagaId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sagas_cant_be_found.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sagas_cant_be_found.cs deleted file mode 100644 index fca0921f8..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sagas_cant_be_found.cs +++ /dev/null @@ -1,212 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NServiceBus.Sagas; - using NUnit.Framework; - using Persistence.Sql; - - public partial class When_sagas_cant_be_found : NServiceBusAcceptanceTest - { - [Test] - public async Task IHandleSagaNotFound_only_called_once() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.SendLocal(new MessageToSaga - { - Id = Guid.NewGuid() - }))) - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(1, context.TimesFired); - } - - [Test] - public async Task IHandleSagaNotFound_not_called_if_second_saga_is_executed() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.SendLocal(new MessageToSaga - { - Id = Guid.NewGuid() - }))) - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(0, context.TimesFired); - } - - public class Context : ScenarioContext - { - public int TimesFired { get; set; } - public bool Done { get; set; } - } - - public class ReceiverWithSagas : EndpointConfigurationBuilder - { - public ReceiverWithSagas() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class CantBeFoundSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages - { - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.MessageId = message.Id; - return Task.FromResult(0); - } - - public Task Handle(MessageToSaga message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - - protected override string CorrelationPropertyName => nameof(CantBeFoundSaga1Data.MessageId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.Id); - } - - public class CantBeFoundSaga1Data : ContainSagaData - { - public virtual Guid MessageId { get; set; } - } - } - - public class CantBeFoundSaga2 : SqlSaga, IAmStartedByMessages, IHandleMessages - { - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.MessageId = message.Id; - return Task.FromResult(0); - } - - public Task Handle(MessageToSaga message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.Id); - } - - public class CantBeFoundSaga2Data : ContainSagaData - { - public virtual Guid MessageId { get; set; } - } - - protected override string CorrelationPropertyName => nameof(CantBeFoundSaga2Data.MessageId); - } - - public class SagaNotFound : IHandleSagaNotFound - { - public Context TestContext { get; set; } - - public Task Handle(object message, IMessageProcessingContext context) - { - TestContext.TimesFired++; - TestContext.Done = true; - return Task.FromResult(0); - } - } - } - - public class ReceiverWithOrderedSagas : EndpointConfigurationBuilder - { - public ReceiverWithOrderedSagas() - { - EndpointSetup(c => - { - c.EnableFeature(); - c.ExecuteTheseHandlersFirst(typeof(ReceiverWithOrderedSagasSaga1), typeof(ReceiverWithOrderedSagasSaga2)); - }); - } - - public class ReceiverWithOrderedSagasSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages - { - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.MessageId = message.Id; - return Task.FromResult(0); - } - - public Task Handle(MessageToSaga message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - protected override string CorrelationPropertyName => nameof(ReceiverWithOrderedSagasSaga1Data.MessageId); - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.Id); - } - - public class ReceiverWithOrderedSagasSaga1Data : ContainSagaData - { - public virtual Guid MessageId { get; set; } - } - } - - public class ReceiverWithOrderedSagasSaga2 : SqlSaga, IHandleMessages, IAmStartedByMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToSaga message, IMessageHandlerContext context) - { - Data.MessageId = message.Id; - Context.Done = true; - return Task.FromResult(0); - } - - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.MessageId = message.Id; - return Task.FromResult(0); - } - - protected override string CorrelationPropertyName => nameof(ReceiverWithOrderedSagasSaga2Data.MessageId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.Id); - } - - public class ReceiverWithOrderedSagasSaga2Data : ContainSagaData - { - public virtual Guid MessageId { get; set; } - } - } - - public class SagaNotFound : IHandleSagaNotFound - { - public Context TestContext { get; set; } - - public Task Handle(object message, IMessageProcessingContext context) - { - TestContext.TimesFired++; - return Task.FromResult(0); - } - } - } - - public class StartSaga : ICommand - { - public Guid Id { get; set; } - } - - public class MessageToSaga : ICommand - { - public Guid Id { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sagas_share_timeout_messages.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sagas_share_timeout_messages.cs deleted file mode 100644 index 8a3e19636..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sagas_share_timeout_messages.cs +++ /dev/null @@ -1,112 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - - public class When_sagas_share_timeout_messages : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_invoke_instance_that_requested_the_timeout() - { - var context = await Scenario.Define() - .WithEndpoint(e => e.When(s => s.SendLocal(new StartSagaMessage() - { - Id = Guid.NewGuid().ToString() - }))) - .Done(c => c.Saga1ReceivedTimeout || c.Saga2ReceivedTimeout) - .Run(TimeSpan.FromSeconds(30)); - - Assert.IsTrue(context.Saga2ReceivedTimeout); - Assert.IsFalse(context.Saga1ReceivedTimeout); - } - - public class Context : ScenarioContext - { - public bool Saga1ReceivedTimeout { get; set; } - public bool Saga2ReceivedTimeout { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => - { - c.EnableFeature(); - }); - } - - public class TimeoutSharingSaga1 : SqlSaga, - IAmStartedByMessages, - IHandleTimeouts - { - protected override string CorrelationPropertyName => nameof(TimeoutSharingSagaData1.CorrelationProperty); - - public Context Context { get; set; } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - public Task Timeout(MySagaTimeout state, IMessageHandlerContext context) - { - Context.Saga1ReceivedTimeout = true; - return Task.FromResult(0); - } - - public class TimeoutSharingSagaData1 : ContainSagaData - { - public virtual string CorrelationProperty { get; set; } - } - - } - - public class TimeoutSharingSaga2 : SqlSaga, IAmStartedByMessages, IHandleTimeouts - { - protected override string CorrelationPropertyName => nameof(TimeoutSharingSagaData2.CorrelationProperty); - - public Context Context { get; set; } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Id); - } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - return RequestTimeout(context, TimeSpan.FromSeconds(10)); - } - - public Task Timeout(MySagaTimeout state, IMessageHandlerContext context) - { - Context.Saga2ReceivedTimeout = true; - return Task.FromResult(0); - } - public class TimeoutSharingSagaData2 : ContainSagaData - { - public virtual string CorrelationProperty { get; set; } - } - } - } - - public class StartSagaMessage : ICommand - { - public string Id { get; set; } - } - - public class MySagaTimeout - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sending_from_a_saga_handle.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sending_from_a_saga_handle.cs deleted file mode 100644 index 9907a2f69..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sending_from_a_saga_handle.cs +++ /dev/null @@ -1,114 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - - public class When_sending_from_a_saga_handle : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_match_different_saga() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new StartSaga1 - { - DataId = Guid.NewGuid() - }))) - .Done(c => c.DidSaga2ReceiveMessage) - .Run(); - - Assert.True(context.DidSaga2ReceiveMessage); - } - - public class Context : ScenarioContext - { - public bool DidSaga2ReceiveMessage { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class TwoSaga1Saga1 : SqlSaga, IAmStartedByMessages, IHandleMessages - { - protected override string CorrelationPropertyName => nameof(TwoSaga1Saga1Data.DataId); - - public Task Handle(StartSaga1 message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - return context.SendLocal(new MessageSaga1WillHandle - { - DataId = message.DataId - }); - } - - public async Task Handle(MessageSaga1WillHandle message, IMessageHandlerContext context) - { - await context.SendLocal(new StartSaga2 - { - DataId = message.DataId - }); - MarkAsComplete(); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - mapper.ConfigureMapping(m => m.DataId); - } - } - - public class TwoSaga1Saga1Data : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - - public class TwoSaga1Saga2 : SqlSaga, IAmStartedByMessages - { - protected override string CorrelationPropertyName => nameof(TwoSaga1Saga2Data.DataId); - - public Context Context { get; set; } - - public Task Handle(StartSaga2 message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - Context.DidSaga2ReceiveMessage = true; - - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class TwoSaga1Saga2Data : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - } - - public class StartSaga1 : ICommand - { - public Guid DataId { get; set; } - } - - public class StartSaga2 : ICommand - { - public Guid DataId { get; set; } - } - - public class MessageSaga1WillHandle : IMessage - { - public Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sending_from_a_saga_timeout.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sending_from_a_saga_timeout.cs deleted file mode 100644 index 2c0cbb862..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_sending_from_a_saga_timeout.cs +++ /dev/null @@ -1,112 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - - public class When_sending_from_a_saga_timeout : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_match_different_saga() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new StartSaga1 - { - DataId = Guid.NewGuid() - }))) - .Done(c => c.DidSaga2ReceiveMessage) - .Run(); - - Assert.True(context.DidSaga2ReceiveMessage); - } - - public class Context : ScenarioContext - { - public bool DidSaga2ReceiveMessage { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class SendFromTimeoutSaga1 : SqlSaga, - IAmStartedByMessages, - IHandleTimeouts - { - protected override string CorrelationPropertyName => nameof(SendFromTimeoutSaga1Data.DataId); - - public Context TestContext { get; set; } - - public Task Handle(StartSaga1 message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - return RequestTimeout(context, TimeSpan.FromMilliseconds(1), new Saga1Timeout()); - } - - public async Task Timeout(Saga1Timeout state, IMessageHandlerContext context) - { - await context.SendLocal(new StartSaga2 - { - DataId = Data.DataId - }); - MarkAsComplete(); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class SendFromTimeoutSaga1Data : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - - public class SendFromTimeoutSaga2 : SqlSaga, IAmStartedByMessages - { - protected override string CorrelationPropertyName => nameof(SendFromTimeoutSaga2Data.DataId); - - public Context Context { get; set; } - - public Task Handle(StartSaga2 message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - Context.DidSaga2ReceiveMessage = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class SendFromTimeoutSaga2Data : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - } - - public class StartSaga1 : ICommand - { - public Guid DataId { get; set; } - } - - public class StartSaga2 : ICommand - { - public Guid DataId { get; set; } - } - - public class Saga1Timeout : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_started_by_base_event_from_other_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_started_by_base_event_from_other_saga.cs deleted file mode 100644 index 002dfea96..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_started_by_base_event_from_other_saga.cs +++ /dev/null @@ -1,109 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - using Routing; - - //Repro for #1323 - public class When_started_by_base_event_from_other_saga : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_start_the_saga_when_set_up_to_start_for_the_base_event() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.IsEventSubscriptionReceived, - session => { return session.Publish(m => { m.DataId = Guid.NewGuid(); }); }) - ) - .WithEndpoint( - b => b.When(async (session, c) => - { - await session.Subscribe(); - - if (c.HasNativePubSubSupport) - { - c.IsEventSubscriptionReceived = true; - } - })) - .Done(c => c.DidSagaComplete) - .Run(); - - Assert.True(context.DidSagaComplete); - } - - public class SagaContext : ScenarioContext - { - public bool IsEventSubscriptionReceived { get; set; } - public bool DidSagaComplete { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => b.OnEndpointSubscribed((args, context) => - { - context.AddTrace($"Subscription received for {args.SubscriberReturnAddress}"); - context.IsEventSubscriptionReceived = true; - })); - } - } - - public class SagaThatIsStartedByABaseEvent : EndpointConfigurationBuilder - { - public SagaThatIsStartedByABaseEvent() - { - EndpointSetup(c => - { - c.EnableFeature(); - c.DisableFeature(); - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class SagaStartedByBaseEvent : SqlSaga, IAmStartedByMessages - { - public SagaContext Context { get; set; } - protected override string CorrelationPropertyName => nameof(SagaStartedByBaseEventSagaData.DataId); - - public Task Handle(BaseEvent message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - MarkAsComplete(); - Context.DidSagaComplete = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class SagaStartedByBaseEventSagaData : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - } - - - public class StartSaga : ICommand - { - public Guid DataId { get; set; } - } - - public interface SomethingHappenedEvent : BaseEvent - { - } - - public interface BaseEvent : IEvent - { - Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_started_by_event_from_another_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_started_by_event_from_another_saga.cs deleted file mode 100644 index 98b66ad29..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_started_by_event_from_another_saga.cs +++ /dev/null @@ -1,167 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - using Routing; - - //Repro for #1323 - public class When_started_by_event_from_another_saga : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_start_the_saga_and_request_a_timeout() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.IsEventSubscriptionReceived, - session => session.SendLocal(new StartSaga - { - DataId = Guid.NewGuid() - })) - ) - .WithEndpoint( - b => b.When(async (session, c) => - { - await session.Subscribe(); - - if (c.HasNativePubSubSupport) - { - c.IsEventSubscriptionReceived = true; - } - })) - .Done(c => c.DidSaga1Complete && c.DidSaga2Complete) - .Run(); - - Assert.True(context.DidSaga1Complete && context.DidSaga2Complete); - } - - public class Context : ScenarioContext - { - public bool DidSaga1Complete { get; set; } - public bool DidSaga2Complete { get; set; } - public bool IsEventSubscriptionReceived { get; set; } - } - - public class SagaThatPublishesAnEvent : EndpointConfigurationBuilder - { - public SagaThatPublishesAnEvent() - { - EndpointSetup(b => - { - b.EnableFeature(); - b.OnEndpointSubscribed((s, context) => { context.IsEventSubscriptionReceived = true; }); - }); - } - - public class EventFromOtherSaga1 : SqlSaga, - IAmStartedByMessages, - IHandleTimeouts - { - protected override string CorrelationPropertyName => nameof(EventFromOtherSaga1Data.DataId); - - public Context TestContext { get; set; } - - public async Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - - //Publish the event, which will start the second saga - await context.Publish(m => { m.DataId = message.DataId; }); - - //Request a timeout - await RequestTimeout(context, TimeSpan.FromMilliseconds(1)); - } - - public Task Timeout(Timeout1 state, IMessageHandlerContext context) - { - MarkAsComplete(); - TestContext.DidSaga1Complete = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class EventFromOtherSaga1Data : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - - public class Timeout1 - { - } - } - } - - public class SagaThatIsStartedByTheEvent : EndpointConfigurationBuilder - { - public SagaThatIsStartedByTheEvent() - { - EndpointSetup(c => - { - c.EnableFeature(); - c.DisableFeature(); - }, - metadata => metadata.RegisterPublisherFor(typeof(SagaThatPublishesAnEvent))); - } - - public class EventFromOtherSaga2 : SqlSaga, - IAmStartedByMessages, - IHandleTimeouts - { - protected override string CorrelationPropertyName => nameof(EventFromOtherSaga2Data.DataId); - - public Context Context { get; set; } - - public Task Handle(SomethingHappenedEvent message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - //Request a timeout - return RequestTimeout(context, TimeSpan.FromMilliseconds(1)); - } - - public Task Timeout(Saga2Timeout state, IMessageHandlerContext context) - { - MarkAsComplete(); - Context.DidSaga2Complete = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class EventFromOtherSaga2Data : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - - public class Saga2Timeout - { - } - } - } - - - public class StartSaga : ICommand - { - public Guid DataId { get; set; } - } - - public interface SomethingHappenedEvent : BaseEvent - { - } - - public interface BaseEvent : IEvent - { - Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_timeout_hit_not_found_saga.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_timeout_hit_not_found_saga.cs deleted file mode 100644 index b2b5d247e..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_timeout_hit_not_found_saga.cs +++ /dev/null @@ -1,116 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NServiceBus.Sagas; - using NUnit.Framework; - using Persistence.Sql; - - public class When_timeout_hit_not_found_saga : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_fire_notfound_for_tm() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new StartSaga - { - DataId = Guid.NewGuid() - }))) - .Done(c => c.NotFoundHandlerCalledForRegularMessage) - .Run(); - - Assert.False(context.NotFoundHandlerCalledForTimeout); - } - - public class Context : ScenarioContext - { - public bool NotFoundHandlerCalledForRegularMessage { get; set; } - public bool NotFoundHandlerCalledForTimeout { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class TimeoutHitsNotFoundSaga : SqlSaga, - IAmStartedByMessages, - IHandleSagaNotFound, - IHandleTimeouts, - IHandleMessages - { - protected override string CorrelationPropertyName => nameof(TimeoutHitsNotFoundSagaData.DataId); - - public Context TestContext { get; set; } - - public async Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - - //this will cause the message to be delivered right away - await RequestTimeout(context, TimeSpan.Zero); - await context.SendLocal(new SomeOtherMessage - { - DataId = Guid.NewGuid() - }); - - MarkAsComplete(); - } - - public Task Handle(SomeOtherMessage message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - public Task Handle(object message, IMessageProcessingContext context) - { - if (message is SomeOtherMessage) - { - TestContext.NotFoundHandlerCalledForRegularMessage = true; - } - - if (message is MyTimeout) - { - TestContext.NotFoundHandlerCalledForTimeout = true; - } - return Task.FromResult(0); - } - - public Task Timeout(MyTimeout state, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - mapper.ConfigureMapping(m => m.DataId); - } - - public class TimeoutHitsNotFoundSagaData : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - - public class MyTimeout - { - } - } - } - - public class StartSaga : IMessage - { - public Guid DataId { get; set; } - } - - public class SomeOtherMessage : IMessage - { - public Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_two_sagas_subscribe_to_the_same_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_two_sagas_subscribe_to_the_same_event.cs deleted file mode 100644 index 443716cb9..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_two_sagas_subscribe_to_the_same_event.cs +++ /dev/null @@ -1,169 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - using Routing; - - // Repro for issue https://github.com/NServiceBus/NServiceBus/issues/1277 - public class When_two_sagas_subscribe_to_the_same_event : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_invoke_all_handlers_on_all_sagas() - { - // exclude the brokers since c.Subscribed won't get set for them - Requires.MessageDrivenPubSub(); - - var context = await Scenario.Define() - .WithEndpoint() - .WithEndpoint(b => - b.When(c => c.Subscribed, session => session.SendLocal(new StartSaga2 - { - DataId = Guid.NewGuid() - })) - ) - .Done(c => c.DidSaga1EventHandlerGetInvoked && c.DidSaga2EventHandlerGetInvoked) - .Run(); - - Assert.True(context.DidSaga1EventHandlerGetInvoked && context.DidSaga2EventHandlerGetInvoked); - } - - public class Context : ScenarioContext - { - public bool Subscribed { get; set; } - public bool DidSaga1EventHandlerGetInvoked { get; set; } - public bool DidSaga2EventHandlerGetInvoked { get; set; } - } - - public class Publisher : EndpointConfigurationBuilder - { - public Publisher() - { - EndpointSetup(b => - { - b.EnableFeature(); - b.OnEndpointSubscribed((s, context) => { context.Subscribed = true; }); - }); - } - - class OpenGroupCommandHandler : IHandleMessages - { - public Task Handle(OpenGroupCommand message, IMessageHandlerContext context) - { - return context.Publish(new GroupPendingEvent - { - DataId = message.DataId - }); - } - } - } - - public class SagaEndpoint : EndpointConfigurationBuilder - { - public SagaEndpoint() - { - EndpointSetup(c => - { - c.EnableFeature(); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(OpenGroupCommand), typeof(Publisher)); - }, - metadata => metadata.RegisterPublisherFor(typeof(Publisher))); - } - - public class Saga1 : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(GroupPendingEvent message, IMessageHandlerContext context) - { - return context.SendLocal(new CompleteSaga1Now - { - DataId = message.DataId - }); - } - - public Task Handle(CompleteSaga1Now message, IMessageHandlerContext context) - { - TestContext.DidSaga1EventHandlerGetInvoked = true; - - MarkAsComplete(); - - return Task.FromResult(0); - } - - protected override string CorrelationPropertyName => nameof(MySaga1Data.DataId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - mapper.ConfigureMapping(m => m.DataId); - } - - public class MySaga1Data : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - - public class Saga2 : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(StartSaga2 message, IMessageHandlerContext context) - { - return context.Send(new OpenGroupCommand - { - DataId = Data.DataId - }); - } - - public Task Handle(GroupPendingEvent message, IMessageHandlerContext context) - { - TestContext.DidSaga2EventHandlerGetInvoked = true; - MarkAsComplete(); - return Task.FromResult(0); - } - - protected override string CorrelationPropertyName => nameof(MySaga2Data.DataId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - mapper.ConfigureMapping(m => m.DataId); - } - - public class MySaga2Data : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - } - } - - public class GroupPendingEvent : IEvent - { - public Guid DataId { get; set; } - } - - public class OpenGroupCommand : ICommand - { - public Guid DataId { get; set; } - } - - public class StartSaga2 : ICommand - { - public Guid DataId { get; set; } - } - - public class CompleteSaga1Now : ICommand - { - public Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_updating_existing_correlation_property.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_updating_existing_correlation_property.cs deleted file mode 100644 index 983363889..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_updating_existing_correlation_property.cs +++ /dev/null @@ -1,87 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Linq; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Support; - using EndpointTemplates; - using NUnit.Framework; - using Persistence.Sql; - - public class When_updating_existing_correlation_property : NServiceBusAcceptanceTest - { - [Test] - public void Should_blow_up() - { - var exception = Assert.ThrowsAsync(async () => - await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new StartSagaMessage - { - SomeId = Guid.NewGuid() - }))) - .Done(c => c.FailedMessages.Any()) - .Run()); - - Assert.IsTrue(((Context)exception.ScenarioContext).ModifiedCorrelationProperty); - Assert.AreEqual(1, exception.ScenarioContext.FailedMessages.Count); - StringAssert.Contains( - "Changing the value of correlated properties at runtime is currently not supported", - exception.FailedMessage.Exception.Message); - } - - public class Context : ScenarioContext - { - public bool ModifiedCorrelationProperty { get; set; } - } - - public class ChangePropertyEndpoint : EndpointConfigurationBuilder - { - public ChangePropertyEndpoint() - { - EndpointSetup(); - } - - public class ChangeCorrPropertySaga : SqlSaga, IAmStartedByMessages - { - public Context TestContext { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - if (message.SecondMessage) - { - Data.SomeId = Guid.NewGuid(); //this is not allowed - TestContext.ModifiedCorrelationProperty = true; - return Task.FromResult(0); - } - - return context.SendLocal(new StartSagaMessage - { - SecondMessage = true, - SomeId = Data.SomeId - }); - } - - protected override string CorrelationPropertyName => nameof(ChangeCorrPropertySagaData.SomeId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - } - - public class ChangeCorrPropertySagaData : IContainSagaData - { - public virtual Guid SomeId { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - public bool SecondMessage { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_ReplyToOriginator.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_ReplyToOriginator.cs deleted file mode 100644 index a0bf414e0..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_ReplyToOriginator.cs +++ /dev/null @@ -1,102 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using NServiceBus.Persistence.Sql; - - public class When_using_ReplyToOriginator : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_set_Reply_as_messageintent() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new InitiateRequestingSaga - { - SomeCorrelationId = Guid.NewGuid() - }))) - .Done(c => c.Done) - .Run(); - - Assert.AreEqual(MessageIntentEnum.Reply, context.Intent); - } - - public class Context : ScenarioContext - { - public MessageIntentEnum Intent { get; set; } - public bool Done { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class RequestingSaga : SqlSaga, - IAmStartedByMessages, - IHandleMessages - { - public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext context) - { - Data.CorrIdForResponse = message.SomeCorrelationId; //wont be needed in the future - - return context.SendLocal(new AnotherRequest - { - SomeCorrelationId = Data.CorrIdForResponse //wont be needed in the future - }); - } - - public async Task Handle(AnotherRequest message, IMessageHandlerContext context) - { - await ReplyToOriginator(context, new MyReplyToOriginator()); - MarkAsComplete(); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeCorrelationId); - mapper.ConfigureMapping(m => m.SomeCorrelationId); - } - - protected override string CorrelationPropertyName => nameof(RequestingSagaData.CorrIdForResponse); - - public class RequestingSagaData : ContainSagaData - { - public virtual Guid CorrIdForResponse { get; set; } //wont be needed in the future - } - } - - class MyReplyToOriginatorHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MyReplyToOriginator message, IMessageHandlerContext context) - { - TestContext.Intent = (MessageIntentEnum) Enum.Parse(typeof(MessageIntentEnum), context.MessageHeaders[Headers.MessageIntent]); - TestContext.Done = true; - return Task.FromResult(0); - } - } - } - - public class InitiateRequestingSaga : ICommand - { - public Guid SomeCorrelationId { get; set; } - } - - public class AnotherRequest : ICommand - { - public Guid SomeCorrelationId { get; set; } - } - - public class MyReplyToOriginator : IMessage - { - public Guid SomeCorrelationId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_a_received_message_for_timeout.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_a_received_message_for_timeout.cs deleted file mode 100644 index 0ce1df8b9..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_a_received_message_for_timeout.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - - public class When_using_a_received_message_for_timeout : NServiceBusAcceptanceTest - { - [Test] - public async Task Timeout_should_be_received_after_expiration() - { - var context = await Scenario.Define() - .WithEndpoint(g => g.When(session => session.SendLocal(new StartSagaMessage - { - SomeId = Guid.NewGuid() - }))) - .Done(c => c.TimeoutReceived) - .Run(); - - Assert.True(context.TimeoutReceived); - Assert.AreEqual(1, context.HandlerCalled); - } - - public class Context : ScenarioContext - { - public bool TimeoutReceived { get; set; } - public int HandlerCalled { get; set; } - } - - public class ReceiveMessageForTimeoutEndpoint : EndpointConfigurationBuilder - { - public ReceiveMessageForTimeoutEndpoint() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class TestSaga01 : SqlSaga, IAmStartedByMessages, IHandleTimeouts - { - protected override string CorrelationPropertyName => nameof(TestSagaData01.SomeId); - - public Context TestContext { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - TestContext.HandlerCalled++; - return RequestTimeout(context, TimeSpan.FromMilliseconds(100), message); - } - - public Task Timeout(StartSagaMessage message, IMessageHandlerContext context) - { - MarkAsComplete(); - TestContext.TimeoutReceived = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - } - - public class TestSagaData01 : IContainSagaData - { - public virtual Guid SomeId { get; set; } - public virtual Guid Id { get; set; } - public virtual string Originator { get; set; } - public virtual string OriginalMessageId { get; set; } - } - } - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_contain_saga_data.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_contain_saga_data.cs deleted file mode 100644 index 7b78af72d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_contain_saga_data.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Persistence.Sql; - - public class When_using_contain_saga_data : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_handle_timeouts_properly() - { - var context = await Scenario.Define() - .WithEndpoint( - b => b.When(session => session.SendLocal(new StartSaga - { - DataId = Guid.NewGuid() - }))) - .Done(c => c.TimeoutReceived) - .Run(); - - Assert.True(context.TimeoutReceived); - } - - public class Context : ScenarioContext - { - public bool TimeoutReceived { get; set; } - } - - public class EndpointThatHostsASaga : EndpointConfigurationBuilder - { - public EndpointThatHostsASaga() - { - EndpointSetup(config => config.EnableFeature()); - } - - public class MySaga : SqlSaga, - IAmStartedByMessages, - IHandleTimeouts - { - protected override string CorrelationPropertyName => nameof(MySagaData.DataId); - - public Context TestContext { get; set; } - - public Task Handle(StartSaga message, IMessageHandlerContext context) - { - Data.DataId = message.DataId; - - return RequestTimeout(context, TimeSpan.FromMilliseconds(1), new TimeHasPassed()); - } - - public Task Timeout(TimeHasPassed state, IMessageHandlerContext context) - { - MarkAsComplete(); - TestContext.TimeoutReceived = true; - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.DataId); - } - - public class MySagaData : ContainSagaData - { - public virtual Guid DataId { get; set; } - } - - public class TimeHasPassed - { - } - } - } - - public class StartSaga : IMessage - { - public Guid DataId { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_receiving_multiple_timeouts.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_receiving_multiple_timeouts.cs deleted file mode 100644 index 60348a2ad..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_receiving_multiple_timeouts.cs +++ /dev/null @@ -1,160 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NServiceBus.Sagas; - using NUnit.Framework; - using Persistence.Sql; - - public class When_receiving_multiple_timeouts : NServiceBusAcceptanceTest - { - // realted to NSB issue #1819 - [Test] - public async Task It_should_not_invoke_SagaNotFound_handler() - { - var context = await Scenario.Define(c => { c.Id = Guid.NewGuid(); }) - .WithEndpoint(b => b.When((session, c) => session.SendLocal(new StartSaga1 - { - ContextId = c.Id - }))) - .Done(c => (c.Saga1TimeoutFired && c.Saga2TimeoutFired) || c.SagaNotFound) - .Run(TimeSpan.FromSeconds(60)); - - Assert.IsFalse(context.SagaNotFound); - Assert.IsTrue(context.Saga1TimeoutFired); - Assert.IsTrue(context.Saga2TimeoutFired); - } - - public class Context : ScenarioContext - { - public Guid Id { get; set; } - public bool Saga1TimeoutFired { get; set; } - public bool Saga2TimeoutFired { get; set; } - public bool SagaNotFound { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => - { - c.EnableFeature(); - c.ExecuteTheseHandlersFirst(typeof(CatchAllMessageHandler)); - c.Recoverability().Immediate(immediate => immediate.NumberOfRetries(5)); - }); - } - - public class MultiTimeoutsSaga1 : SqlSaga, - IAmStartedByMessages, - IHandleTimeouts, - IHandleTimeouts - { - protected override string CorrelationPropertyName => nameof(MultiTimeoutsSaga1Data.ContextId); - - public Context TestContext { get; set; } - - public async Task Handle(StartSaga1 message, IMessageHandlerContext context) - { - if (message.ContextId != TestContext.Id) - { - return; - } - - Data.ContextId = message.ContextId; - - await RequestTimeout(context, TimeSpan.FromMilliseconds(1), new Saga1Timeout - { - ContextId = TestContext.Id - }); - await RequestTimeout(context, TimeSpan.FromMilliseconds(1), new Saga2Timeout - { - ContextId = TestContext.Id - }); - } - - public Task Timeout(Saga1Timeout state, IMessageHandlerContext context) - { - if (state.ContextId == TestContext.Id) - { - TestContext.Saga1TimeoutFired = true; - } - - if (TestContext.Saga1TimeoutFired && TestContext.Saga2TimeoutFired) - { - MarkAsComplete(); - } - return Task.FromResult(0); - } - - public Task Timeout(Saga2Timeout state, IMessageHandlerContext context) - { - if (state.ContextId == TestContext.Id) - { - TestContext.Saga2TimeoutFired = true; - } - - if (TestContext.Saga1TimeoutFired && TestContext.Saga2TimeoutFired) - { - MarkAsComplete(); - } - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.ContextId); - } - - public class MultiTimeoutsSaga1Data : ContainSagaData - { - public virtual Guid ContextId { get; set; } - } - } - - public class SagaNotFound : IHandleSagaNotFound - { - public Context TestContext { get; set; } - - public Task Handle(object message, IMessageProcessingContext context) - { - if (((dynamic) message).ContextId != TestContext.Id) - { - return Task.FromResult(0); - } - - TestContext.SagaNotFound = true; - - return Task.FromResult(0); - } - } - - public class CatchAllMessageHandler : IHandleMessages - { - public Task Handle(object message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - } - } - - - public class StartSaga1 : ICommand - { - public Guid ContextId { get; set; } - } - - public class Saga1Timeout - { - public Guid ContextId { get; set; } - } - - public class Saga2Timeout - { - public Guid ContextId { get; set; } - } - } -} diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_reply_from_saga_not_found_handler.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_reply_from_saga_not_found_handler.cs deleted file mode 100644 index 29773cd8e..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_reply_from_saga_not_found_handler.cs +++ /dev/null @@ -1,113 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Sagas -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NServiceBus.Sagas; - using NUnit.Framework; - using Persistence.Sql; - - public class when_reply_from_saga_not_found_handler : NServiceBusAcceptanceTest - { - // related to NSB issue #2044 - [Test] - public async Task It_should_invoke_message_handler() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.Send(new MessageToSaga()))) - .WithEndpoint() - .Done(c => c.ReplyReceived) - .Run(); - - Assert.IsTrue(context.ReplyReceived); - } - - public class Context : ScenarioContext - { - public bool ReplyReceived { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(MessageToSaga), typeof(ReceiverWithSaga)); - }); - } - - public class ReplyHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(Reply message, IMessageHandlerContext context) - { - Context.ReplyReceived = true; - - return Task.FromResult(0); - } - } - } - - public class ReceiverWithSaga : EndpointConfigurationBuilder - { - public ReceiverWithSaga() - { - EndpointSetup(c => c.EnableFeature()); - } - - public class NotFoundHandlerSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages - { - protected override string CorrelationPropertyName => nameof(NotFoundHandlerSaga1Data.ContextId); - - public Task Handle(StartSaga1 message, IMessageHandlerContext context) - { - Data.ContextId = message.ContextId; - return Task.FromResult(0); - } - - public Task Handle(MessageToSaga message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.ContextId); - mapper.ConfigureMapping(m => m.ContextId); - } - - public class NotFoundHandlerSaga1Data : ContainSagaData - { - public virtual Guid ContextId { get; set; } - } - } - - public class SagaNotFound : IHandleSagaNotFound - { - public Task Handle(object message, IMessageProcessingContext context) - { - return context.Reply(new Reply()); - } - } - } - - public class StartSaga1 : ICommand - { - public Guid ContextId { get; set; } - } - - public class MessageToSaga : ICommand - { - public Guid ContextId { get; set; } - } - - public class Reply : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Satellites/When_a_message_is_available.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Satellites/When_a_message_is_available.cs deleted file mode 100644 index e3f36dbfa..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Satellites/When_a_message_is_available.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Satellites -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Transport; - - public class When_a_message_is_available : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_receive_the_message() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.Send(Endpoint.MySatelliteFeature.Address, new MyMessage()))) - .Done(c => c.MessageReceived) - .Run(); - - Assert.True(context.MessageReceived); - // In the future we want the transport transaction to be an explicit - // concept in the persisters API as well. Adding transport transaction - // to the context will not be necessary at that point. - // See GitHub issue #4047 for more background information. - Assert.True(context.TransportTransactionAddedToContext); - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - public bool TransportTransactionAddedToContext { get; set; } - } - - class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(); - } - - public class MySatelliteFeature : Feature - { - public MySatelliteFeature() - { - EnableByDefault(); - } - - protected override void Setup(FeatureConfigurationContext context) - { - var satelliteLogicalAddress = context.Settings.LogicalAddress().CreateQualifiedAddress("MySatellite"); - var satelliteAddress = context.Settings.GetTransportAddress(satelliteLogicalAddress); - - context.AddSatelliteReceiver("Test satellite", satelliteAddress, PushRuntimeSettings.Default, - (c, ec) => RecoverabilityAction.MoveToError(c.Failed.ErrorQueue), - (builder, messageContext) => - { - var testContext = builder.Build(); - testContext.MessageReceived = true; - testContext.TransportTransactionAddedToContext = ReferenceEquals(messageContext.Extensions.Get(), messageContext.TransportTransaction); - return Task.FromResult(true); - }); - - Address = satelliteAddress; - } - - public static string Address; - } - } - - public class MyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Satellites/When_satellite_txmode_does_not_match_endpoints_txmode.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Satellites/When_satellite_txmode_does_not_match_endpoints_txmode.cs deleted file mode 100644 index 4f1176f3d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Satellites/When_satellite_txmode_does_not_match_endpoints_txmode.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Satellites -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Transport; - - public class When_satellite_txmode_does_not_match_endpoints_txmode : NServiceBusAcceptanceTest - { - [Test] - public void Should_throw() - { - var exception = Assert.ThrowsAsync(async () => await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.Send(Endpoint.MySatelliteFeature.Address, new MyMessage()))) - .Done(c => c.MessageReceived) - .Run()); - - Assert.That(exception.Message, Does.Contain("AddSatelliteReceiver").And.Contain($"{nameof(TransportTransactionMode.None)}")); - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - } - - class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(); - } - - public class MySatelliteFeature : Feature - { - public MySatelliteFeature() - { - EnableByDefault(); - } - - protected override void Setup(FeatureConfigurationContext context) - { - var satelliteLogicalAddress = context.Settings.LogicalAddress().CreateQualifiedAddress("MySatellite"); - var satelliteAddress = context.Settings.GetTransportAddress(satelliteLogicalAddress); - -#pragma warning disable 612, 618 - context.AddSatelliteReceiver("Test satellite", satelliteAddress, TransportTransactionMode.None, PushRuntimeSettings.Default, - (c, ec) => RecoverabilityAction.MoveToError(c.Failed.ErrorQueue), - (builder, messageContext) => - { - var testContext = builder.Build(); - testContext.MessageReceived = true; - return Task.FromResult(true); - }); -#pragma warning restore 612, 618 - - Address = satelliteAddress; - } - - public static string Address; - } - } - - public class MyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ScenarioDescriptors/EnvironmentHelper.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ScenarioDescriptors/EnvironmentHelper.cs deleted file mode 100644 index b55bc4f4c..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ScenarioDescriptors/EnvironmentHelper.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace NServiceBus.AcceptanceTests.ScenarioDescriptors -{ - using System; - - class EnvironmentHelper - { - public static string GetEnvironmentVariable(string variable) - { - var candidate = Environment.GetEnvironmentVariable(variable, EnvironmentVariableTarget.User); - - if (string.IsNullOrWhiteSpace(candidate)) - { - return Environment.GetEnvironmentVariable(variable); - } - - return candidate; - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ScenarioDescriptors/TypeScanner.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ScenarioDescriptors/TypeScanner.cs deleted file mode 100644 index aeafe587f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ScenarioDescriptors/TypeScanner.cs +++ /dev/null @@ -1,40 +0,0 @@ -namespace NServiceBus.AcceptanceTests.ScenarioDescriptors -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Reflection; - using Hosting.Helpers; - - public class TypeScanner - { - static IEnumerable AvailableAssemblies - { - get - { - if (assemblies == null) - { - var result = new AssemblyScanner().GetScannableAssemblies(); - - assemblies = result.Assemblies.Where(a => - { - var references = a.GetReferencedAssemblies(); - - return references.All(an => an.Name != "nunit.framework"); - }).ToList(); - } - - return assemblies; - } - } - - public static IEnumerable GetAllTypesAssignableTo() - { - return AvailableAssemblies.SelectMany(a => a.GetTypes()) - .Where(t => typeof(T).IsAssignableFrom(t) && t != typeof(T)) - .ToList(); - } - - static List assemblies; - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Scheduling/When_scheduling_a_recurring_task.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Scheduling/When_scheduling_a_recurring_task.cs deleted file mode 100644 index ccc49cfb8..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Scheduling/When_scheduling_a_recurring_task.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Scheduling -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_scheduling_a_recurring_task : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_execute_the_task() - { - var context = await Scenario.Define() - .WithEndpoint() - .Done(c => c.InvokedAt.HasValue) - .Run(TimeSpan.FromSeconds(60)); - - Assert.True(context.InvokedAt.HasValue); - Assert.Greater(context.InvokedAt.Value - context.RequestedAt, TimeSpan.FromMilliseconds(5)); - } - - class Context : ScenarioContext - { - public DateTime? InvokedAt { get; set; } - public DateTime RequestedAt { get; set; } - } - - class SetupScheduledAction : Feature - { - protected override void Setup(FeatureConfigurationContext context) - { - context.RegisterStartupTask(b => new SetupScheduledActionTask(b.Build())); - } - } - - class SetupScheduledActionTask : FeatureStartupTask - { - public SetupScheduledActionTask(Context context) - { - this.context = context; - } - - protected override Task OnStart(IMessageSession session) - { - context.RequestedAt = DateTime.UtcNow; - - return session.ScheduleEvery(TimeSpan.FromMilliseconds(5), "MyTask", c => - { - context.InvokedAt = DateTime.UtcNow; - return Task.FromResult(0); - }); - } - - protected override Task OnStop(IMessageSession session) - { - return Task.FromResult(0); - } - - Context context; - } - - class SchedulingEndpoint : EndpointConfigurationBuilder - { - public SchedulingEndpoint() - { - EndpointSetup(config => - { - config.EnableFeature(); - config.EnableFeature(); - }); - } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/SelfVerification/When_running_saga_tests.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/SelfVerification/When_running_saga_tests.cs deleted file mode 100644 index 0daf6c9e6..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/SelfVerification/When_running_saga_tests.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace NServiceBus.AcceptanceTests.SelfVerification -{ - using System; - using System.Collections.Generic; - using System.Linq; - using System.Reflection; - using NUnit.Framework; - - [TestFixture] - public partial class When_running_saga_tests : NServiceBusAcceptanceTest - { - [Test] - public void All_saga_entities_in_acceptance_tests_should_have_virtual_properties() - { - // Because otherwise NHibernate gets cranky! - var sagaEntities = Assembly.GetExecutingAssembly().GetTypes() - .Where(t => typeof(IContainSagaData).IsAssignableFrom(t) && !t.IsInterface && - //only include core tests - t.Namespace != null && t.Namespace.StartsWith("NServiceBus.AcceptanceTests")) - .ToArray(); - - var offenders = 0; - - foreach (var entity in sagaEntities) - { - foreach (var property in entity.GetProperties()) - { - if (property.GetGetMethod().IsVirtual) - { - Console.WriteLine("OK: {0}.{1}", entity.FullName, property.Name); - } - else - { - offenders++; - Console.WriteLine("ERROR: {0}.{1} must be marked as virtual for NHibernate tests to succeed.", entity.FullName, property.Name); - } - } - } - - Assert.AreEqual(0, offenders); - } - - [Test] - public void All_sagas_and_entities_should_have_unique_names() - { - var allTypes = Assembly.GetExecutingAssembly().GetTypes(); - - var sagas = allTypes.Where(t => typeof(Saga).IsAssignableFrom(t)).ToArray(); - var sagaEntities = allTypes.Where(t => typeof(IContainSagaData).IsAssignableFrom(t) && !t.IsInterface) - .ToArray(); - - var nestedSagaEntityParents = sagaEntities - .Where(t => t.DeclaringType != null) - .Select(t => t.DeclaringType) - .ToArray(); - - var usedNames = new HashSet(StringComparer.InvariantCultureIgnoreCase); - var offenders = 0; - - Console.WriteLine("Sagas / Saga Entities with non-unique names:"); - foreach (var cls in sagas.Union(sagaEntities).Union(nestedSagaEntityParents)) - { - if (usedNames.Contains(cls.Name)) - { - offenders++; - Console.WriteLine(cls.FullName); - } - usedNames.Add(cls.Name); - } - - Assert.AreEqual(0, offenders); - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/SelfVerification/When_using_custom_components.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/SelfVerification/When_using_custom_components.cs deleted file mode 100644 index 0a0480af3..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/SelfVerification/When_using_custom_components.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace NServiceBus.AcceptanceTests.SelfVerification -{ - using System.Threading; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Support; - using NUnit.Framework; - - [TestFixture] - public class When_using_custom_components : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_properly_start_and_stop_them() - { - var ctx = await Scenario.Define() - .WithComponent(new CustomComponentBehavior()) - .Done(c => c.Starting) - .Run(); - - Assert.IsTrue(ctx.Starting); - Assert.IsTrue(ctx.ComponentsStarted); - Assert.IsTrue(ctx.Stopped); - } - - class Context : ScenarioContext - { - public bool Starting { get; set; } - public bool ComponentsStarted { get; set; } - public bool Stopped { get; set; } - } - - class CustomComponentBehavior : IComponentBehavior - { - public Task CreateRunner(RunDescriptor run) - { - return Task.FromResult(new Runner((Context)run.ScenarioContext)); - } - - class Runner : ComponentRunner - { - Context context; - - public Runner(Context context) - { - this.context = context; - } - - public override string Name => "MyComponent"; - - public override Task Start(CancellationToken token) - { - context.Starting = true; - return base.Start(token); - } - - public override Task ComponentsStarted(CancellationToken token) - { - context.ComponentsStarted = true; - return base.ComponentsStarted(token); - } - - public override Task Stop() - { - context.Stopped = true; - return base.Stop(); - } - } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_configuring_custom_xml_namespace.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_configuring_custom_xml_namespace.cs deleted file mode 100644 index 80c294142..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_configuring_custom_xml_namespace.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System.Text; - using System.Threading.Tasks; - using System.Xml.Linq; - using AcceptanceTesting; - using EndpointTemplates; - using MessageMutator; - using NUnit.Framework; - - public class When_configuring_custom_xml_namespace : NServiceBusAcceptanceTest - { - const string CustomXmlNamespace = "https://particular.net"; - - [Test] - public async Task Should_use_as_root_namespace_in_messages() - { - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(session => session.SendLocal(new SimpleMessage()))) - .Done(c => c.MessageReceived) - .Run(); - - Assert.AreEqual($"{CustomXmlNamespace}/{typeof(SimpleMessage).Namespace}", context.MessageNamespace); - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - public string MessageNamespace { get; set; } - } - - class EndpointUsingCustomNamespace : EndpointConfigurationBuilder - { - public EndpointUsingCustomNamespace() - { - EndpointSetup(c => - { - c.UseSerialization().Namespace(CustomXmlNamespace); - c.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.SingleInstance)); - }); - } - - class SimpleMessageHandler : IHandleMessages - { - public SimpleMessageHandler(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - - public Task Handle(SimpleMessage message, IMessageHandlerContext context) - { - scenarioContext.MessageReceived = true; - return Task.FromResult(0); - } - - Context scenarioContext; - } - - public class IncomingMutator : IMutateIncomingTransportMessages - { - public IncomingMutator(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - - public Task MutateIncoming(MutateIncomingTransportMessageContext context) - { - var document = XDocument.Parse(Encoding.UTF8.GetString(context.Body)); - var defaultNamespace = document.Root?.GetDefaultNamespace(); - scenarioContext.MessageNamespace = defaultNamespace?.NamespaceName; - return Task.FromResult(0); - } - - Context scenarioContext; - } - } - - public class SimpleMessage : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_no_content_type.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_no_content_type.cs deleted file mode 100644 index 9061530a1..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_no_content_type.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using MessageMutator; - using NUnit.Framework; - - public class When_no_content_type : NServiceBusAcceptanceTest - { - [Test] - public Task Should_handle_message() - { - return Scenario.Define() - .WithEndpoint(b => b.When( - (session, c) => session.SendLocal(new Message - { - Property = "value" - }))) - .Done(c => c.ReceivedMessage) - .Run(); - } - - public class Context : ScenarioContext - { - public bool ReceivedMessage { get; set; } - } - - public class EndpointViaType : EndpointConfigurationBuilder - { - public EndpointViaType() - { - EndpointSetup(); - } - - public class Handler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(Message request, IMessageHandlerContext context) - { - Context.ReceivedMessage = request.Property == "value"; - return Task.FromResult(0); - } - } - - class ContentTypeMutator : IMutateIncomingTransportMessages, INeedInitialization - { - public Context Context { get; set; } - - public Task MutateIncoming(MutateIncomingTransportMessageContext context) - { - context.Headers.Remove(Headers.ContentType); - return Task.FromResult(0); - } - - public void Customize(EndpointConfiguration configuration) - { - configuration.RegisterComponents(c => - c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); - } - } - } - - - public class Message : IMessage - { - public string Property { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_receiving_interface_message_where_child_is_excluded.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_receiving_interface_message_where_child_is_excluded.cs deleted file mode 100644 index 2e393ac81..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_receiving_interface_message_where_child_is_excluded.cs +++ /dev/null @@ -1,80 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_receiving_interface_message_where_child_is_excluded : NServiceBusAcceptanceTest - { - static string ReceiverEndpoint => Conventions.EndpointNamingConvention(typeof(Receiver)); - - [Test] - public async Task Should_process_base_message() - { - var context = await Scenario.Define() - .WithEndpoint(e => e.When(session => session.Send(m => { }))) - .WithEndpoint() - .Done(c => c.MessageReceived) - .Run(); - - Assert.True(context.MessageReceived); - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - } - - class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.UseSerialization(); //only reproduces on json - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(ISomeMessage), ReceiverEndpoint); - } - ); - } - } - - class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(c => - { - c.UseSerialization(); //only reproduces on json - }) - .ExcludeType(); - } - - class MessageHandler : IHandleMessages - { - public MessageHandler(Context testContext) - { - this.testContext = testContext; - } - - public Task Handle(ISomeBaseMessage message, IMessageHandlerContext context) - { - testContext.MessageReceived = true; - - return Task.FromResult(0); - } - - Context testContext; - } - } - - public interface ISomeMessage : ISomeBaseMessage - { - } - - public interface ISomeBaseMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_additional_deserializers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_additional_deserializers.cs deleted file mode 100644 index 32340095a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_additional_deserializers.cs +++ /dev/null @@ -1,144 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System; - using System.Collections.Generic; - using System.IO; - using System.Runtime.Serialization.Formatters.Binary; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using MessageInterfaces; - using NServiceBus.Serialization; - using NUnit.Framework; - using Settings; - - public class When_registering_additional_deserializers : NServiceBusAcceptanceTest - { - [Test] - public async Task Two_endpoints_with_different_serializers_should_deserialize_the_message() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When( - (session, c) => - { - var sendOptions = new SendOptions(); - sendOptions.SetHeader("ContentType", "MyCustomSerializer"); - return session.Send(new MyRequest()); - })) - .WithEndpoint() - .Done(c => c.HandlerGotTheRequest) - .Run(); - - Assert.True(context.HandlerGotTheRequest); - Assert.True(context.SerializeCalled); - Assert.True(context.DeserializeCalled); - Assert.AreEqual("SomeFancySettings", context.ValueFromSettings); - } - - public class Context : ScenarioContext - { - public bool HandlerGotTheRequest { get; set; } - public bool SerializeCalled { get; set; } - public bool DeserializeCalled { get; set; } - public string ValueFromSettings { get; set; } - } - - class CustomSerializationSender : EndpointConfigurationBuilder - { - public CustomSerializationSender() - { - EndpointSetup(c => - { - c.UseSerialization().Settings((Context) ScenarioContext, ""); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyRequest), typeof(XmlCustomSerializationReceiver)); - }); - } - } - - class XmlCustomSerializationReceiver : EndpointConfigurationBuilder - { - public XmlCustomSerializationReceiver() - { - EndpointSetup(c => - { - c.UseSerialization(); - c.AddDeserializer().Settings((Context) ScenarioContext, "SomeFancySettings"); - }); - } - - class MyRequestHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyRequest request, IMessageHandlerContext context) - { - Context.HandlerGotTheRequest = true; - return Task.FromResult(0); - } - } - } - - [Serializable] - public class MyRequest : IMessage - { - } - - public class MyCustomSerializer : SerializationDefinition - { - public override Func Configure(ReadOnlySettings settings) - { - var context = settings.Get(); - return mapper => new MyCustomMessageSerializer(context, settings.Get("MyCustomSerializer.Settings.Value")); - } - } - - class MyCustomMessageSerializer : IMessageSerializer - { - public MyCustomMessageSerializer(Context context, string valueFromSettings) - { - this.context = context; - this.valueFromSettings = valueFromSettings; - } - - public void Serialize(object message, Stream stream) - { - var serializer = new BinaryFormatter(); - - context.SerializeCalled = true; - - serializer.Serialize(stream, message); - } - - public object[] Deserialize(Stream stream, IList messageTypes = null) - { - var serializer = new BinaryFormatter(); - - stream.Position = 0; - var msg = serializer.Deserialize(stream); - context.DeserializeCalled = true; - context.ValueFromSettings = valueFromSettings; - - return new[] - { - msg - }; - } - - public string ContentType => "MyCustomSerializer"; - readonly Context context; - readonly string valueFromSettings; - } - } - - static class CustomSettingsForMyCustomSerializer - { - public static void Settings(this SerializationExtensions extensions, When_registering_additional_deserializers.Context context, string valueFromSettings) - { - var settings = extensions.GetSettings(); - settings.Set("MyCustomSerializer.Settings", context); - settings.Set("MyCustomSerializer.Settings.Value", valueFromSettings); - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_custom_serializer.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_custom_serializer.cs deleted file mode 100644 index 511ecf91a..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_custom_serializer.cs +++ /dev/null @@ -1,109 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System; - using System.Collections.Generic; - using System.IO; - using System.Runtime.Serialization.Formatters.Binary; - using System.Threading.Tasks; - using AcceptanceTesting; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using MessageInterfaces; - using NServiceBus.Serialization; - using NUnit.Framework; - using Settings; - - public class When_registering_custom_serializer : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_use_the_custom_serializer() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When( - (session, c) => session.SendLocal(new MyRequest()))) - .Done(c => c.HandlerGotTheRequest) - .Run(); - - Assert.IsTrue(context.SerializeCalled); - Assert.IsTrue(context.DeserializeCalled); - } - - public class Context : ScenarioContext - { - public bool HandlerGotTheRequest { get; set; } - public bool SerializeCalled { get; set; } - public bool DeserializeCalled { get; set; } - } - - public class EndpointWithCustomSerializer : EndpointConfigurationBuilder - { - public EndpointWithCustomSerializer() - { - var context = (Context) ScenarioContext; - EndpointSetup(c => - { - c.UseSerialization(); - c.GetSettings().Set(context); - }); - } - - public class MyRequestHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyRequest request, IMessageHandlerContext context) - { - Context.HandlerGotTheRequest = true; - return Task.FromResult(0); - } - } - } - - [Serializable] - public class MyRequest : IMessage - { - } - - class MySuperSerializer : SerializationDefinition - { - public override Func Configure(ReadOnlySettings settings) - { - return mapper => new MyCustomSerializer(settings.Get()); - } - } - - class MyCustomSerializer : IMessageSerializer - { - public MyCustomSerializer(Context context) - { - this.context = context; - } - - public void Serialize(object message, Stream stream) - { - context.SerializeCalled = true; - - var serializer = new BinaryFormatter(); - serializer.Serialize(stream, message); - } - - public object[] Deserialize(Stream stream, IList messageTypes = null) - { - var serializer = new BinaryFormatter(); - - stream.Position = 0; - var msg = serializer.Deserialize(stream); - - context.DeserializeCalled = true; - - return new[] - { - msg - }; - } - - public string ContentType => "MyCustomSerializer"; - readonly Context context; - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_deserializers_with_settings.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_deserializers_with_settings.cs deleted file mode 100644 index dcc16df89..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_registering_deserializers_with_settings.cs +++ /dev/null @@ -1,138 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System; - using System.Collections.Generic; - using System.IO; - using System.Runtime.Serialization.Formatters.Binary; - using System.Threading.Tasks; - using AcceptanceTesting; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using MessageInterfaces; - using NServiceBus.Serialization; - using NUnit.Framework; - using Settings; - - public class When_registering_deserializers_with_settings : NServiceBusAcceptanceTest - { - const string Value1 = "SomeFancySettingsForMainSerializer"; - const string Value2 = "SomeFancySettingsForDeserializer"; - - [Test] - public async Task Should_not_override_serializer_settings() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When( - (session, c) => - { - var sendOptions = new SendOptions(); - sendOptions.SetHeader("ContentType", "MyCustomSerializer"); - return session.SendLocal(new MyRequest()); - })) - .Done(c => c.DeserializeCalled) - .Run(); - - Assert.True(context.HandlerGotTheRequest); - Assert.True(context.SerializeCalled); - Assert.True(context.DeserializeCalled); - Assert.AreEqual(Value1, context.ValueFromSettingsForMainSerializer); - Assert.AreEqual(Value2, context.ValueFromSettingsForDeserializer); - } - - public class Context : ScenarioContext - { - public bool HandlerGotTheRequest { get; set; } - public bool SerializeCalled { get; set; } - public bool DeserializeCalled { get; set; } - public string ValueFromSettingsForMainSerializer { get; set; } - public string ValueFromSettingsForDeserializer { get; set; } - } - - class XmlCustomSerializationReceiver : EndpointConfigurationBuilder - { - public XmlCustomSerializationReceiver() - { - var context = (Context)ScenarioContext; - EndpointSetup(c => - { - c.UseSerialization().Settings(Value1, context); - c.AddDeserializer().Settings(Value2, context); - }); - } - - class MyRequestHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyRequest request, IMessageHandlerContext context) - { - Context.HandlerGotTheRequest = true; - return Task.FromResult(0); - } - } - } - - [Serializable] - public class MyRequest : IMessage - { - } - - public class MyCustomSerializer : SerializationDefinition - { - public override Func Configure(ReadOnlySettings settings) - { - return mapper => new MyCustomMessageSerializer(settings.GetOrDefault("MyCustomSerializer.Settings"), settings.Get()); - } - } - - class MyCustomMessageSerializer : IMessageSerializer - { - string valueFromSettings; - Context context; - - public MyCustomMessageSerializer(string valueFromSettings, Context context) - { - this.valueFromSettings = valueFromSettings; - this.context = context; - } - - public void Serialize(object message, Stream stream) - { - var serializer = new BinaryFormatter(); - - context.SerializeCalled = true; - context.ValueFromSettingsForMainSerializer = valueFromSettings; - - serializer.Serialize(stream, message); - } - - public object[] Deserialize(Stream stream, IList messageTypes = null) - { - var serializer = new BinaryFormatter(); - - stream.Position = 0; - var msg = serializer.Deserialize(stream); - context.DeserializeCalled = true; - context.ValueFromSettingsForDeserializer = valueFromSettings; - - return new[] - { - msg - }; - } - - public string ContentType => "MyCustomSerializer"; - } - } - - static class CustomSettingsForMyCustomSerializer2 - { - public static SerializationExtensions Settings(this SerializationExtensions extensions, string valueFromSettings, When_registering_deserializers_with_settings.Context context) - { - var settings = extensions.GetSettings(); - settings.Set("MyCustomSerializer.Settings", valueFromSettings); - settings.Set(context); - return extensions; - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_sanitizing_xml_messages.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_sanitizing_xml_messages.cs deleted file mode 100644 index e3ac79b15..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_sanitizing_xml_messages.cs +++ /dev/null @@ -1,88 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System.Text; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using MessageMutator; - using NUnit.Framework; - - public class When_sanitizing_xml_messages : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_remove_illegal_characters_from_messages() - { - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(session => session.SendLocal(new SimpleMessage - { - Value = "Hello World!" - }))) - .Done(c => c.MessageReceived) - .Run(); - - Assert.That(context.Input, Is.EqualTo("Hello World!")); - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - public string Input { get; set; } - } - - class EndpointSanitizingInput : EndpointConfigurationBuilder - { - public EndpointSanitizingInput() - { - EndpointSetup(c => - { - c.UseSerialization().SanitizeInput(); - c.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.SingleInstance)); - }); - } - - class SimpleMessageHandler : IHandleMessages - { - public SimpleMessageHandler(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - - public Task Handle(SimpleMessage message, IMessageHandlerContext context) - { - scenarioContext.MessageReceived = true; - scenarioContext.Input = message.Value; - - return Task.FromResult(0); - } - - Context scenarioContext; - } - - public class IncomingMutator : IMutateIncomingTransportMessages - { - public IncomingMutator(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - - public Task MutateIncoming(MutateIncomingTransportMessageContext context) - { - var body = Encoding.UTF8.GetString(context.Body); - var invalidChar = char.ConvertFromUtf32(0x8); - - context.Body = Encoding.UTF8.GetBytes(body.Replace("Hello World!", $"{invalidChar}Hello {invalidChar}World!{invalidChar}")); - - return Task.FromResult(0); - } - - Context scenarioContext; - } - } - - public class SimpleMessage : ICommand - { - public string Value { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_serializing_a_message.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_serializing_a_message.cs deleted file mode 100644 index 9cdb003b9..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_serializing_a_message.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - [TestFixture] - public class When_serializing_a_message : NServiceBusAcceptanceTest - { - [Test] - public async Task DateTime_properties_should_keep_their_original_timezone_information() - { - var expectedDateTime = new DateTime(2010, 10, 13, 12, 32, 42, DateTimeKind.Unspecified); - var expectedDateTimeLocal = new DateTime(2010, 10, 13, 12, 32, 42, DateTimeKind.Local); - var expectedDateTimeUtc = new DateTime(2010, 10, 13, 12, 32, 42, DateTimeKind.Utc); - var expectedDateTimeOffset = new DateTimeOffset(2012, 12, 12, 12, 12, 12, TimeSpan.FromHours(6)); - var expectedDateTimeOffsetLocal = DateTimeOffset.Now; - var expectedDateTimeOffsetUtc = DateTimeOffset.UtcNow; - - var context = await Scenario.Define() - .WithEndpoint(b => b.When( - (session, c) => session.SendLocal(new DateTimeMessage - { - DateTime = expectedDateTime, - DateTimeLocal = expectedDateTimeLocal, - DateTimeUtc = expectedDateTimeUtc, - DateTimeOffset = expectedDateTimeOffset, - DateTimeOffsetLocal = expectedDateTimeOffsetLocal, - DateTimeOffsetUtc = expectedDateTimeOffsetUtc - }))) - .Done(c => c.ReceivedMessage != null) - .Run(); - - Assert.AreEqual(expectedDateTime, context.ReceivedMessage.DateTime); - Assert.AreEqual(expectedDateTimeLocal, context.ReceivedMessage.DateTimeLocal); - Assert.AreEqual(expectedDateTimeUtc, context.ReceivedMessage.DateTimeUtc); - Assert.AreEqual(expectedDateTimeOffset, context.ReceivedMessage.DateTimeOffset); - Assert.AreEqual(expectedDateTimeOffsetLocal, context.ReceivedMessage.DateTimeOffsetLocal); - Assert.AreEqual(expectedDateTimeOffsetUtc, context.ReceivedMessage.DateTimeOffsetUtc); - Assert.AreEqual(expectedDateTimeOffsetLocal, context.ReceivedMessage.DateTimeOffsetLocal); - Assert.AreEqual(expectedDateTimeOffsetLocal.Offset, context.ReceivedMessage.DateTimeOffsetLocal.Offset); - Assert.AreEqual(expectedDateTimeOffsetUtc, context.ReceivedMessage.DateTimeOffsetUtc); - Assert.AreEqual(expectedDateTimeOffsetUtc.Offset, context.ReceivedMessage.DateTimeOffsetUtc.Offset); - } - - class DateTimeReceiver : EndpointConfigurationBuilder - { - public DateTimeReceiver() - { - EndpointSetup(c => { c.UseSerialization(); }); - } - - class DateTimeMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(DateTimeMessage message, IMessageHandlerContext context) - { - Context.ReceivedMessage = message; - - return Task.FromResult(0); - } - } - } - - public class DateTimeMessage : IMessage - { - public DateTime DateTime { get; set; } - public DateTime DateTimeLocal { get; set; } - public DateTime DateTimeUtc { get; set; } - public DateTimeOffset DateTimeOffset { get; set; } - public DateTimeOffset DateTimeOffsetLocal { get; set; } - public DateTimeOffset DateTimeOffsetUtc { get; set; } - } - - class Context : ScenarioContext - { - public DateTimeMessage ReceivedMessage { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_skip_wrapping_xml.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_skip_wrapping_xml.cs deleted file mode 100644 index 5b4d5f46e..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_skip_wrapping_xml.cs +++ /dev/null @@ -1,92 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System.Linq; - using System.Text; - using System.Threading.Tasks; - using System.Xml.Linq; - using AcceptanceTesting; - using EndpointTemplates; - using MessageMutator; - using NUnit.Framework; - - public class When_skip_wrapping_xml : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_wrap_xml_content() - { - XNamespace ns = "demoNamepsace"; - var xmlContent = new XDocument(new XElement(ns + "Document", new XElement(ns + "Value", "content"))); - - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(session => session.SendLocal(new MessageWithRawXml { Document = xmlContent }))) - .Done(c => c.MessageReceived) - .Run(); - - Assert.That(context.XmlPropertyValue.ToString(), Is.EqualTo(xmlContent.ToString())); - Assert.That(context.XmlMessage.Root.Name.LocalName, Is.EqualTo(nameof(MessageWithRawXml))); - Assert.That(context.XmlMessage.Root.Elements().Single().ToString(), Is.EqualTo(xmlContent.ToString())); - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - - public XDocument XmlMessage { get; set; } - - public XDocument XmlPropertyValue { get; set; } - } - - class NonWrappingEndpoint : EndpointConfigurationBuilder - { - public NonWrappingEndpoint() - { - EndpointSetup(c => - { - c.UseSerialization().DontWrapRawXml(); - c.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.SingleInstance)); - }); - } - - class RawXmlMessageHandler : IHandleMessages - { - public RawXmlMessageHandler(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - - public Task Handle(MessageWithRawXml messageWithRawXml, IMessageHandlerContext context) - { - scenarioContext.MessageReceived = true; - scenarioContext.XmlPropertyValue = messageWithRawXml.Document; - - return Task.FromResult(0); - } - - Context scenarioContext; - } - - public class IncomingMutator : IMutateIncomingTransportMessages - { - public IncomingMutator(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - - public Task MutateIncoming(MutateIncomingTransportMessageContext context) - { - scenarioContext.XmlMessage = XDocument.Parse(Encoding.UTF8.GetString(context.Body)); - - return Task.FromResult(0); - } - - Context scenarioContext; - } - } - - public class MessageWithRawXml : ICommand - { - public XDocument Document { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_wrapping_is_not_skipped.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_wrapping_is_not_skipped.cs deleted file mode 100644 index d04ad997d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_wrapping_is_not_skipped.cs +++ /dev/null @@ -1,94 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System.Linq; - using System.Text; - using System.Threading.Tasks; - using System.Xml.Linq; - using AcceptanceTesting; - using EndpointTemplates; - using MessageMutator; - using NUnit.Framework; - - public class When_wrapping_is_not_skipped : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_wrap_xml_content() - { - XNamespace ns = "demoNamepsace"; - var xmlContent = new XDocument(new XElement(ns + "Document", new XElement(ns + "Value", "content"))); - - var context = await Scenario.Define() - .WithEndpoint(e => e - .When(session => session.SendLocal(new MessageWithRawXml { Document = xmlContent }))) - .Done(c => c.MessageReceived) - .Run(); - - Assert.That(context.XmlPropertyValue.ToString(), Is.EqualTo(xmlContent.ToString())); - Assert.That(context.XmlMessage.Root.Name.LocalName, Is.EqualTo(nameof(MessageWithRawXml))); - Assert.That(context.XmlMessage.Root.Elements().Single().Name.LocalName, Is.EqualTo("Document")); - Assert.That(context.XmlMessage.Root.Elements().Single().Elements().Single().Name.LocalName, Is.EqualTo("Document")); - Assert.That(context.XmlMessage.Root.Elements().Single().Elements().Single().ToString(), Is.EqualTo(xmlContent.ToString())); - } - - class Context : ScenarioContext - { - public bool MessageReceived { get; set; } - - public XDocument XmlMessage { get; set; } - - public XDocument XmlPropertyValue { get; set; } - } - - class WrappingEndpoint : EndpointConfigurationBuilder - { - public WrappingEndpoint() - { - EndpointSetup(c => - { - c.UseSerialization(); // wrapping is enabled by default - c.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.SingleInstance)); - }); - } - - class RawXmlMessageHandler : IHandleMessages - { - public RawXmlMessageHandler(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - - public Task Handle(MessageWithRawXml messageWithRawXml, IMessageHandlerContext context) - { - scenarioContext.MessageReceived = true; - scenarioContext.XmlPropertyValue = messageWithRawXml.Document; - - return Task.FromResult(0); - } - - Context scenarioContext; - } - - public class IncomingMutator : IMutateIncomingTransportMessages - { - public IncomingMutator(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - - public Task MutateIncoming(MutateIncomingTransportMessageContext context) - { - scenarioContext.XmlMessage = XDocument.Parse(Encoding.UTF8.GetString(context.Body)); - - return Task.FromResult(0); - } - - Context scenarioContext; - } - } - - public class MessageWithRawXml : ICommand - { - public XDocument Document { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_xml_serializer_used_with_unobtrusive_mode.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_xml_serializer_used_with_unobtrusive_mode.cs deleted file mode 100644 index 8163f3630..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_xml_serializer_used_with_unobtrusive_mode.cs +++ /dev/null @@ -1,82 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Serialization -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_xml_serializer_used_with_unobtrusive_mode : NServiceBusAcceptanceTest - { - [Test] - public async Task Message_should_be_received_with_deserialized_payload() - { - var expectedData = 1; - - var context = await Scenario.Define() - .WithEndpoint(c => c.When(s => s.Send(new MyCommand - { - Data = expectedData - }))) - .WithEndpoint() - .Done(c => c.WasCalled) - .Run(TimeSpan.FromSeconds(10)); - - Assert.AreEqual(expectedData, context.Data); - } - - public class Context : ScenarioContext - { - public bool WasCalled { get; set; } - public int Data { get; set; } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.Conventions().DefiningCommandsAs(t => t.Namespace != null && t.FullName.EndsWith("Command")); - c.UseSerialization(); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyCommand), typeof(Receiver)); - }).ExcludeType(); // remove that type from assembly scanning to simulate what would happen with true unobtrusive mode - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(c => - { - c.Conventions().DefiningCommandsAs(t => t.Namespace != null && t.FullName.EndsWith("Command")); - c.UseSerialization(); - }) - .ExcludeType(); // remove that type from assembly scanning to simulate what would happen with true unobtrusive mode - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(ICommand message, IMessageHandlerContext context) - { - Context.Data = ((MyCommand) message).Data; - Context.WasCalled = true; - return Task.FromResult(0); - } - } - } - - public interface ICommand - { - } - - public class MyCommand : ICommand - { - public int Data { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_expired.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_expired.cs deleted file mode 100644 index f150092d2..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_expired.cs +++ /dev/null @@ -1,73 +0,0 @@ -namespace NServiceBus.AcceptanceTests.TimeToBeReceived -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_TimeToBeReceived_has_expired : NServiceBusAcceptanceTest - { - [Test] - public async Task Message_should_not_be_received() - { - var context = await Scenario.Define() - .WithEndpoint() - .Run(TimeSpan.FromSeconds(10)); - - Assert.IsFalse(context.WasCalled); - } - - public class Context : ScenarioContext - { - public bool WasCalled { get; set; } - } - - class DelayReceiverFromStarting : Feature - { - protected override void Setup(FeatureConfigurationContext context) - { - context.RegisterStartupTask(b => new DelayReceiverFromStartingTask()); - } - } - - class DelayReceiverFromStartingTask : FeatureStartupTask - { - protected override async Task OnStart(IMessageSession session) - { - await session.SendLocal(new MyMessage()); - await Task.Delay(TimeSpan.FromSeconds(5)); - } - - protected override Task OnStop(IMessageSession session) - { - return Task.FromResult(0); - } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => c.EnableFeature()); - } - - public class MyMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - TestContext.WasCalled = true; - return Task.FromResult(0); - } - } - } - - [TimeToBeReceived("00:00:02")] - public class MyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_expired_convention.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_expired_convention.cs deleted file mode 100644 index ddf0e19f1..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_expired_convention.cs +++ /dev/null @@ -1,83 +0,0 @@ -namespace NServiceBus.AcceptanceTests.TimeToBeReceived -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_TimeToBeReceived_has_expired_convention : NServiceBusAcceptanceTest - { - [Test] - public async Task Message_should_not_be_received() - { - var context = await Scenario.Define() - .WithEndpoint() - .Run(TimeSpan.FromSeconds(10)); - - Assert.IsFalse(context.WasCalled); - } - - public class Context : ScenarioContext - { - public bool WasCalled { get; set; } - } - - class DelayReceiverFromStarting : Feature - { - protected override void Setup(FeatureConfigurationContext context) - { - context.RegisterStartupTask(b => new DelayReceiverFromStartingTask()); - } - } - - class DelayReceiverFromStartingTask : FeatureStartupTask - { - protected override async Task OnStart(IMessageSession session) - { - await session.SendLocal(new MyMessage()); - await Task.Delay(TimeSpan.FromSeconds(5)); - } - - protected override Task OnStop(IMessageSession session) - { - return Task.FromResult(0); - } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => - { - c.EnableFeature(); - c.Conventions().DefiningTimeToBeReceivedAs(messageType => - { - if (messageType == typeof(MyMessage)) - { - return TimeSpan.FromSeconds(2); - } - return TimeSpan.MaxValue; - }); - }); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - Context.WasCalled = true; - return Task.FromResult(0); - } - } - } - - public class MyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_not_expired.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_not_expired.cs deleted file mode 100644 index b4cc00315..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_has_not_expired.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace NServiceBus.AcceptanceTests.TimeToBeReceived -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_TimeToBeReceived_has_not_expired : NServiceBusAcceptanceTest - { - [Test] - public async Task Message_should_be_received() - { - var context = await Scenario.Define() - .WithEndpoint(b => b.When((session, c) => session.SendLocal(new MyMessage()))) - .Done(c => c.WasCalled) - .Run(); - - Assert.IsTrue(context.WasCalled); - Assert.AreEqual(TimeSpan.FromSeconds(10), context.TTBROnIncomingMessage, "TTBR should be available as a header so receiving endpoints can know what value was used when the message was originally sent"); - } - - public class Context : ScenarioContext - { - public bool WasCalled { get; set; } - public TimeSpan TTBROnIncomingMessage { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(); - } - - public class MyMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MyMessage message, IMessageHandlerContext context) - { - TestContext.TTBROnIncomingMessage = TimeSpan.Parse(context.MessageHeaders[Headers.TimeToBeReceived]); - TestContext.WasCalled = true; - return Task.FromResult(0); - } - } - } - - - [TimeToBeReceived("00:00:10")] - public class MyMessage : IMessage - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_used_with_unobtrusive_mode.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_used_with_unobtrusive_mode.cs deleted file mode 100644 index d28707865..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/TimeToBeReceived/When_TimeToBeReceived_used_with_unobtrusive_mode.cs +++ /dev/null @@ -1,120 +0,0 @@ -namespace NServiceBus.AcceptanceTests.TimeToBeReceived -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - public class When_TimeToBeReceived_used_with_unobtrusive_mode : NServiceBusAcceptanceTest - { - [Test] - public async Task Message_should_not_be_received() - { - var context = await Scenario.Define() - .WithEndpoint() - .WithEndpoint() - .Run(TimeSpan.FromSeconds(10)); - - Assert.IsFalse(context.WasCalled); - } - - public class Context : ScenarioContext - { - public bool WasCalled { get; set; } - } - - class SendMessageWhileStarting : Feature - { - protected override void Setup(FeatureConfigurationContext context) - { - context.RegisterStartupTask(b => new SendMessageWhileStartingTask()); - } - } - - class SendMessageWhileStartingTask : FeatureStartupTask - { - protected override Task OnStart(IMessageSession session) - { - return session.Send(new MyCommand()); - } - - protected override Task OnStop(IMessageSession session) - { - return Task.FromResult(0); - } - } - - public class Sender : EndpointConfigurationBuilder - { - public Sender() - { - EndpointSetup(c => - { - c.Conventions() - .DefiningCommandsAs(t => t.Namespace != null && t.FullName == typeof(MyCommand).FullName) - .DefiningTimeToBeReceivedAs(messageType => - { - if (messageType == typeof(MyCommand)) - { - return TimeSpan.FromSeconds(2); - } - return TimeSpan.MaxValue; - }); - c.EnableFeature(); - c.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyCommand), typeof(Receiver)); - }).ExcludeType(); // remove that type from assembly scanning to simulate what would happen with true unobtrusive mode - } - } - - class DelayReceiverFromStarting : Feature - { - protected override void Setup(FeatureConfigurationContext context) - { - context.RegisterStartupTask(b => new DelayReceiverFromStartingTask()); - } - } - - class DelayReceiverFromStartingTask : FeatureStartupTask - { - protected override Task OnStart(IMessageSession session) - { - return Task.Delay(TimeSpan.FromSeconds(5)); - } - - protected override Task OnStop(IMessageSession session) - { - return Task.FromResult(0); - } - } - - public class Receiver : EndpointConfigurationBuilder - { - public Receiver() - { - EndpointSetup(c => - { - c.Conventions().DefiningCommandsAs(t => t.Namespace != null && t.FullName == typeof(MyCommand).FullName); - c.EnableFeature(); - }); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyCommand message, IMessageHandlerContext context) - { - Context.WasCalled = true; - return Task.FromResult(0); - } - } - } - - public class MyCommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Timeout/CyclingOutageTimeoutPersister.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Timeout/CyclingOutageTimeoutPersister.cs deleted file mode 100644 index 1a18b5c1d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Timeout/CyclingOutageTimeoutPersister.cs +++ /dev/null @@ -1,113 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Timeouts -{ - using System; - using System.Collections.Concurrent; - using System.Collections.Generic; - using System.Linq; - using System.Threading.Tasks; - using Extensibility; - using Timeout.Core; - - /// - /// This class mocks outages for timeout storage. - /// If SecondsToWait is set to 10, it will throw exceptions for 10 seconds, then be available for 10 seconds, and repeat. - /// - class CyclingOutageTimeoutPersister : IPersistTimeouts, IQueryTimeouts - { - public CyclingOutageTimeoutPersister(int secondsToWait) - { - this.secondsToWait = secondsToWait; - } - - public Task TryRemove(string timeoutId, ContextBag context) - { - ThrowExceptionUntilWaitTimeReached(); - - TimeoutData timeoutData = null; - - if (storage.ContainsKey(timeoutId)) - { - storage.TryRemove(timeoutId, out timeoutData); - } - - return Task.FromResult(timeoutData != null); - } - - public Task RemoveTimeoutBy(Guid sagaId, ContextBag context) - { - ThrowExceptionUntilWaitTimeReached(); - return completedTask; - } - - public Task Add(TimeoutData timeout, ContextBag context) - { - ThrowExceptionUntilWaitTimeReached(); - storage.TryAdd(timeout.Id, timeout); - return completedTask; - } - - public Task Peek(string timeoutId, ContextBag context) - { - ThrowExceptionUntilWaitTimeReached(); - if (storage.ContainsKey(timeoutId)) - { - return Task.FromResult(storage[timeoutId]); - } - return Task.FromResult(null); - } - - public Task GetNextChunk(DateTime startSlice) - { - ThrowExceptionUntilWaitTimeReached(); - - var timeoutsDue = new List(); - foreach (var key in storage.Keys) - { - var value = storage[key]; - if (value.Time <= startSlice) - { - var timeout = new TimeoutsChunk.Timeout(key, value.Time); - timeoutsDue.Add(timeout); - } - } - - var chunk = new TimeoutsChunk(timeoutsDue.ToArray(), DateTime.UtcNow.AddSeconds(1)); - - return Task.FromResult(chunk); - } - - void ThrowExceptionUntilWaitTimeReached() - { - if (NextChangeTime <= DateTime.UtcNow) - { - NextChangeTime = DateTime.UtcNow.AddSeconds(secondsToWait); - isAvailable = !isAvailable; - } - - if (!isAvailable) - { - throw new Exception("Persister is temporarily unavailable"); - } - } - - public IEnumerable> GetNextChunk(DateTime startSlice, out DateTime nextTimeToRunQuery) - { - ThrowExceptionUntilWaitTimeReached(); - nextTimeToRunQuery = DateTime.UtcNow.AddSeconds(1); - return Enumerable.Empty>().ToList(); - } - - public Task Add(TimeoutData timeout) - { - ThrowExceptionUntilWaitTimeReached(); - return completedTask; - } - - Task completedTask = Task.FromResult(0); - DateTime NextChangeTime; - int secondsToWait; - ConcurrentDictionary storage = new ConcurrentDictionary(); - - static bool isAvailable; - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Timeout/When_timeout_storage_is_unavailable_temporarily.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Timeout/When_timeout_storage_is_unavailable_temporarily.cs deleted file mode 100644 index 097a86f2f..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Timeout/When_timeout_storage_is_unavailable_temporarily.cs +++ /dev/null @@ -1,88 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Timeouts -{ - using System; - using System.Threading.Tasks; - using AcceptanceTesting; - using Configuration.AdvanceExtensibility; - using EndpointTemplates; - using Features; - using NUnit.Framework; - - class When_timeout_storage_is_unavailable_temporarily : NServiceBusAcceptanceTest - { - [Test] - public async Task Endpoint_should_start() - { - Requires.TimeoutStorage(); - - var context = await Scenario.Define() - .WithEndpoint() - .Done(c => c.EndpointsStarted) - .Run(); - - Assert.IsTrue(context.EndpointsStarted); - } - - [Test] - public async Task Endpoint_should_not_shutdown() - { - var stopTime = DateTime.UtcNow.AddSeconds(6); - - var testContext = - await Scenario.Define(c => { c.SecondsToWait = 3; }) - .WithEndpoint(b => - { - b.CustomConfig((busConfig, context) => - { - busConfig.DefineCriticalErrorAction(criticalErrorContext => - { - context.FatalErrorOccurred = true; - return Task.FromResult(true); - }); - }); - }) - .Done(c => c.FatalErrorOccurred || stopTime <= DateTime.UtcNow) - .Run(); - - Assert.IsFalse(testContext.FatalErrorOccurred, "Circuit breaker was triggered too soon."); - } - - public class TimeoutTestContext : ScenarioContext - { - public int SecondsToWait { get; set; } - public bool FatalErrorOccurred { get; set; } - } - - public class MyMessage : IMessage - { - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(config => - { - config.GetSettings().Set("TimeToWaitBeforeTriggeringCriticalErrorForTimeoutPersisterReceiver", TimeSpan.FromSeconds(7)); - config.EnableFeature(); - }); - } - - public TestContext TestContext { get; set; } - - class Initializer : Feature - { - public Initializer() - { - EnableByDefault(); - } - - protected override void Setup(FeatureConfigurationContext context) - { - var testContext = context.Settings.Get(); - context.Container.ConfigureComponent(b => new CyclingOutageTimeoutPersister(testContext.SecondsToWait), DependencyLifecycle.SingleInstance); - } - } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/FakePromotableResourceManager.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/FakePromotableResourceManager.cs deleted file mode 100644 index 4a15fa479..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/FakePromotableResourceManager.cs +++ /dev/null @@ -1,49 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System; - using System.Transactions; - - public class FakePromotableResourceManager : IPromotableSinglePhaseNotification, IEnlistmentNotification - { - public void Prepare(PreparingEnlistment preparingEnlistment) - { - preparingEnlistment.Prepared(); - } - - public void Commit(Enlistment enlistment) - { - enlistment.Done(); - } - - public void Rollback(Enlistment enlistment) - { - enlistment.Done(); - } - - public void InDoubt(Enlistment enlistment) - { - enlistment.Done(); - } - - public void Initialize() - { - } - - public void SinglePhaseCommit(SinglePhaseEnlistment singlePhaseEnlistment) - { - singlePhaseEnlistment.Committed(); - } - - public void Rollback(SinglePhaseEnlistment singlePhaseEnlistment) - { - singlePhaseEnlistment.Done(); - } - - public byte[] Promote() - { - return TransactionInterop.GetTransmitterPropagationToken(new CommittableTransaction()); - } - - public static Guid ResourceManagerId = Guid.Parse("6f057e24-a0d8-4c95-b091-b8dc9a916fa4"); - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_using_scope_suppress.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_using_scope_suppress.cs deleted file mode 100644 index ce613a667..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_using_scope_suppress.cs +++ /dev/null @@ -1,75 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Linq; - using System.Threading.Tasks; - using System.Transactions; - using AcceptanceTesting; - using EndpointTemplates; - using Logging; - using NUnit.Framework; - - //note: this test will no longer be relevant in v7 - public partial class When_requesting_immediate_dispatch_using_scope_suppress : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_dispatch_immediately() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new InitiatingMessage())) - .DoNotFailOnErrorMessages()) - .Done(c => c.MessageDispatched) - .Run(); - - Assert.True(context.MessageDispatched, "Should dispatch the message immediately"); - Assert.True(context.Logs.Any(l => l.Level == LogLevel.Warn && l.Message.Contains("Suppressed ambient transaction detected when requesting the outgoing operation"))); - } - - public class Context : ScenarioContext - { - public bool MessageDispatched { get; set; } - } - - public class SuppressEndpoint : EndpointConfigurationBuilder - { - public SuppressEndpoint() - { - EndpointSetup(); - } - - public class InitiatingMessageHandler : IHandleMessages - { - public async Task Handle(InitiatingMessage message, IMessageHandlerContext context) - { - using (new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) - { - await context.SendLocal(new MessageToBeDispatchedImmediately()); - } - - throw new SimulatedException(); - } - } - - public class MessageToBeDispatchedImmediatelyHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToBeDispatchedImmediately message, IMessageHandlerContext context) - { - Context.MessageDispatched = true; - return Task.FromResult(0); - } - } - } - - public class InitiatingMessage : ICommand - { - } - - public class MessageToBeDispatchedImmediately : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_at_least_once.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_at_least_once.cs deleted file mode 100644 index 00536497c..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_at_least_once.cs +++ /dev/null @@ -1,74 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_requesting_immediate_dispatch_with_at_least_once : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_dispatch_immediately() - { - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new InitiatingMessage())) - .DoNotFailOnErrorMessages()) - .Done(c => c.MessageDispatched) - .Run(); - - Assert.True(context.MessageDispatched, "Should dispatch the message immediately"); - } - - public class Context : ScenarioContext - { - public bool MessageDispatched { get; set; } - } - - public class AtLeastOnceEndpoint : EndpointConfigurationBuilder - { - public AtLeastOnceEndpoint() - { - EndpointSetup((config, context) => - { - config.ConfigureTransport() - .Transactions(TransportTransactionMode.ReceiveOnly); - }); - } - - public class InitiatingMessageHandler : IHandleMessages - { - public async Task Handle(InitiatingMessage message, IMessageHandlerContext context) - { - var options = new SendOptions(); - - options.RequireImmediateDispatch(); - options.RouteToThisEndpoint(); - - await context.Send(new MessageToBeDispatchedImmediately(), options); - - throw new SimulatedException(); - } - } - - public class MessageToBeDispatchedImmediatelyHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToBeDispatchedImmediately message, IMessageHandlerContext context) - { - Context.MessageDispatched = true; - return Task.FromResult(0); - } - } - } - - public class InitiatingMessage : ICommand - { - } - - public class MessageToBeDispatchedImmediately : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_at_most_once.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_at_most_once.cs deleted file mode 100644 index d76591bb1..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_at_most_once.cs +++ /dev/null @@ -1,70 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_requesting_immediate_dispatch_with_at_most_once : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_dispatch_immediately() - { - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new InitiatingMessage())) - .DoNotFailOnErrorMessages()) - .Done(c => c.MessageDispatched) - .Run(); - - Assert.True(context.MessageDispatched, "Should dispatch the message immediately"); - } - - public class Context : ScenarioContext - { - public bool MessageDispatched { get; set; } - } - - public class NonTransactionalEndpoint : EndpointConfigurationBuilder - { - public NonTransactionalEndpoint() - { - EndpointSetup((config, context) => { config.ConfigureTransport().Transactions(TransportTransactionMode.None); }); - } - - public class InitiatingMessageHandler : IHandleMessages - { - public async Task Handle(InitiatingMessage message, IMessageHandlerContext context) - { - var options = new SendOptions(); - - options.RequireImmediateDispatch(); - options.RouteToThisEndpoint(); - - await context.Send(new MessageToBeDispatchedImmediately(), options); - - throw new SimulatedException(); - } - } - - public class MessageToBeDispatchedImmediatelyHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToBeDispatchedImmediately message, IMessageHandlerContext context) - { - Context.MessageDispatched = true; - return Task.FromResult(0); - } - } - } - - public class InitiatingMessage : ICommand - { - } - - public class MessageToBeDispatchedImmediately : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_exactly_once.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_exactly_once.cs deleted file mode 100644 index 2cd10bba4..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_requesting_immediate_dispatch_with_exactly_once.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_requesting_immediate_dispatch_with_exactly_once : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_dispatch_immediately() - { - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new InitiatingMessage())) - .DoNotFailOnErrorMessages()) - .Done(c => c.MessageDispatched) - .Run(); - - Assert.True(context.MessageDispatched, "Should dispatch the message immediately"); - } - - public class Context : ScenarioContext - { - public bool MessageDispatched { get; set; } - } - - public class ExactlyOnceEndpoint : EndpointConfigurationBuilder - { - public ExactlyOnceEndpoint() - { - //note: We don't have a explicit way to request "ExactlyOnce" yet so we have to rely on it being the default - EndpointSetup(); - } - - public class InitiatingMessageHandler : IHandleMessages - { - public async Task Handle(InitiatingMessage message, IMessageHandlerContext context) - { - var options = new SendOptions(); - - options.RequireImmediateDispatch(); - options.RouteToThisEndpoint(); - - await context.Send(new MessageToBeDispatchedImmediately(), options); - - throw new SimulatedException(); - } - } - - public class MessageToBeDispatchedImmediatelyHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageToBeDispatchedImmediately message, IMessageHandlerContext context) - { - Context.MessageDispatched = true; - return Task.FromResult(0); - } - } - } - - public class InitiatingMessage : ICommand - { - } - - public class MessageToBeDispatchedImmediately : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_sending_inside_ambient_tx.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_sending_inside_ambient_tx.cs deleted file mode 100644 index 7d8db3f6d..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_sending_inside_ambient_tx.cs +++ /dev/null @@ -1,109 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx.ImmediateDispatch -{ - using System; - using System.Threading.Tasks; - using System.Transactions; - using AcceptanceTesting; - using EndpointTemplates; - using NServiceBus.Pipeline; - using NUnit.Framework; - - public class When_sending_inside_ambient_tx : NServiceBusAcceptanceTest - { - //This test is verifying the legacy behavior to immediately dispatch messages via suppressing the transaction scope - //This test should be removed when the ForceImmediateDispatchForOperationsInSuppressedScopeBehavior behavior is removed - [Test] - public async Task Should_not_roll_the_message_back_to_the_queue_in_case_of_failure() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(session => session.SendLocal(new MyMessage())) - .DoNotFailOnErrorMessages()) - .Done(c => c.TestComplete) - .Run(); - - Assert.False(context.MessageEnlistedInTheAmbientTxReceived, "The enlisted session.Send should not commit"); - } - - public class Context : ScenarioContext - { - public bool TestComplete { get; set; } - - public bool MessageEnlistedInTheAmbientTxReceived { get; set; } - } - - public class NonTransactionalEndpoint : EndpointConfigurationBuilder - { - public NonTransactionalEndpoint() - { - EndpointSetup((config, context) => - { - config.ConfigureTransport().Transactions(TransportTransactionMode.None); - config.Pipeline.Register("WrapInScope", new WrapHandlersInScope(), "Wraps the handlers in a scope"); - }); - } - - class WrapHandlersInScope : IBehavior - { - public async Task Invoke(IIncomingLogicalMessageContext context, Func next) - { - using (var tx = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) - { - await next(context).ConfigureAwait(false); - tx.Complete(); - } - } - } - - public class MyMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public async Task Handle(MyMessage message, IMessageHandlerContext context) - { - await context.SendLocal(new CompleteTest - { - EnlistedInTheAmbientTx = true - }); - - using (new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) - { - await context.SendLocal(new CompleteTest()); - } - - throw new SimulatedException(); - } - } - - public class CompleteTestHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(CompleteTest message, IMessageHandlerContext context) - { - if (!Context.MessageEnlistedInTheAmbientTxReceived) - { - Context.MessageEnlistedInTheAmbientTxReceived = message.EnlistedInTheAmbientTx; - } - - Context.TestComplete = true; - - return Task.FromResult(0); - } - } - } - - - public class MyMessage : ICommand - { - } - - - public class CompleteTest : ICommand - { - public bool EnlistedInTheAmbientTx { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/Issue_2481.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/Issue_2481.cs deleted file mode 100644 index 2389e480b..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/Issue_2481.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Threading.Tasks; - using System.Transactions; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class Issue_2481 : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_enlist_the_receive_in_the_dtc_tx() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MyMessage()))) - .Done(c => c.HandlerInvoked) - .Run(); - - Assert.False(context.CanEnlistPromotable, "There should exists a DTC tx"); - } - - public class Context : ScenarioContext - { - public bool HandlerInvoked { get; set; } - - public bool CanEnlistPromotable { get; set; } - } - - public class DTCEndpoint : EndpointConfigurationBuilder - { - public DTCEndpoint() - { - EndpointSetup((config, context) => - { - config.ConfigureTransport() - .Transactions(TransportTransactionMode.TransactionScope); - }); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessage messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.CanEnlistPromotable = Transaction.Current.EnlistPromotableSinglePhase(new FakePromotableResourceManager()); - Context.HandlerInvoked = true; - return Task.FromResult(0); - } - } - } - - - public class MyMessage : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_dtc_enabled.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_dtc_enabled.cs deleted file mode 100644 index 1b9a9e1cd..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_dtc_enabled.cs +++ /dev/null @@ -1,84 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Threading.Tasks; - using System.Transactions; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_receiving_with_dtc_enabled : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_enlist_the_receive_in_the_dtc_tx() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MyMessage()))) - .Done(c => c.HandlerInvoked) - .Run(); - - Assert.False(context.CanEnlistPromotable, "There should exists a DTC tx"); - } - -#if NET452 - [Test] - public void Basic_assumptions_promotable_should_fail_if_durable_already_exists() - { - using (var tx = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) - { - Transaction.Current.EnlistDurable(FakePromotableResourceManager.ResourceManagerId, new FakePromotableResourceManager(), EnlistmentOptions.None); - Assert.False(Transaction.Current.EnlistPromotableSinglePhase(new FakePromotableResourceManager())); - - tx.Complete(); - } - } -#endif - - [Test] - public void Basic_assumptions_second_promotable_should_fail() - { - using (var tx = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) - { - Assert.True(Transaction.Current.EnlistPromotableSinglePhase(new FakePromotableResourceManager())); - - Assert.False(Transaction.Current.EnlistPromotableSinglePhase(new FakePromotableResourceManager())); - - tx.Complete(); - } - } - - public class Context : ScenarioContext - { - public bool HandlerInvoked { get; set; } - - public bool CanEnlistPromotable { get; set; } - } - - public class DTCEndpoint : EndpointConfigurationBuilder - { - public DTCEndpoint() - { - // sql needs a TransactionScope - EndpointSetup(c => c.ConfigureTransport().Transactions(TransportTransactionMode.TransactionScope)); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessage messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.CanEnlistPromotable = Transaction.Current.EnlistPromotableSinglePhase(new FakePromotableResourceManager()); - Context.HandlerInvoked = true; - return Task.FromResult(0); - } - } - } - - - public class MyMessage : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_native_multi_queue_transaction.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_native_multi_queue_transaction.cs deleted file mode 100644 index bd4ec68a2..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_native_multi_queue_transaction.cs +++ /dev/null @@ -1,87 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_receiving_with_native_multi_queue_transaction : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_send_outgoing_messages_if_receiving_transaction_is_rolled_back() - { - Requires.CrossQueueTransactionSupport(); - - var context = await Scenario.Define(c => { c.FirstAttempt = true; }) - .WithEndpoint(b => b.When(session => session.SendLocal(new MyMessage()))) - .Done(c => c.MessageHandled) - .Run(); - - Assert.IsFalse(context.HasFailed); - Assert.IsTrue(context.MessageHandled); - } - - public class Context : ScenarioContext - { - public bool FirstAttempt { get; set; } - public bool MessageHandled { get; set; } - public bool HasFailed { get; set; } - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup((config, context) => - { - config.Recoverability().Immediate(immediate => immediate.NumberOfRetries(1)); - config.ConfigureTransport() - .Transactions(TransportTransactionMode.SendsAtomicWithReceive); - }); - } - - public class MyMessageHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public async Task Handle(MyMessage message, IMessageHandlerContext context) - { - if (TestContext.FirstAttempt) - { - await context.SendLocal(new MessageHandledEvent - { - HasFailed = true - }); - TestContext.FirstAttempt = false; - throw new SimulatedException(); - } - - await context.SendLocal(new MessageHandledEvent()); - } - } - - public class MessageHandledEventHandler : IHandleMessages - { - public Context TestContext { get; set; } - - public Task Handle(MessageHandledEvent message, IMessageHandlerContext context) - { - TestContext.MessageHandled = true; - TestContext.HasFailed |= message.HasFailed; - return Task.FromResult(0); - } - } - } - - - public class MyMessage : ICommand - { - } - - - public class MessageHandledEvent : IMessage - { - public bool HasFailed { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_the_default_settings.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_the_default_settings.cs deleted file mode 100644 index 73f23e8fd..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_the_default_settings.cs +++ /dev/null @@ -1,56 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Threading.Tasks; - using System.Transactions; - using AcceptanceTesting; - using EndpointTemplates; - using NUnit.Framework; - - public class When_receiving_with_the_default_settings : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_wrap_the_handler_pipeline_with_a_transactionscope() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(session => session.SendLocal(new MyMessage()))) - .Done(c => c.HandlerInvoked) - .Run(); - - Assert.True(context.AmbientTransactionExists, "There should exist an ambient transaction"); - } - - public class Context : ScenarioContext - { - public bool AmbientTransactionExists { get; set; } - public bool HandlerInvoked { get; set; } - } - - public class TransactionalEndpoint : EndpointConfigurationBuilder - { - public TransactionalEndpoint() - { - // sql needs a TransactionScope - EndpointSetup(c => c.ConfigureTransport().Transactions(TransportTransactionMode.TransactionScope)); - } - - public class MyMessageHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MyMessage messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.AmbientTransactionExists = Transaction.Current != null; - Context.HandlerInvoked = true; - return Task.FromResult(0); - } - } - } - - - public class MyMessage : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_sending_within_an_ambient_transaction.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_sending_within_an_ambient_transaction.cs deleted file mode 100644 index 1d6c1ef2e..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_sending_within_an_ambient_transaction.cs +++ /dev/null @@ -1,133 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using System.Threading.Tasks; - using System.Transactions; - using AcceptanceTesting; - using AcceptanceTesting.Customization; - using EndpointTemplates; - using NUnit.Framework; - - public class When_sending_within_an_ambient_transaction : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_not_deliver_them_until_the_commit_phase() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(async (session, ctx) => - { - using (var tx = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) - { - await session.Send(new MessageThatIsEnlisted - { - SequenceNumber = 1 - }); - await session.Send(new MessageThatIsEnlisted - { - SequenceNumber = 2 - }); - - //send another message as well so that we can check the order in the receiver - using (new TransactionScope(TransactionScopeOption.Suppress, TransactionScopeAsyncFlowOption.Enabled)) - { - await session.Send(new MessageThatIsNotEnlisted()); - } - - tx.Complete(); - } - })) - .Done(c => c.MessageThatIsNotEnlistedHandlerWasCalled && c.TimesCalled >= 2) - .Run(); - - Assert.AreEqual(1, context.SequenceNumberOfFirstMessage, "The transport should preserve the order in which the transactional messages are delivered to the queuing system"); - } - - [Test] - public async Task Should_not_deliver_them_on_rollback() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b.When(async session => - { - using (new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) - { - await session.Send(new MessageThatIsEnlisted()); - //rollback - } - - await session.Send(new MessageThatIsNotEnlisted()); - })) - .Done(c => c.MessageThatIsNotEnlistedHandlerWasCalled) - .Run(); - - Assert.False(context.MessageThatIsEnlistedHandlerWasCalled, "The transactional handler should not be called"); - } - - public class Context : ScenarioContext - { - public bool MessageThatIsEnlistedHandlerWasCalled { get; set; } - - public bool MessageThatIsNotEnlistedHandlerWasCalled { get; set; } - public int TimesCalled { get; set; } - - public int SequenceNumberOfFirstMessage { get; set; } - - public bool NonTransactionalHandlerCalledFirst { get; set; } - } - - public class TransactionalEndpoint : EndpointConfigurationBuilder - { - public TransactionalEndpoint() - { - EndpointSetup(c => - { - c.LimitMessageProcessingConcurrencyTo(1); - var routing = c.ConfigureTransport().Routing(); - routing.RouteToEndpoint(typeof(MessageThatIsEnlisted), typeof(TransactionalEndpoint)); - routing.RouteToEndpoint(typeof(MessageThatIsNotEnlisted), typeof(TransactionalEndpoint)); - }); - } - - public class MessageThatIsEnlistedHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageThatIsEnlisted messageThatIsEnlisted, IMessageHandlerContext context) - { - Context.MessageThatIsEnlistedHandlerWasCalled = true; - Context.TimesCalled++; - - if (Context.SequenceNumberOfFirstMessage == 0) - { - Context.SequenceNumberOfFirstMessage = messageThatIsEnlisted.SequenceNumber; - } - - return Task.FromResult(0); - } - } - - public class MessageThatIsNotEnlistedHandler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(MessageThatIsNotEnlisted messageThatIsNotEnlisted, IMessageHandlerContext context) - { - Context.MessageThatIsNotEnlistedHandlerWasCalled = true; - Context.NonTransactionalHandlerCalledFirst = !Context.MessageThatIsEnlistedHandlerWasCalled; - return Task.FromResult(0); - } - } - } - - public class MessageThatIsEnlisted : ICommand - { - public int SequenceNumber { get; set; } - } - - public class MessageThatIsNotEnlisted : ICommand - { - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Versioning/When_multiple_versions_of_a_message_is_published.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Versioning/When_multiple_versions_of_a_message_is_published.cs deleted file mode 100644 index d5f537026..000000000 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Versioning/When_multiple_versions_of_a_message_is_published.cs +++ /dev/null @@ -1,129 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Versioning -{ - using System.Threading.Tasks; - using AcceptanceTesting; - using EndpointTemplates; - using Features; - using NUnit.Framework; - using Routing; - - public class When_multiple_versions_of_a_message_is_published : NServiceBusAcceptanceTest - { - [Test] - public async Task Should_deliver_is_to_both_v1_and_vX_subscribers() - { - var context = await Scenario.Define() - .WithEndpoint(b => - b.When(c => c.V1Subscribed && c.V2Subscribed, (session, c) => - { - return session.Publish(e => - { - e.SomeData = 1; - e.MoreInfo = "dasd"; - }); - })) - .WithEndpoint(b => b.When(async (session, c) => - { - await session.Subscribe(); - if (c.HasNativePubSubSupport) - { - c.V1Subscribed = true; - } - })) - .WithEndpoint(b => b.When(async (session, c) => - { - await session.Subscribe(); - if (c.HasNativePubSubSupport) - { - c.V2Subscribed = true; - } - })) - .Done(c => c.V1SubscriberGotTheMessage && c.V2SubscriberGotTheMessage) - .Run(); - - Assert.True(context.V1SubscriberGotTheMessage); - Assert.True(context.V2SubscriberGotTheMessage); - } - - public class Context : ScenarioContext - { - public bool V1SubscriberGotTheMessage { get; set; } - - public bool V2SubscriberGotTheMessage { get; set; } - - public bool V1Subscribed { get; set; } - - public bool V2Subscribed { get; set; } - } - - public class V2Publisher : EndpointConfigurationBuilder - { - public V2Publisher() - { - EndpointSetup(b => b.OnEndpointSubscribed((s, context) => - { - if (s.SubscriberReturnAddress.Contains("V1Subscriber")) - { - context.V1Subscribed = true; - } - - if (s.SubscriberReturnAddress.Contains("V2Subscriber")) - { - context.V2Subscribed = true; - } - })); - } - } - - public class V1Subscriber : EndpointConfigurationBuilder - { - public V1Subscriber() - { - EndpointSetup(b => b.DisableFeature(), - metadata => metadata.RegisterPublisherFor(typeof(V2Publisher))) - .ExcludeType(); - } - - class V1Handler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(V1Event message, IMessageHandlerContext context) - { - Context.V1SubscriberGotTheMessage = true; - return Task.FromResult(0); - } - } - } - - public class V2Subscriber : EndpointConfigurationBuilder - { - public V2Subscriber() - { - EndpointSetup(b => b.DisableFeature(), - metadata => metadata.RegisterPublisherFor(typeof(V2Publisher))); - } - - class V2Handler : IHandleMessages - { - public Context Context { get; set; } - - public Task Handle(V2Event message, IMessageHandlerContext context) - { - Context.V2SubscriberGotTheMessage = true; - return Task.FromResult(0); - } - } - } - - public class V1Event : IEvent - { - public int SomeData { get; set; } - } - - public class V2Event : V1Event - { - public string MoreInfo { get; set; } - } - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/AssemblyInfo.cs b/src/AcceptanceTestsHolder/AssemblyInfo.cs deleted file mode 100644 index dd9f551a2..000000000 --- a/src/AcceptanceTestsHolder/AssemblyInfo.cs +++ /dev/null @@ -1,4 +0,0 @@ -using NUnit.Framework; - -[assembly: Category("AcceptanceTestsHolder")] -[assembly: Ignore("Hack to share acceptance tests without running them in this project")] \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/TestSuiteConstraints.cs b/src/AcceptanceTestsHolder/TestSuiteConstraints.cs deleted file mode 100644 index c6bcdaf92..000000000 --- a/src/AcceptanceTestsHolder/TestSuiteConstraints.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace NServiceBus.AcceptanceTests -{ - using AcceptanceTesting.Support; - - public partial class TestSuiteConstraints - { - public bool SupportsDtc => true; - public bool SupportsCrossQueueTransactions => true; - public bool SupportsNativePubSub => false; - public bool SupportsNativeDeferral => false; - public bool SupportsOutbox => true; - public IConfigureEndpointTestExecution CreateTransportConfiguration() - { - return null; - } - - public IConfigureEndpointTestExecution CreatePersistenceConfiguration() - { - return null; - } - - } -} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/packages.config b/src/AcceptanceTestsHolder/packages.config deleted file mode 100644 index 6243a5fbb..000000000 --- a/src/AcceptanceTestsHolder/packages.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/src/NServiceBus.Persistence.Sql.sln b/src/NServiceBus.Persistence.Sql.sln index c5bea50ae..4af58b7e0 100644 --- a/src/NServiceBus.Persistence.Sql.sln +++ b/src/NServiceBus.Persistence.Sql.sln @@ -28,8 +28,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ScriptBuilderTask.Tests.Tar EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OracleAcceptanceTests", "OracleAcceptanceTests\OracleAcceptanceTests.csproj", "{6DFB669B-7BB0-409B-90AE-6968470EA2CB}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AcceptanceTestsHolder", "AcceptanceTestsHolder\AcceptanceTestsHolder.csproj", "{8B2246AB-4FAA-481D-AC1B-0A3F24E48CC8}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PostgreSqlAcceptanceTests", "PostgreSqlAcceptanceTests\PostgreSqlAcceptanceTests.csproj", "{2247EC45-45DE-4D00-9343-C0FBC3C8EFB4}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FB898D09-ADF0-49D4-8089-D743F1A31D12}" @@ -38,7 +36,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ..\GitVersion.yml = ..\GitVersion.yml EndProjectSection EndProject -Project("{F184B08F-C81C-45F6-A57F-5ABD9991F28F}") = "VBTestCode", "VBTestCode\VBTestCode.vbproj", "{86E76F2D-6743-442E-BDAD-80D6A872D4FA}" +Project("{778DAE3C-4631-46EA-AA77-85C1314464D9}") = "VBTestCode", "VBTestCode\VBTestCode.vbproj", "{86E76F2D-6743-442E-BDAD-80D6A872D4FA}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -94,10 +92,6 @@ Global {6DFB669B-7BB0-409B-90AE-6968470EA2CB}.Debug|Any CPU.Build.0 = Debug|Any CPU {6DFB669B-7BB0-409B-90AE-6968470EA2CB}.Release|Any CPU.ActiveCfg = Release|Any CPU {6DFB669B-7BB0-409B-90AE-6968470EA2CB}.Release|Any CPU.Build.0 = Release|Any CPU - {8B2246AB-4FAA-481D-AC1B-0A3F24E48CC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8B2246AB-4FAA-481D-AC1B-0A3F24E48CC8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8B2246AB-4FAA-481D-AC1B-0A3F24E48CC8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8B2246AB-4FAA-481D-AC1B-0A3F24E48CC8}.Release|Any CPU.Build.0 = Release|Any CPU {2247EC45-45DE-4D00-9343-C0FBC3C8EFB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2247EC45-45DE-4D00-9343-C0FBC3C8EFB4}.Debug|Any CPU.Build.0 = Debug|Any CPU {2247EC45-45DE-4D00-9343-C0FBC3C8EFB4}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -115,7 +109,6 @@ Global {B79BC184-2A06-4B40-9B45-C4722EEDA09D} = {8E942C0C-AAAB-4962-87F6-3D0F584003F2} {88A9E98A-0DDD-4D48-B073-0255B36A7E6F} = {8E942C0C-AAAB-4962-87F6-3D0F584003F2} {6DFB669B-7BB0-409B-90AE-6968470EA2CB} = {8E942C0C-AAAB-4962-87F6-3D0F584003F2} - {8B2246AB-4FAA-481D-AC1B-0A3F24E48CC8} = {8E942C0C-AAAB-4962-87F6-3D0F584003F2} {2247EC45-45DE-4D00-9343-C0FBC3C8EFB4} = {8E942C0C-AAAB-4962-87F6-3D0F584003F2} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution From 0cd8f227c1ffc10f158619be9596a3f2e207225c Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 16:44:55 -0500 Subject: [PATCH 09/11] Postgres can't use DTC, and neither does MSSQL because SqlTransport with AtomicSendsAndReceives --- src/MsSqlAcceptanceTests/TestSuiteConstraints.cs | 4 ---- src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs | 4 ---- 2 files changed, 8 deletions(-) diff --git a/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs b/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs index 1a26809ed..fd58b31fe 100644 --- a/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs +++ b/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs @@ -4,11 +4,7 @@ public partial class TestSuiteConstraints { -#if NET452 - public bool SupportsDtc => true; -#else public bool SupportsDtc => false; -#endif public bool SupportsCrossQueueTransactions => true; public bool SupportsNativePubSub => false; public bool SupportsNativeDeferral => false; diff --git a/src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs b/src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs index 1a26809ed..fd58b31fe 100644 --- a/src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs +++ b/src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs @@ -4,11 +4,7 @@ public partial class TestSuiteConstraints { -#if NET452 - public bool SupportsDtc => true; -#else public bool SupportsDtc => false; -#endif public bool SupportsCrossQueueTransactions => true; public bool SupportsNativePubSub => false; public bool SupportsNativeDeferral => false; From caa5afc83a4970fd1d9cf42129895e7ff7a23ef8 Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 16:45:29 -0500 Subject: [PATCH 10/11] Remove acceptance tests from MySQL that use names too long for MySQL to handle --- src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index 29571df11..c6091468c 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -37,6 +37,10 @@ + + + + \ No newline at end of file From 611891151039212cc0a620a55f9222d94afbca63 Mon Sep 17 00:00:00 2001 From: David Boike Date: Wed, 27 Jun 2018 16:50:44 -0500 Subject: [PATCH 11/11] Inspections --- src/AcceptanceTestsShared/NoPersistenceServer.cs | 2 +- ...requesting_immediate_dispatch_using_scope_suppress.cs | 9 --------- src/SqlPersistence/Subscription/SubscriptionPersister.cs | 2 +- 3 files changed, 2 insertions(+), 11 deletions(-) delete mode 100644 src/PostgreSqlAcceptanceTests/TestPartials/When_requesting_immediate_dispatch_using_scope_suppress.cs diff --git a/src/AcceptanceTestsShared/NoPersistenceServer.cs b/src/AcceptanceTestsShared/NoPersistenceServer.cs index 260d4b9bc..fd9bb7e75 100644 --- a/src/AcceptanceTestsShared/NoPersistenceServer.cs +++ b/src/AcceptanceTestsShared/NoPersistenceServer.cs @@ -7,7 +7,7 @@ using AcceptanceTesting.Support; using Configuration.AdvanceExtensibility; using Features; - using NServiceBus.Config.ConfigurationSource; + using Config.ConfigurationSource; public class NoPersistenceServer : IEndpointSetupTemplate { diff --git a/src/PostgreSqlAcceptanceTests/TestPartials/When_requesting_immediate_dispatch_using_scope_suppress.cs b/src/PostgreSqlAcceptanceTests/TestPartials/When_requesting_immediate_dispatch_using_scope_suppress.cs deleted file mode 100644 index 22c063bb4..000000000 --- a/src/PostgreSqlAcceptanceTests/TestPartials/When_requesting_immediate_dispatch_using_scope_suppress.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace NServiceBus.AcceptanceTests.Tx -{ - using NUnit.Framework; - - [Explicit("SQL transport does not support immediate dispatch via scope suppress")] - public partial class When_requesting_immediate_dispatch_using_scope_suppress - { - } -} \ No newline at end of file diff --git a/src/SqlPersistence/Subscription/SubscriptionPersister.cs b/src/SqlPersistence/Subscription/SubscriptionPersister.cs index 9291b4e5b..166e0b38e 100644 --- a/src/SqlPersistence/Subscription/SubscriptionPersister.cs +++ b/src/SqlPersistence/Subscription/SubscriptionPersister.cs @@ -128,7 +128,7 @@ void ClearForMessageType(MessageType messageType) { if (cacheKey.Contains(keyPart)) { - Cache.TryRemove(cacheKey, out CacheItem _); + Cache.TryRemove(cacheKey, out _); } } }