From aafd70d77aaab61d71d56f8ba2590c9b36eacca4 Mon Sep 17 00:00:00 2001 From: SzymonPobiega Date: Tue, 21 Nov 2017 10:32:25 +0100 Subject: [PATCH 01/32] Revert "Merge pull request #231 from Particular/target-nsb6" This reverts commit 0441943a34674925129f52f00ddbe18db964f16e, reversing changes made to fd6fb79778c6589c4df9ed9941a299f8b254da94. --- .../AcceptanceTestHelper.csproj | 2 +- .../EndpointConfigurationExtensions.cs | 2 +- .../AcceptanceTestsHolder.csproj | 75 +++----- .../Audit/When_a_message_is_audited.cs | 43 ++--- .../Audit/When_a_replymessage_is_audited.cs | 27 +-- ..._auditing_message_with_TimeToBeReceived.cs | 34 ++-- .../ConfigureEndpointLearningPersistence.cs | 19 +- .../ConfigureEndpointLearningTransport.cs | 25 ++- .../ConfigureEndpointMsmqTransport.cs | 12 +- ..._received_message_without_correlationid.cs | 5 +- .../When_using_a_custom_correlation_id.cs | 69 ------- .../When_sending_databus_properties.cs | 12 +- ...ing_databus_properties_with_unobtrusive.cs | 23 ++- ...hen_using_special_characters_in_headers.cs | 82 +++++++++ .../NSB.AcceptanceTests/DeterministicGuid.cs | 2 + .../EndpointTemplates/DefaultPublisher.cs | 7 +- .../EndpointTemplates/DefaultServer.cs | 10 +- .../EndpointConfigurationExtensions.cs | 2 +- ...intCustomizationConfigurationExtensions.cs | 12 +- .../EndpointTemplates/Requires.cs | 3 +- ...rverWithNoDefaultPersistenceDefinitions.cs | 6 +- .../NServiceBusAcceptanceTest.cs | 7 +- .../When_a_duplicate_message_arrives.cs | 3 +- .../Outbox/When_clearing_saga_timeouts.cs | 145 +++++++++++++++ ...When_headers_contain_special_characters.cs | 116 ++++++++++++ .../When_handling_current_message_later.cs | 109 ------------ .../When_sending_to_another_endpoint.cs | 6 +- ...hen_message_with_TimeToBeReceived_fails.cs | 40 ++--- ...hen_using_special_characters_in_headers.cs | 97 ++++++++++ .../When_extending_event_routing.cs | 2 +- .../When_publishing_from_sendonly.cs | 3 +- ..._event_with_a_route_for_a_derived_event.cs | 111 ------------ ...with_routes_to_base_and_specific_events.cs | 121 ------------- ...hen_subscribing_to_scaled_out_publisher.cs | 2 +- .../When_unsubscribing_from_event.cs | 8 +- ...n_unsubscribing_to_scaled_out_publisher.cs | 2 +- ...embly_level_message_mapping_for_pub_sub.cs | 112 ------------ ...ibe_with_missing_publisher_information.cs} | 2 +- ...When_using_legacy_routing_configuration.cs | 94 ---------- ...en_publishing_to_scaled_out_subscribers.cs | 7 +- .../When_unsubscribing_from_event.cs | 2 +- .../Routing/SubscriptionBehavior.cs | 54 ------ .../Routing/SubscriptionBehaviorExtensions.cs | 26 --- .../Routing/SubscriptionEventArgs.cs | 15 -- .../When_base_event_from_2_publishers.cs | 13 +- ...nfigure_routes_for_unobtrusive_messages.cs | 27 +-- .../Routing/When_extending_command_routing.cs | 7 +- ...n_making_endpoint_uniquely_addressable.cs} | 25 +-- .../Routing/When_publishing.cs | 19 +- ...t_implementing_two_unrelated_interfaces.cs | 11 +- .../Routing/When_publishing_an_interface.cs | 7 +- ...ublishing_an_interface_with_unobtrusive.cs | 7 +- ....cs => When_publishing_using_base_type.cs} | 6 +- ...lishing_with_only_local_messagehandlers.cs | 108 ----------- ...ublishing_with_overridden_local_address.cs | 3 +- .../Routing/When_replying_to_message.cs | 21 +++ .../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 | 18 +- ..._to_a_message_sent_to_specific_instance.cs | 2 +- ..._base_class_mapped_is_handled_by_a_saga.cs | 93 ---------- ...When_a_base_class_message_starts_a_saga.cs | 90 ---------- ...n_correlated_property_value_is_changed.cs} | 11 +- ...n_doing_request_response_between_sagas.cs} | 30 ++-- .../When_forgetting_to_set_a_corr_property.cs | 85 --------- ...essage_with_handler_and_timeout_handler.cs | 80 --------- .../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 --- ...ting.cs => When_replying_to_originator.cs} | 30 ++-- ..._replying_to_originator_from_a_timeout.cs} | 29 ++- ...saga.cs => When_replying_to_saga_event.cs} | 46 +++-- ...n_started_by_base_event_from_other_saga.cs | 5 +- .../Sagas/When_using_ReplyToOriginator.cs | 102 ----------- ..._txmode_does_not_match_endpoints_txmode.cs | 70 -------- .../When_configuring_custom_xml_namespace.cs | 10 +- .../Serialization/When_no_content_type.cs | 12 +- ...terface_message_where_child_is_excluded.cs | 80 --------- ...en_registering_additional_deserializers.cs | 2 +- .../When_registering_custom_serializer.cs | 2 +- ...registering_deserializers_with_settings.cs | 2 +- .../When_sanitizing_xml_messages.cs | 11 +- .../When_serializing_a_message.cs | 2 +- .../Serialization/When_skip_wrapping_xml.cs | 30 ++-- .../When_wrapping_is_not_skipped.cs | 26 +-- .../When_TimeToBeReceived_has_not_expired.cs | 1 - .../Timeout/CyclingOutageTimeoutPersister.cs | 113 ------------ ...eout_storage_is_unavailable_temporarily.cs | 88 --------- .../Tx/FakePromotableResourceManager.cs | 2 + ...immediate_dispatch_using_scope_suppress.cs | 75 -------- .../When_sending_inside_ambient_tx.cs | 109 ------------ ...iple_versions_of_a_message_is_published.cs | 6 +- .../App_Packages/NoPersistenceServer.cs | 6 +- src/AcceptanceTestsHolder/packages.config | 7 +- .../ConfigureEndpointSqlServerTransport.cs | 2 +- .../MsSqlAcceptanceTests.csproj | 10 +- .../MySqlAcceptanceTests.csproj | 6 +- ...en_doing_request_response_between_sagas.cs | 7 + ...When_headers_contain_special_characters.cs | 11 ++ ...n_replying_to_originator_from_a_timeout.cs | 9 + ...hen_using_special_characters_in_headers.cs | 11 ++ .../OracleAcceptanceTests.csproj | 6 +- .../ConfigureEndpointSqlServerTransport.cs | 2 +- .../PostgreSqlAcceptanceTests.csproj | 10 +- ...orrelation.ForScenario.Oracle.approved.txt | 11 +- ...ansitional.ForScenario.Oracle.approved.txt | 15 +- .../ScriptBuilder.Tests.csproj | 5 +- src/ScriptBuilder/ScriptBuilder.csproj | 2 +- .../ScriptBuilderTask.Tests.Target.csproj | 2 +- .../ScriptBuilderTask.Tests.csproj | 5 +- ...NServiceBus.Persistence.Sql.MsBuild.nuspec | 1 + .../ScriptBuilderTask.csproj | 12 +- .../Integration/MixedSagaAndNoOutbox.cs | 1 - .../Integration/MixedSagaAndOutbox.cs | 1 - .../Integration/SagaConsistencyTests.cs | 2 +- .../Integration/UserDataConsistencyTests.cs | 2 +- .../Outbox/OracleOutboxPersisterTests.cs | 2 +- .../Saga/OracleSagaPersisterTests.cs | 2 +- .../SqlPersistence.Tests.csproj | 23 ++- .../OracleSubscriptionPersisterTests.cs | 2 +- .../Timeout/OracleTimeoutPersisterTests.cs | 2 +- .../Config/SqlPersistenceConfig_Connection.cs | 2 +- .../Config/SqlPersistenceConfig_Enabled.cs | 2 +- .../Config/SqlPersistenceConfig_SqlDialect.cs | 2 +- .../SqlPersistenceConfig_TablePrefix.cs | 2 +- .../SagaSettings_JsonSerializerSettings.cs | 6 +- .../Saga/Config/SagaSettings_Reader.cs | 6 +- .../Saga/Config/SagaSettings_Writer.cs | 6 +- .../Saga/Config/SqlPersistenceConfig.cs | 2 +- src/SqlPersistence/Saga/SagaPersister_Get.cs | 23 +-- .../RetrieveVersionSpecificJsonSettings.cs | 6 +- src/SqlPersistence/ScriptLocation.cs | 3 +- src/SqlPersistence/SqlPersistence.cs | 1 + src/SqlPersistence/SqlPersistence.csproj | 9 +- .../Config/SqlPersistenceConfig.cs | 2 +- src/TestHelper/TestHelper.csproj | 8 +- 139 files changed, 1003 insertions(+), 2900 deletions(-) delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Correlation/When_using_a_custom_correlation_id.cs create mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs create mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs create mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Pipeline/When_handling_current_message_later.cs create mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_using_special_characters_in_headers.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_event_with_routes_to_base_and_specific_events.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_assembly_level_message_mapping_for_pub_sub.cs rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/{When_using_autosubscribe_with_missing_routing_information.cs => When_using_autosubscribe_with_missing_publisher_information.cs} (91%) 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/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 rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/{When_using_instance_ids.cs => When_making_endpoint_uniquely_addressable.cs} (75%) rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/{When_publishing_using_root_type.cs => When_publishing_using_base_type.cs} (92%) 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_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/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 rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/{When_auto_correlated_property_is_changed.cs => When_correlated_property_value_is_changed.cs} (89%) rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/{When_req_resp_between_sagas_first_handler_responding.cs => When_doing_request_response_between_sagas.cs} (82%) 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_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 rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/{When_req_resp_between_sagas_response_from_noninitiating.cs => When_replying_to_originator.cs} (85%) rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/{When_req_resp_between_sagas_with_timeout.cs => When_replying_to_originator_from_a_timeout.cs} (84%) rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/{When_replies_to_message_published_by_a_saga.cs => When_replying_to_saga_event.cs} (73%) delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_using_ReplyToOriginator.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/Serialization/When_receiving_interface_message_where_child_is_excluded.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/ImmediateDispatch/When_requesting_immediate_dispatch_using_scope_suppress.cs delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/ImmediateDispatch/When_sending_inside_ambient_tx.cs create mode 100644 src/MySqlAcceptanceTests/TestPartials/When_doing_request_response_between_sagas.cs create mode 100644 src/MySqlAcceptanceTests/TestPartials/When_headers_contain_special_characters.cs create mode 100644 src/MySqlAcceptanceTests/TestPartials/When_replying_to_originator_from_a_timeout.cs create mode 100644 src/MySqlAcceptanceTests/TestPartials/When_using_special_characters_in_headers.cs diff --git a/src/AcceptanceTestHelper/AcceptanceTestHelper.csproj b/src/AcceptanceTestHelper/AcceptanceTestHelper.csproj index 49f598307..6f37fe92c 100644 --- a/src/AcceptanceTestHelper/AcceptanceTestHelper.csproj +++ b/src/AcceptanceTestHelper/AcceptanceTestHelper.csproj @@ -1,7 +1,7 @@  - net452 + net452;netcoreapp2.0 true $(SolutionDir)Test.snk diff --git a/src/AcceptanceTestHelper/EndpointConfigurationExtensions.cs b/src/AcceptanceTestHelper/EndpointConfigurationExtensions.cs index 014f08490..fed5d2852 100644 --- a/src/AcceptanceTestHelper/EndpointConfigurationExtensions.cs +++ b/src/AcceptanceTestHelper/EndpointConfigurationExtensions.cs @@ -3,7 +3,7 @@ using System.Linq; using System.Reflection; using NServiceBus; -using NServiceBus.Configuration.AdvanceExtensibility; +using NServiceBus.Configuration.AdvancedExtensibility; public static class EndpointConfigurationExtensions { diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index 647a8de99..77ebe5bb5 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -1,5 +1,6 @@  + Debug @@ -9,11 +10,10 @@ Properties AcceptanceTestsHolder AcceptanceTestsHolder - v4.5.2 + v4.6 512 - true @@ -31,11 +31,14 @@ prompt - - ..\packages\NServiceBus.AcceptanceTesting.6.4.2\lib\net452\NServiceBus.AcceptanceTesting.dll + + ..\packages\NServiceBus.AcceptanceTesting.7.0.0-beta0012\lib\net452\NServiceBus.AcceptanceTesting.dll - - ..\packages\NServiceBus.6.4.2\lib\net452\NServiceBus.Core.dll + + ..\packages\NServiceBus.7.0.0-beta0012\lib\net452\NServiceBus.Core.dll + + + ..\packages\NServiceBus.Transport.Msmq.1.0.0-beta0005\lib\net452\NServiceBus.Transport.Msmq.dll ..\packages\NUnit.3.7.1\lib\net45\nunit.framework.dll @@ -68,13 +71,13 @@ - + @@ -93,12 +96,12 @@ + + - - @@ -118,41 +121,35 @@ + - - - - - + - - - + - - + @@ -162,30 +159,17 @@ - - - - - - - - + - - - - - + - - - - - - - + + + + + @@ -204,9 +188,7 @@ - - @@ -214,7 +196,6 @@ - @@ -223,18 +204,14 @@ - - - - @@ -260,4 +237,10 @@ + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + + \ 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 index f5a1f2117..bb93697e1 100644 --- 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 @@ -28,8 +28,8 @@ public async Task Should_preserve_the_original_body() public static byte Checksum(byte[] data) { - var longSum = data.Sum(x => (long) x); - return unchecked((byte) longSum); + var longSum = data.Sum(x => (long)x); + return unchecked((byte)longSum); } public class Context : ScenarioContext @@ -44,19 +44,25 @@ public class EndpointWithAuditOn : EndpointConfigurationBuilder { public EndpointWithAuditOn() { - EndpointSetup(c => c - .AuditProcessedMessagesTo()); + EndpointSetup((config, context) => + { + config.RegisterMessageMutator(new BodyMutator(context)); + config.AuditProcessedMessagesTo(); + }); } - class BodyMutator : IMutateIncomingTransportMessages, INeedInitialization + class BodyMutator : IMutateIncomingTransportMessages { - public Context Context { get; set; } + public BodyMutator(Context testContext) + { + this.testContext = testContext; + } public Task MutateIncoming(MutateIncomingTransportMessageContext context) { var originalBody = context.Body; - Context.OriginalBodyChecksum = Checksum(originalBody); + testContext.OriginalBodyChecksum = Checksum(originalBody); // modifying the body by adding a line break var modifiedBody = new byte[originalBody.Length + 1]; @@ -69,10 +75,7 @@ public Task MutateIncoming(MutateIncomingTransportMessageContext context) return Task.FromResult(0); } - public void Customize(EndpointConfiguration configuration) - { - configuration.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); - } + Context testContext; } public class MessageToBeAuditedHandler : IHandleMessages @@ -88,23 +91,23 @@ class AuditSpyEndpoint : EndpointConfigurationBuilder { public AuditSpyEndpoint() { - EndpointSetup(); + EndpointSetup((config, context) => config.RegisterMessageMutator(new BodySpy(context))); } - class BodySpy : IMutateIncomingTransportMessages, INeedInitialization + class BodySpy : IMutateIncomingTransportMessages { - public Context Context { get; set; } + public BodySpy(Context context) + { + this.context = context; + } public Task MutateIncoming(MutateIncomingTransportMessageContext transportMessage) { - Context.AuditChecksum = Checksum(transportMessage.Body); + context.AuditChecksum = Checksum(transportMessage.Body); return Task.FromResult(0); } - public void Customize(EndpointConfiguration configuration) - { - configuration.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); - } + Context context; } public class MessageToBeAuditedHandler : IHandleMessages @@ -114,9 +117,7 @@ public class MessageToBeAuditedHandler : IHandleMessages public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) { if (message.RunId != TestContext.RunId) - { return Task.FromResult(0); - } TestContext.Done = true; 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 index f5acc70a3..7716a454d 100644 --- 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 @@ -23,18 +23,20 @@ public async Task Should_audit_the_message() Assert.True(context.MessageProcessed); Assert.True(context.MessageAudited); + Assert.AreEqual("SomeValue", context.HeaderValue); } public static byte Checksum(byte[] data) { - var longSum = data.Sum(x => (long) x); - return unchecked((byte) longSum); + 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 string HeaderValue { get; set; } } public class Server : EndpointConfigurationBuilder @@ -75,7 +77,7 @@ public class MessageToBeAuditedHandler : IHandleMessages public Task Handle(ResponseToBeAudited message, IMessageHandlerContext context) { - Assert.AreEqual(context.MessageHeaders["MyHeader"], "SomeValue"); + TestContext.HeaderValue = context.MessageHeaders["MyHeader"]; TestContext.MessageProcessed = true; return Task.FromResult(0); } @@ -86,23 +88,22 @@ class AuditSpyEndpoint : EndpointConfigurationBuilder { public AuditSpyEndpoint() { - EndpointSetup(); + EndpointSetup((config, context) => config.RegisterMessageMutator(new BodySpy(context))); } - class BodySpy : IMutateIncomingTransportMessages, INeedInitialization + class BodySpy : IMutateIncomingTransportMessages { - public Context Context { get; set; } - - public Task MutateIncoming(MutateIncomingTransportMessageContext transportMessage) + public BodySpy(Context testContext) { - Context.MessageAudited = true; - return Task.FromResult(0); + this.testContext = testContext; } - - public void Customize(EndpointConfiguration configuration) + public Task MutateIncoming(MutateIncomingTransportMessageContext context) { - configuration.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); + testContext.MessageAudited = true; + return Task.FromResult(0); } + + Context testContext; } public class MessageToBeAuditedHandler : IHandleMessages 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 index 6fd8ba231..3dc42f3fb 100644 --- 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 @@ -1,6 +1,7 @@ namespace NServiceBus.AcceptanceTests.Audit { using System; + using System.Threading; using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; @@ -9,6 +10,10 @@ public class When_auditing_message_with_TimeToBeReceived : NServiceBusAcceptanceTest { + // This test has repeatedly failed because the message took longer than the TTBR value to be received. + // We assume this could be due to the parallel test execution. + // If this test fails your build with this attribute set, please ping the NServiceBus maintainers. + [NonParallelizable] [Test] public async Task Should_not_honor_TimeToBeReceived_for_audit_message() { @@ -23,8 +28,8 @@ public async Task Should_not_honor_TimeToBeReceived_for_audit_message() class Context : ScenarioContext { + public int AuditRetries; public bool IsMessageHandlingComplete { get; set; } - public DateTime? FirstTimeProcessedByAudit { get; set; } public bool TTBRHasExpiredAndMessageIsStillInAuditQueue { get; set; } } @@ -56,7 +61,7 @@ class EndpointThatHandlesAuditMessages : EndpointConfigurationBuilder { public EndpointThatHandlesAuditMessages() { - EndpointSetup(); + EndpointSetup(c => c.Recoverability().Immediate(s => s.NumberOfRetries(10))); } class AuditMessageHandler : IHandleMessages @@ -66,28 +71,21 @@ public AuditMessageHandler(Context textContext) this.textContext = textContext; } - public Task Handle(MessageToBeAudited message, IMessageHandlerContext context) + public async Task Handle(MessageToBeAudited message, IMessageHandlerContext context) { - var auditProcessingStarted = DateTime.Now; - if (textContext.FirstTimeProcessedByAudit == null) + if (textContext.AuditRetries > 0) { - textContext.FirstTimeProcessedByAudit = auditProcessingStarted; + textContext.TTBRHasExpiredAndMessageIsStillInAuditQueue = true; + return; } 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(); - } + // wait longer than configured TTBR + await Task.Delay(ttbr.Add(TimeSpan.FromSeconds(1))); - return Task.FromResult(0); + // enforce message retry + Interlocked.Increment(ref textContext.AuditRetries); + throw new Exception("retry message"); } Context textContext; diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningPersistence.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningPersistence.cs index 0e40ae4a9..1d858c83b 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningPersistence.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningPersistence.cs @@ -3,14 +3,27 @@ using System.Threading.Tasks; using NServiceBus; using NServiceBus.AcceptanceTesting.Support; -using NServiceBus.Persistence; +using NUnit.Framework; 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")); + var testRunId = TestContext.CurrentContext.Test.ID; + + string tempDir; + + if (Environment.OSVersion.Platform == PlatformID.Win32NT) + { + //can't use bin dir since that will be too long on the build agents + tempDir = @"c:\temp"; + } + else + { + tempDir = Path.GetTempPath(); + } + + storageDir = Path.Combine(tempDir, testRunId); configuration.UsePersistence(); configuration.UsePersistence(); diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs index f25f722f3..f243f219a 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs @@ -1,8 +1,10 @@ +using System; using System.IO; using System.Threading.Tasks; using NServiceBus; using NServiceBus.AcceptanceTesting.Support; using NServiceBus.Transport; +using NUnit.Framework; public class ConfigureEndpointLearningTransport : IConfigureEndpointTestExecution { @@ -18,13 +20,30 @@ public Task Cleanup() 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 + var testRunId = TestContext.CurrentContext.Test.ID; + + string tempDir; + + if (Environment.OSVersion.Platform == PlatformID.Win32NT) + { + //can't use bin dir since that will be too long on the build agents + tempDir = @"c:\temp"; + } + else + { + tempDir = Path.GetTempPath(); + } + + storageDir = Path.Combine(tempDir, testRunId); //we want the tests to be exposed to concurrency configuration.LimitMessageProcessingConcurrencyTo(PushRuntimeSettings.Default.MaxConcurrency); - configuration.UseTransport() - .StorageDirectory(storageDir); + var transport = configuration.UseTransport(); +#if (MySQL) + transport.Transactions(TransportTransactionMode.SendsAtomicWithReceive); +#endif + transport.StorageDirectory(storageDir); return Task.FromResult(0); } diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs index 79199b7c7..705c27d6b 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs @@ -6,22 +6,22 @@ using NServiceBus; using NServiceBus.AcceptanceTesting.Support; using NServiceBus.AcceptanceTests.ScenarioDescriptors; -using NServiceBus.Configuration.AdvanceExtensibility; +using NServiceBus.Configuration.AdvancedExtensibility; 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); + transportConfig.DisableConnectionCachingForSends(); + +#if (MySQL) + transportConfig.Transactions(TransportTransactionMode.SendsAtomicWithReceive); +#endif var routingConfig = transportConfig.Routing(); 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 index 20649ee71..f4f5e8f09 100644 --- 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 @@ -37,8 +37,7 @@ public class CorrelationEndpoint : EndpointConfigurationBuilder { public CorrelationEndpoint() { - EndpointSetup(c => c.RegisterComponents( - components => { components.ConfigureComponent(DependencyLifecycle.InstancePerCall); })); + EndpointSetup(c => c.RegisterMessageMutator(new RemoveCorrelationIdMutator())); } public class MyRequestHandler : IHandleMessages @@ -67,7 +66,7 @@ public Task Handle(MyResponse message, IMessageHandlerContext c) readonly Context context; } - class RemoveCorrelationId : IMutateIncomingTransportMessages + class RemoveCorrelationIdMutator : IMutateIncomingTransportMessages { public Task MutateIncoming(MutateIncomingTransportMessageContext context) { 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 index e3ed5b22b..d1106ded6 100644 --- 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 @@ -28,7 +28,7 @@ public async Task Should_receive_messages_with_largepayload_correctly() Assert.AreEqual(payloadToSend, context.ReceivedPayload, "The large payload should be marshalled correctly using the databus"); } - const int PayloadSize = 100; + const int PayloadSize = 500; public class Context : ScenarioContext { @@ -41,9 +41,8 @@ public Sender() { EndpointSetup(builder => { - var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"databus\sender"); + var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, "databus", "sender"); builder.UseDataBus().BasePath(basePath); - builder.UseSerialization(); builder.ConfigureTransport().Routing().RouteToEndpoint(typeof(MyMessageWithLargePayload), typeof(Receiver)); }); @@ -56,10 +55,9 @@ public Receiver() { EndpointSetup(builder => { - var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, @"databus\sender"); + var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, "databus", "sender"); builder.UseDataBus().BasePath(basePath); - builder.UseSerialization(); - builder.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.InstancePerCall)); + builder.RegisterMessageMutator(new Mutator()); }); } @@ -81,7 +79,7 @@ public Task MutateIncoming(MutateIncomingTransportMessageContext context) { if (context.Body.Length > PayloadSize) { - throw new Exception(); + throw new Exception("The message body is too large, which means the DataBus was not used to transfer the payload."); } return Task.FromResult(0); } 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 index 6ac7d839b..f834c89b3 100644 --- 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 @@ -1,10 +1,12 @@ 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_with_unobtrusive : NServiceBusAcceptanceTest @@ -26,7 +28,7 @@ public async Task Should_receive_messages_with_largepayload_correctly() Assert.AreEqual(payloadToSend, context.ReceivedPayload, "The large payload should be marshalled correctly using the databus"); } - const int PayloadSize = 100; + const int PayloadSize = 500; public class Context : ScenarioContext { @@ -43,9 +45,8 @@ public Sender() .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"); + 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 @@ -62,9 +63,9 @@ public Receiver() .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"); + var basePath = Path.Combine(TestContext.CurrentContext.TestDirectory, "databus", "sender"); builder.UseDataBus().BasePath(basePath); - builder.UseSerialization(); + builder.RegisterMessageMutator(new Mutator()); }); } @@ -81,6 +82,18 @@ public Task Handle(MyMessageWithLargePayload messageWithLargePayload, IMessageHa } } + public class Mutator : IMutateIncomingTransportMessages + { + public Task MutateIncoming(MutateIncomingTransportMessageContext context) + { + if (context.Body.Length > PayloadSize) + { + throw new Exception("The message body is too large, which means the DataBus was not used to transfer the payload."); + } + return Task.FromResult(0); + } + } + public class MyMessageWithLargePayload { public byte[] Payload { get; set; } diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs new file mode 100644 index 000000000..bf3595b56 --- /dev/null +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs @@ -0,0 +1,82 @@ +namespace NServiceBus.AcceptanceTests.DelayedDelivery +{ + using System; + using System.Collections.Generic; + using System.Threading.Tasks; + using AcceptanceTesting; + using EndpointTemplates; + using Features; + using NUnit.Framework; + + public partial class When_using_special_characters_in_headers : NServiceBusAcceptanceTest + { + readonly Dictionary specialHeaders = new Dictionary + { + { "a-B1", "a-B" }, + { "a-B2", "a-ɤϡ֎ᾣ♥-b" }, + { "a-ɤϡ֎ᾣ♥-B3", "a-B" }, + { "a-B4", "a-\U0001F60D-b" }, + { "a-\U0001F605-B5", "a-B" }, + { "a-B6", "a-😍-b" }, + { "a-😅-B7", "a-B" }, + }; + + [Test] + public async Task Should_store_unicode_characters_in_timeout_persistence_for_delayed_messages() + { + Requires.TimeoutStorage(); + + var context = await Scenario.Define() + .WithEndpoint(e => e + .When(s => + { + var options = new SendOptions(); + options.RouteToThisEndpoint(); + options.DelayDeliveryWith(TimeSpan.FromSeconds(3)); + foreach (var specialHeader in specialHeaders) + { + options.SetHeader(specialHeader.Key, specialHeader.Value); + } + return s.Send(new DelayedMessage(), options); + })) + .Done(c => c.ReceivedMessageHeaders != null) + .Run(); + + Assert.IsNotEmpty(context.ReceivedMessageHeaders); + CollectionAssert.IsSupersetOf(context.ReceivedMessageHeaders, specialHeaders); + } + + class Context : ScenarioContext + { + public IReadOnlyDictionary ReceivedMessageHeaders { get; set; } + } + + class EndpointHandlingDelayedMessages : EndpointConfigurationBuilder + { + public EndpointHandlingDelayedMessages() + { + EndpointSetup(e => e.EnableFeature()); + } + + class DelayedMessageHandler : IHandleMessages + { + Context testContext; + + public DelayedMessageHandler(Context testContext) + { + this.testContext = testContext; + } + + public Task Handle(DelayedMessage message, IMessageHandlerContext context) + { + testContext.ReceivedMessageHeaders = context.MessageHeaders; + return Task.FromResult(0); + } + } + } + + public class DelayedMessage : 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 index 97248bb16..2699cc98f 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DeterministicGuid.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DeterministicGuid.cs @@ -9,7 +9,9 @@ static class DeterministicGuid public static Guid Create(params object[] data) { // use MD5 hash to get a 16-byte hash of the string +#pragma warning disable PC001 using (var provider = new MD5CryptoServiceProvider()) +#pragma warning restore PC001 { var inputBytes = Encoding.Default.GetBytes(string.Concat(data)); var hashBytes = provider.ComputeHash(inputBytes); diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultPublisher.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultPublisher.cs index 3948a4536..242819ae1 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultPublisher.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultPublisher.cs @@ -3,15 +3,12 @@ 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 + public Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, Action configurationBuilderCustomization) { - return new DefaultServer().GetConfiguration(runDescriptor, endpointConfiguration, configSource, configurationBuilderCustomization); + return new DefaultServer().GetConfiguration(runDescriptor, endpointConfiguration, configurationBuilderCustomization); } } } diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultServer.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultServer.cs index d541e885a..431905e3a 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultServer.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/DefaultServer.cs @@ -5,9 +5,7 @@ using System.Threading.Tasks; using AcceptanceTesting.Customization; using AcceptanceTesting.Support; - using Configuration.AdvanceExtensibility; using Features; - using NServiceBus.Config.ConfigurationSource; public class DefaultServer : IEndpointSetupTemplate { @@ -21,9 +19,7 @@ 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 + public async Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, Action configurationBuilderCustomization) { var types = endpointConfiguration.GetTypesScopedByTestClass(); @@ -32,7 +28,6 @@ public async Task GetConfiguration(RunDescriptor runDescr var configuration = new EndpointConfiguration(endpointConfiguration.EndpointName); configuration.TypesToIncludeInScan(typesToInclude); - configuration.CustomConfigurationSource(configSource); configuration.EnableInstallers(); configuration.DisableFeature(); @@ -48,7 +43,6 @@ public async Task GetConfiguration(RunDescriptor runDescr await configuration.DefinePersistence(runDescriptor, endpointConfiguration).ConfigureAwait(false); - configuration.GetSettings().SetDefault("ScaleOut.UseSingleBrokerQueue", true); configurationBuilderCustomization(configuration); return configuration; @@ -56,4 +50,4 @@ public async Task GetConfiguration(RunDescriptor runDescr 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 index eba7cd771..f07a96efd 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointConfigurationExtensions.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointConfigurationExtensions.cs @@ -1,6 +1,6 @@ namespace NServiceBus.AcceptanceTests { - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; public static class EndpointConfigurationExtensions { diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointCustomizationConfigurationExtensions.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointCustomizationConfigurationExtensions.cs index 9b0b73cb1..2b81e9d0a 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointCustomizationConfigurationExtensions.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/EndpointCustomizationConfigurationExtensions.cs @@ -13,14 +13,10 @@ public static IEnumerable GetTypesScopedByTestClass(this EndpointCustomiza { 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"); - }) + var assembliesToScan = assemblies.Assemblies + //exclude acceptance tests by default + .Where(a => a != Assembly.GetExecutingAssembly()).ToList(); + var types = assembliesToScan .SelectMany(a => a.GetTypes()); types = types.Union(GetNestedTypeRecursive(endpointConfiguration.BuilderType.DeclaringType, endpointConfiguration.BuilderType)); diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/Requires.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/Requires.cs index 9985dbaac..8e7e275b2 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/Requires.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/Requires.cs @@ -2,7 +2,8 @@ { using NUnit.Framework; - static class Requires + // ReSharper disable once PartialTypeWithSinglePart + static partial class Requires { public static void DtcSupport() { diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ServerWithNoDefaultPersistenceDefinitions.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ServerWithNoDefaultPersistenceDefinitions.cs index 68f66bc1e..7c8693a78 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ServerWithNoDefaultPersistenceDefinitions.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/EndpointTemplates/ServerWithNoDefaultPersistenceDefinitions.cs @@ -6,7 +6,6 @@ using AcceptanceTesting.Customization; using AcceptanceTesting.Support; using Features; - using NServiceBus.Config.ConfigurationSource; public class ServerWithNoDefaultPersistenceDefinitions : IEndpointSetupTemplate { @@ -20,9 +19,7 @@ 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 + public async Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, Action configurationBuilderCustomization) { var types = endpointConfiguration.GetTypesScopedByTestClass(); @@ -30,7 +27,6 @@ public async Task GetConfiguration(RunDescriptor runDescr var builder = new EndpointConfiguration(endpointConfiguration.EndpointName); builder.TypesToIncludeInScan(typesToInclude); - builder.CustomConfigurationSource(configSource); builder.EnableInstallers(); builder.DisableFeature(); diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs index 5c2528036..f0ffdd896 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs @@ -15,6 +15,11 @@ public abstract partial class NServiceBusAcceptanceTest [SetUp] public void SetUp() { +#if NET452 + // Hack: prevents SerializationException ... Type 'x' in assembly 'y' is not marked as serializable. + // https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/mitigation-deserialization-of-objects-across-app-domains + System.Configuration.ConfigurationManager.GetSection("X"); +#endif Conventions.EndpointNamingConvention = t => { var classAndEndpoint = t.FullName.Split('.').Last(); @@ -33,4 +38,4 @@ public void SetUp() }; } } -} \ 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 index 67132fd08..61b14cdd3 100644 --- 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 @@ -75,7 +75,8 @@ 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 + // limit to one to avoid race conditions on dispatch and this allows us to reliably check whether deduplication happens properly + b.LimitMessageProcessingConcurrencyTo(1); b.EnableOutbox(); b.ConfigureTransport().Routing().RouteToEndpoint(typeof(SendOrderAcknowledgement), typeof(DownstreamEndpoint)); }); diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs new file mode 100644 index 000000000..0488ca57b --- /dev/null +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs @@ -0,0 +1,145 @@ +namespace NServiceBus.AcceptanceTests.Core.Outbox +{ + using System; + using System.Threading.Tasks; + using AcceptanceTesting; + using EndpointTemplates; + using Extensibility; + using Features; + using NServiceBus; + using NServiceBus.Persistence.Sql; + using NServiceBus.Outbox; + using NServiceBus.Persistence; + using NUnit.Framework; + + public class When_clearing_saga_timeouts : NServiceBusAcceptanceTest + { + [Test] + public async Task Should_record_the_request_to_clear_in_outbox() + { + Requires.TimeoutStorage(); + Requires.OutboxPersistence(); + + var context = await Scenario.Define() + .WithEndpoint(b => b.When(session => session.SendLocal(new PlaceOrder + { + DataId = Guid.NewGuid() + }))) + .Done(c => c.Done) + .Run(); + + Assert.AreEqual(2, context.NumberOfOps, "Request to clear and a done signal should be in the outbox"); + } + + public class Context : ScenarioContext + { + public int NumberOfOps { get; set; } + public bool Done { get; set; } + } + + public class NonDtcReceivingEndpoint : EndpointConfigurationBuilder + { + public NonDtcReceivingEndpoint() + { + EndpointSetup( + b => + { + b.EnableFeature(); + b.UsePersistence(); + b.RegisterComponents(c => c.ConfigureComponent(DependencyLifecycle.SingleInstance)); + }); + } + + class DoneHandler : IHandleMessages + { + public Context Context { get; set; } + + public Task Handle(SignalDone message, IMessageHandlerContext context) + { + Context.Done = true; + return Task.FromResult(0); + } + } + + public class PlaceOrderSaga : SqlSaga, IAmStartedByMessages + { + public Task Handle(PlaceOrder message, IMessageHandlerContext context) + { + MarkAsComplete(); + return context.SendLocal(new SignalDone()); + } + protected override string CorrelationPropertyName => nameof(PlaceOrderSagaData.DataId); + + protected override void ConfigureMapping(IMessagePropertyMapper mapper) + { + mapper.ConfigureMapping(m => m.DataId); + } + + public class PlaceOrderSagaData : ContainSagaData + { + public virtual Guid DataId { get; set; } + } + } + } + + class FakeOutbox : IOutboxStorage + { + public FakeOutbox(Context context) + { + testContext = context; + } + + public Task Get(string messageId, ContextBag context) + { + return Task.FromResult(default(OutboxMessage)); + } + + public Task Store(OutboxMessage message, OutboxTransaction transaction, ContextBag context) + { + testContext.NumberOfOps += message.TransportOperations.Length; + return Task.FromResult(0); + } + + public Task SetAsDispatched(string messageId, ContextBag context) + { + return Task.FromResult(0); + } + + public Task BeginTransaction(ContextBag context) + { + return Task.FromResult(new FakeOutboxTransaction()); + } + + Context testContext; + + class FakeOutboxTransaction : OutboxTransaction + { + public void Dispose() + { + } + + public Task Commit() + { + return Task.FromResult(0); + } + } + } + + public class PlaceOrder : ICommand + { + public Guid DataId { get; set; } + } + + public class SignalDone : ICommand + { + } + } + + public class FakeOutboxPersistence : PersistenceDefinition + { + public FakeOutboxPersistence() + { + Supports(s => { }); + } + } +} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs new file mode 100644 index 000000000..60fe0eb42 --- /dev/null +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs @@ -0,0 +1,116 @@ +namespace NServiceBus.AcceptanceTests.Outbox +{ + using System; + using System.Collections.Generic; + using System.Threading.Tasks; + using AcceptanceTesting; + using EndpointTemplates; + using NServiceBus.Pipeline; + using NUnit.Framework; + + public partial class When_headers_contain_special_characters : NServiceBusAcceptanceTest + { + static Dictionary sentHeaders = new Dictionary + { + { "a-B1", "a-B" }, + { "a-B2", "a-ɤϡ֎ᾣ♥-b" }, + { "a-ɤϡ֎ᾣ♥-B3", "a-B" }, + { "a-B4", "a-\U0001F60D-b" }, + { "a-\U0001F605-B5", "a-B" }, + { "a-B6", "a-😍-b" }, + { "a-😅-B7", "a-B" }, + {"a-b8", "奥曼克"}, + {"a-B9", "٩(-̮̮̃-̃)۶ ٩(●̮̮̃•̃)۶ ٩(͡๏̯͡๏)۶ ٩(-̮̮̃•̃)" }, + {"a-b10", "தமிழ்" } + }; + + [Test] + public async Task Outbox_should_work() + { + Requires.OutboxPersistence(); + + var context = await Scenario.Define() + .WithEndpoint(b => b.When(session => session.SendLocal(new PlaceOrder()))) + .Done(c => c.MessageReceived) + .Run(); + + Assert.IsNotEmpty(context.UnicodeHeaders); + CollectionAssert.IsSubsetOf(sentHeaders, context.UnicodeHeaders); + } + + class Context : ScenarioContext + { + public IReadOnlyDictionary UnicodeHeaders { get; set; } + public bool MessageReceived { get; set; } + public bool SavedOutBoxRecord { get; set; } + } + + public class OutboxEndpoint : EndpointConfigurationBuilder + { + public OutboxEndpoint() + { + EndpointSetup(b => + { + b.EnableOutbox(); + b.Pipeline.Register("BlowUpBeforeDispatchBehavior", new BlowUpBeforeDispatchBehavior((Context)ScenarioContext), "Force reading the message from Outbox storage."); + b.Recoverability().Immediate(a => a.NumberOfRetries(1)); + }); + } + class BlowUpBeforeDispatchBehavior : IBehavior + { + Context testContext; + + public BlowUpBeforeDispatchBehavior(Context testContext) + { + this.testContext = testContext; + } + + public async Task Invoke(IBatchDispatchContext context, Func next) + { + if (!testContext.SavedOutBoxRecord) + { + testContext.SavedOutBoxRecord = true; + throw new Exception(); + } + + await next(context).ConfigureAwait(false); + } + } + + class PlaceOrderHandler : IHandleMessages + { + public Task Handle(PlaceOrder message, IMessageHandlerContext context) + { + var sendOrderAcknowledgement = new SendOrderAcknowledgement(); + var sendOptions = new SendOptions(); + sendOptions.RouteToThisEndpoint(); + foreach (var header in sentHeaders) + { + sendOptions.SetHeader(header.Key, header.Value); + } + return context.Send(sendOrderAcknowledgement, sendOptions); + } + } + + class SendOrderAcknowledgementHandler : IHandleMessages + { + public Context Context { get; set; } + + public Task Handle(SendOrderAcknowledgement message, IMessageHandlerContext context) + { + Context.MessageReceived = true; + Context.UnicodeHeaders = context.MessageHeaders; + 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_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 index 8edf9760d..abd5e57ca 100644 --- 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 @@ -34,6 +34,7 @@ public async Task Should_receive_the_message() 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"); + Assert.AreEqual("MyMessageId", context.MyMessageId, "MessageId should be applied to outgoing messages"); } public class Context : ScenarioContext @@ -47,6 +48,7 @@ public class Context : ScenarioContext public Guid Id { get; set; } public string MyHeader { get; set; } + public string MyMessageId { get; set; } } public class Sender : EndpointConfigurationBuilder @@ -79,10 +81,8 @@ public Task Handle(MyMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - Assert.AreEqual(context.MessageId, "MyMessageId"); - TestContext.TimesCalled++; - + TestContext.MyMessageId = context.MessageId; TestContext.MyHeader = context.MessageHeaders["MyHeader"]; TestContext.ReceivedHeaders = context.MessageHeaders; 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 index 1a58bcac0..c9312878a 100644 --- 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 @@ -1,6 +1,7 @@ namespace NServiceBus.AcceptanceTests.Recoverability { using System; + using System.Threading; using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; @@ -9,6 +10,10 @@ public class When_message_with_TimeToBeReceived_fails : NServiceBusAcceptanceTest { + // This test has repeatedly failed because the message took longer than the TTBR value to be received. + // We assume this could be due to the parallel test execution. + // If this test fails your build with this attribute set, please ping the NServiceBus maintainers. + [NonParallelizable] [Test] public async Task Should_not_honor_TimeToBeReceived_for_error_message() { @@ -16,7 +21,8 @@ public async Task Should_not_honor_TimeToBeReceived_for_error_message() .WithEndpoint(b => b .When(session => session.SendLocal(new MessageThatFails())) .DoNotFailOnErrorMessages()) - .WithEndpoint() + .WithEndpoint(b => b + .DoNotFailOnErrorMessages()) .Done(c => c.MessageFailed && c.TTBRHasExpiredAndMessageIsStillInErrorQueue) .Run(); @@ -26,8 +32,8 @@ public async Task Should_not_honor_TimeToBeReceived_for_error_message() class Context : ScenarioContext { + public int ErrorQueueRetries; public bool MessageFailed { get; set; } - public DateTime? FirstTimeProcessedByErrorHandler { get; set; } public bool TTBRHasExpiredAndMessageIsStillInErrorQueue { get; set; } } @@ -35,7 +41,8 @@ class EndpointThatThrows : EndpointConfigurationBuilder { public EndpointThatThrows() { - EndpointSetup(c => c.SendFailedMessagesTo()); + EndpointSetup(c => c + .SendFailedMessagesTo()); } class ThrowingMessageHandler : IHandleMessages @@ -59,7 +66,7 @@ class EndpointThatHandlesErrorMessages : EndpointConfigurationBuilder { public EndpointThatHandlesErrorMessages() { - EndpointSetup(); + EndpointSetup(c => c.Recoverability().Immediate(s => s.NumberOfRetries(10))); } class ErrorMessageHandler : IHandleMessages @@ -69,28 +76,21 @@ public ErrorMessageHandler(Context testContext) this.testContext = testContext; } - public Task Handle(MessageThatFails message, IMessageHandlerContext context) + public async Task Handle(MessageThatFails message, IMessageHandlerContext context) { - var errorProcessingStarted = DateTime.Now; - if (testContext.FirstTimeProcessedByErrorHandler == null) + if (testContext.ErrorQueueRetries > 0) { - testContext.FirstTimeProcessedByErrorHandler = errorProcessingStarted; + testContext.TTBRHasExpiredAndMessageIsStillInErrorQueue = true; + return; } 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(); - } + // wait longer than configured TTBR + await Task.Delay(ttbr.Add(TimeSpan.FromSeconds(1))); - return Task.FromResult(0); // ignore messages from previous test runs + // enforce message retry + Interlocked.Increment(ref testContext.ErrorQueueRetries); + throw new Exception("retry message"); } Context testContext; diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_using_special_characters_in_headers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_using_special_characters_in_headers.cs new file mode 100644 index 000000000..1ceeec37c --- /dev/null +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Recoverability/When_using_special_characters_in_headers.cs @@ -0,0 +1,97 @@ +namespace NServiceBus.AcceptanceTests.Recoverability +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Threading.Tasks; + using AcceptanceTesting; + using EndpointTemplates; + using Features; + using NUnit.Framework; + + public class When_using_special_characters_in_headers : NServiceBusAcceptanceTest + { + readonly Dictionary specialHeaders = new Dictionary + { + { "a-B1", "a-B" }, + { "a-B2", "a-ɤϡ֎ᾣ♥-b" }, + { "a-ɤϡ֎ᾣ♥-B3", "a-B" }, + { "a-B4", "a-\U0001F60D-b" }, + { "a-\U0001F605-B5", "a-B" }, + { "a-B6", "a-😍-b" }, + { "a-😅-B7", "a-B" }, + }; + + [Test] + public async Task Should_store_unicode_characters_in_timeout_manager_for_delayed_retries() + { + Requires.TimeoutStorage(); + + var context = await Scenario.Define() + .WithEndpoint(e => e + .When(s => + { + var options = new SendOptions(); + options.RouteToThisEndpoint(); + options.DelayDeliveryWith(TimeSpan.FromSeconds(3)); + foreach (var specialHeader in specialHeaders) + { + options.SetHeader(specialHeader.Key, specialHeader.Value); + } + return s.Send(new FailingMessage(), options); + })) + .Done(c => c.ReceivedMessageHeaders != null) + .Run(); + + Assert.IsNotEmpty(context.ReceivedMessageHeaders); + CollectionAssert.IsSupersetOf(context.ReceivedMessageHeaders, Enumerable.Empty>()); + } + + class Context : ScenarioContext + { + public IReadOnlyDictionary ReceivedMessageHeaders { get; set; } + } + + class EndpointHandlingDelayedMessages : EndpointConfigurationBuilder + { + public EndpointHandlingDelayedMessages() + { + EndpointSetup(e => + { + e.EnableFeature(); + e.Recoverability() + .Immediate(ir => ir + .NumberOfRetries(0)) + .Delayed(dr => dr + .NumberOfRetries(1) + .TimeIncrease(TimeSpan.FromSeconds(3))); + }); + } + + class DelayedMessageHandler : IHandleMessages + { + Context testContext; + + public DelayedMessageHandler(Context testContext) + { + this.testContext = testContext; + } + + public Task Handle(FailingMessage message, IMessageHandlerContext context) + { + if (context.MessageHeaders.TryGetValue(Headers.DelayedRetries, out _)) + { + testContext.ReceivedMessageHeaders = context.MessageHeaders; + return Task.FromResult(0); + } + + throw new Exception("require delayed retry"); + } + } + } + + public class FailingMessage : ICommand + { + } + } +} \ 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 index a301ff69b..495a7414b 100644 --- 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 @@ -4,7 +4,7 @@ using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using Features; using NServiceBus.Routing.MessageDrivenSubscriptions; 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 index 453d2ae91..b186821ff 100644 --- 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 @@ -12,6 +12,7 @@ using Persistence; using Unicast.Subscriptions; using Unicast.Subscriptions.MessageDrivenSubscriptions; + using Conventions = AcceptanceTesting.Customization.Conventions; public class When_publishing_from_sendonly : NServiceBusAcceptanceTest { @@ -94,7 +95,7 @@ public HardcodedSubscriptionManager() { addressTask = Task.FromResult(new[] { - new Unicast.Subscriptions.MessageDrivenSubscriptions.Subscriber("publishingFromSendonly.subscriber", null) + new Unicast.Subscriptions.MessageDrivenSubscriptions.Subscriber(Conventions.EndpointNamingConvention(typeof(Subscriber)), null) }.AsEnumerable()); } 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_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_scaled_out_publisher.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_subscribing_to_scaled_out_publisher.cs index e260d92ed..78727a231 100644 --- 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 @@ -4,7 +4,7 @@ using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using NServiceBus.Routing; using NUnit.Framework; 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 index 4968d9093..58812ca83 100644 --- 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 @@ -11,7 +11,7 @@ public class When_unsubscribing_from_event : NServiceBusAcceptanceTest { [Test] - public async Task ShouldNoLongerReceiveEvent() + public async Task Should_no_longer_receive_event() { Requires.MessageDrivenPubSub(); @@ -60,19 +60,19 @@ public Publisher() { c.OnEndpointSubscribed((args, ctx) => { - if (args.SubscriberReturnAddress.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber1)))) + if (args.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber1)))) { ctx.Subscriber1Subscribed = true; } - if (args.SubscriberReturnAddress.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber2)))) + if (args.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber2)))) { ctx.Subscriber2Subscribed = true; } }); c.OnEndpointUnsubscribed((args, ctx) => { - if (args.SubscriberReturnAddress.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber2)))) + if (args.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber2)))) { ctx.Subscriber2Unsubscribed = true; } 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 index e8742af8a..ce37d0ea6 100644 --- 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 @@ -4,7 +4,7 @@ using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using NServiceBus.Routing; using NUnit.Framework; 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_publisher_information.cs similarity index 91% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_autosubscribe_with_missing_routing_information.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/MessageDrivenSubscriptions/When_using_autosubscribe_with_missing_publisher_information.cs index 78f0accf9..0d5e816f0 100644 --- 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_publisher_information.cs @@ -5,7 +5,7 @@ using EndpointTemplates; using NUnit.Framework; - public class When_using_autosubscribe_with_missing_routing_information : NServiceBusAcceptanceTest + public class When_using_autosubscribe_with_missing_publisher_information : NServiceBusAcceptanceTest { [Test] public async Task Should_skip_events_with_missing_routes() 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_publishing_to_scaled_out_subscribers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_to_scaled_out_subscribers.cs index 88dd4350a..1999827fe 100644 --- 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 @@ -14,7 +14,8 @@ 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 + .When(c => c.EndpointsStarted, (session, c) => 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"))) @@ -22,8 +23,8 @@ public async Task Should_route_event_to_shared_queue() .Done(c => c.SubscriberACounter > 0 && c.SubscriberBCounter > 0) .Run(); - Assert.IsTrue(context.SubscriberACounter == 1); - Assert.IsTrue(context.SubscriberBCounter == 1); + Assert.AreEqual(1, context.SubscriberACounter); + Assert.AreEqual(1, context.SubscriberBCounter); } public class Context : ScenarioContext 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 index ba35008d1..aabd764f7 100644 --- 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 @@ -10,7 +10,7 @@ public class When_unsubscribing_from_event : NServiceBusAcceptanceTest { [Test] - public async Task ShouldNoLongerReceiveEvent() + public async Task Should_no_longer_receive_event() { Requires.NativePubSubSupport(); 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 index b79cc0f39..e197d5776 100644 --- 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 @@ -5,6 +5,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Conventions = AcceptanceTesting.Customization.Conventions; public class When_base_event_from_2_publishers : NServiceBusAcceptanceTest { @@ -50,8 +51,8 @@ public Publisher1() { EndpointSetup(b => b.OnEndpointSubscribed((s, context) => { - context.AddTrace("Publisher1 SubscriberReturnAddress=" + s.SubscriberReturnAddress); - if (s.SubscriberReturnAddress.Contains("Subscriber1")) + context.AddTrace($"{Conventions.EndpointNamingConvention(typeof(Publisher1))} SubscriberEndpoint={s.SubscriberEndpoint}"); + if (s.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber1)))) { context.SubscribedToPublisher1 = true; } @@ -65,9 +66,9 @@ public Publisher2() { EndpointSetup(b => b.OnEndpointSubscribed((s, context) => { - context.AddTrace("Publisher2 SubscriberReturnAddress=" + s.SubscriberReturnAddress); + context.AddTrace($"{Conventions.EndpointNamingConvention(typeof(Publisher2))} SubscriberEndpoint={s.SubscriberEndpoint}"); - if (s.SubscriberReturnAddress.Contains("Subscriber1")) + if (s.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber1)))) { context.SubscribedToPublisher2 = true; } @@ -93,11 +94,11 @@ public class BaseEventHandler : IHandleMessages public Task Handle(BaseEvent message, IMessageHandlerContext context) { - if (message.GetType().FullName.Contains("DerivedEvent1")) + if (message.GetType().FullName.Contains(nameof(DerivedEvent1))) { Context.GotTheEventFromPublisher1 = true; } - if (message.GetType().FullName.Contains("DerivedEvent2")) + if (message.GetType().FullName.Contains(nameof(DerivedEvent1))) { Context.GotTheEventFromPublisher2 = true; } 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 index a96196d09..0f27c236b 100644 --- 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 @@ -3,7 +3,7 @@ using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using NUnit.Framework; @@ -22,19 +22,6 @@ public async Task Should_use_routes_from_routing_api() 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; } @@ -54,18 +41,6 @@ public SendingEndpointUsingRoutingApi() } } - 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() 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 index 6bdfcbc12..51f7d1005 100644 --- 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 @@ -6,7 +6,7 @@ using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using NServiceBus.Routing; using NUnit.Framework; @@ -68,9 +68,10 @@ public XyzDistributionStrategy(string endpoint) : base(endpoint, DistributionStr { } - public override string SelectReceiver(string[] receiverAddresses) + public override string SelectDestination(DistributionContext context) { - return receiverAddresses.First(x => x.Contains("XYZ")); + var address = context.ToTransportAddress(new EndpointInstance(ReceiverEndpoint, "XYZ")); + return context.ReceiverAddresses.First(x => x == address); } } } diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_instance_ids.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_making_endpoint_uniquely_addressable.cs similarity index 75% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_instance_ids.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_making_endpoint_uniquely_addressable.cs index 967b3668a..8b26c4f27 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_using_instance_ids.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_making_endpoint_uniquely_addressable.cs @@ -1,26 +1,27 @@ -namespace NServiceBus.AcceptanceTests.ScaleOut +namespace NServiceBus.AcceptanceTests.Routing { using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using NServiceBus.Routing; using NUnit.Framework; - public class When_using_instance_ids : NServiceBusAcceptanceTest + public class When_making_endpoint_uniquely_addressable : NServiceBusAcceptanceTest { static string ReceiverEndpoint => Conventions.EndpointNamingConvention(typeof(Receiver)); + const string InstanceDiscriminator = "XYZ"; [Test] - public async Task Should_be_addressable_both_by_shared_queue_and_specific_queue() + public async Task Should_be_addressable_both_by_shared_queue_and_unique_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()))) + .WithEndpoint(b => b.When(s => s.Send(new MyMessage()))) + .WithEndpoint(b => b.When(s => s.Send(new MyMessage()))) .Done(c => c.MessagesReceived > 1) .Run(); @@ -32,9 +33,9 @@ public class Context : ScenarioContext public int MessagesReceived; } - public class UnawareSender : EndpointConfigurationBuilder + public class UnawareOfInstanceSender : EndpointConfigurationBuilder { - public UnawareSender() + public UnawareOfInstanceSender() { EndpointSetup((c, r) => { @@ -43,9 +44,9 @@ public UnawareSender() } } - public class AwareSender : EndpointConfigurationBuilder + public class InstanceAwareSender : EndpointConfigurationBuilder { - public AwareSender() + public InstanceAwareSender() { EndpointSetup((c, r) => { @@ -54,7 +55,7 @@ public AwareSender() c.GetSettings().GetOrCreate() .AddOrReplaceInstances("testing", new List { - new EndpointInstance(ReceiverEndpoint, "XYZ") + new EndpointInstance(ReceiverEndpoint, InstanceDiscriminator) }); }); } @@ -64,7 +65,7 @@ public class Receiver : EndpointConfigurationBuilder { public Receiver() { - EndpointSetup(c => { c.MakeInstanceUniquelyAddressable("XYZ"); }); + EndpointSetup(c => { c.MakeInstanceUniquelyAddressable(InstanceDiscriminator); }); } public class MyMessageHandler : IHandleMessages diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing.cs index fda4ea374..2c1168fe0 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing.cs @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Conventions = AcceptanceTesting.Customization.Conventions; public class When_publishing : NServiceBusAcceptanceTest { @@ -78,6 +79,7 @@ public async Task Should_be_delivered_to_all_subscribers() Assert.True(context.Subscriber1GotTheEvent); Assert.True(context.Subscriber2GotTheEvent); + Assert.AreEqual("SomeValue", context.HeaderValue); } public class Context : ScenarioContext @@ -88,6 +90,7 @@ public class Context : ScenarioContext public bool Subscriber1Subscribed { get; set; } public bool Subscriber2Subscribed { get; set; } public bool Subscriber3Subscribed { get; set; } + public string HeaderValue { get; set; } } public class Publisher : EndpointConfigurationBuilder @@ -98,15 +101,17 @@ public Publisher() { b.OnEndpointSubscribed((s, context) => { - if (s.SubscriberReturnAddress.Contains("Subscriber1")) + var subscriber1 = Conventions.EndpointNamingConvention(typeof(Subscriber1)); + if (s.SubscriberEndpoint.Contains(subscriber1)) { context.Subscriber1Subscribed = true; - context.AddTrace("Subscriber1 is now subscribed"); + context.AddTrace($"{subscriber1} is now subscribed"); } - if (s.SubscriberReturnAddress.Contains("Subscriber2")) + var subscriber2 = Conventions.EndpointNamingConvention(typeof(Subscriber2)); + if (s.SubscriberEndpoint.Contains(subscriber2)) { - context.AddTrace("Subscriber2 is now subscribed"); + context.AddTrace($"{subscriber2} is now subscribed"); context.Subscriber2Subscribed = true; } }); @@ -121,8 +126,10 @@ public Publisher3() { EndpointSetup(b => b.OnEndpointSubscribed((s, context) => { - if (s.SubscriberReturnAddress.Contains("Subscriber3")) + var subscriber3 = Conventions.EndpointNamingConvention(typeof(Subscriber3)); + if (s.SubscriberEndpoint.Contains(subscriber3)) { + context.AddTrace($"{subscriber3} is now subscribed"); context.Subscriber3Subscribed = true; } })); @@ -163,7 +170,7 @@ public class MyEventHandler : IHandleMessages public Task Handle(MyEvent message, IMessageHandlerContext context) { - Assert.AreEqual(context.MessageHeaders["MyHeader"], "SomeValue"); + TestContext.HeaderValue = context.MessageHeaders["MyHeader"]; TestContext.Subscriber1GotTheEvent = true; return Task.FromResult(0); } 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 index 289626640..d00099109 100644 --- 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 @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Conventions = AcceptanceTesting.Customization.Conventions; public class When_publishing_an_event_implementing_two_unrelated_interfaces : NServiceBusAcceptanceTest { @@ -55,10 +56,9 @@ public Publisher() { EndpointSetup(b => { - b.UseSerialization(); b.OnEndpointSubscribed((s, context) => { - if (s.SubscriberReturnAddress.Contains("Subscriber")) + if (s.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber)))) { if (s.MessageType == typeof(IEventA).AssemblyQualifiedName) { @@ -80,13 +80,6 @@ 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 => 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 index ff8677b43..9bbdcc23a 100644 --- 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 @@ -7,11 +7,12 @@ using Features; using NServiceBus.Pipeline; using NUnit.Framework; + using Conventions = AcceptanceTesting.Customization.Conventions; public class When_publishing_an_interface : NServiceBusAcceptanceTest { [Test] - public async Task Should_receive_event_for_non_xml() + public async Task Should_receive_event() { var context = await Scenario.Define() .WithEndpoint(b => @@ -44,11 +45,10 @@ public Publisher() { EndpointSetup(c => { - c.UseSerialization(); c.Pipeline.Register("EventTypeSpy", new EventTypeSpy((Context)ScenarioContext), "EventTypeSpy"); c.OnEndpointSubscribed((s, context) => { - if (s.SubscriberReturnAddress.Contains("Subscriber")) + if (s.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber)))) { context.Subscribed = true; } @@ -79,7 +79,6 @@ public Subscriber() { EndpointSetup(c => { - c.UseSerialization(); c.DisableFeature(); }, metadata => metadata.RegisterPublisherFor(typeof(Publisher))); 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 index 363adfafa..4834761ae 100644 --- 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 @@ -7,11 +7,12 @@ using Features; using NServiceBus.Pipeline; using NUnit.Framework; + using Conventions = AcceptanceTesting.Customization.Conventions; public class When_publishing_an_interface_with_unobtrusive : NServiceBusAcceptanceTest { [Test] - public async Task Should_receive_event_for_non_xml() + public async Task Should_receive_event() { var context = await Scenario.Define() .WithEndpoint(b => @@ -44,12 +45,11 @@ 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")) + if (s.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber)))) { context.Subscribed = true; } @@ -80,7 +80,6 @@ public Subscriber() { EndpointSetup(c => { - c.UseSerialization(); c.Conventions().DefiningEventsAs(t => t.Namespace != null && t.Name.EndsWith("Event")); c.DisableFeature(); }, 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_base_type.cs similarity index 92% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_using_root_type.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/When_publishing_using_base_type.cs index f9af81595..95bf79d5f 100644 --- 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_base_type.cs @@ -6,8 +6,9 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Conventions = AcceptanceTesting.Customization.Conventions; - public class When_publishing_using_root_type : NServiceBusAcceptanceTest + public class When_publishing_using_base_type : NServiceBusAcceptanceTest { [Test] public async Task Event_should_be_published_using_instance_type() @@ -47,7 +48,7 @@ public Publisher() { EndpointSetup(b => b.OnEndpointSubscribed((s, context) => { - if (s.SubscriberReturnAddress.Contains("Subscriber1")) + if (s.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(Subscriber1)))) { context.Subscriber1Subscribed = true; } @@ -74,7 +75,6 @@ public Task Handle(EventMessage messageThatIsEnlisted, IMessageHandlerContext co } } - public class EventMessage : IMyEvent { public Guid EventId { get; set; } 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 index 18176251d..21f66a78b 100644 --- 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 @@ -8,7 +8,7 @@ public class When_publishing_with_overridden_local_address : NServiceBusAcceptanceTest { - [Test, Explicit("This test fails against RabbitMQ")] + [Test] public async Task Should_be_delivered_to_all_subscribers() { var context = await Scenario.Define() @@ -57,6 +57,7 @@ public Subscriber1() EndpointSetup(builder => { builder.DisableFeature(); + builder.OverrideLocalAddress("myinputqueue"); }, metadata => metadata.RegisterPublisherFor(typeof(Publisher))); } 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 index 1ea012edc..b636cb138 100644 --- 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 @@ -24,6 +24,23 @@ public async Task Should_reply_to_originator() Assert.IsFalse(ctx.OtherEndpointGotResponse); } + [Test] + public async Task Should_reply_to_shared_queue_by_default() + { + const string instanceDiscriminator = "instance-55"; + + var ctx = await Scenario.Define() + .WithEndpoint(c => c + .CustomConfig(cfg => cfg.MakeInstanceUniquelyAddressable(instanceDiscriminator)) + .When(b => b.Send(new MyMessage()))) + .WithEndpoint() + .Done(c => c.SendingEndpointGotResponse) + .Run(); + + Assert.IsTrue(ctx.SendingEndpointGotResponse); + StringAssert.DoesNotContain(instanceDiscriminator, ctx.ReplyToAddress); + } + [Test] public async Task Should_reply_to_configured_return_address() { @@ -44,6 +61,7 @@ public class Context : ScenarioContext { public bool SendingEndpointGotResponse { get; set; } public bool OtherEndpointGotResponse { get; set; } + public string ReplyToAddress { get; set; } } public class SendingEndpoint : EndpointConfigurationBuilder @@ -96,8 +114,11 @@ public ReplyingEndpoint() public class MessageHandler : IHandleMessages { + public Context Context { get; set; } + public Task Handle(MyMessage message, IMessageHandlerContext context) { + Context.ReplyToAddress = context.ReplyToAddress; return context.Reply(new MyReply()); } } 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 index 8f06ee50c..cbdf559d5 100644 --- 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 @@ -7,7 +7,7 @@ using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using NServiceBus.Routing; using NUnit.Framework; @@ -25,16 +25,16 @@ public async Task Should_route_commands_correctly() 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 }); + await session.Send(new MyCommand { Instance = Discriminator1 }); }) ) .WithEndpoint(b => b.CustomConfig(cfg => cfg.MakeInstanceUniquelyAddressable(Discriminator1))) .WithEndpoint(b => b.CustomConfig(cfg => cfg.MakeInstanceUniquelyAddressable(Discriminator2))) - .Done(c => c.MessageDeliveredReceiver1 >= 2 && c.MessageDeliveredReceiver2 >=2) + .Done(c => c.MessageDeliveredReceiver1 >= 3 && c.MessageDeliveredReceiver2 >=1) .Run(); - Assert.AreEqual(2, ctx.MessageDeliveredReceiver1); - Assert.AreEqual(2, ctx.MessageDeliveredReceiver2); + Assert.AreEqual(3, ctx.MessageDeliveredReceiver1); + Assert.AreEqual(1, ctx.MessageDeliveredReceiver2); } static string Discriminator1 = "553E9649"; @@ -76,15 +76,9 @@ public ContentBasedRoutingStrategy(string endpoint) : base(endpoint, Distributio { } - 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) + if (context.Message.Instance is MyCommand message) { var address = context.ToTransportAddress(new EndpointInstance(Endpoint, message.Instance)); return context.ReceiverAddresses.Single(a => a.Contains(address)); 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 index 1ca4d320d..362abf0f2 100644 --- 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 @@ -4,7 +4,7 @@ using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using NServiceBus.Routing; using NUnit.Framework; 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_auto_correlated_property_is_changed.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs similarity index 89% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_auto_correlated_property_is_changed.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs index 6f08b4429..cd12d2b85 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_auto_correlated_property_is_changed.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs @@ -1,16 +1,15 @@ 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; + using Persistence.Sql; [TestFixture] - public class When_auto_correlated_property_is_changed : NServiceBusAcceptanceTest + public class When_correlated_property_value_is_changed : NServiceBusAcceptanceTest { [Test] public void Should_throw() @@ -22,10 +21,9 @@ await Scenario.Define() { DataId = Guid.NewGuid() }))) - .Done(c => c.FailedMessages.Any()) + .Done(c => c.ModifiedCorrelationProperty) .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", @@ -56,13 +54,12 @@ public Task Handle(StartSaga message, IMessageHandlerContext context) return Task.FromResult(0); } + protected override string CorrelationPropertyName => nameof(CorrIdChangedSagaData.DataId); 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; } 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_doing_request_response_between_sagas.cs similarity index 82% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_first_handler_responding.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs index a6e92e7b0..1f2867eb2 100644 --- 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_doing_request_response_between_sagas.cs @@ -6,12 +6,12 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; - using NServiceBus.Persistence.Sql; + using Persistence.Sql; - public class When_req_resp_between_sagas_first_handler_responding : NServiceBusAcceptanceTest + public partial class When_doing_request_response_between_sagas : NServiceBusAcceptanceTest { [Test] - public async Task Should_autocorrelate_the_response_back_to_the_requesting_saga_from_the_first_handler() + public async Task Should_autocorrelate_the_response_back_to_the_requesting_saga() { var context = await Scenario.Define() .WithEndpoint(b => b.When(session => session.SendLocal(new InitiateRequestingSaga()))) @@ -33,7 +33,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestingSaga1 : SqlSaga, + public class RequestResponseRequestingSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -43,10 +43,12 @@ public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext contex { return context.SendLocal(new RequestToRespondingSaga { - SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse //wont be needed in the future + SomeId = Guid.NewGuid() }); } + protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData1.CorrIdForResponse); + public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context) { TestContext.DidRequestingSagaGetTheResponse = true; @@ -55,22 +57,19 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context 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 virtual Guid CorrIdForResponse { get; set; } } } - public class RespondingSaga1 : SqlSaga, + public class RequestResponseRespondingSaga1 : SqlSaga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -78,18 +77,17 @@ public class RespondingSaga1 : SqlSaga nameof(RequestResponseRespondingSagaData1.CorrIdForRequest); protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs); + mapper.ConfigureMapping(m => m.SomeId); } - protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData1.CorrIdForRequest); - public class RequestResponseRespondingSagaData1 : ContainSagaData { public virtual Guid CorrIdForRequest { get; set; } @@ -109,7 +107,7 @@ public InitiateRequestingSaga() public class RequestToRespondingSaga : ICommand { - public Guid SomeIdThatTheResponseSagaCanCorrelateBackToUs { get; set; } + public Guid SomeId { get; set; } } public class ResponseFromOtherSaga : IMessage 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_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_req_resp_between_sagas_response_from_noninitiating.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs similarity index 85% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_response_from_noninitiating.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs index 46b812a2f..e6c1309b9 100644 --- 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_replying_to_originator.cs @@ -6,12 +6,12 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; - using NServiceBus.Persistence.Sql; + using Persistence.Sql; - public class When_req_resp_between_sagas_response_from_noninitiating : NServiceBusAcceptanceTest + public class When_replying_to_originator : NServiceBusAcceptanceTest { [Test] - public async Task Should_autocorrelate_the_response_back() + public async Task Should_route_the_message_to_the_endpoint_starting_the_saga() { var context = await Scenario.Define() .WithEndpoint(b => b.When(session => session.SendLocal(new InitiateRequestingSaga()))) @@ -33,7 +33,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestingSaga2 : SqlSaga, + public class RequestResponseRequestingSaga2 : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -43,7 +43,7 @@ public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext contex { return context.SendLocal(new RequestToRespondingSaga { - SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse //wont be needed in the future + SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse }); } @@ -56,21 +56,21 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context return Task.FromResult(0); } + protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData2.CorrIdForResponse); 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 virtual Guid CorrIdForResponse { get; set; } } } - public class RespondingSaga2 : SqlSaga, + public class RequestResponseRespondingSaga2 : + SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -86,22 +86,20 @@ public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext conte 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 + //reply to originator must be used here since the sender of the incoming message is this saga and not the requesting saga + return ReplyToOriginator(context, new ResponseFromOtherSaga { - SomeCorrelationId = Data.CorrIdForRequest //wont be needed in the future + SomeCorrelationId = Data.CorrIdForRequest }); } - + protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData2.CorrIdForRequest); 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 + //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; } 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_replying_to_originator_from_a_timeout.cs similarity index 84% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_req_resp_between_sagas_with_timeout.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs index c454baf18..0be50f074 100644 --- 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_replying_to_originator_from_a_timeout.cs @@ -6,12 +6,12 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; - using NServiceBus.Persistence.Sql; + using Persistence.Sql; - public class When_req_resp_between_sagas_with_timeout : NServiceBusAcceptanceTest + public partial class When_replying_to_originator_from_a_timeout : NServiceBusAcceptanceTest { [Test] - public async Task Should_autocorrelate_the_response_back_to_the_requesting_saga_from_timeouts() + public async Task Should_route_the_message_to_the_endpoint_starting_the_saga() { var context = await Scenario.Define() .WithEndpoint(b => b.When(session => session.SendLocal(new InitiateRequestingSaga()))) @@ -33,7 +33,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestingSaga3 : SqlSaga, + public class RequestResponseRequestingSaga3 : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -43,7 +43,7 @@ public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext contex { return context.SendLocal(new RequestToRespondingSaga { - SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse //wont be needed in the future + SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse }); } @@ -56,23 +56,23 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context return Task.FromResult(0); } + protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData3.CorrIdForResponse); 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 virtual Guid CorrIdForResponse { get; set; } } } - public class RespondingSaga3 : SqlSaga, + public class RequestResponseRespondingSaga3 : + SqlSaga, IAmStartedByMessages, - IHandleTimeouts + IHandleTimeouts { public Context TestContext { get; set; } @@ -83,20 +83,19 @@ public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext conte 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 + //reply to originator must be used here since the sender of the incoming message is the TimeoutManager and not the requesting saga + return ReplyToOriginator(context, new ResponseFromOtherSaga { - SomeCorrelationId = Data.CorrIdForRequest //wont be needed in the future + SomeCorrelationId = Data.CorrIdForRequest }); } + protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData3.CorrIdForRequest); 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; } 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_replying_to_saga_event.cs similarity index 73% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replies_to_message_published_by_a_saga.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs index 4bbda4b9f..fdd3da87b 100644 --- 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_replying_to_saga_event.cs @@ -6,38 +6,38 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Routing; - using NServiceBus.Persistence.Sql; + using Persistence.Sql; - public class When_replies_to_message_published_by_a_saga : NServiceBusAcceptanceTest + public class When_replying_to_saga_event : NServiceBusAcceptanceTest { [Test] - public async Task Should_reply_to_a_message_published_by_a_saga() + public async Task Should_correlate_reply_to_publishing_saga_instance() { var context = await Scenario.Define() - .WithEndpoint - (b => b.When(c => c.Subscribed, session => session.SendLocal(new StartSaga - { - DataId = Guid.NewGuid() - })) + .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) + .WithEndpoint(b => b + .When(async (session, c) => { - c.Subscribed = true; - } - })) - .Done(c => c.DidSagaReplyMessageGetCorrelated) + await session.Subscribe(); + if (c.HasNativePubSubSupport) + { + c.Subscribed = true; + } + })) + .Done(c => c.CorrelatedResponseReceived) .Run(); - Assert.True(context.DidSagaReplyMessageGetCorrelated); + Assert.True(context.CorrelatedResponseReceived); } public class Context : ScenarioContext { - public bool DidSagaReplyMessageGetCorrelated { get; set; } + public bool CorrelatedResponseReceived { get; set; } public bool Subscribed { get; set; } } @@ -75,9 +75,10 @@ public class ReplyToPubMsgSaga : SqlSaga nameof(ReplyToPubMsgSagaData.DataId); + public Task Handle(StartSaga message, IMessageHandlerContext context) { - Data.DataId = message.DataId; return context.Publish(new DidSomething { DataId = message.DataId @@ -86,8 +87,7 @@ public Task Handle(StartSaga message, IMessageHandlerContext context) public Task Handle(DidSomethingResponse message, IMessageHandlerContext context) { - Context.DidSagaReplyMessageGetCorrelated = message.ReceivedDataId == Data.DataId; - MarkAsComplete(); + Context.CorrelatedResponseReceived = message.ReceivedDataId == Data.DataId; return Task.FromResult(0); } @@ -96,8 +96,6 @@ 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; } 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 index 002dfea96..e6f5ae08b 100644 --- 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 @@ -7,7 +7,6 @@ using Features; using NUnit.Framework; using Persistence.Sql; - using Routing; //Repro for #1323 public class When_started_by_base_event_from_other_saga : NServiceBusAcceptanceTest @@ -46,9 +45,9 @@ public class Publisher : EndpointConfigurationBuilder { public Publisher() { - EndpointSetup(b => b.OnEndpointSubscribed((args, context) => + EndpointSetup(b => b.OnEndpointSubscribed((s, context) => { - context.AddTrace($"Subscription received for {args.SubscriberReturnAddress}"); + context.AddTrace($"Subscription received for {s.SubscriberEndpoint}"); context.IsEventSubscriptionReceived = true; })); } 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/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/Serialization/When_configuring_custom_xml_namespace.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_configuring_custom_xml_namespace.cs index 80c294142..1afcbb904 100644 --- 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 @@ -34,11 +34,11 @@ class EndpointUsingCustomNamespace : EndpointConfigurationBuilder { public EndpointUsingCustomNamespace() { - EndpointSetup(c => - { - c.UseSerialization().Namespace(CustomXmlNamespace); - c.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.SingleInstance)); - }); + EndpointSetup((config, context) => + { + config.UseSerialization().Namespace(CustomXmlNamespace); + config.RegisterMessageMutator(new IncomingMutator(context)); + }); } class SimpleMessageHandler : IHandleMessages 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 index 9061530a1..8556137bc 100644 --- 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 @@ -30,7 +30,7 @@ public class EndpointViaType : EndpointConfigurationBuilder { public EndpointViaType() { - EndpointSetup(); + EndpointSetup(config => config.RegisterMessageMutator(new ContentTypeMutator())); } public class Handler : IHandleMessages @@ -44,21 +44,13 @@ public Task Handle(Message request, IMessageHandlerContext context) } } - class ContentTypeMutator : IMutateIncomingTransportMessages, INeedInitialization + class ContentTypeMutator : IMutateIncomingTransportMessages { - 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)); - } } } 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 index 32340095a..b2b7e6bf8 100644 --- 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 @@ -7,7 +7,7 @@ using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using MessageInterfaces; using NServiceBus.Serialization; 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 index 511ecf91a..49715a6ab 100644 --- 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 @@ -6,7 +6,7 @@ using System.Runtime.Serialization.Formatters.Binary; using System.Threading.Tasks; using AcceptanceTesting; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using MessageInterfaces; using NServiceBus.Serialization; 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 index dcc16df89..3c7038088 100644 --- 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 @@ -6,7 +6,7 @@ namespace NServiceBus.AcceptanceTests.Serialization using System.Runtime.Serialization.Formatters.Binary; using System.Threading.Tasks; using AcceptanceTesting; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using EndpointTemplates; using MessageInterfaces; using NServiceBus.Serialization; 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 index e3ac79b15..1df4078da 100644 --- 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 @@ -37,7 +37,7 @@ public EndpointSanitizingInput() EndpointSetup(c => { c.UseSerialization().SanitizeInput(); - c.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.SingleInstance)); + c.RegisterMessageMutator(new InjectInvalidCharMutator()); }); } @@ -59,13 +59,8 @@ public Task Handle(SimpleMessage message, IMessageHandlerContext context) Context scenarioContext; } - public class IncomingMutator : IMutateIncomingTransportMessages + class InjectInvalidCharMutator : IMutateIncomingTransportMessages { - public IncomingMutator(Context scenarioContext) - { - this.scenarioContext = scenarioContext; - } - public Task MutateIncoming(MutateIncomingTransportMessageContext context) { var body = Encoding.UTF8.GetString(context.Body); @@ -75,8 +70,6 @@ public Task MutateIncoming(MutateIncomingTransportMessageContext context) return Task.FromResult(0); } - - Context scenarioContext; } } 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 index 9cdb003b9..e012c5706 100644 --- 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 @@ -49,7 +49,7 @@ class DateTimeReceiver : EndpointConfigurationBuilder { public DateTimeReceiver() { - EndpointSetup(c => { c.UseSerialization(); }); + EndpointSetup(); } class DateTimeMessageHandler : IHandleMessages 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 index 5b4d5f46e..7971f0489 100644 --- 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 @@ -14,7 +14,7 @@ public class When_skip_wrapping_xml : NServiceBusAcceptanceTest [Test] public async Task Should_not_wrap_xml_content() { - XNamespace ns = "demoNamepsace"; + XNamespace ns = "demoNamespace"; var xmlContent = new XDocument(new XElement(ns + "Document", new XElement(ns + "Value", "content"))); var context = await Scenario.Define() @@ -41,46 +41,46 @@ class NonWrappingEndpoint : EndpointConfigurationBuilder { public NonWrappingEndpoint() { - EndpointSetup(c => - { - c.UseSerialization().DontWrapRawXml(); - c.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.SingleInstance)); - }); + EndpointSetup((config, context) => + { + config.UseSerialization().DontWrapRawXml(); + config.RegisterMessageMutator(new IncomingMutator(context)); + }); } class RawXmlMessageHandler : IHandleMessages { - public RawXmlMessageHandler(Context scenarioContext) + public RawXmlMessageHandler(Context testContext) { - this.scenarioContext = scenarioContext; + this.testContext = testContext; } public Task Handle(MessageWithRawXml messageWithRawXml, IMessageHandlerContext context) { - scenarioContext.MessageReceived = true; - scenarioContext.XmlPropertyValue = messageWithRawXml.Document; + testContext.MessageReceived = true; + testContext.XmlPropertyValue = messageWithRawXml.Document; return Task.FromResult(0); } - Context scenarioContext; + Context testContext; } public class IncomingMutator : IMutateIncomingTransportMessages { - public IncomingMutator(Context scenarioContext) + public IncomingMutator(Context testContext) { - this.scenarioContext = scenarioContext; + this.testContext = testContext; } public Task MutateIncoming(MutateIncomingTransportMessageContext context) { - scenarioContext.XmlMessage = XDocument.Parse(Encoding.UTF8.GetString(context.Body)); + testContext.XmlMessage = XDocument.Parse(Encoding.UTF8.GetString(context.Body)); return Task.FromResult(0); } - Context scenarioContext; + Context testContext; } } 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 index d04ad997d..657812521 100644 --- 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 @@ -14,7 +14,7 @@ public class When_wrapping_is_not_skipped : NServiceBusAcceptanceTest [Test] public async Task Should_wrap_xml_content() { - XNamespace ns = "demoNamepsace"; + XNamespace ns = "demoNamespace"; var xmlContent = new XDocument(new XElement(ns + "Document", new XElement(ns + "Value", "content"))); var context = await Scenario.Define() @@ -43,46 +43,46 @@ class WrappingEndpoint : EndpointConfigurationBuilder { public WrappingEndpoint() { - EndpointSetup(c => + EndpointSetup((config,context) => { - c.UseSerialization(); // wrapping is enabled by default - c.RegisterComponents(r => r.ConfigureComponent(DependencyLifecycle.SingleInstance)); + config.UseSerialization(); // wrapping is enabled by default + config.RegisterMessageMutator(new IncomingMutator(context)); }); } class RawXmlMessageHandler : IHandleMessages { - public RawXmlMessageHandler(Context scenarioContext) + public RawXmlMessageHandler(Context testContext) { - this.scenarioContext = scenarioContext; + this.testContext = testContext; } public Task Handle(MessageWithRawXml messageWithRawXml, IMessageHandlerContext context) { - scenarioContext.MessageReceived = true; - scenarioContext.XmlPropertyValue = messageWithRawXml.Document; + testContext.MessageReceived = true; + testContext.XmlPropertyValue = messageWithRawXml.Document; return Task.FromResult(0); } - Context scenarioContext; + Context testContext; } public class IncomingMutator : IMutateIncomingTransportMessages { - public IncomingMutator(Context scenarioContext) + public IncomingMutator(Context testContext) { - this.scenarioContext = scenarioContext; + this.testContext = testContext; } public Task MutateIncoming(MutateIncomingTransportMessageContext context) { - scenarioContext.XmlMessage = XDocument.Parse(Encoding.UTF8.GetString(context.Body)); + testContext.XmlMessage = XDocument.Parse(Encoding.UTF8.GetString(context.Body)); return Task.FromResult(0); } - Context scenarioContext; + Context testContext; } } 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 index b4cc00315..8d509be75 100644 --- 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 @@ -46,7 +46,6 @@ public Task Handle(MyMessage message, IMessageHandlerContext context) } } - [TimeToBeReceived("00:00:10")] public class MyMessage : IMessage { 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 index 4a15fa479..34b784c1f 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/FakePromotableResourceManager.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/FakePromotableResourceManager.cs @@ -41,7 +41,9 @@ public void Rollback(SinglePhaseEnlistment singlePhaseEnlistment) public byte[] Promote() { +#pragma warning disable PC001 return TransactionInterop.GetTransmitterPropagationToken(new CommittableTransaction()); +#pragma warning restore PC001 } public static Guid ResourceManagerId = Guid.Parse("6f057e24-a0d8-4c95-b091-b8dc9a916fa4"); 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 64efab1f7..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 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_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/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 index d5f537026..bf1df24ec 100644 --- 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 @@ -5,7 +5,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Routing; + using Conventions = AcceptanceTesting.Customization.Conventions; public class When_multiple_versions_of_a_message_is_published : NServiceBusAcceptanceTest { @@ -62,12 +62,12 @@ public V2Publisher() { EndpointSetup(b => b.OnEndpointSubscribed((s, context) => { - if (s.SubscriberReturnAddress.Contains("V1Subscriber")) + if (s.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(V1Subscriber)))) { context.V1Subscribed = true; } - if (s.SubscriberReturnAddress.Contains("V2Subscriber")) + if (s.SubscriberEndpoint.Contains(Conventions.EndpointNamingConvention(typeof(V2Subscriber)))) { context.V2Subscribed = true; } diff --git a/src/AcceptanceTestsHolder/App_Packages/NoPersistenceServer.cs b/src/AcceptanceTestsHolder/App_Packages/NoPersistenceServer.cs index 260d4b9bc..75d4e086f 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NoPersistenceServer.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NoPersistenceServer.cs @@ -5,9 +5,8 @@ using System.Threading.Tasks; using AcceptanceTesting.Customization; using AcceptanceTesting.Support; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using Features; - using NServiceBus.Config.ConfigurationSource; public class NoPersistenceServer : IEndpointSetupTemplate { @@ -22,7 +21,7 @@ public NoPersistenceServer(List typesToInclude) } #pragma warning disable CS0618 - public async Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, IConfigurationSource configSource, Action configurationBuilderCustomization) + public async Task GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, Action configurationBuilderCustomization) #pragma warning restore CS0618 { var types = endpointConfiguration.GetTypesScopedByTestClass(); @@ -32,7 +31,6 @@ public async Task GetConfiguration(RunDescriptor runDescr var configuration = new EndpointConfiguration(endpointConfiguration.EndpointName); configuration.TypesToIncludeInScan(typesToInclude); - configuration.CustomConfigurationSource(configSource); configuration.EnableInstallers(); configuration.DisableFeature(); diff --git a/src/AcceptanceTestsHolder/packages.config b/src/AcceptanceTestsHolder/packages.config index 6243a5fbb..d1bc0bd63 100644 --- a/src/AcceptanceTestsHolder/packages.config +++ b/src/AcceptanceTestsHolder/packages.config @@ -1,7 +1,8 @@  - - - + + + + \ No newline at end of file diff --git a/src/MsSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs b/src/MsSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs index 6f696a482..d613d561f 100644 --- a/src/MsSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs +++ b/src/MsSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using NServiceBus; using NServiceBus.AcceptanceTesting.Support; -using NServiceBus.Configuration.AdvanceExtensibility; +using NServiceBus.Configuration.AdvancedExtensibility; using NServiceBus.Transport; using NServiceBus.Transport.SQLServer; diff --git a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj index 271954fb2..4e27e843e 100644 --- a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj +++ b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj @@ -1,7 +1,7 @@  - net452 + net452;netcoreapp2.0 true $(SolutionDir)Test.snk true @@ -11,16 +11,14 @@ - + - - - - + + diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index a5e6bcf80..4307749fb 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -13,14 +13,12 @@ - - - - + + diff --git a/src/MySqlAcceptanceTests/TestPartials/When_doing_request_response_between_sagas.cs b/src/MySqlAcceptanceTests/TestPartials/When_doing_request_response_between_sagas.cs new file mode 100644 index 000000000..a01d8840e --- /dev/null +++ b/src/MySqlAcceptanceTests/TestPartials/When_doing_request_response_between_sagas.cs @@ -0,0 +1,7 @@ +namespace NServiceBus.AcceptanceTests.Sagas +{ + using NUnit.Framework; + + [Explicit] + partial class When_doing_request_response_between_sagas { } +} \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/TestPartials/When_headers_contain_special_characters.cs b/src/MySqlAcceptanceTests/TestPartials/When_headers_contain_special_characters.cs new file mode 100644 index 000000000..fce21a96a --- /dev/null +++ b/src/MySqlAcceptanceTests/TestPartials/When_headers_contain_special_characters.cs @@ -0,0 +1,11 @@ +namespace NServiceBus.AcceptanceTests.Outbox +{ +#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_headers_contain_special_characters + { + } +} \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/TestPartials/When_replying_to_originator_from_a_timeout.cs b/src/MySqlAcceptanceTests/TestPartials/When_replying_to_originator_from_a_timeout.cs new file mode 100644 index 000000000..ec872fd8d --- /dev/null +++ b/src/MySqlAcceptanceTests/TestPartials/When_replying_to_originator_from_a_timeout.cs @@ -0,0 +1,9 @@ +namespace NServiceBus.AcceptanceTests.Sagas +{ + using NUnit.Framework; + + [Explicit] + partial class When_replying_to_originator_from_a_timeout + { + } +} \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/TestPartials/When_using_special_characters_in_headers.cs b/src/MySqlAcceptanceTests/TestPartials/When_using_special_characters_in_headers.cs new file mode 100644 index 000000000..2d784df80 --- /dev/null +++ b/src/MySqlAcceptanceTests/TestPartials/When_using_special_characters_in_headers.cs @@ -0,0 +1,11 @@ +namespace NServiceBus.AcceptanceTests.DelayedDelivery +{ +#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_using_special_characters_in_headers + { + } +} \ No newline at end of file diff --git a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj index 5da784d28..748d09bf0 100644 --- a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj +++ b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj @@ -12,14 +12,12 @@ - - - - + + diff --git a/src/PostgreSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs b/src/PostgreSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs index 6f696a482..d613d561f 100644 --- a/src/PostgreSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs +++ b/src/PostgreSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs @@ -4,7 +4,7 @@ using System.Threading.Tasks; using NServiceBus; using NServiceBus.AcceptanceTesting.Support; -using NServiceBus.Configuration.AdvanceExtensibility; +using NServiceBus.Configuration.AdvancedExtensibility; using NServiceBus.Transport; using NServiceBus.Transport.SQLServer; diff --git a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj index 271954fb2..4e27e843e 100644 --- a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj +++ b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj @@ -1,7 +1,7 @@  - net452 + net452;netcoreapp2.0 true $(SolutionDir)Test.snk true @@ -11,16 +11,14 @@ - + - - - - + + diff --git a/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelation.ForScenario.Oracle.approved.txt b/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelation.ForScenario.Oracle.approved.txt index ffc03b2f1..c38a971de 100644 --- a/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelation.ForScenario.Oracle.approved.txt +++ b/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelation.ForScenario.Oracle.approved.txt @@ -7,10 +7,7 @@ declare sqlStatement varchar2(500); dataType varchar2(30); n number(10); - currentSchema varchar2(500); begin -select sys_context('USERENV','CURRENT_SCHEMA') into currentSchema from dual; - /* CreateTable */ @@ -40,7 +37,7 @@ select sys_context('USERENV','CURRENT_SCHEMA') into currentSchema from dual; /* AddProperty CorrelationProperty */ -select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; +select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY'; if(n = 0) then sqlStatement := 'alter table "THESAGA" add ( CORR_CORRELATIONPROPERTY NVARCHAR2(200) )'; @@ -62,7 +59,7 @@ select data_type || end end into dataType from all_tab_columns -where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; +where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY'; if(dataType <> 'NVARCHAR2(200)') then @@ -86,7 +83,7 @@ end if; select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name like 'CORR_%' and - column_name <> 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; + column_name <> 'CORR_CORRELATIONPROPERTY'; if(n > 0) then @@ -94,7 +91,7 @@ then select 'alter table "THESAGA" drop column ' || column_name into sqlStatement from all_tab_columns where table_name = 'THESAGA' and column_name like 'CORR_%' and - column_name <> 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; + column_name <> 'CORR_CORRELATIONPROPERTY'; execute immediate sqlStatement; diff --git a/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelationAndTransitional.ForScenario.Oracle.approved.txt b/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelationAndTransitional.ForScenario.Oracle.approved.txt index 5ba31693b..ba9c4f5f9 100644 --- a/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelationAndTransitional.ForScenario.Oracle.approved.txt +++ b/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelationAndTransitional.ForScenario.Oracle.approved.txt @@ -7,10 +7,7 @@ declare sqlStatement varchar2(500); dataType varchar2(30); n number(10); - currentSchema varchar2(500); begin -select sys_context('USERENV','CURRENT_SCHEMA') into currentSchema from dual; - /* CreateTable */ @@ -40,7 +37,7 @@ select sys_context('USERENV','CURRENT_SCHEMA') into currentSchema from dual; /* AddProperty CorrelationProperty */ -select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; +select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY'; if(n = 0) then sqlStatement := 'alter table "THESAGA" add ( CORR_CORRELATIONPROPERTY NVARCHAR2(200) )'; @@ -62,7 +59,7 @@ select data_type || end end into dataType from all_tab_columns -where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; +where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY'; if(dataType <> 'NVARCHAR2(200)') then @@ -81,7 +78,7 @@ end if; /* AddProperty TransitionalProperty */ -select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_TRANSITIONALPROPERTY' and owner = currentSchema; +select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_TRANSITIONALPROPERTY'; if(n = 0) then sqlStatement := 'alter table "THESAGA" add ( CORR_TRANSITIONALPROPERTY NVARCHAR2(200) )'; @@ -103,7 +100,7 @@ select data_type || end end into dataType from all_tab_columns -where table_name = 'THESAGA' and column_name = 'CORR_TRANSITIONALPROPERTY' and owner = currentSchema; +where table_name = 'THESAGA' and column_name = 'CORR_TRANSITIONALPROPERTY'; if(dataType <> 'NVARCHAR2(200)') then @@ -128,7 +125,7 @@ select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name like 'CORR_%' and column_name <> 'CORR_CORRELATIONPROPERTY' and - column_name <> 'CORR_TRANSITIONALPROPERTY' and owner = currentSchema; + column_name <> 'CORR_TRANSITIONALPROPERTY'; if(n > 0) then @@ -137,7 +134,7 @@ then from all_tab_columns where table_name = 'THESAGA' and column_name like 'CORR_%' and column_name <> 'CORR_CORRELATIONPROPERTY' and - column_name <> 'CORR_TRANSITIONALPROPERTY' and owner = currentSchema; + column_name <> 'CORR_TRANSITIONALPROPERTY'; execute immediate sqlStatement; diff --git a/src/ScriptBuilder.Tests/ScriptBuilder.Tests.csproj b/src/ScriptBuilder.Tests/ScriptBuilder.Tests.csproj index beee558cb..6c4455fe4 100644 --- a/src/ScriptBuilder.Tests/ScriptBuilder.Tests.csproj +++ b/src/ScriptBuilder.Tests/ScriptBuilder.Tests.csproj @@ -1,7 +1,7 @@  - net452 + net452;netcoreapp2.0 true $(SolutionDir)Test.snk false @@ -17,6 +17,9 @@ + + + diff --git a/src/ScriptBuilder/ScriptBuilder.csproj b/src/ScriptBuilder/ScriptBuilder.csproj index e803cb2fa..0b7cbaf34 100644 --- a/src/ScriptBuilder/ScriptBuilder.csproj +++ b/src/ScriptBuilder/ScriptBuilder.csproj @@ -1,7 +1,7 @@  - net452 + net452;netstandard1.5 NServiceBus.Persistence.Sql.ScriptBuilder NServiceBus.Persistence.Sql.ScriptBuilder true diff --git a/src/ScriptBuilderTask.Tests.Target/ScriptBuilderTask.Tests.Target.csproj b/src/ScriptBuilderTask.Tests.Target/ScriptBuilderTask.Tests.Target.csproj index 9d0c41113..a79408a57 100644 --- a/src/ScriptBuilderTask.Tests.Target/ScriptBuilderTask.Tests.Target.csproj +++ b/src/ScriptBuilderTask.Tests.Target/ScriptBuilderTask.Tests.Target.csproj @@ -1,7 +1,7 @@  - net452 + net452;netcoreapp2.0 diff --git a/src/ScriptBuilderTask.Tests/ScriptBuilderTask.Tests.csproj b/src/ScriptBuilderTask.Tests/ScriptBuilderTask.Tests.csproj index 0362f814e..e50e64aee 100644 --- a/src/ScriptBuilderTask.Tests/ScriptBuilderTask.Tests.csproj +++ b/src/ScriptBuilderTask.Tests/ScriptBuilderTask.Tests.csproj @@ -1,7 +1,7 @@  - net452 + net452;netcoreapp2.0 true $(SolutionDir)Test.snk false @@ -17,6 +17,9 @@ + + + diff --git a/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.nuspec b/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.nuspec index 8bc2025ae..dd880f2f5 100644 --- a/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.nuspec +++ b/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.nuspec @@ -19,6 +19,7 @@ + diff --git a/src/ScriptBuilderTask/ScriptBuilderTask.csproj b/src/ScriptBuilderTask/ScriptBuilderTask.csproj index a4e639906..86ceae5e2 100644 --- a/src/ScriptBuilderTask/ScriptBuilderTask.csproj +++ b/src/ScriptBuilderTask/ScriptBuilderTask.csproj @@ -1,7 +1,7 @@  - net452 + net452;netstandard1.5 NServiceBus.Persistence.Sql.ScriptBuilderTask NServiceBus.Persistence.Sql true @@ -19,12 +19,22 @@ + + + + + + + + + + NServiceBus.Persistence.Sql.MsBuild MsBuild Task for building deployment scripts for the NServiceBus.Persistence.Sql package diff --git a/src/SqlPersistence.Tests/Integration/MixedSagaAndNoOutbox.cs b/src/SqlPersistence.Tests/Integration/MixedSagaAndNoOutbox.cs index 549b7614a..6e6dfb47f 100644 --- a/src/SqlPersistence.Tests/Integration/MixedSagaAndNoOutbox.cs +++ b/src/SqlPersistence.Tests/Integration/MixedSagaAndNoOutbox.cs @@ -3,7 +3,6 @@ using System.Threading; using System.Threading.Tasks; using NServiceBus; -using NServiceBus.Persistence; using NServiceBus.Persistence.Sql; using NServiceBus.Persistence.Sql.ScriptBuilder; using NUnit.Framework; diff --git a/src/SqlPersistence.Tests/Integration/MixedSagaAndOutbox.cs b/src/SqlPersistence.Tests/Integration/MixedSagaAndOutbox.cs index dd320b5e4..791f89884 100644 --- a/src/SqlPersistence.Tests/Integration/MixedSagaAndOutbox.cs +++ b/src/SqlPersistence.Tests/Integration/MixedSagaAndOutbox.cs @@ -1,7 +1,6 @@ using System; using System.Threading.Tasks; using NServiceBus; -using NServiceBus.Persistence; using NServiceBus.Persistence.Sql; using NUnit.Framework; diff --git a/src/SqlPersistence.Tests/Integration/SagaConsistencyTests.cs b/src/SqlPersistence.Tests/Integration/SagaConsistencyTests.cs index 90b31d9ca..8fc115184 100644 --- a/src/SqlPersistence.Tests/Integration/SagaConsistencyTests.cs +++ b/src/SqlPersistence.Tests/Integration/SagaConsistencyTests.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; using System.Transactions; using NServiceBus; -using NServiceBus.Configuration.AdvanceExtensibility; +using NServiceBus.Configuration.AdvancedExtensibility; using NServiceBus.Persistence.Sql; using NServiceBus.Persistence.Sql.ScriptBuilder; using NServiceBus.Pipeline; diff --git a/src/SqlPersistence.Tests/Integration/UserDataConsistencyTests.cs b/src/SqlPersistence.Tests/Integration/UserDataConsistencyTests.cs index 628599a2d..a32ef5d58 100644 --- a/src/SqlPersistence.Tests/Integration/UserDataConsistencyTests.cs +++ b/src/SqlPersistence.Tests/Integration/UserDataConsistencyTests.cs @@ -2,7 +2,7 @@ using System.Threading; using System.Threading.Tasks; using NServiceBus; -using NServiceBus.Configuration.AdvanceExtensibility; +using NServiceBus.Configuration.AdvancedExtensibility; using NServiceBus.Features; using NServiceBus.Persistence.Sql; using NServiceBus.Persistence.Sql.ScriptBuilder; diff --git a/src/SqlPersistence.Tests/Outbox/OracleOutboxPersisterTests.cs b/src/SqlPersistence.Tests/Outbox/OracleOutboxPersisterTests.cs index 0214de515..947955f07 100644 --- a/src/SqlPersistence.Tests/Outbox/OracleOutboxPersisterTests.cs +++ b/src/SqlPersistence.Tests/Outbox/OracleOutboxPersisterTests.cs @@ -24,7 +24,7 @@ protected override Func GetConnection() var connection = Environment.GetEnvironmentVariable(key); if (string.IsNullOrWhiteSpace(connection)) { - throw new Exception($"The tests require a connection string to be configured for the custom schema '{schema}'. The connection string for that schema needs to be added as '{key}' environment variable."); + throw new Exception($"{key} environment variable is empty"); } return new OracleConnection(connection); }; diff --git a/src/SqlPersistence.Tests/Saga/OracleSagaPersisterTests.cs b/src/SqlPersistence.Tests/Saga/OracleSagaPersisterTests.cs index 30fa8ddfa..8a7b20563 100644 --- a/src/SqlPersistence.Tests/Saga/OracleSagaPersisterTests.cs +++ b/src/SqlPersistence.Tests/Saga/OracleSagaPersisterTests.cs @@ -24,7 +24,7 @@ protected override Func GetConnection() var connectionString = Environment.GetEnvironmentVariable(key); if (string.IsNullOrWhiteSpace(connectionString)) { - throw new Exception($"The tests require a connection string to be configured for the custom schema '{schema}'. The connection string for that schema needs to be added as '{key}' environment variable."); + throw new Exception($"{key} environment variable is empty"); } var connection = new OracleConnection(connectionString); connection.Open(); diff --git a/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj b/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj index ce4eef3f3..0e35ed9e9 100644 --- a/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj +++ b/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj @@ -1,7 +1,7 @@  - net452 + net452;netcoreapp2.0 true $(SolutionDir)Test.snk false @@ -16,13 +16,28 @@ - - + + + + - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/SqlPersistence.Tests/Subscription/OracleSubscriptionPersisterTests.cs b/src/SqlPersistence.Tests/Subscription/OracleSubscriptionPersisterTests.cs index 6d0872e68..4da4820ee 100644 --- a/src/SqlPersistence.Tests/Subscription/OracleSubscriptionPersisterTests.cs +++ b/src/SqlPersistence.Tests/Subscription/OracleSubscriptionPersisterTests.cs @@ -24,7 +24,7 @@ protected override Func GetConnection() var connection = Environment.GetEnvironmentVariable(key); if (string.IsNullOrWhiteSpace(connection)) { - throw new Exception($"The tests require a connection string to be configured for the custom schema '{schema}'. The connection string for that schema needs to be added as '{key}' environment variable."); + throw new Exception($"{key} environment variable is empty"); } return new OracleConnection(connection); }; diff --git a/src/SqlPersistence.Tests/Timeout/OracleTimeoutPersisterTests.cs b/src/SqlPersistence.Tests/Timeout/OracleTimeoutPersisterTests.cs index 3dc1690c3..2532a06b2 100644 --- a/src/SqlPersistence.Tests/Timeout/OracleTimeoutPersisterTests.cs +++ b/src/SqlPersistence.Tests/Timeout/OracleTimeoutPersisterTests.cs @@ -22,7 +22,7 @@ protected override Func GetConnection() var connection = Environment.GetEnvironmentVariable(key); if (string.IsNullOrWhiteSpace(connection)) { - throw new Exception($"The tests require a connection string to be configured for the custom schema '{schema}'. The connection string for that schema needs to be added as '{key}' environment variable."); + throw new Exception($"{key} environment variable is empty"); } return new OracleConnection(connection); }; diff --git a/src/SqlPersistence/Config/SqlPersistenceConfig_Connection.cs b/src/SqlPersistence/Config/SqlPersistenceConfig_Connection.cs index b4c322cf9..90741ffd4 100644 --- a/src/SqlPersistence/Config/SqlPersistenceConfig_Connection.cs +++ b/src/SqlPersistence/Config/SqlPersistenceConfig_Connection.cs @@ -2,7 +2,7 @@ namespace NServiceBus { using System; using System.Data.Common; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using Persistence.Sql; using Settings; diff --git a/src/SqlPersistence/Config/SqlPersistenceConfig_Enabled.cs b/src/SqlPersistence/Config/SqlPersistenceConfig_Enabled.cs index 0d23619c5..14a08828c 100644 --- a/src/SqlPersistence/Config/SqlPersistenceConfig_Enabled.cs +++ b/src/SqlPersistence/Config/SqlPersistenceConfig_Enabled.cs @@ -1,6 +1,6 @@ namespace NServiceBus { - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using Persistence.Sql; public static partial class SqlPersistenceConfig diff --git a/src/SqlPersistence/Config/SqlPersistenceConfig_SqlDialect.cs b/src/SqlPersistence/Config/SqlPersistenceConfig_SqlDialect.cs index 2de659901..26d6dc465 100644 --- a/src/SqlPersistence/Config/SqlPersistenceConfig_SqlDialect.cs +++ b/src/SqlPersistence/Config/SqlPersistenceConfig_SqlDialect.cs @@ -1,7 +1,7 @@ namespace NServiceBus { using System; - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using Persistence.Sql; using Settings; diff --git a/src/SqlPersistence/Config/SqlPersistenceConfig_TablePrefix.cs b/src/SqlPersistence/Config/SqlPersistenceConfig_TablePrefix.cs index 83125132d..4eb86c02a 100644 --- a/src/SqlPersistence/Config/SqlPersistenceConfig_TablePrefix.cs +++ b/src/SqlPersistence/Config/SqlPersistenceConfig_TablePrefix.cs @@ -1,6 +1,6 @@ namespace NServiceBus { - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using Persistence.Sql; using Settings; diff --git a/src/SqlPersistence/Saga/Config/SagaSettings_JsonSerializerSettings.cs b/src/SqlPersistence/Saga/Config/SagaSettings_JsonSerializerSettings.cs index b06b29edd..b15739e8a 100644 --- a/src/SqlPersistence/Saga/Config/SagaSettings_JsonSerializerSettings.cs +++ b/src/SqlPersistence/Saga/Config/SagaSettings_JsonSerializerSettings.cs @@ -1,5 +1,4 @@ -#pragma warning disable CS0419 -namespace NServiceBus.Persistence.Sql +namespace NServiceBus.Persistence.Sql { using Newtonsoft.Json; using Settings; @@ -19,5 +18,4 @@ internal static JsonSerializerSettings GetJsonSerializerSettings(ReadOnlySetting return settings.GetOrDefault("SqlPersistence.Saga.JsonSerializerSettings"); } } -} -#pragma warning restore CS0419 \ No newline at end of file +} \ No newline at end of file diff --git a/src/SqlPersistence/Saga/Config/SagaSettings_Reader.cs b/src/SqlPersistence/Saga/Config/SagaSettings_Reader.cs index 58612f384..3115f6b47 100644 --- a/src/SqlPersistence/Saga/Config/SagaSettings_Reader.cs +++ b/src/SqlPersistence/Saga/Config/SagaSettings_Reader.cs @@ -1,5 +1,4 @@ -#pragma warning disable CS0419 -namespace NServiceBus.Persistence.Sql +namespace NServiceBus.Persistence.Sql { using System; using System.IO; @@ -21,5 +20,4 @@ internal static Func GetReaderCreator(ReadOnlySettings s return settings.GetOrDefault>("SqlPersistence.Saga.ReaderCreator"); } } -} -#pragma warning restore CS0419 \ No newline at end of file +} \ No newline at end of file diff --git a/src/SqlPersistence/Saga/Config/SagaSettings_Writer.cs b/src/SqlPersistence/Saga/Config/SagaSettings_Writer.cs index f5e1a126e..1232a4c55 100644 --- a/src/SqlPersistence/Saga/Config/SagaSettings_Writer.cs +++ b/src/SqlPersistence/Saga/Config/SagaSettings_Writer.cs @@ -1,5 +1,4 @@ -#pragma warning disable CS0419 -namespace NServiceBus.Persistence.Sql +namespace NServiceBus.Persistence.Sql { using System; using System.IO; @@ -24,5 +23,4 @@ internal static Func GetWriterCreator(ReadOnlySettings s } } -} -#pragma warning restore CS0419 \ No newline at end of file +} \ No newline at end of file diff --git a/src/SqlPersistence/Saga/Config/SqlPersistenceConfig.cs b/src/SqlPersistence/Saga/Config/SqlPersistenceConfig.cs index 2f00b295c..9919dd008 100644 --- a/src/SqlPersistence/Saga/Config/SqlPersistenceConfig.cs +++ b/src/SqlPersistence/Saga/Config/SqlPersistenceConfig.cs @@ -1,6 +1,6 @@ namespace NServiceBus { - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using Persistence.Sql; public static partial class SqlPersistenceConfig diff --git a/src/SqlPersistence/Saga/SagaPersister_Get.cs b/src/SqlPersistence/Saga/SagaPersister_Get.cs index a6d1221f2..89ffdbe5f 100644 --- a/src/SqlPersistence/Saga/SagaPersister_Get.cs +++ b/src/SqlPersistence/Saga/SagaPersister_Get.cs @@ -10,14 +10,14 @@ partial class SagaPersister { internal static async Task GetByWhereClause(string whereClause, SynchronizedStorageSession session, ContextBag context, ParameterAppender appendParameters, SagaInfoCache sagaInfoCache) - where TSagaData : IContainSagaData + where TSagaData : class, IContainSagaData { var result = await GetByWhereClause(whereClause, session, appendParameters, sagaInfoCache).ConfigureAwait(false); return SetConcurrency(result, context); } static Task> GetByWhereClause(string whereClause, SynchronizedStorageSession session, ParameterAppender appendParameters, SagaInfoCache sagaInfoCache) - where TSagaData : IContainSagaData + where TSagaData : class, IContainSagaData { var sagaInfo = sagaInfoCache.GetInfo(typeof(TSagaData)); var commandText = $@" @@ -27,14 +27,14 @@ static Task> GetByWhereClause(string whereClau } public async Task Get(string propertyName, object propertyValue, SynchronizedStorageSession session, ContextBag context) - where TSagaData : IContainSagaData + where TSagaData : class, IContainSagaData { var result = await Get(propertyName, propertyValue, session).ConfigureAwait(false); return SetConcurrency(result, context); } internal Task> Get(string propertyName, object propertyValue, SynchronizedStorageSession session) - where TSagaData : IContainSagaData + where TSagaData : class, IContainSagaData { var sagaInfo = sagaInfoCache.GetInfo(typeof(TSagaData)); @@ -50,14 +50,14 @@ internal Task> Get(string propertyName, object } public async Task Get(Guid sagaId, SynchronizedStorageSession session, ContextBag context) - where TSagaData : IContainSagaData + where TSagaData : class, IContainSagaData { var result = await Get(sagaId, session).ConfigureAwait(false); return SetConcurrency(result, context); } internal Task> Get(Guid sagaId, SynchronizedStorageSession session) - where TSagaData : IContainSagaData + where TSagaData : class, IContainSagaData { var sagaInfo = sagaInfoCache.GetInfo(typeof(TSagaData)); return GetSagaData(session, sagaInfo.GetBySagaIdCommand, sagaInfo, @@ -70,7 +70,7 @@ internal Task> Get(Guid sagaId, SynchronizedSt } static async Task> GetSagaData(SynchronizedStorageSession session, string commandText, RuntimeSagaInfo sagaInfo, ParameterAppender appendParameters) - where TSagaData : IContainSagaData + where TSagaData : class, IContainSagaData { var sqlSession = session.SqlPersistenceSession(); @@ -85,7 +85,7 @@ static async Task> GetSagaData(SynchronizedSto { if (!await dataReader.ReadAsync().ConfigureAwait(false)) { - return new Concurrency(default(TSagaData), 0); + return default; } var id = await dataReader.GetGuidAsync(0).ConfigureAwait(false); @@ -129,12 +129,13 @@ static void ValidatePropertyName(string propertyName, RuntimeSagaInfo } static TSagaData SetConcurrency(Concurrency result, ContextBag context) - where TSagaData : IContainSagaData + where TSagaData : class, IContainSagaData { - if (!EqualityComparer.Default.Equals(result.Data, default(TSagaData))) + if (result.Data == null) { - context.Set("NServiceBus.Persistence.Sql.Concurrency", result.Version); + return null; } + context.Set("NServiceBus.Persistence.Sql.Concurrency", result.Version); return result.Data; } } \ No newline at end of file diff --git a/src/SqlPersistence/Saga/Serialization/RetrieveVersionSpecificJsonSettings.cs b/src/SqlPersistence/Saga/Serialization/RetrieveVersionSpecificJsonSettings.cs index d4d51233f..588293890 100644 --- a/src/SqlPersistence/Saga/Serialization/RetrieveVersionSpecificJsonSettings.cs +++ b/src/SqlPersistence/Saga/Serialization/RetrieveVersionSpecificJsonSettings.cs @@ -1,5 +1,4 @@ -#pragma warning disable CS0419 -namespace NServiceBus.Persistence.Sql +namespace NServiceBus.Persistence.Sql { using System; using Newtonsoft.Json; @@ -11,5 +10,4 @@ namespace NServiceBus.Persistence.Sql /// The saga data that the are being returned for. /// The assembly version of the saga data being serialized. public delegate JsonSerializerSettings RetrieveVersionSpecificJsonSettings(Type sagaDataType, Version sagaVersion); -} -#pragma warning restore CS0419 \ No newline at end of file +} \ No newline at end of file diff --git a/src/SqlPersistence/ScriptLocation.cs b/src/SqlPersistence/ScriptLocation.cs index 87d7456d7..ed6a9b9d6 100644 --- a/src/SqlPersistence/ScriptLocation.cs +++ b/src/SqlPersistence/ScriptLocation.cs @@ -14,7 +14,8 @@ public static string FindScriptDirectory(ReadOnlySettings settings) static string GetCurrentDirectory(ReadOnlySettings settings) { - if (settings.TryGet("SqlPersistence.ScriptDirectory", out string scriptDirectory)) + string scriptDirectory; + if (settings.TryGet("SqlPersistence.ScriptDirectory", out scriptDirectory)) { return scriptDirectory; } diff --git a/src/SqlPersistence/SqlPersistence.cs b/src/SqlPersistence/SqlPersistence.cs index e98b58c39..8d2180c6a 100644 --- a/src/SqlPersistence/SqlPersistence.cs +++ b/src/SqlPersistence/SqlPersistence.cs @@ -26,6 +26,7 @@ public SqlPersistence() { s.EnableFeatureByDefault(); EnableSession(s); + s.AddUnrecoverableException(typeof(SerializationException)); }); Supports(s => { diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index f5933135e..05c9dfb87 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -1,7 +1,7 @@  - net452 + net452;netstandard2.0 NServiceBus.Persistence.Sql NServiceBus.Persistence.Sql true @@ -11,11 +11,14 @@ - + - + + + + diff --git a/src/SqlPersistence/Subscription/Config/SqlPersistenceConfig.cs b/src/SqlPersistence/Subscription/Config/SqlPersistenceConfig.cs index 5d8f8b4f3..c1d10fa94 100644 --- a/src/SqlPersistence/Subscription/Config/SqlPersistenceConfig.cs +++ b/src/SqlPersistence/Subscription/Config/SqlPersistenceConfig.cs @@ -1,6 +1,6 @@ namespace NServiceBus { - using Configuration.AdvanceExtensibility; + using Configuration.AdvancedExtensibility; using Persistence.Sql; public static partial class SqlPersistenceConfig diff --git a/src/TestHelper/TestHelper.csproj b/src/TestHelper/TestHelper.csproj index 126f847d0..6984b11ea 100644 --- a/src/TestHelper/TestHelper.csproj +++ b/src/TestHelper/TestHelper.csproj @@ -1,7 +1,7 @@  - net452 + net452;netcoreapp2.0 true $(SolutionDir)Test.snk @@ -10,9 +10,13 @@ - + + + + + From b7fb28d471700c9895ddac17a77a2af0fe955a17 Mon Sep 17 00:00:00 2001 From: SzymonPobiega Date: Tue, 21 Nov 2017 10:40:18 +0100 Subject: [PATCH 02/32] Postponed the removal of obsolete APIs to 5 --- src/SqlPersistence/Config/SqlPersistenceConfig_Obsoletes.cs | 4 ++-- src/SqlPersistence/Config/SqlVariant.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/SqlPersistence/Config/SqlPersistenceConfig_Obsoletes.cs b/src/SqlPersistence/Config/SqlPersistenceConfig_Obsoletes.cs index 6f0acf3a6..c0ee6f689 100644 --- a/src/SqlPersistence/Config/SqlPersistenceConfig_Obsoletes.cs +++ b/src/SqlPersistence/Config/SqlPersistenceConfig_Obsoletes.cs @@ -9,7 +9,7 @@ public static partial class SqlPersistenceConfig { [ObsoleteEx( TreatAsErrorFromVersion = "3.0", - RemoveInVersion = "4.0", + RemoveInVersion = "5.0", ReplacementTypeOrMember = "persistence.SqlDialect()")] public static void SqlVariant(this PersistenceExtensions configuration, SqlVariant sqlVariant) { @@ -18,7 +18,7 @@ public static void SqlVariant(this PersistenceExtensions configu [ObsoleteEx( TreatAsErrorFromVersion = "3.0", - RemoveInVersion = "4.0", + RemoveInVersion = "5.0", ReplacementTypeOrMember = "persistence.SqlDialect().Schema(\"schema_name\")")] public static void Schema(this PersistenceExtensions configuration, string schema) { diff --git a/src/SqlPersistence/Config/SqlVariant.cs b/src/SqlPersistence/Config/SqlVariant.cs index b4a5ee5e5..b016257ca 100644 --- a/src/SqlPersistence/Config/SqlVariant.cs +++ b/src/SqlPersistence/Config/SqlVariant.cs @@ -4,7 +4,7 @@ namespace NServiceBus.Persistence.Sql { [ObsoleteEx( TreatAsErrorFromVersion = "3.0", - RemoveInVersion = "4.0", + RemoveInVersion = "5.0", ReplacementTypeOrMember = "persistence.SqlDialect()")] public enum SqlVariant { From 1fc441fa93f2b41549024d4d1e4416f1092d4c75 Mon Sep 17 00:00:00 2001 From: SzymonPobiega Date: Thu, 23 Nov 2017 08:47:08 +0100 Subject: [PATCH 03/32] Fix automatic merge --- src/Integration/Shared/Shared.csproj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Integration/Shared/Shared.csproj b/src/Integration/Shared/Shared.csproj index b547519fd..0a58e5dc8 100644 --- a/src/Integration/Shared/Shared.csproj +++ b/src/Integration/Shared/Shared.csproj @@ -6,9 +6,10 @@ - + + \ No newline at end of file From b6aac2220985c597024250bf369eae1d9fd610bb Mon Sep 17 00:00:00 2001 From: SzymonPobiega Date: Thu, 23 Nov 2017 08:55:55 +0100 Subject: [PATCH 04/32] Fix scriptbuilder --- .../NServiceBus.Persistence.Sql.MsBuild.targets | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets b/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets index d719c59f4..b993299be 100644 --- a/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets +++ b/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets @@ -1,7 +1,8 @@  - $(MSBuildThisFileDirectory)..\netclassic\NServiceBus.Persistence.Sql.ScriptBuilderTask.dll + $(MSBuildThisFileDirectory)..\netstandard\NServiceBus.Persistence.Sql.ScriptBuilderTask.dll + $(MSBuildThisFileDirectory)..\netclassic\NServiceBus.Persistence.Sql.ScriptBuilderTask.dll Date: Mon, 27 Nov 2017 09:12:29 +0100 Subject: [PATCH 05/32] Downgrade to NSB beta 8 --- src/SqlPersistence/SqlPersistence.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index 05c9dfb87..7e39a6581 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -11,7 +11,7 @@ - + From d5367fa6ac13d1b295a04d87ca6f79907061e933 Mon Sep 17 00:00:00 2001 From: SzymonPobiega Date: Wed, 13 Dec 2017 11:33:32 +0100 Subject: [PATCH 06/32] Fix the tests --- ...Correlation.ForScenario.Oracle.approved.txt | 11 +++++++---- ...ransitional.ForScenario.Oracle.approved.txt | 15 +++++++++------ .../Saga/Writers/OracleSagaScriptWriter.cs | 2 +- .../APIApprovals.Approve.approved.txt | 6 +++--- .../Saga/SagaPersisterTests.cs | 18 ++++++++++-------- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelation.ForScenario.Oracle.approved.txt b/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelation.ForScenario.Oracle.approved.txt index c38a971de..dddde7ffe 100644 --- a/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelation.ForScenario.Oracle.approved.txt +++ b/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelation.ForScenario.Oracle.approved.txt @@ -7,7 +7,10 @@ declare sqlStatement varchar2(500); dataType varchar2(30); n number(10); + currentSchema varchar2(500); begin + select sys_context('USERENV','CURRENT_SCHEMA') into currentSchema from dual; + /* CreateTable */ @@ -37,7 +40,7 @@ begin /* AddProperty CorrelationProperty */ -select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY'; +select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; if(n = 0) then sqlStatement := 'alter table "THESAGA" add ( CORR_CORRELATIONPROPERTY NVARCHAR2(200) )'; @@ -59,7 +62,7 @@ select data_type || end end into dataType from all_tab_columns -where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY'; +where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; if(dataType <> 'NVARCHAR2(200)') then @@ -83,7 +86,7 @@ end if; select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name like 'CORR_%' and - column_name <> 'CORR_CORRELATIONPROPERTY'; + column_name <> 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; if(n > 0) then @@ -91,7 +94,7 @@ then select 'alter table "THESAGA" drop column ' || column_name into sqlStatement from all_tab_columns where table_name = 'THESAGA' and column_name like 'CORR_%' and - column_name <> 'CORR_CORRELATIONPROPERTY'; + column_name <> 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; execute immediate sqlStatement; diff --git a/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelationAndTransitional.ForScenario.Oracle.approved.txt b/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelationAndTransitional.ForScenario.Oracle.approved.txt index ba9c4f5f9..7b4add646 100644 --- a/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelationAndTransitional.ForScenario.Oracle.approved.txt +++ b/src/ScriptBuilder.Tests/Saga/SagaScriptBuilderTest.CreateWithCorrelationAndTransitional.ForScenario.Oracle.approved.txt @@ -7,7 +7,10 @@ declare sqlStatement varchar2(500); dataType varchar2(30); n number(10); + currentSchema varchar2(500); begin + select sys_context('USERENV','CURRENT_SCHEMA') into currentSchema from dual; + /* CreateTable */ @@ -37,7 +40,7 @@ begin /* AddProperty CorrelationProperty */ -select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY'; +select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; if(n = 0) then sqlStatement := 'alter table "THESAGA" add ( CORR_CORRELATIONPROPERTY NVARCHAR2(200) )'; @@ -59,7 +62,7 @@ select data_type || end end into dataType from all_tab_columns -where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY'; +where table_name = 'THESAGA' and column_name = 'CORR_CORRELATIONPROPERTY' and owner = currentSchema; if(dataType <> 'NVARCHAR2(200)') then @@ -78,7 +81,7 @@ end if; /* AddProperty TransitionalProperty */ -select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_TRANSITIONALPROPERTY'; +select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name = 'CORR_TRANSITIONALPROPERTY' and owner = currentSchema; if(n = 0) then sqlStatement := 'alter table "THESAGA" add ( CORR_TRANSITIONALPROPERTY NVARCHAR2(200) )'; @@ -100,7 +103,7 @@ select data_type || end end into dataType from all_tab_columns -where table_name = 'THESAGA' and column_name = 'CORR_TRANSITIONALPROPERTY'; +where table_name = 'THESAGA' and column_name = 'CORR_TRANSITIONALPROPERTY' and owner = currentSchema; if(dataType <> 'NVARCHAR2(200)') then @@ -125,7 +128,7 @@ select count(*) into n from all_tab_columns where table_name = 'THESAGA' and column_name like 'CORR_%' and column_name <> 'CORR_CORRELATIONPROPERTY' and - column_name <> 'CORR_TRANSITIONALPROPERTY'; + column_name <> 'CORR_TRANSITIONALPROPERTY' and owner = currentSchema; if(n > 0) then @@ -134,7 +137,7 @@ then from all_tab_columns where table_name = 'THESAGA' and column_name like 'CORR_%' and column_name <> 'CORR_CORRELATIONPROPERTY' and - column_name <> 'CORR_TRANSITIONALPROPERTY'; + column_name <> 'CORR_TRANSITIONALPROPERTY' and owner = currentSchema; execute immediate sqlStatement; diff --git a/src/ScriptBuilder/Saga/Writers/OracleSagaScriptWriter.cs b/src/ScriptBuilder/Saga/Writers/OracleSagaScriptWriter.cs index a2883b76c..6555f24f1 100644 --- a/src/ScriptBuilder/Saga/Writers/OracleSagaScriptWriter.cs +++ b/src/ScriptBuilder/Saga/Writers/OracleSagaScriptWriter.cs @@ -34,7 +34,7 @@ public void Initialize() n number(10); currentSchema varchar2(500); begin -select sys_context('USERENV','CURRENT_SCHEMA') into currentSchema from dual; + select sys_context('USERENV','CURRENT_SCHEMA') into currentSchema from dual; "); } diff --git a/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt b/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt index 838fae35c..c7633102f 100644 --- a/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt +++ b/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt @@ -71,7 +71,7 @@ namespace NServiceBus.Persistence.Sql protected abstract void ConfigureMapping(NServiceBus.Persistence.Sql.IMessagePropertyMapper mapper); } [System.ObsoleteAttribute("Use `persistence.SqlDialect()` instead. Will be removed i" + - "n version 4.0.0.", true)] + "n version 5.0.0.", true)] public enum SqlVariant { MsSqlServer = 0, @@ -197,7 +197,7 @@ namespace NServiceBus public static NServiceBus.Persistence.Sql.SagaSettings SagaSettings(this NServiceBus.PersistenceExtensions configuration) { } [System.ObsoleteAttribute("Use `persistence.SqlDialect().Schema(\"schema_name\")` inst" + "ead. The member currently throws a NotImplementedException. Will be removed in v" + - "ersion 4.0.0.", true)] + "ersion 5.0.0.", true)] public static void Schema(this NServiceBus.PersistenceExtensions configuration, string schema) { } public static void Schema(this NServiceBus.SqlDialectSettings dialectSettings, string schema) { } public static void Schema(this NServiceBus.SqlDialectSettings dialectSettings, string schema) { } @@ -205,7 +205,7 @@ namespace NServiceBus public static NServiceBus.SqlDialectSettings SqlDialect(this NServiceBus.PersistenceExtensions configuration) where T : NServiceBus.SqlDialect, new () { } [System.ObsoleteAttribute("Use `persistence.SqlDialect()` instead. The member curren" + - "tly throws a NotImplementedException. Will be removed in version 4.0.0.", true)] + "tly throws a NotImplementedException. Will be removed in version 5.0.0.", true)] public static void SqlVariant(this NServiceBus.PersistenceExtensions configuration, NServiceBus.Persistence.Sql.SqlVariant sqlVariant) { } public static NServiceBus.Persistence.Sql.SubscriptionSettings SubscriptionSettings(this NServiceBus.PersistenceExtensions configuration) { } public static void TablePrefix(this NServiceBus.PersistenceExtensions configuration, string tablePrefix) { } diff --git a/src/SqlPersistence.Tests/Saga/SagaPersisterTests.cs b/src/SqlPersistence.Tests/Saga/SagaPersisterTests.cs index 566558c12..643c55cf1 100644 --- a/src/SqlPersistence.Tests/Saga/SagaPersisterTests.cs +++ b/src/SqlPersistence.Tests/Saga/SagaPersisterTests.cs @@ -1172,15 +1172,17 @@ public async Task UseConfiguredSchema() }; using (var connection = GetConnection()(null)) + using (var transaction = connection.BeginTransaction()) + using (var storageSession = new StorageSession(connection, transaction, false, null)) { - SagaWithNoCorrelation.SagaData result; - using (var transaction = connection.BeginTransaction()) - using (var storageSession = new StorageSession(connection, transaction, false, null)) - { - await defaultSchemaPersister.Save(sagaData, storageSession, null).ConfigureAwait(false); - result = (await schemaPersister.Get(id, storageSession).ConfigureAwait(false)).Data; - } - connection.ExecuteCommand(SagaScriptBuilder.BuildDropScript(definition, sqlDialect), endpointName, schema: null); + await defaultSchemaPersister.Save(sagaData, storageSession, null).ConfigureAwait(false); + } + + using (var connection = GetConnection()(schema)) + using (var transaction = connection.BeginTransaction()) + using (var storageSession = new StorageSession(connection, transaction, false, null)) + { + var result = (await schemaPersister.Get(id, storageSession).ConfigureAwait(false)).Data; Assert.IsNull(result); } } From a5b32831aa9a0a4d65c3972ae5ca020be0742355 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 8 Dec 2017 16:39:41 -0500 Subject: [PATCH 07/32] Update NServiceBus to 7.0.0-beta0012 --- src/SqlPersistence/SqlPersistence.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index 7e39a6581..171ee403b 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -11,7 +11,7 @@ - + From 96ec7f19c07cf2965043eed2984c89bd3ce2c15d Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 8 Dec 2017 16:46:42 -0500 Subject: [PATCH 08/32] Don't use range for System packages --- src/SqlPersistence/SqlPersistence.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index 171ee403b..3a314687c 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -18,7 +18,7 @@ - + From c3ccf84108ddc7a745b882a74012b22e7e4ff2b9 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 8 Dec 2017 17:00:56 -0500 Subject: [PATCH 09/32] Update other components to final beta versions --- src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj | 6 +++--- src/AcceptanceTestsHolder/packages.config | 2 +- src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj | 2 +- src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj | 2 +- src/OracleAcceptanceTests/OracleAcceptanceTests.csproj | 2 +- .../PostgreSqlAcceptanceTests.csproj | 2 +- src/SqlPersistence.Tests/SqlPersistence.Tests.csproj | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index 77ebe5bb5..7fbdabb99 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -1,6 +1,6 @@  - + Debug @@ -38,7 +38,7 @@ ..\packages\NServiceBus.7.0.0-beta0012\lib\net452\NServiceBus.Core.dll - ..\packages\NServiceBus.Transport.Msmq.1.0.0-beta0005\lib\net452\NServiceBus.Transport.Msmq.dll + ..\packages\NServiceBus.Transport.Msmq.1.0.0-beta0006\lib\net452\NServiceBus.Transport.Msmq.dll ..\packages\NUnit.3.7.1\lib\net45\nunit.framework.dll @@ -241,6 +241,6 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - + \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/packages.config b/src/AcceptanceTestsHolder/packages.config index d1bc0bd63..c2f45dd74 100644 --- a/src/AcceptanceTestsHolder/packages.config +++ b/src/AcceptanceTestsHolder/packages.config @@ -3,6 +3,6 @@ - + \ No newline at end of file diff --git a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj index 4e27e843e..0ca8f0dea 100644 --- a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj +++ b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index 4307749fb..4eb977c87 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj index 748d09bf0..d920f22a9 100644 --- a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj +++ b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj index 4e27e843e..0ca8f0dea 100644 --- a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj +++ b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj @@ -18,7 +18,7 @@ - + diff --git a/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj b/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj index 0e35ed9e9..fd8c7acfb 100644 --- a/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj +++ b/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj @@ -16,7 +16,7 @@ - + From feade6d9cbf9216d96e3a2e282575aa0cd0bf7d0 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 8 Dec 2017 17:37:40 -0500 Subject: [PATCH 10/32] Update GitVersion.yml --- GitVersion.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/GitVersion.yml b/GitVersion.yml index 87f434673..e191cd08d 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,7 +1,7 @@ assembly-versioning-scheme: Major -next-version: 3.0 +next-version: 4.0 branches: develop: tag: alpha release: - tag: beta \ No newline at end of file + tag: rc \ No newline at end of file From 1dac53bc55fc11e8627da12d5de15a850e08b8b0 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 8 Dec 2017 18:18:34 -0500 Subject: [PATCH 11/32] Fix inspection error --- src/SqlPersistence/ScriptLocation.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/SqlPersistence/ScriptLocation.cs b/src/SqlPersistence/ScriptLocation.cs index ed6a9b9d6..87d7456d7 100644 --- a/src/SqlPersistence/ScriptLocation.cs +++ b/src/SqlPersistence/ScriptLocation.cs @@ -14,8 +14,7 @@ public static string FindScriptDirectory(ReadOnlySettings settings) static string GetCurrentDirectory(ReadOnlySettings settings) { - string scriptDirectory; - if (settings.TryGet("SqlPersistence.ScriptDirectory", out scriptDirectory)) + if (settings.TryGet("SqlPersistence.ScriptDirectory", out string scriptDirectory)) { return scriptDirectory; } From 594ba896b000225dbfea30b2ebc5ea3ac1bac0b3 Mon Sep 17 00:00:00 2001 From: SzymonPobiega Date: Wed, 13 Dec 2017 12:06:07 +0100 Subject: [PATCH 12/32] Fixed inspections --- src/SqlPersistence/ScriptLocation.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/SqlPersistence/ScriptLocation.cs b/src/SqlPersistence/ScriptLocation.cs index ed6a9b9d6..87d7456d7 100644 --- a/src/SqlPersistence/ScriptLocation.cs +++ b/src/SqlPersistence/ScriptLocation.cs @@ -14,8 +14,7 @@ public static string FindScriptDirectory(ReadOnlySettings settings) static string GetCurrentDirectory(ReadOnlySettings settings) { - string scriptDirectory; - if (settings.TryGet("SqlPersistence.ScriptDirectory", out scriptDirectory)) + if (settings.TryGet("SqlPersistence.ScriptDirectory", out string scriptDirectory)) { return scriptDirectory; } From fd8f2c5e8d806f95e3c6b3084f11565ff40e69ad Mon Sep 17 00:00:00 2001 From: SzymonPobiega Date: Tue, 19 Dec 2017 11:31:14 +0100 Subject: [PATCH 13/32] Fix the subscription drop script --- src/ScriptBuilder/Writers/SubscriptionWriter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ScriptBuilder/Writers/SubscriptionWriter.cs b/src/ScriptBuilder/Writers/SubscriptionWriter.cs index aca78cc41..88e2f9aa9 100644 --- a/src/ScriptBuilder/Writers/SubscriptionWriter.cs +++ b/src/ScriptBuilder/Writers/SubscriptionWriter.cs @@ -15,7 +15,7 @@ public static void WriteSubscriptionScript(string scriptPath, BuildSqlDialect sq File.Delete(dropPath); using (var writer = File.CreateText(dropPath)) { - SubscriptionScriptBuilder.BuildCreateScript(writer, sqlDialect); + SubscriptionScriptBuilder.BuildDropScript(writer, sqlDialect); } } } \ No newline at end of file From 8d4f9ff312b382ee808350aee38b8eb93bd8140a Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 19 Dec 2017 13:16:00 +0100 Subject: [PATCH 14/32] use acceptance testing transport --- .../AcceptanceTestsHolder.csproj | 5 +- ...igureEndpointAcceptanceTestingTransport.cs | 69 +++++++ src/AcceptanceTestsHolder/packages.config | 6 +- .../ConfigureEndpointSqlServerTransport.cs | 173 ------------------ .../MsSqlAcceptanceTests.csproj | 2 +- .../TestSuiteConstraints.cs | 15 +- .../MySqlAcceptanceTests.csproj | 2 +- .../OracleAcceptanceTests.csproj | 2 +- .../PostgreSqlAcceptanceTests.csproj | 2 +- src/SqlPersistence/SqlPersistence.csproj | 2 +- 10 files changed, 83 insertions(+), 195 deletions(-) create mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointAcceptanceTestingTransport.cs delete mode 100644 src/MsSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index 7fbdabb99..b3a97fd8d 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -32,10 +32,10 @@ - ..\packages\NServiceBus.AcceptanceTesting.7.0.0-beta0012\lib\net452\NServiceBus.AcceptanceTesting.dll + ..\packages\NServiceBus.AcceptanceTesting.7.0.0-beta0013\lib\net452\NServiceBus.AcceptanceTesting.dll - ..\packages\NServiceBus.7.0.0-beta0012\lib\net452\NServiceBus.Core.dll + ..\packages\NServiceBus.7.0.0-beta0013\lib\net452\NServiceBus.Core.dll ..\packages\NServiceBus.Transport.Msmq.1.0.0-beta0006\lib\net452\NServiceBus.Transport.Msmq.dll @@ -64,6 +64,7 @@ + diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointAcceptanceTestingTransport.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointAcceptanceTestingTransport.cs new file mode 100644 index 000000000..6008c75c0 --- /dev/null +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointAcceptanceTestingTransport.cs @@ -0,0 +1,69 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using NServiceBus; +using NServiceBus.AcceptanceTesting.Support; +using NUnit.Framework; + +public class ConfigureEndpointAcceptanceTestingTransport : IConfigureEndpointTestExecution +{ + public ConfigureEndpointAcceptanceTestingTransport(bool useNativePubSub, bool useNativeDelayedDelivery) + { + this.useNativePubSub = useNativePubSub; + this.useNativeDelayedDelivery = useNativeDelayedDelivery; + } + + 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) + { + var testRunId = TestContext.CurrentContext.Test.ID; + + string tempDir; + + if (Environment.OSVersion.Platform == PlatformID.Win32NT) + { + //can't use bin dir since that will be too long on the build agents + tempDir = @"c:\temp"; + } + else + { + tempDir = Path.GetTempPath(); + } + + storageDir = Path.Combine(tempDir, testRunId); + + var transportConfig = configuration.UseTransport() + .StorageDirectory(storageDir) + .UseNativePubSub(useNativePubSub) + .UseNativeDelayedDelivery(useNativeDelayedDelivery); + + if (!useNativePubSub) + { + //apply publisher registrations required for message driven pub/sub + var routingConfig = transportConfig.Routing(); + foreach (var publisherMetadataPublisher in publisherMetadata.Publishers) + { + foreach (var @event in publisherMetadataPublisher.Events) + { + routingConfig.RegisterPublisher(@event, publisherMetadataPublisher.PublisherName); + } + } + } + + return Task.FromResult(0); + } + + readonly bool useNativePubSub; + readonly bool useNativeDelayedDelivery; + + string storageDir; +} \ No newline at end of file diff --git a/src/AcceptanceTestsHolder/packages.config b/src/AcceptanceTestsHolder/packages.config index c2f45dd74..061a4b6e8 100644 --- a/src/AcceptanceTestsHolder/packages.config +++ b/src/AcceptanceTestsHolder/packages.config @@ -1,8 +1,8 @@  - - - + + + \ No newline at end of file diff --git a/src/MsSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs b/src/MsSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs deleted file mode 100644 index d613d561f..000000000 --- a/src/MsSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Data.SqlClient; -using System.Linq; -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.AcceptanceTesting.Support; -using NServiceBus.Configuration.AdvancedExtensibility; -using NServiceBus.Transport; -using NServiceBus.Transport.SQLServer; - -public class ConfigureEndpointSqlServerTransport : IConfigureEndpointTestExecution -{ - public Task Configure(string endpointName, EndpointConfiguration configuration, RunSettings settings, PublisherMetadata publisherMetadata) - { - queueBindings = configuration.GetSettings().Get(); - var transport = configuration.UseTransport(); - transport.UseCustomSqlConnectionFactory(async () => - { - var connection = MsSqlConnectionBuilder.Build(); - await connection.OpenAsync().ConfigureAwait(false); - return connection; - }); - - transport.Transactions(TransportTransactionMode.SendsAtomicWithReceive); - - var routingConfig = transport.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() - { - using (var conn = MsSqlConnectionBuilder.Build()) - { - conn.Open(); - - var queueAddresses = queueBindings.ReceivingAddresses.Select(QueueAddress.Parse).ToList(); - foreach (var address in queueAddresses) - { - TryDeleteTable(conn, address); - TryDeleteTable(conn, new QueueAddress(address.Table + ".Delayed", address.Schema, address.Catalog)); - } - } - return Task.FromResult(0); - } - - static void TryDeleteTable(SqlConnection conn, QueueAddress address) - { - try - { - using (var comm = conn.CreateCommand()) - { - comm.CommandText = $"IF OBJECT_ID('{address.QualifiedTableName}', 'U') IS NOT NULL DROP TABLE {address.QualifiedTableName}"; - comm.ExecuteNonQuery(); - } - } - catch (Exception exception) when (exception.Message.Contains("it does not exist or you do not have permission")) - { - } - } - - QueueBindings queueBindings; - - class QueueAddress - { - public QueueAddress(string table, string schemaName, string catalogName) - { - Table = table; - Catalog = SafeUnquote(catalogName); - Schema = SafeUnquote(schemaName); - } - - public string Catalog { get; } - public string Table { get; } - public string Schema { get; } - - public static QueueAddress Parse(string address) - { - var firstAtIndex = address.IndexOf("@", StringComparison.Ordinal); - - if (firstAtIndex == -1) - { - return new QueueAddress(address, null, null); - } - - var tableName = address.Substring(0, firstAtIndex); - address = firstAtIndex + 1 < address.Length ? address.Substring(firstAtIndex + 1) : string.Empty; - - address = ExtractNextPart(address, out var schemaName); - - string catalogName = null; - - if (address != string.Empty) - { - ExtractNextPart(address, out catalogName); - } - return new QueueAddress(tableName, schemaName, catalogName); - } - - public string QualifiedTableName => $"{Quote(Catalog)}.{Quote(Schema)}.{Quote(Table)}"; - - static string ExtractNextPart(string address, out string part) - { - var noRightBrackets = 0; - var index = 1; - - while (true) - { - if (index >= address.Length) - { - part = address; - return string.Empty; - } - - if (address[index] == '@' && (address[0] != '[' || noRightBrackets % 2 == 1)) - { - part = address.Substring(0, index); - return index + 1 < address.Length ? address.Substring(index + 1) : string.Empty; - } - - if (address[index] == ']') - { - noRightBrackets++; - } - - index++; - } - } - - static string Quote(string name) - { - if (name == null) - { - return null; - } - return prefix + name.Replace(suffix, suffix + suffix) + suffix; - } - - static string SafeUnquote(string name) - { - var result = Unquote(name); - return string.IsNullOrWhiteSpace(result) - ? null - : result; - } - - const string prefix = "["; - const string suffix = "]"; - static string Unquote(string quotedString) - { - if (quotedString == null) - { - return null; - } - - if (!quotedString.StartsWith(prefix) || !quotedString.EndsWith(suffix)) - { - return quotedString; - } - - return quotedString - .Substring(prefix.Length, quotedString.Length - prefix.Length - suffix.Length).Replace(suffix + suffix, suffix); - } - } -} \ No newline at end of file diff --git a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj index 0ca8f0dea..616379f09 100644 --- a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj +++ b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs b/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs index 1a26809ed..c7369e2db 100644 --- a/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs +++ b/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs @@ -4,23 +4,14 @@ 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; public bool SupportsOutbox => true; - public IConfigureEndpointTestExecution CreateTransportConfiguration() - { - return new ConfigureEndpointSqlServerTransport(); - } - public IConfigureEndpointTestExecution CreatePersistenceConfiguration() - { - return new ConfigureEndpointSqlPersistence(); - } + public IConfigureEndpointTestExecution CreateTransportConfiguration() => new ConfigureEndpointAcceptanceTestingTransport(SupportsNativePubSub, SupportsNativeDeferral); + + public IConfigureEndpointTestExecution CreatePersistenceConfiguration() => new ConfigureEndpointSqlPersistence(); } } \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index 4eb977c87..4ba4422c2 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj index d920f22a9..feb8fc7c5 100644 --- a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj +++ b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj index 0ca8f0dea..616379f09 100644 --- a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj +++ b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index 3a314687c..718740097 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -11,7 +11,7 @@ - + From 93f9f1dfdbec497a6c51fc815bc77d2a0323a69f Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 19 Dec 2017 13:45:34 +0100 Subject: [PATCH 15/32] remove transcationscope test --- ...g_new_transaction_scope_in_the_pipeline.cs | 105 ------------------ 1 file changed, 105 deletions(-) delete mode 100644 src/MsSqlAcceptanceTests/When_creating_new_transaction_scope_in_the_pipeline.cs diff --git a/src/MsSqlAcceptanceTests/When_creating_new_transaction_scope_in_the_pipeline.cs b/src/MsSqlAcceptanceTests/When_creating_new_transaction_scope_in_the_pipeline.cs deleted file mode 100644 index 0441d84a6..000000000 --- a/src/MsSqlAcceptanceTests/When_creating_new_transaction_scope_in_the_pipeline.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using System.Transactions; -using NServiceBus; -using NServiceBus.AcceptanceTesting; -using NServiceBus.AcceptanceTests; -using NServiceBus.AcceptanceTests.EndpointTemplates; -using NServiceBus.Persistence.Sql; -using NServiceBus.Pipeline; -using NUnit.Framework; - -public class When_creating_new_transaction_scope_in_the_pipeline : NServiceBusAcceptanceTest -{ - [Test] - public async Task Should_fail_when_creating_synchronized_storage_session() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(async session => - { - var id = Guid.NewGuid(); - await session.SendLocal(new StartSagaMessage - { - SomeId = id - }).ConfigureAwait(false); - }).DoNotFailOnErrorMessages()) - .Done(c => c.FailedMessages.Any()) - .Run().ConfigureAwait(false); - - var exceptionMessage = context.FailedMessages.First().Value.First().Exception.Message; - StringAssert.StartsWith("A TransactionScope has been opened in the current context overriding the one created by the transport.", exceptionMessage); - } - - public class Context : ScenarioContext - { - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => - { - var transport = c.UseTransport(); - transport.Transactions(TransportTransactionMode.TransactionScope); - var pipeline = c.Pipeline; - pipeline.Register(new TransactionScopeBehavior(), "Creates a new transaction scope"); - pipeline.Register(new SimulateFailureBehavior(), "Simulates failure before committing transport transaction"); - }); - } - - class TransactionScopeBehavior : Behavior - { - public override async Task Invoke(IIncomingLogicalMessageContext context, Func next) - { - using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, TransactionScopeAsyncFlowOption.Enabled)) - { - await next().ConfigureAwait(false); - scope.Complete(); - } - } - } - - class SimulateFailureBehavior : Behavior - { - public override async Task Invoke(IIncomingPhysicalMessageContext context, Func next) - { - await next().ConfigureAwait(false); - throw new SimulatedException(); - } - } - - public class TestSaga12 : SqlSaga, IAmStartedByMessages - { - protected override string CorrelationPropertyName => nameof(TestSagaData12.SomeId); - - public Context TestContext { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - } - - public class TestSagaData12 : ContainSagaData - { - public virtual Guid SomeId { get; set; } - } - } - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - - public bool SecondMessage { get; set; } - } -} \ No newline at end of file From b4bf69bf5d0eac8d08016fad417a616e2a50a934 Mon Sep 17 00:00:00 2001 From: Tim Date: Tue, 19 Dec 2017 13:50:46 +0100 Subject: [PATCH 16/32] use acceptance testing transport instead of msmq --- .../AcceptanceTestsHolder.csproj | 11 --- .../ConfigureEndpointMsmqTransport.cs | 82 ------------------- src/AcceptanceTestsHolder/packages.config | 1 - .../TestSuiteConstraints.cs | 10 ++- .../TestSuiteConstraints.cs | 3 +- .../TestSuiteConstraints.cs | 5 +- 6 files changed, 13 insertions(+), 99 deletions(-) delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointMsmqTransport.cs diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index b3a97fd8d..1e7a71d9a 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -1,6 +1,5 @@  - Debug @@ -37,9 +36,6 @@ ..\packages\NServiceBus.7.0.0-beta0013\lib\net452\NServiceBus.Core.dll - - ..\packages\NServiceBus.Transport.Msmq.1.0.0-beta0006\lib\net452\NServiceBus.Transport.Msmq.dll - ..\packages\NUnit.3.7.1\lib\net45\nunit.framework.dll @@ -68,7 +64,6 @@ - @@ -238,10 +233,4 @@ - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - \ No newline at end of file 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 705c27d6b..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.AdvancedExtensibility; -using NServiceBus.Transport; - -public class ConfigureEndpointMsmqTransport : IConfigureEndpointTestExecution -{ - - public Task Configure(string endpointName, EndpointConfiguration configuration, RunSettings settings, PublisherMetadata publisherMetadata) - { - queueBindings = configuration.GetSettings().Get(); - var transportConfig = configuration.UseTransport(); - - transportConfig.DisableConnectionCachingForSends(); - -#if (MySQL) - transportConfig.Transactions(TransportTransactionMode.SendsAtomicWithReceive); -#endif - - 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/packages.config b/src/AcceptanceTestsHolder/packages.config index 061a4b6e8..3d8322c04 100644 --- a/src/AcceptanceTestsHolder/packages.config +++ b/src/AcceptanceTestsHolder/packages.config @@ -3,6 +3,5 @@ - \ No newline at end of file diff --git a/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs b/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs index c7369e2db..dfeb84b94 100644 --- a/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs +++ b/src/MsSqlAcceptanceTests/TestSuiteConstraints.cs @@ -10,8 +10,14 @@ public partial class TestSuiteConstraints public bool SupportsNativeDeferral => false; public bool SupportsOutbox => true; - public IConfigureEndpointTestExecution CreateTransportConfiguration() => new ConfigureEndpointAcceptanceTestingTransport(SupportsNativePubSub, SupportsNativeDeferral); + public IConfigureEndpointTestExecution CreateTransportConfiguration() + { + return new ConfigureEndpointAcceptanceTestingTransport(SupportsNativePubSub, SupportsNativeDeferral); + } - public IConfigureEndpointTestExecution CreatePersistenceConfiguration() => new ConfigureEndpointSqlPersistence(); + public IConfigureEndpointTestExecution CreatePersistenceConfiguration() + { + return new ConfigureEndpointSqlPersistence(); + } } } \ No newline at end of file diff --git a/src/MySqlAcceptanceTests/TestSuiteConstraints.cs b/src/MySqlAcceptanceTests/TestSuiteConstraints.cs index 9e9df064a..dfeb84b94 100644 --- a/src/MySqlAcceptanceTests/TestSuiteConstraints.cs +++ b/src/MySqlAcceptanceTests/TestSuiteConstraints.cs @@ -9,9 +9,10 @@ public partial class TestSuiteConstraints public bool SupportsNativePubSub => false; public bool SupportsNativeDeferral => false; public bool SupportsOutbox => true; + public IConfigureEndpointTestExecution CreateTransportConfiguration() { - return new ConfigureEndpointMsmqTransport(); + return new ConfigureEndpointAcceptanceTestingTransport(SupportsNativePubSub, SupportsNativeDeferral); } public IConfigureEndpointTestExecution CreatePersistenceConfiguration() diff --git a/src/OracleAcceptanceTests/TestSuiteConstraints.cs b/src/OracleAcceptanceTests/TestSuiteConstraints.cs index adac23f28..dfeb84b94 100644 --- a/src/OracleAcceptanceTests/TestSuiteConstraints.cs +++ b/src/OracleAcceptanceTests/TestSuiteConstraints.cs @@ -4,14 +4,15 @@ public partial class TestSuiteConstraints { - public bool SupportsDtc => true; + public bool SupportsDtc => false; public bool SupportsCrossQueueTransactions => true; public bool SupportsNativePubSub => false; public bool SupportsNativeDeferral => false; public bool SupportsOutbox => true; + public IConfigureEndpointTestExecution CreateTransportConfiguration() { - return new ConfigureEndpointMsmqTransport(); + return new ConfigureEndpointAcceptanceTestingTransport(SupportsNativePubSub, SupportsNativeDeferral); } public IConfigureEndpointTestExecution CreatePersistenceConfiguration() From e9ac1110cd785746f0bd45739bfff9fde0504ed3 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 20 Dec 2017 10:59:47 +0100 Subject: [PATCH 17/32] switch all acceptance tests to use the acceptance testing transport --- .../MsSqlAcceptanceTests.csproj | 3 +- .../MySqlAcceptanceTests.csproj | 1 - .../OracleAcceptanceTests.csproj | 1 - .../ConfigureEndpointSqlServerTransport.cs | 173 ------------------ .../PostgreSqlAcceptanceTests.csproj | 3 +- .../TestSuiteConstraints.cs | 6 +- ...g_new_transaction_scope_in_the_pipeline.cs | 105 ----------- 7 files changed, 3 insertions(+), 289 deletions(-) delete mode 100644 src/PostgreSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs delete mode 100644 src/PostgreSqlAcceptanceTests/When_creating_new_transaction_scope_in_the_pipeline.cs diff --git a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj index 616379f09..491c286ce 100644 --- a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj +++ b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj @@ -18,13 +18,12 @@ - - + diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index 4ba4422c2..e3a12bd52 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -18,7 +18,6 @@ - diff --git a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj index feb8fc7c5..f4f046673 100644 --- a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj +++ b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj @@ -17,7 +17,6 @@ - diff --git a/src/PostgreSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs b/src/PostgreSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs deleted file mode 100644 index d613d561f..000000000 --- a/src/PostgreSqlAcceptanceTests/ConfigureEndpointSqlServerTransport.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Data.SqlClient; -using System.Linq; -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.AcceptanceTesting.Support; -using NServiceBus.Configuration.AdvancedExtensibility; -using NServiceBus.Transport; -using NServiceBus.Transport.SQLServer; - -public class ConfigureEndpointSqlServerTransport : IConfigureEndpointTestExecution -{ - public Task Configure(string endpointName, EndpointConfiguration configuration, RunSettings settings, PublisherMetadata publisherMetadata) - { - queueBindings = configuration.GetSettings().Get(); - var transport = configuration.UseTransport(); - transport.UseCustomSqlConnectionFactory(async () => - { - var connection = MsSqlConnectionBuilder.Build(); - await connection.OpenAsync().ConfigureAwait(false); - return connection; - }); - - transport.Transactions(TransportTransactionMode.SendsAtomicWithReceive); - - var routingConfig = transport.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() - { - using (var conn = MsSqlConnectionBuilder.Build()) - { - conn.Open(); - - var queueAddresses = queueBindings.ReceivingAddresses.Select(QueueAddress.Parse).ToList(); - foreach (var address in queueAddresses) - { - TryDeleteTable(conn, address); - TryDeleteTable(conn, new QueueAddress(address.Table + ".Delayed", address.Schema, address.Catalog)); - } - } - return Task.FromResult(0); - } - - static void TryDeleteTable(SqlConnection conn, QueueAddress address) - { - try - { - using (var comm = conn.CreateCommand()) - { - comm.CommandText = $"IF OBJECT_ID('{address.QualifiedTableName}', 'U') IS NOT NULL DROP TABLE {address.QualifiedTableName}"; - comm.ExecuteNonQuery(); - } - } - catch (Exception exception) when (exception.Message.Contains("it does not exist or you do not have permission")) - { - } - } - - QueueBindings queueBindings; - - class QueueAddress - { - public QueueAddress(string table, string schemaName, string catalogName) - { - Table = table; - Catalog = SafeUnquote(catalogName); - Schema = SafeUnquote(schemaName); - } - - public string Catalog { get; } - public string Table { get; } - public string Schema { get; } - - public static QueueAddress Parse(string address) - { - var firstAtIndex = address.IndexOf("@", StringComparison.Ordinal); - - if (firstAtIndex == -1) - { - return new QueueAddress(address, null, null); - } - - var tableName = address.Substring(0, firstAtIndex); - address = firstAtIndex + 1 < address.Length ? address.Substring(firstAtIndex + 1) : string.Empty; - - address = ExtractNextPart(address, out var schemaName); - - string catalogName = null; - - if (address != string.Empty) - { - ExtractNextPart(address, out catalogName); - } - return new QueueAddress(tableName, schemaName, catalogName); - } - - public string QualifiedTableName => $"{Quote(Catalog)}.{Quote(Schema)}.{Quote(Table)}"; - - static string ExtractNextPart(string address, out string part) - { - var noRightBrackets = 0; - var index = 1; - - while (true) - { - if (index >= address.Length) - { - part = address; - return string.Empty; - } - - if (address[index] == '@' && (address[0] != '[' || noRightBrackets % 2 == 1)) - { - part = address.Substring(0, index); - return index + 1 < address.Length ? address.Substring(index + 1) : string.Empty; - } - - if (address[index] == ']') - { - noRightBrackets++; - } - - index++; - } - } - - static string Quote(string name) - { - if (name == null) - { - return null; - } - return prefix + name.Replace(suffix, suffix + suffix) + suffix; - } - - static string SafeUnquote(string name) - { - var result = Unquote(name); - return string.IsNullOrWhiteSpace(result) - ? null - : result; - } - - const string prefix = "["; - const string suffix = "]"; - static string Unquote(string quotedString) - { - if (quotedString == null) - { - return null; - } - - if (!quotedString.StartsWith(prefix) || !quotedString.EndsWith(suffix)) - { - return quotedString; - } - - return quotedString - .Substring(prefix.Length, quotedString.Length - prefix.Length - suffix.Length).Replace(suffix + suffix, suffix); - } - } -} \ No newline at end of file diff --git a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj index 616379f09..491c286ce 100644 --- a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj +++ b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj @@ -18,13 +18,12 @@ - - + diff --git a/src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs b/src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs index 1a26809ed..1c7211ad7 100644 --- a/src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs +++ b/src/PostgreSqlAcceptanceTests/TestSuiteConstraints.cs @@ -4,18 +4,14 @@ 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; public bool SupportsOutbox => true; public IConfigureEndpointTestExecution CreateTransportConfiguration() { - return new ConfigureEndpointSqlServerTransport(); + return new ConfigureEndpointAcceptanceTestingTransport(SupportsNativePubSub, SupportsNativeDeferral); } public IConfigureEndpointTestExecution CreatePersistenceConfiguration() diff --git a/src/PostgreSqlAcceptanceTests/When_creating_new_transaction_scope_in_the_pipeline.cs b/src/PostgreSqlAcceptanceTests/When_creating_new_transaction_scope_in_the_pipeline.cs deleted file mode 100644 index 0441d84a6..000000000 --- a/src/PostgreSqlAcceptanceTests/When_creating_new_transaction_scope_in_the_pipeline.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Linq; -using System.Threading.Tasks; -using System.Transactions; -using NServiceBus; -using NServiceBus.AcceptanceTesting; -using NServiceBus.AcceptanceTests; -using NServiceBus.AcceptanceTests.EndpointTemplates; -using NServiceBus.Persistence.Sql; -using NServiceBus.Pipeline; -using NUnit.Framework; - -public class When_creating_new_transaction_scope_in_the_pipeline : NServiceBusAcceptanceTest -{ - [Test] - public async Task Should_fail_when_creating_synchronized_storage_session() - { - Requires.DtcSupport(); - - var context = await Scenario.Define() - .WithEndpoint(b => b - .When(async session => - { - var id = Guid.NewGuid(); - await session.SendLocal(new StartSagaMessage - { - SomeId = id - }).ConfigureAwait(false); - }).DoNotFailOnErrorMessages()) - .Done(c => c.FailedMessages.Any()) - .Run().ConfigureAwait(false); - - var exceptionMessage = context.FailedMessages.First().Value.First().Exception.Message; - StringAssert.StartsWith("A TransactionScope has been opened in the current context overriding the one created by the transport.", exceptionMessage); - } - - public class Context : ScenarioContext - { - } - - public class Endpoint : EndpointConfigurationBuilder - { - public Endpoint() - { - EndpointSetup(c => - { - var transport = c.UseTransport(); - transport.Transactions(TransportTransactionMode.TransactionScope); - var pipeline = c.Pipeline; - pipeline.Register(new TransactionScopeBehavior(), "Creates a new transaction scope"); - pipeline.Register(new SimulateFailureBehavior(), "Simulates failure before committing transport transaction"); - }); - } - - class TransactionScopeBehavior : Behavior - { - public override async Task Invoke(IIncomingLogicalMessageContext context, Func next) - { - using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew, TransactionScopeAsyncFlowOption.Enabled)) - { - await next().ConfigureAwait(false); - scope.Complete(); - } - } - } - - class SimulateFailureBehavior : Behavior - { - public override async Task Invoke(IIncomingPhysicalMessageContext context, Func next) - { - await next().ConfigureAwait(false); - throw new SimulatedException(); - } - } - - public class TestSaga12 : SqlSaga, IAmStartedByMessages - { - protected override string CorrelationPropertyName => nameof(TestSagaData12.SomeId); - - public Context TestContext { get; set; } - - public Task Handle(StartSagaMessage message, IMessageHandlerContext context) - { - return Task.FromResult(0); - } - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.SomeId); - } - } - - public class TestSagaData12 : ContainSagaData - { - public virtual Guid SomeId { get; set; } - } - } - - public class StartSagaMessage : ICommand - { - public Guid SomeId { get; set; } - - public bool SecondMessage { get; set; } - } -} \ No newline at end of file From 8475192083c7ca6de4f2fe2a92b56030eb1dad79 Mon Sep 17 00:00:00 2001 From: Tim Date: Wed, 20 Dec 2017 11:14:37 +0100 Subject: [PATCH 18/32] keep the main package at beta12 and keep the dependency range --- src/SqlPersistence/SqlPersistence.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index 718740097..3a314687c 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -11,7 +11,7 @@ - + From 3aae0a5ca8d5500350cee94361771f4e476cf78a Mon Sep 17 00:00:00 2001 From: SzymonPobiega Date: Thu, 21 Dec 2017 12:05:39 +0100 Subject: [PATCH 19/32] Add unit-level tests for adapting transport connection --- .../AdaptTransportConnectionTests.cs | 55 +++++++++++++++++++ .../MySqlAdaptTransportConnectionTests.cs | 24 ++++++++ .../OracleAdaptTransportConnectionTests.cs | 21 +++++++ ...PostgreSqlAdaptTransportConnectionTests.cs | 21 +++++++ .../SqlServerAdaptTransportConnectionTests.cs | 41 ++++++++++++++ 5 files changed, 162 insertions(+) create mode 100644 src/SqlPersistence.Tests/SynchronizedStorage/AdaptTransportConnectionTests.cs create mode 100644 src/SqlPersistence.Tests/SynchronizedStorage/MySqlAdaptTransportConnectionTests.cs create mode 100644 src/SqlPersistence.Tests/SynchronizedStorage/OracleAdaptTransportConnectionTests.cs create mode 100644 src/SqlPersistence.Tests/SynchronizedStorage/PostgreSqlAdaptTransportConnectionTests.cs create mode 100644 src/SqlPersistence.Tests/SynchronizedStorage/SqlServerAdaptTransportConnectionTests.cs diff --git a/src/SqlPersistence.Tests/SynchronizedStorage/AdaptTransportConnectionTests.cs b/src/SqlPersistence.Tests/SynchronizedStorage/AdaptTransportConnectionTests.cs new file mode 100644 index 000000000..899d1b0e5 --- /dev/null +++ b/src/SqlPersistence.Tests/SynchronizedStorage/AdaptTransportConnectionTests.cs @@ -0,0 +1,55 @@ +using System; +using System.Data.Common; +using System.Threading.Tasks; +using System.Transactions; +using NServiceBus.Extensibility; +using NServiceBus.Persistence.Sql.ScriptBuilder; +using NServiceBus.Transport; +using NUnit.Framework; + +abstract class AdaptTransportConnectionTests +{ + protected BuildSqlDialect sqlDialect; + protected Func dbConnection; + + protected abstract Func GetConnection(); + + protected virtual bool SupportsDistributedTransactions => true; + + protected AdaptTransportConnectionTests(BuildSqlDialect sqlDialect) + { + this.sqlDialect = sqlDialect; + dbConnection = () => GetConnection()(null); + } + + [Test] + public void It_throws_if_non_transport_transaction_scope_exists() + { + if (!SupportsDistributedTransactions) + { + Assert.Ignore(); + } + using (new TransactionScope()) + { + var transportTransaction = new TransportTransaction(); + transportTransaction.Set(Transaction.Current); + using (new TransactionScope(TransactionScopeOption.RequiresNew, TransactionScopeAsyncFlowOption.Enabled)) + { + var ex = Assert.ThrowsAsync(() => sqlDialect.Convert().TryAdaptTransportConnection(transportTransaction, new ContextBag(), dbConnection, + (conn, tx, arg3) => new StorageSession(conn, tx, false, null))); + + StringAssert.StartsWith("A TransactionScope has been opened in the current context overriding the one created by the transport.", ex.Message); + } + } + } + + [Test] + public async Task It_returns_null_if_there_is_no_transaction_scope() + { + var transportTransaction = new TransportTransaction(); + var result = await sqlDialect.Convert().TryAdaptTransportConnection(transportTransaction, new ContextBag(), dbConnection, + (conn, tx, arg3) => new StorageSession(conn, tx, false, null)); + + Assert.IsNull(result); + } +} \ No newline at end of file diff --git a/src/SqlPersistence.Tests/SynchronizedStorage/MySqlAdaptTransportConnectionTests.cs b/src/SqlPersistence.Tests/SynchronizedStorage/MySqlAdaptTransportConnectionTests.cs new file mode 100644 index 000000000..f5b237938 --- /dev/null +++ b/src/SqlPersistence.Tests/SynchronizedStorage/MySqlAdaptTransportConnectionTests.cs @@ -0,0 +1,24 @@ +#if NET452 +using System; +using System.Data.Common; +using NServiceBus.Persistence.Sql.ScriptBuilder; + +class MySqlAdaptTransportConnectionTests : AdaptTransportConnectionTests +{ + public MySqlAdaptTransportConnectionTests() : base(BuildSqlDialect.MySql) + { + } + + protected override bool SupportsDistributedTransactions => false; + + protected override Func GetConnection() + { + return x => + { + var connection = MySqlConnectionBuilder.Build(); + connection.Open(); + return connection; + }; + } +} +#endif \ No newline at end of file diff --git a/src/SqlPersistence.Tests/SynchronizedStorage/OracleAdaptTransportConnectionTests.cs b/src/SqlPersistence.Tests/SynchronizedStorage/OracleAdaptTransportConnectionTests.cs new file mode 100644 index 000000000..9dd242599 --- /dev/null +++ b/src/SqlPersistence.Tests/SynchronizedStorage/OracleAdaptTransportConnectionTests.cs @@ -0,0 +1,21 @@ +#if NET452 +using System; +using System.Data.Common; +using NServiceBus.Persistence.Sql.ScriptBuilder; + +class OracleAdaptTransportConnectionTests : AdaptTransportConnectionTests +{ + public OracleAdaptTransportConnectionTests() : base(BuildSqlDialect.Oracle) + { + } + + protected override Func GetConnection() + { + return x => + { + var connection = OracleConnectionBuilder.Build(); + return connection; + }; + } +} +#endif \ No newline at end of file diff --git a/src/SqlPersistence.Tests/SynchronizedStorage/PostgreSqlAdaptTransportConnectionTests.cs b/src/SqlPersistence.Tests/SynchronizedStorage/PostgreSqlAdaptTransportConnectionTests.cs new file mode 100644 index 000000000..e3281f374 --- /dev/null +++ b/src/SqlPersistence.Tests/SynchronizedStorage/PostgreSqlAdaptTransportConnectionTests.cs @@ -0,0 +1,21 @@ +#if NET452 +using System; +using System.Data.Common; +using NServiceBus.Persistence.Sql.ScriptBuilder; + +class PostgreSqlAdaptTransportConnectionTests : AdaptTransportConnectionTests +{ + public PostgreSqlAdaptTransportConnectionTests() : base(BuildSqlDialect.PostgreSql) + { + } + + protected override Func GetConnection() + { + return x => + { + var connection = PostgreSqlConnectionBuilder.Build(); + return connection; + }; + } +} +#endif \ No newline at end of file diff --git a/src/SqlPersistence.Tests/SynchronizedStorage/SqlServerAdaptTransportConnectionTests.cs b/src/SqlPersistence.Tests/SynchronizedStorage/SqlServerAdaptTransportConnectionTests.cs new file mode 100644 index 000000000..f07a5c477 --- /dev/null +++ b/src/SqlPersistence.Tests/SynchronizedStorage/SqlServerAdaptTransportConnectionTests.cs @@ -0,0 +1,41 @@ +using System; +using System.Data.Common; +using System.Threading.Tasks; +using NServiceBus.Extensibility; +using NServiceBus.Persistence.Sql.ScriptBuilder; +using NServiceBus.Transport; +using NUnit.Framework; + +class SqlServerAdaptTransportConnectionTests : AdaptTransportConnectionTests +{ + public SqlServerAdaptTransportConnectionTests() : base(BuildSqlDialect.MsSqlServer) + { + } + + protected override Func GetConnection() + { + return x => + { + var connection = MsSqlConnectionBuilder.Build(); + connection.Open(); + return connection; + }; + } + + [Test] + public async Task Adapts_transport_connection() + { + var transportTransaction = new TransportTransaction(); + + var transportConnection = dbConnection(); + var transaction = transportConnection.BeginTransaction(); + + transportTransaction.Set("System.Data.SqlClient.SqlConnection", transportConnection); + transportTransaction.Set("System.Data.SqlClient.SqlTransaction", transaction); + + var result = await sqlDialect.Convert().TryAdaptTransportConnection(transportTransaction, new ContextBag(), () => throw new Exception("Should not be called"), + (conn, tx, arg3) => new StorageSession(conn, tx, false, null)); + + Assert.IsNotNull(result); + } +} \ No newline at end of file From 392c159422716cc5eedb60114275f1e8626e414e Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Mon, 15 Jan 2018 17:47:33 +1100 Subject: [PATCH 20/32] make script execution a public api --- .../APIApprovals.Approve.approved.txt | 4 + src/SqlPersistence/Installer.cs | 123 ------------------ src/SqlPersistence/NeedToInstallSomething.cs | 35 +++++ src/SqlPersistence/ScriptRunner.cs | 119 +++++++++++++++++ 4 files changed, 158 insertions(+), 123 deletions(-) delete mode 100644 src/SqlPersistence/Installer.cs create mode 100644 src/SqlPersistence/NeedToInstallSomething.cs create mode 100644 src/SqlPersistence/ScriptRunner.cs diff --git a/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt b/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt index c7633102f..5c08fdbe7 100644 --- a/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt +++ b/src/SqlPersistence.Tests/APIApprovals.Approve.approved.txt @@ -41,6 +41,10 @@ namespace NServiceBus.Persistence.Sql public void ReaderCreator(System.Func readerCreator) { } public void WriterCreator(System.Func writerCreator) { } } + public class static ScriptRunner + { + public static System.Threading.Tasks.Task Install(NServiceBus.SqlDialect sqlDialect, string tablePrefix, System.Func connectionBuilder, string scriptDirectory, bool shouldInstallOutbox = True, bool shouldInstallSagas = True, bool shouldInstallSubscriptions = True, bool shouldInstallTimeouts = True) { } + } public class SqlPersistence : NServiceBus.Persistence.PersistenceDefinition { public SqlPersistence() { } diff --git a/src/SqlPersistence/Installer.cs b/src/SqlPersistence/Installer.cs deleted file mode 100644 index b358343d0..000000000 --- a/src/SqlPersistence/Installer.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Data.Common; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using NServiceBus; -using NServiceBus.Features; -using NServiceBus.Installation; -using NServiceBus.Logging; -using NServiceBus.Settings; - -class Installer : INeedToInstallSomething -{ - InstallerSettings installerSettings; - ReadOnlySettings settings; - static ILog log = LogManager.GetLogger(); - - public Installer(ReadOnlySettings settings) - { - this.settings = settings; - installerSettings = settings.GetOrDefault(); - } - - public async Task Install(string identity) - { - if (installerSettings == null || installerSettings.Disabled) - { - return; - } - - installerSettings.Dialect.ValidateTablePrefix(installerSettings.TablePrefix); - - using (var connection = await installerSettings.ConnectionBuilder.OpenConnection().ConfigureAwait(false)) - using (var transaction = connection.BeginTransaction()) - { - await InstallOutbox(installerSettings.ScriptDirectory, connection, transaction, installerSettings.TablePrefix, installerSettings.Dialect).ConfigureAwait(false); - await InstallSagas(installerSettings.ScriptDirectory, connection, transaction, installerSettings.TablePrefix, installerSettings.Dialect).ConfigureAwait(false); - await InstallSubscriptions(installerSettings.ScriptDirectory, connection, transaction, installerSettings.TablePrefix, installerSettings.Dialect).ConfigureAwait(false); - await InstallTimeouts(installerSettings.ScriptDirectory, connection, transaction, installerSettings.TablePrefix, installerSettings.Dialect).ConfigureAwait(false); - - transaction.Commit(); - } - } - - Task InstallOutbox(string scriptDirectory, DbConnection connection, DbTransaction transaction, string tablePrefix, SqlDialect sqlDialect) - { - if (!settings.IsFeatureActive(typeof(SqlOutboxFeature))) - { - return Task.FromResult(0); - } - - var createScript = Path.Combine(scriptDirectory, "Outbox_Create.sql"); - ScriptLocation.ValidateScriptExists(createScript); - log.Info($"Executing '{createScript}'"); - - return sqlDialect.ExecuteTableCommand( - connection: connection, - transaction: transaction, - script: File.ReadAllText(createScript), - tablePrefix: tablePrefix); - } - - Task InstallSubscriptions(string scriptDirectory, DbConnection connection, DbTransaction transaction, string tablePrefix, SqlDialect sqlDialect) - { - if (!settings.IsFeatureActive(typeof(SqlSubscriptionFeature))) - { - return Task.FromResult(0); - } - - var createScript = Path.Combine(scriptDirectory, "Subscription_Create.sql"); - ScriptLocation.ValidateScriptExists(createScript); - log.Info($"Executing '{createScript}'"); - - return sqlDialect.ExecuteTableCommand( - connection: connection, - transaction: transaction, - script: File.ReadAllText(createScript), - tablePrefix: tablePrefix); - } - - Task InstallTimeouts(string scriptDirectory, DbConnection connection, DbTransaction transaction, string tablePrefix, SqlDialect sqlDialect) - { - if (!settings.IsFeatureActive(typeof(SqlTimeoutFeature))) - { - return Task.FromResult(0); - } - - var createScript = Path.Combine(scriptDirectory, "Timeout_Create.sql"); - ScriptLocation.ValidateScriptExists(createScript); - log.Info($"Executing '{createScript}'"); - - return sqlDialect.ExecuteTableCommand( - connection: connection, - transaction: transaction, - script: File.ReadAllText(createScript), - tablePrefix: tablePrefix); - } - - async Task InstallSagas(string scriptDirectory, DbConnection connection, DbTransaction transaction, string tablePrefix, SqlDialect sqlDialect) - { - if (!settings.IsFeatureActive(typeof(SqlSagaFeature))) - { - return; - } - - var sagasDirectory = Path.Combine(scriptDirectory, "Sagas"); - if (!Directory.Exists(sagasDirectory)) - { - log.Info($"Directory '{sagasDirectory}' not found so no saga creation scripts will be executed."); - return; - } - var scriptFiles = Directory.EnumerateFiles(sagasDirectory, "*_Create.sql").ToList(); - log.Info($@"Executing saga creation scripts: -{string.Join(Environment.NewLine, scriptFiles)}"); - var sagaScripts = scriptFiles - .Select(File.ReadAllText); - - foreach (var script in sagaScripts) - { - await sqlDialect.ExecuteTableCommand(connection, transaction, script, tablePrefix).ConfigureAwait(false); - } - } -} \ No newline at end of file diff --git a/src/SqlPersistence/NeedToInstallSomething.cs b/src/SqlPersistence/NeedToInstallSomething.cs new file mode 100644 index 000000000..27f15964d --- /dev/null +++ b/src/SqlPersistence/NeedToInstallSomething.cs @@ -0,0 +1,35 @@ +using System.Threading.Tasks; +using NServiceBus.Features; +using NServiceBus.Installation; +using NServiceBus.Persistence.Sql; +using NServiceBus.Settings; + +class NeedToInstallSomething : INeedToInstallSomething +{ + InstallerSettings installerSettings; + ReadOnlySettings settings; + + public NeedToInstallSomething(ReadOnlySettings settings) + { + this.settings = settings; + installerSettings = settings.GetOrDefault(); + } + + public async Task Install(string identity) + { + if (installerSettings == null || installerSettings.Disabled) + { + return; + } + + await ScriptRunner.Install( + sqlDialect: installerSettings.Dialect, + tablePrefix: installerSettings.TablePrefix, + connectionBuilder: installerSettings.ConnectionBuilder, + scriptDirectory: installerSettings.ScriptDirectory, + shouldInstallOutbox: settings.IsFeatureActive(typeof(SqlOutboxFeature)), + shouldInstallSagas: settings.IsFeatureActive(typeof(SqlSagaFeature)), + shouldInstallSubscriptions: settings.IsFeatureActive(typeof(SqlSubscriptionFeature)), + shouldInstallTimeouts: settings.IsFeatureActive(typeof(SqlTimeoutFeature))); + } +} \ No newline at end of file diff --git a/src/SqlPersistence/ScriptRunner.cs b/src/SqlPersistence/ScriptRunner.cs new file mode 100644 index 000000000..3d3504796 --- /dev/null +++ b/src/SqlPersistence/ScriptRunner.cs @@ -0,0 +1,119 @@ +using System; +using System.Data.Common; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using NServiceBus.Logging; + +namespace NServiceBus.Persistence.Sql +{ + /// + /// Executes the scripts produced by a Sql Persistence MSBuild task. + /// + public static class ScriptRunner + { + static ILog log = Logging.LogManager.GetLogger(nameof(ScriptRunner)); + + /// + /// Executes the scripts produced by a Sql Persistence MSBuild task. + /// + /// + /// Designed to be used in a manual installation without the requirement of starting a full NServiceBus endpoint. + /// + public static async Task Install(SqlDialect sqlDialect, string tablePrefix, Func connectionBuilder, string scriptDirectory, bool shouldInstallOutbox = true, bool shouldInstallSagas = true, bool shouldInstallSubscriptions = true, bool shouldInstallTimeouts = true) + { + Guard.AgainstNull(nameof(sqlDialect), sqlDialect); + Guard.AgainstNull(nameof(tablePrefix), tablePrefix); + Guard.AgainstSqlDelimiters(nameof(tablePrefix), tablePrefix); + Guard.AgainstNull(nameof(connectionBuilder), connectionBuilder); + Guard.AgainstNullAndEmpty(nameof(scriptDirectory), scriptDirectory); + sqlDialect.ValidateTablePrefix(tablePrefix); + + using (var connection = await connectionBuilder.OpenConnection().ConfigureAwait(false)) + using (var transaction = connection.BeginTransaction()) + { + if (shouldInstallOutbox) + { + await InstallOutbox(scriptDirectory, connection, transaction, tablePrefix, sqlDialect).ConfigureAwait(false); + } + + if (shouldInstallSagas) + { + await InstallSagas(scriptDirectory, connection, transaction, tablePrefix, sqlDialect).ConfigureAwait(false); + } + + if (shouldInstallSubscriptions) + { + await InstallSubscriptions(scriptDirectory, connection, transaction, tablePrefix, sqlDialect).ConfigureAwait(false); + } + + if (shouldInstallTimeouts) + { + await InstallTimeouts(scriptDirectory, connection, transaction, tablePrefix, sqlDialect).ConfigureAwait(false); + } + + transaction.Commit(); + } + } + + static Task InstallOutbox(string scriptDirectory, DbConnection connection, DbTransaction transaction, string tablePrefix, SqlDialect sqlDialect) + { + var createScript = Path.Combine(scriptDirectory, "Outbox_Create.sql"); + ScriptLocation.ValidateScriptExists(createScript); + log.Info($"Executing '{createScript}'"); + + return sqlDialect.ExecuteTableCommand( + connection: connection, + transaction: transaction, + script: File.ReadAllText(createScript), + tablePrefix: tablePrefix); + } + + static Task InstallSubscriptions(string scriptDirectory, DbConnection connection, DbTransaction transaction, string tablePrefix, SqlDialect sqlDialect) + { + var createScript = Path.Combine(scriptDirectory, "Subscription_Create.sql"); + ScriptLocation.ValidateScriptExists(createScript); + log.Info($"Executing '{createScript}'"); + + return sqlDialect.ExecuteTableCommand( + connection: connection, + transaction: transaction, + script: File.ReadAllText(createScript), + tablePrefix: tablePrefix); + } + + static Task InstallTimeouts(string scriptDirectory, DbConnection connection, DbTransaction transaction, string tablePrefix, SqlDialect sqlDialect) + { + var createScript = Path.Combine(scriptDirectory, "Timeout_Create.sql"); + ScriptLocation.ValidateScriptExists(createScript); + log.Info($"Executing '{createScript}'"); + + return sqlDialect.ExecuteTableCommand( + connection: connection, + transaction: transaction, + script: File.ReadAllText(createScript), + tablePrefix: tablePrefix); + } + + static async Task InstallSagas(string scriptDirectory, DbConnection connection, DbTransaction transaction, string tablePrefix, SqlDialect sqlDialect) + { + var sagasDirectory = Path.Combine(scriptDirectory, "Sagas"); + if (!Directory.Exists(sagasDirectory)) + { + log.Info($"Directory '{sagasDirectory}' not found so no saga creation scripts will be executed."); + return; + } + + var scriptFiles = Directory.EnumerateFiles(sagasDirectory, "*_Create.sql").ToList(); + log.Info($@"Executing saga creation scripts: +{string.Join(Environment.NewLine, scriptFiles)}"); + var sagaScripts = scriptFiles + .Select(File.ReadAllText); + + foreach (var script in sagaScripts) + { + await sqlDialect.ExecuteTableCommand(connection, transaction, script, tablePrefix).ConfigureAwait(false); + } + } + } +} \ No newline at end of file From d12d8a7412629890a49441d4b30ac2875aa9e5fd Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Wed, 31 Jan 2018 11:07:12 -0800 Subject: [PATCH 21/32] Remove conditional dependency on SqlClient (#254) Also bumps to latest patch version. --- src/SqlPersistence/SqlPersistence.csproj | 5 +---- src/TestHelper/TestHelper.csproj | 5 +---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index 3a314687c..02460f09c 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -15,10 +15,7 @@ - - - - + diff --git a/src/TestHelper/TestHelper.csproj b/src/TestHelper/TestHelper.csproj index 6984b11ea..d06568b69 100644 --- a/src/TestHelper/TestHelper.csproj +++ b/src/TestHelper/TestHelper.csproj @@ -8,6 +8,7 @@ + @@ -15,8 +16,4 @@ - - - - From 19085fa041a0413313447b0b2117c9a9a43658c5 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Thu, 1 Feb 2018 16:19:11 -0500 Subject: [PATCH 22/32] Update dependencies to RC versions --- .../AcceptanceTestsHolder.csproj | 8 +- .../ConventionEnforcementTests.cs | 59 -------------- .../NServiceBusAcceptanceTest.cs | 2 +- .../Pipeline/When_a_message_is_sent.cs | 78 ------------------- .../When_publishing_from_sendonly.cs | 2 +- .../Routing/When_overriding_local_address.cs | 13 ++++ .../When_sagas_share_timeout_messages.cs | 2 +- .../Sagas/when_receiving_multiple_timeouts.cs | 4 +- .../when_reply_from_saga_not_found_handler.cs | 2 +- .../When_running_saga_tests.cs | 74 ------------------ .../When_using_custom_components.cs | 70 ----------------- .../Tx/When_receiving_with_dtc_enabled.cs | 5 +- ...hen_receiving_with_the_default_settings.cs | 3 +- .../Partials/When_running_saga_tests.cs | 9 --- src/AcceptanceTestsHolder/packages.config | 6 +- .../MsSqlAcceptanceTests.csproj | 2 +- .../MySqlAcceptanceTests.csproj | 2 +- .../OracleAcceptanceTests.csproj | 2 +- .../PostgreSqlAcceptanceTests.csproj | 2 +- src/SqlPersistence/SqlPersistence.csproj | 2 +- 20 files changed, 32 insertions(+), 315 deletions(-) delete mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConventionEnforcementTests.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/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/Partials/When_running_saga_tests.cs diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index 1e7a71d9a..106629c34 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -31,10 +31,10 @@ - ..\packages\NServiceBus.AcceptanceTesting.7.0.0-beta0013\lib\net452\NServiceBus.AcceptanceTesting.dll + ..\packages\NServiceBus.AcceptanceTesting.7.0.0-rc0001\lib\net452\NServiceBus.AcceptanceTesting.dll - ..\packages\NServiceBus.7.0.0-beta0013\lib\net452\NServiceBus.Core.dll + ..\packages\NServiceBus.7.0.0-rc0001\lib\net452\NServiceBus.Core.dll ..\packages\NUnit.3.7.1\lib\net45\nunit.framework.dll @@ -64,7 +64,6 @@ - @@ -188,8 +187,6 @@ - - @@ -217,7 +214,6 @@ - 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/NServiceBusAcceptanceTest.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs index f0ffdd896..9c252d672 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/NServiceBusAcceptanceTest.cs @@ -15,7 +15,7 @@ public abstract partial class NServiceBusAcceptanceTest [SetUp] public void SetUp() { -#if NET452 +#if !NETCOREAPP2_0 // Hack: prevents SerializationException ... Type 'x' in assembly 'y' is not marked as serializable. // https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/mitigation-deserialization-of-objects-across-app-domains System.Configuration.ConfigurationManager.GetSection("X"); 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/Routing/NativePublishSubscribe/When_publishing_from_sendonly.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Routing/NativePublishSubscribe/When_publishing_from_sendonly.cs index 608bad8d4..6d70d3979 100644 --- 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 @@ -57,7 +57,7 @@ public Task Handle(MyEvent messageThatIsEnlisted, IMessageHandlerContext context } } } - + public class MyEvent : IEvent { } 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 index d4150783f..3325f6bf8 100644 --- 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 @@ -1,5 +1,6 @@ namespace NServiceBus.AcceptanceTests.Routing { + using System; using System.Threading.Tasks; using AcceptanceTesting; using AcceptanceTesting.Customization; @@ -28,6 +29,18 @@ public async Task Should_use_the_provided_address_as_input_queue_name() Assert.That(context.ReceivedMessage, Is.True); } + [Test] + public void Should_not_be_allowed_when_send_only() + { + var ex = Assert.ThrowsAsync(async () => await Scenario.Define() + .WithEndpoint() + .WithEndpoint(e => e.CustomConfig(c => c.SendOnly())) + .Done(c => c.EndpointsStarted) + .Run()); + + StringAssert.Contains("send-only", ex.Message); + } + public class Context : ScenarioContext { public bool ReceivedMessage { get; set; } 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 index 8a3e19636..8e47c52d7 100644 --- 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 @@ -14,7 +14,7 @@ public class When_sagas_share_timeout_messages : NServiceBusAcceptanceTest public async Task Should_invoke_instance_that_requested_the_timeout() { var context = await Scenario.Define() - .WithEndpoint(e => e.When(s => s.SendLocal(new StartSagaMessage() + .WithEndpoint(e => e.When(s => s.SendLocal(new StartSagaMessage { Id = Guid.NewGuid().ToString() }))) 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 index 60348a2ad..b432642e0 100644 --- 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 @@ -11,7 +11,7 @@ public class When_receiving_multiple_timeouts : NServiceBusAcceptanceTest { - // realted to NSB issue #1819 + // related to NSB issue #1819 [Test] public async Task It_should_not_invoke_SagaNotFound_handler() { @@ -141,7 +141,7 @@ public Task Handle(object message, IMessageHandlerContext context) } } - + public class StartSaga1 : ICommand { 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 index 29773cd8e..bac3538b6 100644 --- 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 @@ -10,7 +10,7 @@ using NUnit.Framework; using Persistence.Sql; - public class when_reply_from_saga_not_found_handler : NServiceBusAcceptanceTest + public class When_reply_from_saga_not_found_handler : NServiceBusAcceptanceTest { // related to NSB issue #2044 [Test] 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/Tx/When_receiving_with_dtc_enabled.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Tx/When_receiving_with_dtc_enabled.cs index 1b9a9e1cd..c3a440501 100644 --- 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 @@ -21,7 +21,7 @@ public async Task Should_enlist_the_receive_in_the_dtc_tx() Assert.False(context.CanEnlistPromotable, "There should exists a DTC tx"); } -#if NET452 +#if !NETCOREAPP2_0 [Test] public void Basic_assumptions_promotable_should_fail_if_durable_already_exists() { @@ -59,8 +59,7 @@ public class DTCEndpoint : EndpointConfigurationBuilder { public DTCEndpoint() { - // sql needs a TransactionScope - EndpointSetup(c => c.ConfigureTransport().Transactions(TransportTransactionMode.TransactionScope)); + EndpointSetup(); } public class MyMessageHandler : IHandleMessages 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 index 73f23e8fd..e6e375b3d 100644 --- 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 @@ -31,8 +31,7 @@ public class TransactionalEndpoint : EndpointConfigurationBuilder { public TransactionalEndpoint() { - // sql needs a TransactionScope - EndpointSetup(c => c.ConfigureTransport().Transactions(TransportTransactionMode.TransactionScope)); + EndpointSetup(); } public class MyMessageHandler : IHandleMessages 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/AcceptanceTestsHolder/packages.config b/src/AcceptanceTestsHolder/packages.config index 3d8322c04..2afbc4b4d 100644 --- a/src/AcceptanceTestsHolder/packages.config +++ b/src/AcceptanceTestsHolder/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file diff --git a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj index 491c286ce..793e1599a 100644 --- a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj +++ b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index e3a12bd52..de9075c99 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj index f4f046673..7b481b6e5 100644 --- a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj +++ b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj index 491c286ce..793e1599a 100644 --- a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj +++ b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index 02460f09c..ee4b647d8 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -11,7 +11,7 @@ - + From 4540a0c47cc03ea82d668a0a26259584d4f544d3 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Thu, 1 Feb 2018 16:41:31 -0500 Subject: [PATCH 23/32] Update Integration solution to RC versions --- src/Integration/Shared/Shared.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Integration/Shared/Shared.csproj b/src/Integration/Shared/Shared.csproj index 0a58e5dc8..e8d4f7bfd 100644 --- a/src/Integration/Shared/Shared.csproj +++ b/src/Integration/Shared/Shared.csproj @@ -6,10 +6,10 @@ - + - + \ No newline at end of file From effb132dd928a02357c1a5b37622b5f1b7433a7c Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Thu, 15 Feb 2018 17:10:05 +0200 Subject: [PATCH 24/32] Don't pass *Undefined* to ScriptBuilder task (#257) --- .../NServiceBus.Persistence.Sql.MsBuild.targets | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets b/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets index 7e0a75444..02bf0ce8e 100644 --- a/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets +++ b/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets @@ -1,6 +1,7 @@  + $(SolutionDir) $(MSBuildThisFileDirectory)..\netstandard\NServiceBus.Persistence.Sql.ScriptBuilderTask.dll $(MSBuildThisFileDirectory)..\netclassic\NServiceBus.Persistence.Sql.ScriptBuilderTask.dll @@ -17,7 +18,7 @@ AssemblyPath="$(ProjectDir)@(IntermediateAssembly)" IntermediateDirectory="$(ProjectDir)$(IntermediateOutputPath)" ProjectDirectory="$(ProjectDir)" - SolutionDirectory="$(SolutionDir)"/> + SolutionDirectory="$(SqlPersistenceSolutionDir)"/> From deab3eed0ec3576f680338b55ecdb446496ec6c3 Mon Sep 17 00:00:00 2001 From: Simon Cropp Date: Thu, 22 Feb 2018 15:23:06 +1100 Subject: [PATCH 25/32] missing configawait --- src/SqlPersistence/NeedToInstallSomething.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/SqlPersistence/NeedToInstallSomething.cs b/src/SqlPersistence/NeedToInstallSomething.cs index 27f15964d..2ddc3364b 100644 --- a/src/SqlPersistence/NeedToInstallSomething.cs +++ b/src/SqlPersistence/NeedToInstallSomething.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using NServiceBus.Features; using NServiceBus.Installation; using NServiceBus.Persistence.Sql; @@ -15,14 +15,14 @@ public NeedToInstallSomething(ReadOnlySettings settings) installerSettings = settings.GetOrDefault(); } - public async Task Install(string identity) + public Task Install(string identity) { if (installerSettings == null || installerSettings.Disabled) { - return; + return Task.FromResult(0); } - await ScriptRunner.Install( + return ScriptRunner.Install( sqlDialect: installerSettings.Dialect, tablePrefix: installerSettings.TablePrefix, connectionBuilder: installerSettings.ConnectionBuilder, @@ -32,4 +32,4 @@ await ScriptRunner.Install( shouldInstallSubscriptions: settings.IsFeatureActive(typeof(SqlSubscriptionFeature)), shouldInstallTimeouts: settings.IsFeatureActive(typeof(SqlTimeoutFeature))); } -} \ No newline at end of file +} From 1be07a0003e409d7026c986d589a9968663d03da Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Tue, 3 Apr 2018 15:03:22 -0500 Subject: [PATCH 26/32] Update targets file to include scripts in publish output (#271) * Update targets file to include scripts in publish output * Remove Mono.Cecil wildcard and fix compilation --- .../CecilExtensions/CustomAttributeMock.cs | 4 +++ src/ScriptBuilder/ScriptBuilder.csproj | 2 +- ...ServiceBus.Persistence.Sql.MsBuild.targets | 36 ++++++++++++++----- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/ScriptBuilder.Tests/CecilExtensions/CustomAttributeMock.cs b/src/ScriptBuilder.Tests/CecilExtensions/CustomAttributeMock.cs index c9fe2a3e5..f92010c69 100644 --- a/src/ScriptBuilder.Tests/CecilExtensions/CustomAttributeMock.cs +++ b/src/ScriptBuilder.Tests/CecilExtensions/CustomAttributeMock.cs @@ -38,4 +38,8 @@ public Collection Properties { get; } + + public bool HasConstructorArguments => throw new NotImplementedException(); + + public Collection ConstructorArguments => throw new NotImplementedException(); } \ No newline at end of file diff --git a/src/ScriptBuilder/ScriptBuilder.csproj b/src/ScriptBuilder/ScriptBuilder.csproj index 0b7cbaf34..0352b2655 100644 --- a/src/ScriptBuilder/ScriptBuilder.csproj +++ b/src/ScriptBuilder/ScriptBuilder.csproj @@ -12,7 +12,7 @@ - + diff --git a/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets b/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets index 02bf0ce8e..7f2e24d4d 100644 --- a/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets +++ b/src/ScriptBuilderTask/NServiceBus.Persistence.Sql.MsBuild.targets @@ -34,15 +34,33 @@ - - - - - - - + + <_SourceItemsToCopyToOutputDirectoryAlways Include="@(SqlPersistenceScripts)"> + Always + NServiceBus.Persistence.Sql\%(RecursiveDir)%(Filename)%(Extension) + + + + + + + + + $(ProjectDir)$(IntermediateOutputPath)NServiceBus.Persistence.Sql\ + + + + + + + + <_SourceItemsToCopyToPublishDirectoryAlways Include="@(SqlPersistenceScriptsForPublish)"> + Always + NServiceBus.Persistence.Sql\%(RecursiveDir)%(Filename)%(Extension) + + From e7a02e3ecf7dfaa717a6add72f853af857f7385c Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 11 May 2018 13:06:53 -0400 Subject: [PATCH 27/32] Remove wildcards to avoid upcoming build break --- 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..c2374d9de 100644 --- a/src/ScriptBuilderTask/ScriptBuilderTask.csproj +++ b/src/ScriptBuilderTask/ScriptBuilderTask.csproj @@ -29,10 +29,10 @@ - - - - + + + + From dee12e0a207d1f11ba7155d67ae1be057db62a09 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 11 May 2018 13:54:34 -0400 Subject: [PATCH 28/32] Update packages to RTM versions --- src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj | 2 +- src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj | 2 +- src/OracleAcceptanceTests/OracleAcceptanceTests.csproj | 2 +- .../PostgreSqlAcceptanceTests.csproj | 2 +- src/SqlPersistence.Tests/SqlPersistence.Tests.csproj | 2 +- src/SqlPersistence/SqlPersistence.csproj | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj index 793e1599a..531b74b9e 100644 --- a/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj +++ b/src/MsSqlAcceptanceTests/MsSqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj index de9075c99..763252c67 100644 --- a/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj +++ b/src/MySqlAcceptanceTests/MySqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj index 7b481b6e5..36eb7d652 100644 --- a/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj +++ b/src/OracleAcceptanceTests/OracleAcceptanceTests.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj index 793e1599a..531b74b9e 100644 --- a/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj +++ b/src/PostgreSqlAcceptanceTests/PostgreSqlAcceptanceTests.csproj @@ -17,7 +17,7 @@ - + diff --git a/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj b/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj index fd8c7acfb..f3724372f 100644 --- a/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj +++ b/src/SqlPersistence.Tests/SqlPersistence.Tests.csproj @@ -16,7 +16,7 @@ - + diff --git a/src/SqlPersistence/SqlPersistence.csproj b/src/SqlPersistence/SqlPersistence.csproj index ee4b647d8..46c5d1081 100644 --- a/src/SqlPersistence/SqlPersistence.csproj +++ b/src/SqlPersistence/SqlPersistence.csproj @@ -11,11 +11,11 @@ - + - + From 214068c572b3dea29842ded3b4ce26596ed55699 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 11 May 2018 14:43:16 -0400 Subject: [PATCH 29/32] Update AcceptanceTestsHolder packages --- .../AcceptanceTestsHolder.csproj | 5 +- .../ConfigureEndpointLearningTransport.cs | 7 +- .../When_Deferring_a_message.cs | 2 +- ...hen_using_special_characters_in_headers.cs | 2 +- .../Outbox/When_clearing_saga_timeouts.cs | 8 +- ...When_headers_contain_special_characters.cs | 2 +- .../When_an_endpoint_replies_to_a_saga.cs | 11 +-- ...en_correlated_property_value_is_changed.cs | 8 +- .../When_correlating_on_special_characters.cs | 15 ++-- ...en_doing_request_response_between_sagas.cs | 25 +++---- .../Sagas/When_message_has_a_saga_id.cs | 10 +-- ...cs => When_receiving_multiple_timeouts.cs} | 10 +-- ...When_reply_from_saga_not_found_handler.cs} | 13 ++-- .../Sagas/When_replying_to_originator.cs | 23 +++--- ...n_replying_to_originator_from_a_timeout.cs | 23 +++--- .../Sagas/When_replying_to_saga_event.cs | 9 +-- .../When_saga_exists_for_start_message.cs | 9 +-- .../When_saga_handles_unmapped_message.cs | 11 +-- .../When_saga_has_a_non_empty_constructor.cs | 13 ++-- .../Sagas/When_saga_id_changed.cs | 8 +- ...en_saga_is_mapped_to_complex_expression.cs | 14 ++-- ...ga_message_goes_through_delayed_retries.cs | 13 ++-- .../Sagas/When_saga_started_concurrently.cs | 11 +-- .../Sagas/When_sagas_cant_be_found.cs | 42 +++++------ .../When_sagas_share_timeout_messages.cs | 17 ++--- .../Sagas/When_sending_from_a_saga_handle.cs | 19 ++--- .../Sagas/When_sending_from_a_saga_timeout.cs | 17 ++--- ...n_started_by_base_event_from_other_saga.cs | 8 +- ...When_started_by_event_from_another_saga.cs | 18 ++--- .../Sagas/When_timeout_hit_not_found_saga.cs | 11 +-- ...n_two_sagas_subscribe_to_the_same_event.cs | 20 ++--- ..._updating_existing_correlation_property.cs | 9 +-- ...en_using_a_received_message_for_timeout.cs | 10 +-- .../Sagas/When_using_contain_saga_data.cs | 9 +-- ...r_processes_message_without_type_header.cs | 73 +++++++++++++++++++ ...l_serializer_used_with_unobtrusive_mode.cs | 39 +++------- src/AcceptanceTestsHolder/packages.config | 6 +- 37 files changed, 259 insertions(+), 291 deletions(-) rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/{when_receiving_multiple_timeouts.cs => When_receiving_multiple_timeouts.cs} (93%) rename src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/{when_reply_from_saga_not_found_handler.cs => When_reply_from_saga_not_found_handler.cs} (88%) create mode 100644 src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_xml_serializer_processes_message_without_type_header.cs diff --git a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj index 68b17bda7..de43f119d 100644 --- a/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj +++ b/src/AcceptanceTestsHolder/AcceptanceTestsHolder.csproj @@ -31,10 +31,10 @@ - ..\packages\NServiceBus.AcceptanceTesting.7.0.0-rc0001\lib\net452\NServiceBus.AcceptanceTesting.dll + ..\packages\NServiceBus.AcceptanceTesting.7.0.0\lib\net452\NServiceBus.AcceptanceTesting.dll - ..\packages\NServiceBus.7.0.0-rc0001\lib\net452\NServiceBus.Core.dll + ..\packages\NServiceBus.7.0.0\lib\net452\NServiceBus.Core.dll ..\packages\NUnit.3.7.1\lib\net45\nunit.framework.dll @@ -196,6 +196,7 @@ + diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs index f243f219a..66e1babf9 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs @@ -39,11 +39,8 @@ public Task Configure(string endpointName, EndpointConfiguration configuration, //we want the tests to be exposed to concurrency configuration.LimitMessageProcessingConcurrencyTo(PushRuntimeSettings.Default.MaxConcurrency); - var transport = configuration.UseTransport(); -#if (MySQL) - transport.Transactions(TransportTransactionMode.SendsAtomicWithReceive); -#endif - transport.StorageDirectory(storageDir); + configuration.UseTransport() + .StorageDirectory(storageDir); return Task.FromResult(0); } 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 index ee42f3900..61bcf56c4 100644 --- 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 @@ -7,7 +7,7 @@ using Features; using NUnit.Framework; - public partial class When_deferring_a_message : NServiceBusAcceptanceTest + public class When_deferring_a_message : NServiceBusAcceptanceTest { [Test] public async Task Should_delay_delivery() diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs index bf3595b56..354c6fef8 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs @@ -8,7 +8,7 @@ using Features; using NUnit.Framework; - public partial class When_using_special_characters_in_headers : NServiceBusAcceptanceTest + public class When_using_special_characters_in_headers : NServiceBusAcceptanceTest { readonly Dictionary specialHeaders = new Dictionary { diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs index 0488ca57b..17f0b386b 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs @@ -7,7 +7,6 @@ using Extensibility; using Features; using NServiceBus; - using NServiceBus.Persistence.Sql; using NServiceBus.Outbox; using NServiceBus.Persistence; using NUnit.Framework; @@ -61,18 +60,17 @@ public Task Handle(SignalDone message, IMessageHandlerContext context) } } - public class PlaceOrderSaga : SqlSaga, IAmStartedByMessages + public class PlaceOrderSaga : Saga, IAmStartedByMessages { public Task Handle(PlaceOrder message, IMessageHandlerContext context) { MarkAsComplete(); return context.SendLocal(new SignalDone()); } - protected override string CorrelationPropertyName => nameof(PlaceOrderSagaData.DataId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class PlaceOrderSagaData : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs index 60fe0eb42..d2b1ea18a 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs @@ -8,7 +8,7 @@ using NServiceBus.Pipeline; using NUnit.Framework; - public partial class When_headers_contain_special_characters : NServiceBusAcceptanceTest + public class When_headers_contain_special_characters : NServiceBusAcceptanceTest { static Dictionary sentHeaders = new Dictionary { 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 index 81b11634d..98439e875 100644 --- 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 @@ -7,7 +7,6 @@ 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. @@ -65,7 +64,7 @@ public EndpointThatHostsASaga() }); } - public class CorrelationTestSaga : SqlSaga, + public class CorrelationTestSaga : Saga, IAmStartedByMessages, IHandleMessages { @@ -87,12 +86,10 @@ public Task Handle(DoSomethingResponse message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(CorrelationTestSagaData.RunId); - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.RunId); - mapper.ConfigureMapping(m => m.RunId); + mapper.ConfigureMapping(m => m.RunId).ToSaga(s => s.RunId); + mapper.ConfigureMapping(m => m.RunId).ToSaga(s => s.RunId); } public class CorrelationTestSagaData : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs index cd12d2b85..bd9309bbc 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs @@ -6,7 +6,6 @@ using AcceptanceTesting.Support; using EndpointTemplates; using NUnit.Framework; - using Persistence.Sql; [TestFixture] public class When_correlated_property_value_is_changed : NServiceBusAcceptanceTest @@ -42,7 +41,7 @@ public Endpoint() EndpointSetup(); } - public class CorrIdChangedSaga : SqlSaga, + public class CorrIdChangedSaga : Saga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -54,10 +53,9 @@ public Task Handle(StartSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(CorrIdChangedSagaData.DataId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class CorrIdChangedSagaData : ContainSagaData 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 index 5d2cfebc3..21348c8c0 100644 --- 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 @@ -4,9 +4,8 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; - using NServiceBus.Persistence.Sql; - partial class When_correlating_special_chars : NServiceBusAcceptanceTest + class When_correlating_special_chars : NServiceBusAcceptanceTest { [Test] public async Task Saga_persistence_and_correlation_should_work() @@ -37,13 +36,13 @@ public SpecialCharacterSagaEndpoint() EndpointSetup(); } - public class SagaDataWithSpecialPropertyValues : ContainSagaData + public class SagaDataSpecialValues : ContainSagaData { public virtual string SpecialCharacterValues { get; set; } } public class SagaSpecialValues : - SqlSaga, + Saga, IAmStartedByMessages, IHandleMessages { @@ -54,12 +53,10 @@ public SagaSpecialValues(Context testContext) this.testContext = testContext; } - protected override string CorrelationPropertyName => nameof(SagaDataWithSpecialPropertyValues.SpecialCharacterValues); - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SpecialCharacterValues); - mapper.ConfigureMapping(m => m.SpecialCharacterValues); + mapper.ConfigureMapping(m => m.SpecialCharacterValues).ToSaga(s => s.SpecialCharacterValues); + mapper.ConfigureMapping(m => m.SpecialCharacterValues).ToSaga(s => s.SpecialCharacterValues); } public Task Handle(MessageWithSpecialPropertyValues message, IMessageHandlerContext context) diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs index 1f2867eb2..f1bbd99a0 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs @@ -6,9 +6,8 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; - public partial class When_doing_request_response_between_sagas : NServiceBusAcceptanceTest + public class When_doing_request_response_between_sagas : NServiceBusAcceptanceTest { [Test] public async Task Should_autocorrelate_the_response_back_to_the_requesting_saga() @@ -33,7 +32,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestResponseRequestingSaga1 : SqlSaga, + public class RequestResponseRequestingSaga1 : Saga, IAmStartedByMessages, IHandleMessages { @@ -43,12 +42,10 @@ public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext contex { return context.SendLocal(new RequestToRespondingSaga { - SomeId = Guid.NewGuid() + SomeId = Guid.NewGuid() }); } - protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData1.CorrIdForResponse); - public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context) { TestContext.DidRequestingSagaGetTheResponse = true; @@ -57,19 +54,20 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.SomeCorrelationId); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrIdForResponse); + mapper.ConfigureMapping(m => m.SomeCorrelationId).ToSaga(s => s.CorrIdForResponse); } public class RequestResponseRequestingSagaData1 : ContainSagaData { - public virtual Guid CorrIdForResponse { get; set; } + public virtual Guid CorrIdForResponse { get; set; } } } - public class RequestResponseRespondingSaga1 : SqlSaga, + public class RequestResponseRespondingSaga1 : Saga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -82,10 +80,9 @@ public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext conte return context.Reply(new ResponseFromOtherSaga{SomeCorrelationId = Guid.NewGuid()}); } - protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData1.CorrIdForRequest); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId); + mapper.ConfigureMapping(m => m.SomeId).ToSaga(s => s.CorrIdForRequest); } public class RequestResponseRespondingSagaData1 : ContainSagaData 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 index 7828819d0..cd3182130 100644 --- 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 @@ -7,7 +7,6 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; - using Persistence.Sql; public class When_message_has_a_saga_id : NServiceBusAcceptanceTest { @@ -52,13 +51,11 @@ public SagaEndpoint() EndpointSetup(c => c.EnableFeature()); } - public class MessageWithSagaIdSaga : SqlSaga, + public class MessageWithSagaIdSaga : Saga, IAmStartedByMessages, IHandleTimeouts, IHandleSagaNotFound { - protected override string CorrelationPropertyName => nameof(MessageWithSagaIdSagaData.DataId); - public Context TestContext { get; set; } public Task Handle(MessageWithSagaId message, IMessageHandlerContext context) @@ -79,9 +76,10 @@ public Task Timeout(MessageWithSagaId state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId) + .ToSaga(s => s.DataId); } public class MessageWithSagaIdSagaData : ContainSagaData 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 similarity index 93% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_receiving_multiple_timeouts.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_receiving_multiple_timeouts.cs index b432642e0..8e245a8a6 100644 --- 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 @@ -7,7 +7,6 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; - using Persistence.Sql; public class When_receiving_multiple_timeouts : NServiceBusAcceptanceTest { @@ -48,13 +47,11 @@ public Endpoint() }); } - public class MultiTimeoutsSaga1 : SqlSaga, + public class MultiTimeoutsSaga1 : Saga, IAmStartedByMessages, IHandleTimeouts, IHandleTimeouts { - protected override string CorrelationPropertyName => nameof(MultiTimeoutsSaga1Data.ContextId); - public Context TestContext { get; set; } public async Task Handle(StartSaga1 message, IMessageHandlerContext context) @@ -104,9 +101,10 @@ public Task Timeout(Saga2Timeout state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.ContextId); + mapper.ConfigureMapping(m => m.ContextId) + .ToSaga(s => s.ContextId); } public class MultiTimeoutsSaga1Data : ContainSagaData 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 similarity index 88% rename from src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/when_reply_from_saga_not_found_handler.cs rename to src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_reply_from_saga_not_found_handler.cs index bac3538b6..299c2402b 100644 --- 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 @@ -8,7 +8,6 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; - using Persistence.Sql; public class When_reply_from_saga_not_found_handler : NServiceBusAcceptanceTest { @@ -60,10 +59,8 @@ public ReceiverWithSaga() EndpointSetup(c => c.EnableFeature()); } - public class NotFoundHandlerSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages + public class NotFoundHandlerSaga1 : Saga, IAmStartedByMessages, IHandleMessages { - protected override string CorrelationPropertyName => nameof(NotFoundHandlerSaga1Data.ContextId); - public Task Handle(StartSaga1 message, IMessageHandlerContext context) { Data.ContextId = message.ContextId; @@ -75,10 +72,12 @@ public Task Handle(MessageToSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.ContextId); - mapper.ConfigureMapping(m => m.ContextId); + mapper.ConfigureMapping(m => m.ContextId) + .ToSaga(s => s.ContextId); + mapper.ConfigureMapping(m => m.ContextId) + .ToSaga(s => s.ContextId); } public class NotFoundHandlerSaga1Data : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs index e6c1309b9..e2e5a6e40 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs @@ -6,7 +6,6 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; public class When_replying_to_originator : NServiceBusAcceptanceTest { @@ -33,7 +32,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestResponseRequestingSaga2 : SqlSaga, + public class RequestResponseRequestingSaga2 : Saga, IAmStartedByMessages, IHandleMessages { @@ -56,11 +55,10 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData2.CorrIdForResponse); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.SomeCorrelationId); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrIdForResponse); + mapper.ConfigureMapping(m => m.SomeCorrelationId).ToSaga(s => s.CorrIdForResponse); } public class RequestResponseRequestingSagaData2 : ContainSagaData @@ -69,8 +67,7 @@ public class RequestResponseRequestingSagaData2 : ContainSagaData } } - public class RequestResponseRespondingSaga2 : - SqlSaga, + public class RequestResponseRespondingSaga2 : Saga, IAmStartedByMessages, IHandleMessages { @@ -87,17 +84,17 @@ public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext conte public Task Handle(SendReplyFromNonInitiatingHandler message, IMessageHandlerContext context) { //reply to originator must be used here since the sender of the incoming message is this saga and not the requesting saga - return ReplyToOriginator(context, new ResponseFromOtherSaga + return ReplyToOriginator(context, new ResponseFromOtherSaga { SomeCorrelationId = Data.CorrIdForRequest }); } - protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData2.CorrIdForRequest); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs); + mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs).ToSaga(s => s.CorrIdForRequest); //this line is just needed so we can test the non-initiating handler case - mapper.ConfigureMapping(m => m.SagaIdSoWeCanCorrelate); + mapper.ConfigureMapping(m => m.SagaIdSoWeCanCorrelate).ToSaga(s => s.CorrIdForRequest); } public class RequestResponseRespondingSagaData2 : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs index 0be50f074..c851eab5a 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs @@ -6,9 +6,8 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; - public partial class When_replying_to_originator_from_a_timeout : NServiceBusAcceptanceTest + public class When_replying_to_originator_from_a_timeout : NServiceBusAcceptanceTest { [Test] public async Task Should_route_the_message_to_the_endpoint_starting_the_saga() @@ -33,7 +32,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestResponseRequestingSaga3 : SqlSaga, + public class RequestResponseRequestingSaga3 : Saga, IAmStartedByMessages, IHandleMessages { @@ -43,7 +42,7 @@ public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext contex { return context.SendLocal(new RequestToRespondingSaga { - SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse + SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse }); } @@ -56,11 +55,10 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData3.CorrIdForResponse); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.SomeCorrelationId); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrIdForResponse); + mapper.ConfigureMapping(m => m.SomeCorrelationId).ToSaga(s => s.CorrIdForResponse); } public class RequestResponseRequestingSagaData3 : ContainSagaData @@ -69,8 +67,7 @@ public class RequestResponseRequestingSagaData3 : ContainSagaData } } - public class RequestResponseRespondingSaga3 : - SqlSaga, + public class RequestResponseRespondingSaga3 : Saga, IAmStartedByMessages, IHandleTimeouts { @@ -90,12 +87,12 @@ public Task Timeout(DelayReply state, IMessageHandlerContext context) }); } - protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData3.CorrIdForRequest); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs); + mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs).ToSaga(s => s.CorrIdForRequest); } + public class RequestResponseRespondingSagaData3 : ContainSagaData { public virtual Guid CorrIdForRequest { get; set; } diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs index fdd3da87b..8d2598048 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs @@ -6,7 +6,6 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; public class When_replying_to_saga_event : NServiceBusAcceptanceTest { @@ -71,12 +70,10 @@ public SagaEndpoint() }); } - public class ReplyToPubMsgSaga : SqlSaga, IAmStartedByMessages, IHandleMessages + public class ReplyToPubMsgSaga : Saga, IAmStartedByMessages, IHandleMessages { public Context Context { get; set; } - protected override string CorrelationPropertyName => nameof(ReplyToPubMsgSagaData.DataId); - public Task Handle(StartSaga message, IMessageHandlerContext context) { return context.Publish(new DidSomething @@ -91,9 +88,9 @@ public Task Handle(DidSomethingResponse message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class ReplyToPubMsgSagaData : ContainSagaData 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 index c8843c542..c0cf33ec7 100644 --- 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 @@ -6,7 +6,6 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; - using Persistence.Sql; public class When_saga_exists_for_start_message : NServiceBusAcceptanceTest { @@ -48,10 +47,9 @@ public ExistingSagaInstanceEndpoint() EndpointSetup(c => c.LimitMessageProcessingConcurrencyTo(1)); } - public class TestSaga05 : SqlSaga, IAmStartedByMessages + public class TestSaga05 : Saga, IAmStartedByMessages { public Context TestContext { get; set; } - protected override string CorrelationPropertyName => nameof(TestSagaData05.SomeId); public Task Handle(StartSagaMessage message, IMessageHandlerContext context) { @@ -60,9 +58,10 @@ public Task Handle(StartSagaMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId); + mapper.ConfigureMapping(m => m.SomeId) + .ToSaga(s => s.SomeId); } } 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 index 96e1b4875..9b814b066 100644 --- 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 @@ -6,7 +6,6 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; - using Persistence.Sql; public class When_saga_handles_unmapped_message : NServiceBusAcceptanceTest { @@ -50,19 +49,17 @@ public UnmappedMsgEndpoint() EndpointSetup(); } - public class UnmappedMsgSaga : SqlSaga, + public class UnmappedMsgSaga : Saga, IAmStartedByMessages, IHandleMessages, IHandleMessages { - protected override string CorrelationPropertyName => nameof(UnmappedMsgSagaData.SomeId); - public Context Context { get; set; } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(msg => msg.SomeId); - mapper.ConfigureMapping(msg => msg.SomeId); + mapper.ConfigureMapping(msg => msg.SomeId).ToSaga(saga => saga.SomeId); + mapper.ConfigureMapping(msg => msg.SomeId).ToSaga(saga => saga.SomeId); // No mapping for EchoMessage, so saga can't possibly be found } 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 index 200687bc5..0f1ddf413 100644 --- 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 @@ -5,7 +5,6 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; - using Persistence.Sql; public class When_saga_has_a_non_empty_constructor : NServiceBusAcceptanceTest { @@ -35,12 +34,10 @@ public NonEmptySagaCtorEndpt() EndpointSetup(); } - public class TestSaga11 : SqlSaga, + public class TestSaga11 : Saga, IAmStartedByMessages, IHandleMessages { - protected override string CorrelationPropertyName => nameof(TestSagaData11.SomeId); - public TestSaga11(Context testContext) { this.testContext = testContext; @@ -61,10 +58,12 @@ public Task Handle(OtherMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId); - mapper.ConfigureMapping(m => m.SomeId); + mapper.ConfigureMapping(m => m.SomeId) + .ToSaga(s => s.SomeId); + mapper.ConfigureMapping(m => m.SomeId) + .ToSaga(s => s.SomeId); } Context testContext; 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 index a707d63b8..4d951228d 100644 --- 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 @@ -7,7 +7,6 @@ using AcceptanceTesting.Support; using EndpointTemplates; using NUnit.Framework; - using Persistence.Sql; [TestFixture] public class When_saga_id_changed : NServiceBusAcceptanceTest @@ -42,7 +41,7 @@ public Endpoint() EndpointSetup(); } - public class SagaIdChangedSaga : SqlSaga, + public class SagaIdChangedSaga : Saga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -54,10 +53,9 @@ public Task Handle(StartSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(SagaIdChangedSagaData.DataId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class SagaIdChangedSagaData : ContainSagaData 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 index db0f7e8d7..73d282938 100644 --- 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 @@ -5,7 +5,6 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; - using NServiceBus.Persistence.Sql; public class When_saga_is_mapped_to_complex_expression : NServiceBusAcceptanceTest { @@ -46,7 +45,7 @@ public SagaEndpoint() EndpointSetup(c => c.LimitMessageProcessingConcurrencyTo(1)); } - public class TestSaga02 : SqlSaga, + public class TestSaga02 : Saga, IAmStartedByMessages, IAmStartedByMessages { public Context Context { get; set; } @@ -65,12 +64,13 @@ public Task Handle(StartSagaMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(TestSagaData02.KeyValue); - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Key); - mapper.ConfigureMapping(m => m.Part1 + "_" + m.Part2); + mapper.ConfigureMapping(m => m.Key) + .ToSaga(s => s.KeyValue); + + mapper.ConfigureMapping(m => m.Part1 + "_" + m.Part2) + .ToSaga(s => s.KeyValue); } } 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 index 375bc11e4..62af8aeff 100644 --- 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 @@ -6,7 +6,6 @@ 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 @@ -46,12 +45,10 @@ public DelayedRetryEndpoint() }); } - public class DelayedRetryTestingSaga : SqlSaga, + public class DelayedRetryTestingSaga : Saga, IAmStartedByMessages, IHandleMessages { - protected override string CorrelationPropertyName => nameof(DelayedRetryTestingSagaData.SomeId); - public Context TestContext { get; set; } public Task Handle(StartSagaMessage message, IMessageHandlerContext context) @@ -78,10 +75,12 @@ public Task Handle(SecondSagaMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId); - mapper.ConfigureMapping(m => m.SomeId); + mapper.ConfigureMapping(m => m.SomeId) + .ToSaga(s => s.SomeId); + mapper.ConfigureMapping(m => m.SomeId) + .ToSaga(s => s.SomeId); } } 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 index fb526553b..a981b1a02 100644 --- 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 @@ -5,7 +5,6 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; - using Persistence.Sql; public class When_saga_started_concurrently : NServiceBusAcceptanceTest { @@ -55,12 +54,10 @@ public ConcurrentHandlerEndpoint() }); } - public class ConcurrentlyStartedSaga : SqlSaga, + public class ConcurrentlyStartedSaga : Saga, IAmStartedByMessages, IAmStartedByMessages { - protected override string CorrelationPropertyName => nameof(ConcurrentlyStartedSagaData.OrderId); - public Context Context { get; set; } public async Task Handle(StartMessageOne message, IMessageHandlerContext context) @@ -85,10 +82,10 @@ await context.SendLocal(new SuccessfulProcessing CheckForCompletion(context); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(msg => msg.SomeId); - mapper.ConfigureMapping(msg => msg.SomeId); + mapper.ConfigureMapping(msg => msg.SomeId).ToSaga(saga => saga.OrderId); + mapper.ConfigureMapping(msg => msg.SomeId).ToSaga(saga => saga.OrderId); } void CheckForCompletion(IMessageHandlerContext context) 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 index fca0921f8..202ea2b47 100644 --- 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 @@ -7,9 +7,8 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; - using Persistence.Sql; - public partial class When_sagas_cant_be_found : NServiceBusAcceptanceTest + public class When_sagas_cant_be_found : NServiceBusAcceptanceTest { [Test] public async Task IHandleSagaNotFound_only_called_once() @@ -52,7 +51,7 @@ public ReceiverWithSagas() EndpointSetup(config => config.EnableFeature()); } - public class CantBeFoundSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages + public class CantBeFoundSaga1 : Saga, IAmStartedByMessages, IHandleMessages { public Task Handle(StartSaga message, IMessageHandlerContext context) { @@ -65,12 +64,10 @@ public Task Handle(MessageToSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - - protected override string CorrelationPropertyName => nameof(CantBeFoundSaga1Data.MessageId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); } public class CantBeFoundSaga1Data : ContainSagaData @@ -79,7 +76,7 @@ public class CantBeFoundSaga1Data : ContainSagaData } } - public class CantBeFoundSaga2 : SqlSaga, IAmStartedByMessages, IHandleMessages + public class CantBeFoundSaga2 : Saga, IAmStartedByMessages, IHandleMessages { public Task Handle(StartSaga message, IMessageHandlerContext context) { @@ -92,18 +89,16 @@ public Task Handle(MessageToSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); } public class CantBeFoundSaga2Data : ContainSagaData { public virtual Guid MessageId { get; set; } } - - protected override string CorrelationPropertyName => nameof(CantBeFoundSaga2Data.MessageId); } public class SagaNotFound : IHandleSagaNotFound @@ -130,7 +125,7 @@ public ReceiverWithOrderedSagas() }); } - public class ReceiverWithOrderedSagasSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages + public class ReceiverWithOrderedSagasSaga1 : Saga, IAmStartedByMessages, IHandleMessages { public Task Handle(StartSaga message, IMessageHandlerContext context) { @@ -143,12 +138,10 @@ public Task Handle(MessageToSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(ReceiverWithOrderedSagasSaga1Data.MessageId); - - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); } public class ReceiverWithOrderedSagasSaga1Data : ContainSagaData @@ -157,7 +150,7 @@ public class ReceiverWithOrderedSagasSaga1Data : ContainSagaData } } - public class ReceiverWithOrderedSagasSaga2 : SqlSaga, IHandleMessages, IAmStartedByMessages + public class ReceiverWithOrderedSagasSaga2 : Saga, IHandleMessages, IAmStartedByMessages { public Context Context { get; set; } @@ -174,11 +167,10 @@ public Task Handle(StartSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(ReceiverWithOrderedSagasSaga2Data.MessageId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); - mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); } public class ReceiverWithOrderedSagasSaga2Data : ContainSagaData 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 index 8e47c52d7..63f9d5d03 100644 --- 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 @@ -6,7 +6,6 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; public class When_sagas_share_timeout_messages : NServiceBusAcceptanceTest { @@ -41,17 +40,15 @@ public Endpoint() }); } - public class TimeoutSharingSaga1 : SqlSaga, + public class TimeoutSharingSaga1 : Saga, IAmStartedByMessages, IHandleTimeouts { - protected override string CorrelationPropertyName => nameof(TimeoutSharingSagaData1.CorrelationProperty); - public Context Context { get; set; } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrelationProperty); } public Task Handle(StartSagaMessage message, IMessageHandlerContext context) @@ -72,15 +69,13 @@ public class TimeoutSharingSagaData1 : ContainSagaData } - public class TimeoutSharingSaga2 : SqlSaga, IAmStartedByMessages, IHandleTimeouts + public class TimeoutSharingSaga2 : Saga, IAmStartedByMessages, IHandleTimeouts { - protected override string CorrelationPropertyName => nameof(TimeoutSharingSagaData2.CorrelationProperty); - public Context Context { get; set; } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrelationProperty); } public Task Handle(StartSagaMessage message, IMessageHandlerContext context) 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 index 9907a2f69..784e9e9c7 100644 --- 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 @@ -6,7 +6,6 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; public class When_sending_from_a_saga_handle : NServiceBusAcceptanceTest { @@ -36,10 +35,8 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class TwoSaga1Saga1 : SqlSaga, IAmStartedByMessages, IHandleMessages + public class TwoSaga1Saga1 : Saga, IAmStartedByMessages, IHandleMessages { - protected override string CorrelationPropertyName => nameof(TwoSaga1Saga1Data.DataId); - public Task Handle(StartSaga1 message, IMessageHandlerContext context) { Data.DataId = message.DataId; @@ -58,10 +55,10 @@ await context.SendLocal(new StartSaga2 MarkAsComplete(); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } } @@ -70,10 +67,8 @@ public class TwoSaga1Saga1Data : ContainSagaData public virtual Guid DataId { get; set; } } - public class TwoSaga1Saga2 : SqlSaga, IAmStartedByMessages + public class TwoSaga1Saga2 : Saga, IAmStartedByMessages { - protected override string CorrelationPropertyName => nameof(TwoSaga1Saga2Data.DataId); - public Context Context { get; set; } public Task Handle(StartSaga2 message, IMessageHandlerContext context) @@ -84,9 +79,9 @@ public Task Handle(StartSaga2 message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class TwoSaga1Saga2Data : ContainSagaData 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 index 2c0cbb862..774e23624 100644 --- 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 @@ -6,7 +6,6 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; public class When_sending_from_a_saga_timeout : NServiceBusAcceptanceTest { @@ -36,12 +35,10 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class SendFromTimeoutSaga1 : SqlSaga, + public class SendFromTimeoutSaga1 : Saga, IAmStartedByMessages, IHandleTimeouts { - protected override string CorrelationPropertyName => nameof(SendFromTimeoutSaga1Data.DataId); - public Context TestContext { get; set; } public Task Handle(StartSaga1 message, IMessageHandlerContext context) @@ -59,9 +56,9 @@ await context.SendLocal(new StartSaga2 MarkAsComplete(); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class SendFromTimeoutSaga1Data : ContainSagaData @@ -70,10 +67,8 @@ public class SendFromTimeoutSaga1Data : ContainSagaData } } - public class SendFromTimeoutSaga2 : SqlSaga, IAmStartedByMessages + public class SendFromTimeoutSaga2 : Saga, IAmStartedByMessages { - protected override string CorrelationPropertyName => nameof(SendFromTimeoutSaga2Data.DataId); - public Context Context { get; set; } public Task Handle(StartSaga2 message, IMessageHandlerContext context) @@ -83,9 +78,9 @@ public Task Handle(StartSaga2 message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class SendFromTimeoutSaga2Data : ContainSagaData 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 index e6f5ae08b..ac442ea56 100644 --- 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 @@ -6,7 +6,6 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; //Repro for #1323 public class When_started_by_base_event_from_other_saga : NServiceBusAcceptanceTest @@ -65,10 +64,9 @@ public SagaThatIsStartedByABaseEvent() metadata => metadata.RegisterPublisherFor(typeof(Publisher))); } - public class SagaStartedByBaseEvent : SqlSaga, IAmStartedByMessages + public class SagaStartedByBaseEvent : Saga, IAmStartedByMessages { public SagaContext Context { get; set; } - protected override string CorrelationPropertyName => nameof(SagaStartedByBaseEventSagaData.DataId); public Task Handle(BaseEvent message, IMessageHandlerContext context) { @@ -78,9 +76,9 @@ public Task Handle(BaseEvent message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class SagaStartedByBaseEventSagaData : ContainSagaData 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 index 98b66ad29..d44f41ece 100644 --- 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 @@ -6,8 +6,6 @@ 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 @@ -57,12 +55,10 @@ public SagaThatPublishesAnEvent() }); } - public class EventFromOtherSaga1 : SqlSaga, + public class EventFromOtherSaga1 : Saga, IAmStartedByMessages, IHandleTimeouts { - protected override string CorrelationPropertyName => nameof(EventFromOtherSaga1Data.DataId); - public Context TestContext { get; set; } public async Task Handle(StartSaga message, IMessageHandlerContext context) @@ -83,9 +79,9 @@ public Task Timeout(Timeout1 state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class EventFromOtherSaga1Data : ContainSagaData @@ -111,12 +107,10 @@ public SagaThatIsStartedByTheEvent() metadata => metadata.RegisterPublisherFor(typeof(SagaThatPublishesAnEvent))); } - public class EventFromOtherSaga2 : SqlSaga, + public class EventFromOtherSaga2 : Saga, IAmStartedByMessages, IHandleTimeouts { - protected override string CorrelationPropertyName => nameof(EventFromOtherSaga2Data.DataId); - public Context Context { get; set; } public Task Handle(SomethingHappenedEvent message, IMessageHandlerContext context) @@ -133,9 +127,9 @@ public Task Timeout(Saga2Timeout state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class EventFromOtherSaga2Data : ContainSagaData 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 index b2b5d247e..8f1c567a8 100644 --- 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 @@ -7,7 +7,6 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; - using Persistence.Sql; public class When_timeout_hit_not_found_saga : NServiceBusAcceptanceTest { @@ -38,14 +37,12 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class TimeoutHitsNotFoundSaga : SqlSaga, + public class TimeoutHitsNotFoundSaga : Saga, IAmStartedByMessages, IHandleSagaNotFound, IHandleTimeouts, IHandleMessages { - protected override string CorrelationPropertyName => nameof(TimeoutHitsNotFoundSagaData.DataId); - public Context TestContext { get; set; } public async Task Handle(StartSaga message, IMessageHandlerContext context) @@ -86,10 +83,10 @@ public Task Timeout(MyTimeout state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class TimeoutHitsNotFoundSagaData : ContainSagaData 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 index 443716cb9..3b815ba2d 100644 --- 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 @@ -7,8 +7,6 @@ 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 @@ -75,7 +73,7 @@ public SagaEndpoint() metadata => metadata.RegisterPublisherFor(typeof(Publisher))); } - public class Saga1 : SqlSaga, + public class Saga1 : Saga, IAmStartedByMessages, IHandleMessages { @@ -98,11 +96,10 @@ public Task Handle(CompleteSaga1Now message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(MySaga1Data.DataId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class MySaga1Data : ContainSagaData @@ -111,7 +108,7 @@ public class MySaga1Data : ContainSagaData } } - public class Saga2 : SqlSaga, + public class Saga2 : Saga, IAmStartedByMessages, IHandleMessages { @@ -132,11 +129,10 @@ public Task Handle(GroupPendingEvent message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override string CorrelationPropertyName => nameof(MySaga2Data.DataId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class MySaga2Data : ContainSagaData 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 index 983363889..4aa07f2b3 100644 --- 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 @@ -7,7 +7,6 @@ using AcceptanceTesting.Support; using EndpointTemplates; using NUnit.Framework; - using Persistence.Sql; public class When_updating_existing_correlation_property : NServiceBusAcceptanceTest { @@ -42,7 +41,7 @@ public ChangePropertyEndpoint() EndpointSetup(); } - public class ChangeCorrPropertySaga : SqlSaga, IAmStartedByMessages + public class ChangeCorrPropertySaga : Saga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -62,10 +61,10 @@ public Task Handle(StartSagaMessage message, IMessageHandlerContext context) }); } - protected override string CorrelationPropertyName => nameof(ChangeCorrPropertySagaData.SomeId); - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId); + mapper.ConfigureMapping(m => m.SomeId) + .ToSaga(s => s.SomeId); } } 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 index 0ce1df8b9..245674c98 100644 --- 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 @@ -6,7 +6,6 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; public class When_using_a_received_message_for_timeout : NServiceBusAcceptanceTest { @@ -38,10 +37,8 @@ public ReceiveMessageForTimeoutEndpoint() EndpointSetup(config => config.EnableFeature()); } - public class TestSaga01 : SqlSaga, IAmStartedByMessages, IHandleTimeouts + public class TestSaga01 : Saga, IAmStartedByMessages, IHandleTimeouts { - protected override string CorrelationPropertyName => nameof(TestSagaData01.SomeId); - public Context TestContext { get; set; } public Task Handle(StartSagaMessage message, IMessageHandlerContext context) @@ -57,9 +54,10 @@ public Task Timeout(StartSagaMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId); + mapper.ConfigureMapping(m => m.SomeId) + .ToSaga(s => s.SomeId); } } 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 index 7b78af72d..f326cfc3f 100644 --- 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 @@ -6,7 +6,6 @@ using EndpointTemplates; using Features; using NUnit.Framework; - using Persistence.Sql; public class When_using_contain_saga_data : NServiceBusAcceptanceTest { @@ -37,12 +36,10 @@ public EndpointThatHostsASaga() EndpointSetup(config => config.EnableFeature()); } - public class MySaga : SqlSaga, + public class MySaga : Saga, IAmStartedByMessages, IHandleTimeouts { - protected override string CorrelationPropertyName => nameof(MySagaData.DataId); - public Context TestContext { get; set; } public Task Handle(StartSaga message, IMessageHandlerContext context) @@ -59,9 +56,9 @@ public Task Timeout(TimeHasPassed state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureMapping(IMessagePropertyMapper mapper) + protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); } public class MySagaData : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_xml_serializer_processes_message_without_type_header.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_xml_serializer_processes_message_without_type_header.cs new file mode 100644 index 000000000..6838ec8ca --- /dev/null +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Serialization/When_xml_serializer_processes_message_without_type_header.cs @@ -0,0 +1,73 @@ +namespace NServiceBus.AcceptanceTests.Serialization +{ + using System; + using System.Threading.Tasks; + using AcceptanceTesting; + using EndpointTemplates; + using NServiceBus.Pipeline; + using NUnit.Framework; + + public class When_xml_serializer_processes_message_without_type_header : NServiceBusAcceptanceTest + { + [Test] + public async Task Should_work_in_unobtrusive() + { + var context = await Scenario.Define() + .WithEndpoint(c => c.When(s => s.SendLocal(new MessageToBeDetectedByRootNodeName()))) + .Done(c => c.WasCalled) + .Run(); + + Assert.True(context.WasCalled); + } + + public class Context : ScenarioContext + { + public bool WasCalled { get; set; } + } + + public class Sender : EndpointConfigurationBuilder + { + public Sender() + { + EndpointSetup(c => + { + c.Conventions().DefiningMessagesAs(t => t == typeof(MessageToBeDetectedByRootNodeName)); + c.Pipeline.Register(typeof(RemoveTheTypeHeader), "Removes the message type header to simulate receiving a native message"); + c.UseSerialization(); + }) + //Need to include the message since it can't be nested inside the test class, see below + .IncludeType(); + } + + public class MyMessageHandler : IHandleMessages + { + public Context Context { get; set; } + + public Task Handle(MessageToBeDetectedByRootNodeName message, IMessageHandlerContext context) + { + Context.WasCalled = true; + return Task.FromResult(0); + } + } + + public class RemoveTheTypeHeader : Behavior + { + public override Task Invoke(IDispatchContext context, Func next) + { + foreach (var op in context.Operations) + { + op.Message.Headers.Remove(Headers.EnclosedMessageTypes); + } + + return next(); + } + } + } + } + + //Can't be nested inside the test class since the xml serializer can't deal with nested types + public class MessageToBeDetectedByRootNodeName + { + public int Data { 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 index 8163f3630..5b35e1045 100644 --- 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 @@ -1,27 +1,24 @@ 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() + public async Task Should_deserialize_message() { var expectedData = 1; var context = await Scenario.Define() - .WithEndpoint(c => c.When(s => s.Send(new MyCommand + .WithEndpoint(c => c.When(s => s.SendLocal(new MyMessage { Data = expectedData }))) - .WithEndpoint() .Done(c => c.WasCalled) - .Run(TimeSpan.FromSeconds(10)); + .Run(); Assert.AreEqual(expectedData, context.Data); } @@ -38,43 +35,25 @@ public Sender() { EndpointSetup(c => { - c.Conventions().DefiningCommandsAs(t => t.Namespace != null && t.FullName.EndsWith("Command")); + c.Conventions().DefiningMessagesAs(t => t == typeof(MyMessage)); 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 class MyMessageHandler : IHandleMessages { public Context Context { get; set; } - public Task Handle(ICommand message, IMessageHandlerContext context) + public Task Handle(MyMessage message, IMessageHandlerContext context) { - Context.Data = ((MyCommand) message).Data; + Context.Data = message.Data; Context.WasCalled = true; return Task.FromResult(0); } } } - public interface ICommand - { - } - - public class MyCommand : ICommand + public class MyMessage { public int Data { get; set; } } diff --git a/src/AcceptanceTestsHolder/packages.config b/src/AcceptanceTestsHolder/packages.config index 2afbc4b4d..bbe52d0fd 100644 --- a/src/AcceptanceTestsHolder/packages.config +++ b/src/AcceptanceTestsHolder/packages.config @@ -1,7 +1,7 @@  - - - + + + \ No newline at end of file From a84747f435ebaa19a0931e983b547cf12f697513 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 11 May 2018 14:51:27 -0400 Subject: [PATCH 30/32] Add customized test files back --- .../ConfigureEndpointLearningTransport.cs | 7 +++- .../When_Deferring_a_message.cs | 2 +- ...hen_using_special_characters_in_headers.cs | 2 +- .../Outbox/When_clearing_saga_timeouts.cs | 8 ++-- ...When_headers_contain_special_characters.cs | 2 +- .../When_an_endpoint_replies_to_a_saga.cs | 11 +++-- ...en_correlated_property_value_is_changed.cs | 8 ++-- .../When_correlating_on_special_characters.cs | 15 ++++--- ...en_doing_request_response_between_sagas.cs | 25 ++++++----- .../Sagas/When_message_has_a_saga_id.cs | 10 +++-- .../Sagas/When_receiving_multiple_timeouts.cs | 10 +++-- .../When_reply_from_saga_not_found_handler.cs | 13 +++--- .../Sagas/When_replying_to_originator.cs | 23 +++++----- ...n_replying_to_originator_from_a_timeout.cs | 23 +++++----- .../Sagas/When_replying_to_saga_event.cs | 9 ++-- .../When_saga_exists_for_start_message.cs | 9 ++-- .../When_saga_handles_unmapped_message.cs | 11 +++-- .../When_saga_has_a_non_empty_constructor.cs | 13 +++--- .../Sagas/When_saga_id_changed.cs | 8 ++-- ...en_saga_is_mapped_to_complex_expression.cs | 14 +++---- ...ga_message_goes_through_delayed_retries.cs | 13 +++--- .../Sagas/When_saga_started_concurrently.cs | 11 +++-- .../Sagas/When_sagas_cant_be_found.cs | 42 +++++++++++-------- .../When_sagas_share_timeout_messages.cs | 17 +++++--- .../Sagas/When_sending_from_a_saga_handle.cs | 19 +++++---- .../Sagas/When_sending_from_a_saga_timeout.cs | 17 +++++--- ...n_started_by_base_event_from_other_saga.cs | 8 ++-- ...When_started_by_event_from_another_saga.cs | 18 +++++--- .../Sagas/When_timeout_hit_not_found_saga.cs | 11 +++-- ...n_two_sagas_subscribe_to_the_same_event.cs | 20 +++++---- ..._updating_existing_correlation_property.cs | 9 ++-- ...en_using_a_received_message_for_timeout.cs | 10 +++-- .../Sagas/When_using_contain_saga_data.cs | 9 ++-- 33 files changed, 256 insertions(+), 171 deletions(-) diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs index 66e1babf9..f243f219a 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/ConfigureEndpointLearningTransport.cs @@ -39,8 +39,11 @@ public Task Configure(string endpointName, EndpointConfiguration configuration, //we want the tests to be exposed to concurrency configuration.LimitMessageProcessingConcurrencyTo(PushRuntimeSettings.Default.MaxConcurrency); - configuration.UseTransport() - .StorageDirectory(storageDir); + var transport = configuration.UseTransport(); +#if (MySQL) + transport.Transactions(TransportTransactionMode.SendsAtomicWithReceive); +#endif + transport.StorageDirectory(storageDir); return Task.FromResult(0); } 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 index 61bcf56c4..ee42f3900 100644 --- 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 @@ -7,7 +7,7 @@ using Features; using NUnit.Framework; - public class When_deferring_a_message : NServiceBusAcceptanceTest + public partial class When_deferring_a_message : NServiceBusAcceptanceTest { [Test] public async Task Should_delay_delivery() diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs index 354c6fef8..bf3595b56 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/DelayedDelivery/When_using_special_characters_in_headers.cs @@ -8,7 +8,7 @@ using Features; using NUnit.Framework; - public class When_using_special_characters_in_headers : NServiceBusAcceptanceTest + public partial class When_using_special_characters_in_headers : NServiceBusAcceptanceTest { readonly Dictionary specialHeaders = new Dictionary { diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs index 17f0b386b..0488ca57b 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_clearing_saga_timeouts.cs @@ -7,6 +7,7 @@ using Extensibility; using Features; using NServiceBus; + using NServiceBus.Persistence.Sql; using NServiceBus.Outbox; using NServiceBus.Persistence; using NUnit.Framework; @@ -60,17 +61,18 @@ public Task Handle(SignalDone message, IMessageHandlerContext context) } } - public class PlaceOrderSaga : Saga, IAmStartedByMessages + public class PlaceOrderSaga : SqlSaga, IAmStartedByMessages { public Task Handle(PlaceOrder message, IMessageHandlerContext context) { MarkAsComplete(); return context.SendLocal(new SignalDone()); } + protected override string CorrelationPropertyName => nameof(PlaceOrderSagaData.DataId); - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class PlaceOrderSagaData : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs index d2b1ea18a..60fe0eb42 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Outbox/When_headers_contain_special_characters.cs @@ -8,7 +8,7 @@ using NServiceBus.Pipeline; using NUnit.Framework; - public class When_headers_contain_special_characters : NServiceBusAcceptanceTest + public partial class When_headers_contain_special_characters : NServiceBusAcceptanceTest { static Dictionary sentHeaders = new Dictionary { 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 index 98439e875..81b11634d 100644 --- 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 @@ -7,6 +7,7 @@ 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. @@ -64,7 +65,7 @@ public EndpointThatHostsASaga() }); } - public class CorrelationTestSaga : Saga, + public class CorrelationTestSaga : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -86,10 +87,12 @@ public Task Handle(DoSomethingResponse message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(CorrelationTestSagaData.RunId); + + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.RunId).ToSaga(s => s.RunId); - mapper.ConfigureMapping(m => m.RunId).ToSaga(s => s.RunId); + mapper.ConfigureMapping(m => m.RunId); + mapper.ConfigureMapping(m => m.RunId); } public class CorrelationTestSagaData : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs index bd9309bbc..cd12d2b85 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_correlated_property_value_is_changed.cs @@ -6,6 +6,7 @@ using AcceptanceTesting.Support; using EndpointTemplates; using NUnit.Framework; + using Persistence.Sql; [TestFixture] public class When_correlated_property_value_is_changed : NServiceBusAcceptanceTest @@ -41,7 +42,7 @@ public Endpoint() EndpointSetup(); } - public class CorrIdChangedSaga : Saga, + public class CorrIdChangedSaga : SqlSaga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -53,9 +54,10 @@ public Task Handle(StartSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(CorrIdChangedSagaData.DataId); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class CorrIdChangedSagaData : ContainSagaData 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 index 21348c8c0..5d2cfebc3 100644 --- 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 @@ -4,8 +4,9 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; + using NServiceBus.Persistence.Sql; - class When_correlating_special_chars : NServiceBusAcceptanceTest + partial class When_correlating_special_chars : NServiceBusAcceptanceTest { [Test] public async Task Saga_persistence_and_correlation_should_work() @@ -36,13 +37,13 @@ public SpecialCharacterSagaEndpoint() EndpointSetup(); } - public class SagaDataSpecialValues : ContainSagaData + public class SagaDataWithSpecialPropertyValues : ContainSagaData { public virtual string SpecialCharacterValues { get; set; } } public class SagaSpecialValues : - Saga, + SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -53,10 +54,12 @@ public SagaSpecialValues(Context testContext) this.testContext = testContext; } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(SagaDataWithSpecialPropertyValues.SpecialCharacterValues); + + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SpecialCharacterValues).ToSaga(s => s.SpecialCharacterValues); - mapper.ConfigureMapping(m => m.SpecialCharacterValues).ToSaga(s => s.SpecialCharacterValues); + mapper.ConfigureMapping(m => m.SpecialCharacterValues); + mapper.ConfigureMapping(m => m.SpecialCharacterValues); } public Task Handle(MessageWithSpecialPropertyValues message, IMessageHandlerContext context) diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs index f1bbd99a0..1f2867eb2 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_doing_request_response_between_sagas.cs @@ -6,8 +6,9 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; - public class When_doing_request_response_between_sagas : NServiceBusAcceptanceTest + public partial class When_doing_request_response_between_sagas : NServiceBusAcceptanceTest { [Test] public async Task Should_autocorrelate_the_response_back_to_the_requesting_saga() @@ -32,7 +33,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestResponseRequestingSaga1 : Saga, + public class RequestResponseRequestingSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -42,10 +43,12 @@ public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext contex { return context.SendLocal(new RequestToRespondingSaga { - SomeId = Guid.NewGuid() + SomeId = Guid.NewGuid() }); } + protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData1.CorrIdForResponse); + public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context) { TestContext.DidRequestingSagaGetTheResponse = true; @@ -54,20 +57,19 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context return Task.FromResult(0); } - - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrIdForResponse); - mapper.ConfigureMapping(m => m.SomeCorrelationId).ToSaga(s => s.CorrIdForResponse); + mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.SomeCorrelationId); } public class RequestResponseRequestingSagaData1 : ContainSagaData { - public virtual Guid CorrIdForResponse { get; set; } + public virtual Guid CorrIdForResponse { get; set; } } } - public class RequestResponseRespondingSaga1 : Saga, + public class RequestResponseRespondingSaga1 : SqlSaga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -80,9 +82,10 @@ public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext conte return context.Reply(new ResponseFromOtherSaga{SomeCorrelationId = Guid.NewGuid()}); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData1.CorrIdForRequest); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId).ToSaga(s => s.CorrIdForRequest); + mapper.ConfigureMapping(m => m.SomeId); } public class RequestResponseRespondingSagaData1 : ContainSagaData 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 index cd3182130..7828819d0 100644 --- 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 @@ -7,6 +7,7 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; + using Persistence.Sql; public class When_message_has_a_saga_id : NServiceBusAcceptanceTest { @@ -51,11 +52,13 @@ public SagaEndpoint() EndpointSetup(c => c.EnableFeature()); } - public class MessageWithSagaIdSaga : Saga, + 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) @@ -76,10 +79,9 @@ public Task Timeout(MessageWithSagaId state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId) - .ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class MessageWithSagaIdSagaData : ContainSagaData 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 index 8e245a8a6..b432642e0 100644 --- 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 @@ -7,6 +7,7 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; + using Persistence.Sql; public class When_receiving_multiple_timeouts : NServiceBusAcceptanceTest { @@ -47,11 +48,13 @@ public Endpoint() }); } - public class MultiTimeoutsSaga1 : Saga, + 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) @@ -101,10 +104,9 @@ public Task Timeout(Saga2Timeout state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.ContextId) - .ToSaga(s => s.ContextId); + mapper.ConfigureMapping(m => m.ContextId); } public class MultiTimeoutsSaga1Data : ContainSagaData 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 index 299c2402b..bac3538b6 100644 --- 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 @@ -8,6 +8,7 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; + using Persistence.Sql; public class When_reply_from_saga_not_found_handler : NServiceBusAcceptanceTest { @@ -59,8 +60,10 @@ public ReceiverWithSaga() EndpointSetup(c => c.EnableFeature()); } - public class NotFoundHandlerSaga1 : Saga, IAmStartedByMessages, IHandleMessages + public class NotFoundHandlerSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages { + protected override string CorrelationPropertyName => nameof(NotFoundHandlerSaga1Data.ContextId); + public Task Handle(StartSaga1 message, IMessageHandlerContext context) { Data.ContextId = message.ContextId; @@ -72,12 +75,10 @@ public Task Handle(MessageToSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.ContextId) - .ToSaga(s => s.ContextId); - mapper.ConfigureMapping(m => m.ContextId) - .ToSaga(s => s.ContextId); + mapper.ConfigureMapping(m => m.ContextId); + mapper.ConfigureMapping(m => m.ContextId); } public class NotFoundHandlerSaga1Data : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs index e2e5a6e40..e6c1309b9 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator.cs @@ -6,6 +6,7 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; public class When_replying_to_originator : NServiceBusAcceptanceTest { @@ -32,7 +33,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestResponseRequestingSaga2 : Saga, + public class RequestResponseRequestingSaga2 : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -55,10 +56,11 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData2.CorrIdForResponse); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrIdForResponse); - mapper.ConfigureMapping(m => m.SomeCorrelationId).ToSaga(s => s.CorrIdForResponse); + mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.SomeCorrelationId); } public class RequestResponseRequestingSagaData2 : ContainSagaData @@ -67,7 +69,8 @@ public class RequestResponseRequestingSagaData2 : ContainSagaData } } - public class RequestResponseRespondingSaga2 : Saga, + public class RequestResponseRespondingSaga2 : + SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -84,17 +87,17 @@ public Task Handle(RequestToRespondingSaga message, IMessageHandlerContext conte public Task Handle(SendReplyFromNonInitiatingHandler message, IMessageHandlerContext context) { //reply to originator must be used here since the sender of the incoming message is this saga and not the requesting saga - return ReplyToOriginator(context, new ResponseFromOtherSaga + return ReplyToOriginator(context, new ResponseFromOtherSaga { SomeCorrelationId = Data.CorrIdForRequest }); } - - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData2.CorrIdForRequest); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs).ToSaga(s => s.CorrIdForRequest); + mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs); //this line is just needed so we can test the non-initiating handler case - mapper.ConfigureMapping(m => m.SagaIdSoWeCanCorrelate).ToSaga(s => s.CorrIdForRequest); + mapper.ConfigureMapping(m => m.SagaIdSoWeCanCorrelate); } public class RequestResponseRespondingSagaData2 : ContainSagaData diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs index c851eab5a..0be50f074 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_originator_from_a_timeout.cs @@ -6,8 +6,9 @@ namespace NServiceBus.AcceptanceTests.Sagas using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; - public class When_replying_to_originator_from_a_timeout : NServiceBusAcceptanceTest + public partial class When_replying_to_originator_from_a_timeout : NServiceBusAcceptanceTest { [Test] public async Task Should_route_the_message_to_the_endpoint_starting_the_saga() @@ -32,7 +33,7 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class RequestResponseRequestingSaga3 : Saga, + public class RequestResponseRequestingSaga3 : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -42,7 +43,7 @@ public Task Handle(InitiateRequestingSaga message, IMessageHandlerContext contex { return context.SendLocal(new RequestToRespondingSaga { - SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse + SomeIdThatTheResponseSagaCanCorrelateBackToUs = Data.CorrIdForResponse }); } @@ -55,10 +56,11 @@ public Task Handle(ResponseFromOtherSaga message, IMessageHandlerContext context return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(RequestResponseRequestingSagaData3.CorrIdForResponse); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrIdForResponse); - mapper.ConfigureMapping(m => m.SomeCorrelationId).ToSaga(s => s.CorrIdForResponse); + mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.SomeCorrelationId); } public class RequestResponseRequestingSagaData3 : ContainSagaData @@ -67,7 +69,8 @@ public class RequestResponseRequestingSagaData3 : ContainSagaData } } - public class RequestResponseRespondingSaga3 : Saga, + public class RequestResponseRespondingSaga3 : + SqlSaga, IAmStartedByMessages, IHandleTimeouts { @@ -87,12 +90,12 @@ public Task Timeout(DelayReply state, IMessageHandlerContext context) }); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(RequestResponseRespondingSagaData3.CorrIdForRequest); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs).ToSaga(s => s.CorrIdForRequest); + mapper.ConfigureMapping(m => m.SomeIdThatTheResponseSagaCanCorrelateBackToUs); } - public class RequestResponseRespondingSagaData3 : ContainSagaData { public virtual Guid CorrIdForRequest { get; set; } diff --git a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs index 8d2598048..fdd3da87b 100644 --- a/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs +++ b/src/AcceptanceTestsHolder/App_Packages/NSB.AcceptanceTests/Sagas/When_replying_to_saga_event.cs @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; public class When_replying_to_saga_event : NServiceBusAcceptanceTest { @@ -70,10 +71,12 @@ public SagaEndpoint() }); } - public class ReplyToPubMsgSaga : Saga, IAmStartedByMessages, IHandleMessages + public class ReplyToPubMsgSaga : SqlSaga, IAmStartedByMessages, IHandleMessages { public Context Context { get; set; } + protected override string CorrelationPropertyName => nameof(ReplyToPubMsgSagaData.DataId); + public Task Handle(StartSaga message, IMessageHandlerContext context) { return context.Publish(new DidSomething @@ -88,9 +91,9 @@ public Task Handle(DidSomethingResponse message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class ReplyToPubMsgSagaData : ContainSagaData 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 index c0cf33ec7..c8843c542 100644 --- 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 @@ -6,6 +6,7 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; + using Persistence.Sql; public class When_saga_exists_for_start_message : NServiceBusAcceptanceTest { @@ -47,9 +48,10 @@ public ExistingSagaInstanceEndpoint() EndpointSetup(c => c.LimitMessageProcessingConcurrencyTo(1)); } - public class TestSaga05 : Saga, IAmStartedByMessages + public class TestSaga05 : SqlSaga, IAmStartedByMessages { public Context TestContext { get; set; } + protected override string CorrelationPropertyName => nameof(TestSagaData05.SomeId); public Task Handle(StartSagaMessage message, IMessageHandlerContext context) { @@ -58,10 +60,9 @@ public Task Handle(StartSagaMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId) - .ToSaga(s => s.SomeId); + mapper.ConfigureMapping(m => m.SomeId); } } 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 index 9b814b066..96e1b4875 100644 --- 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 @@ -6,6 +6,7 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; + using Persistence.Sql; public class When_saga_handles_unmapped_message : NServiceBusAcceptanceTest { @@ -49,17 +50,19 @@ public UnmappedMsgEndpoint() EndpointSetup(); } - public class UnmappedMsgSaga : Saga, + public class UnmappedMsgSaga : SqlSaga, IAmStartedByMessages, IHandleMessages, IHandleMessages { + protected override string CorrelationPropertyName => nameof(UnmappedMsgSagaData.SomeId); + public Context Context { get; set; } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(msg => msg.SomeId).ToSaga(saga => saga.SomeId); - mapper.ConfigureMapping(msg => msg.SomeId).ToSaga(saga => saga.SomeId); + mapper.ConfigureMapping(msg => msg.SomeId); + mapper.ConfigureMapping(msg => msg.SomeId); // No mapping for EchoMessage, so saga can't possibly be found } 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 index 0f1ddf413..200687bc5 100644 --- 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 @@ -5,6 +5,7 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; + using Persistence.Sql; public class When_saga_has_a_non_empty_constructor : NServiceBusAcceptanceTest { @@ -34,10 +35,12 @@ public NonEmptySagaCtorEndpt() EndpointSetup(); } - public class TestSaga11 : Saga, + public class TestSaga11 : SqlSaga, IAmStartedByMessages, IHandleMessages { + protected override string CorrelationPropertyName => nameof(TestSagaData11.SomeId); + public TestSaga11(Context testContext) { this.testContext = testContext; @@ -58,12 +61,10 @@ public Task Handle(OtherMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId) - .ToSaga(s => s.SomeId); - mapper.ConfigureMapping(m => m.SomeId) - .ToSaga(s => s.SomeId); + mapper.ConfigureMapping(m => m.SomeId); + mapper.ConfigureMapping(m => m.SomeId); } Context testContext; 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 index 4d951228d..a707d63b8 100644 --- 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 @@ -7,6 +7,7 @@ using AcceptanceTesting.Support; using EndpointTemplates; using NUnit.Framework; + using Persistence.Sql; [TestFixture] public class When_saga_id_changed : NServiceBusAcceptanceTest @@ -41,7 +42,7 @@ public Endpoint() EndpointSetup(); } - public class SagaIdChangedSaga : Saga, + public class SagaIdChangedSaga : SqlSaga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -53,9 +54,10 @@ public Task Handle(StartSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(SagaIdChangedSagaData.DataId); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class SagaIdChangedSagaData : ContainSagaData 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 index 73d282938..db0f7e8d7 100644 --- 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 @@ -5,6 +5,7 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; + using NServiceBus.Persistence.Sql; public class When_saga_is_mapped_to_complex_expression : NServiceBusAcceptanceTest { @@ -45,7 +46,7 @@ public SagaEndpoint() EndpointSetup(c => c.LimitMessageProcessingConcurrencyTo(1)); } - public class TestSaga02 : Saga, + public class TestSaga02 : SqlSaga, IAmStartedByMessages, IAmStartedByMessages { public Context Context { get; set; } @@ -64,13 +65,12 @@ public Task Handle(StartSagaMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) - { - mapper.ConfigureMapping(m => m.Key) - .ToSaga(s => s.KeyValue); + protected override string CorrelationPropertyName => nameof(TestSagaData02.KeyValue); - mapper.ConfigureMapping(m => m.Part1 + "_" + m.Part2) - .ToSaga(s => s.KeyValue); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) + { + mapper.ConfigureMapping(m => m.Key); + mapper.ConfigureMapping(m => m.Part1 + "_" + m.Part2); } } 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 index 62af8aeff..375bc11e4 100644 --- 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 @@ -6,6 +6,7 @@ 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 @@ -45,10 +46,12 @@ public DelayedRetryEndpoint() }); } - public class DelayedRetryTestingSaga : Saga, + 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) @@ -75,12 +78,10 @@ public Task Handle(SecondSagaMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId) - .ToSaga(s => s.SomeId); - mapper.ConfigureMapping(m => m.SomeId) - .ToSaga(s => s.SomeId); + mapper.ConfigureMapping(m => m.SomeId); + mapper.ConfigureMapping(m => m.SomeId); } } 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 index a981b1a02..fb526553b 100644 --- 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 @@ -5,6 +5,7 @@ using AcceptanceTesting; using EndpointTemplates; using NUnit.Framework; + using Persistence.Sql; public class When_saga_started_concurrently : NServiceBusAcceptanceTest { @@ -54,10 +55,12 @@ public ConcurrentHandlerEndpoint() }); } - public class ConcurrentlyStartedSaga : Saga, + 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) @@ -82,10 +85,10 @@ await context.SendLocal(new SuccessfulProcessing CheckForCompletion(context); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(msg => msg.SomeId).ToSaga(saga => saga.OrderId); - mapper.ConfigureMapping(msg => msg.SomeId).ToSaga(saga => saga.OrderId); + mapper.ConfigureMapping(msg => msg.SomeId); + mapper.ConfigureMapping(msg => msg.SomeId); } void CheckForCompletion(IMessageHandlerContext context) 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 index 202ea2b47..fca0921f8 100644 --- 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 @@ -7,8 +7,9 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; + using Persistence.Sql; - public class When_sagas_cant_be_found : NServiceBusAcceptanceTest + public partial class When_sagas_cant_be_found : NServiceBusAcceptanceTest { [Test] public async Task IHandleSagaNotFound_only_called_once() @@ -51,7 +52,7 @@ public ReceiverWithSagas() EndpointSetup(config => config.EnableFeature()); } - public class CantBeFoundSaga1 : Saga, IAmStartedByMessages, IHandleMessages + public class CantBeFoundSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages { public Task Handle(StartSaga message, IMessageHandlerContext context) { @@ -64,10 +65,12 @@ public Task Handle(MessageToSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + + protected override string CorrelationPropertyName => nameof(CantBeFoundSaga1Data.MessageId); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); + mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id); } public class CantBeFoundSaga1Data : ContainSagaData @@ -76,7 +79,7 @@ public class CantBeFoundSaga1Data : ContainSagaData } } - public class CantBeFoundSaga2 : Saga, IAmStartedByMessages, IHandleMessages + public class CantBeFoundSaga2 : SqlSaga, IAmStartedByMessages, IHandleMessages { public Task Handle(StartSaga message, IMessageHandlerContext context) { @@ -89,16 +92,18 @@ public Task Handle(MessageToSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); + 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 @@ -125,7 +130,7 @@ public ReceiverWithOrderedSagas() }); } - public class ReceiverWithOrderedSagasSaga1 : Saga, IAmStartedByMessages, IHandleMessages + public class ReceiverWithOrderedSagasSaga1 : SqlSaga, IAmStartedByMessages, IHandleMessages { public Task Handle(StartSaga message, IMessageHandlerContext context) { @@ -138,10 +143,12 @@ public Task Handle(MessageToSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(ReceiverWithOrderedSagasSaga1Data.MessageId); + + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); + mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id); } public class ReceiverWithOrderedSagasSaga1Data : ContainSagaData @@ -150,7 +157,7 @@ public class ReceiverWithOrderedSagasSaga1Data : ContainSagaData } } - public class ReceiverWithOrderedSagasSaga2 : Saga, IHandleMessages, IAmStartedByMessages + public class ReceiverWithOrderedSagasSaga2 : SqlSaga, IHandleMessages, IAmStartedByMessages { public Context Context { get; set; } @@ -167,10 +174,11 @@ public Task Handle(StartSaga message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(ReceiverWithOrderedSagasSaga2Data.MessageId); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.MessageId); + mapper.ConfigureMapping(m => m.Id); + mapper.ConfigureMapping(m => m.Id); } public class ReceiverWithOrderedSagasSaga2Data : ContainSagaData 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 index 63f9d5d03..8e47c52d7 100644 --- 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 @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; public class When_sagas_share_timeout_messages : NServiceBusAcceptanceTest { @@ -40,15 +41,17 @@ public Endpoint() }); } - public class TimeoutSharingSaga1 : Saga, + public class TimeoutSharingSaga1 : SqlSaga, IAmStartedByMessages, IHandleTimeouts { + protected override string CorrelationPropertyName => nameof(TimeoutSharingSagaData1.CorrelationProperty); + public Context Context { get; set; } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrelationProperty); + mapper.ConfigureMapping(m => m.Id); } public Task Handle(StartSagaMessage message, IMessageHandlerContext context) @@ -69,13 +72,15 @@ public class TimeoutSharingSagaData1 : ContainSagaData } - public class TimeoutSharingSaga2 : Saga, IAmStartedByMessages, IHandleTimeouts + public class TimeoutSharingSaga2 : SqlSaga, IAmStartedByMessages, IHandleTimeouts { + protected override string CorrelationPropertyName => nameof(TimeoutSharingSagaData2.CorrelationProperty); + public Context Context { get; set; } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.Id).ToSaga(s => s.CorrelationProperty); + mapper.ConfigureMapping(m => m.Id); } public Task Handle(StartSagaMessage message, IMessageHandlerContext context) 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 index 784e9e9c7..9907a2f69 100644 --- 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 @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; public class When_sending_from_a_saga_handle : NServiceBusAcceptanceTest { @@ -35,8 +36,10 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class TwoSaga1Saga1 : Saga, IAmStartedByMessages, IHandleMessages + public class TwoSaga1Saga1 : SqlSaga, IAmStartedByMessages, IHandleMessages { + protected override string CorrelationPropertyName => nameof(TwoSaga1Saga1Data.DataId); + public Task Handle(StartSaga1 message, IMessageHandlerContext context) { Data.DataId = message.DataId; @@ -55,10 +58,10 @@ await context.SendLocal(new StartSaga2 MarkAsComplete(); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId); } } @@ -67,8 +70,10 @@ public class TwoSaga1Saga1Data : ContainSagaData public virtual Guid DataId { get; set; } } - public class TwoSaga1Saga2 : Saga, IAmStartedByMessages + public class TwoSaga1Saga2 : SqlSaga, IAmStartedByMessages { + protected override string CorrelationPropertyName => nameof(TwoSaga1Saga2Data.DataId); + public Context Context { get; set; } public Task Handle(StartSaga2 message, IMessageHandlerContext context) @@ -79,9 +84,9 @@ public Task Handle(StartSaga2 message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class TwoSaga1Saga2Data : ContainSagaData 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 index 774e23624..2c0cbb862 100644 --- 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 @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; public class When_sending_from_a_saga_timeout : NServiceBusAcceptanceTest { @@ -35,10 +36,12 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class SendFromTimeoutSaga1 : Saga, + 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) @@ -56,9 +59,9 @@ await context.SendLocal(new StartSaga2 MarkAsComplete(); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class SendFromTimeoutSaga1Data : ContainSagaData @@ -67,8 +70,10 @@ public class SendFromTimeoutSaga1Data : ContainSagaData } } - public class SendFromTimeoutSaga2 : Saga, IAmStartedByMessages + public class SendFromTimeoutSaga2 : SqlSaga, IAmStartedByMessages { + protected override string CorrelationPropertyName => nameof(SendFromTimeoutSaga2Data.DataId); + public Context Context { get; set; } public Task Handle(StartSaga2 message, IMessageHandlerContext context) @@ -78,9 +83,9 @@ public Task Handle(StartSaga2 message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class SendFromTimeoutSaga2Data : ContainSagaData 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 index ac442ea56..e6f5ae08b 100644 --- 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 @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; //Repro for #1323 public class When_started_by_base_event_from_other_saga : NServiceBusAcceptanceTest @@ -64,9 +65,10 @@ public SagaThatIsStartedByABaseEvent() metadata => metadata.RegisterPublisherFor(typeof(Publisher))); } - public class SagaStartedByBaseEvent : Saga, IAmStartedByMessages + public class SagaStartedByBaseEvent : SqlSaga, IAmStartedByMessages { public SagaContext Context { get; set; } + protected override string CorrelationPropertyName => nameof(SagaStartedByBaseEventSagaData.DataId); public Task Handle(BaseEvent message, IMessageHandlerContext context) { @@ -76,9 +78,9 @@ public Task Handle(BaseEvent message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class SagaStartedByBaseEventSagaData : ContainSagaData 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 index d44f41ece..98b66ad29 100644 --- 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 @@ -6,6 +6,8 @@ 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 @@ -55,10 +57,12 @@ public SagaThatPublishesAnEvent() }); } - public class EventFromOtherSaga1 : Saga, + 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) @@ -79,9 +83,9 @@ public Task Timeout(Timeout1 state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class EventFromOtherSaga1Data : ContainSagaData @@ -107,10 +111,12 @@ public SagaThatIsStartedByTheEvent() metadata => metadata.RegisterPublisherFor(typeof(SagaThatPublishesAnEvent))); } - public class EventFromOtherSaga2 : Saga, + 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) @@ -127,9 +133,9 @@ public Task Timeout(Saga2Timeout state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class EventFromOtherSaga2Data : ContainSagaData 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 index 8f1c567a8..b2b5d247e 100644 --- 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 @@ -7,6 +7,7 @@ using Features; using NServiceBus.Sagas; using NUnit.Framework; + using Persistence.Sql; public class When_timeout_hit_not_found_saga : NServiceBusAcceptanceTest { @@ -37,12 +38,14 @@ public Endpoint() EndpointSetup(config => config.EnableFeature()); } - public class TimeoutHitsNotFoundSaga : Saga, + 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) @@ -83,10 +86,10 @@ public Task Timeout(MyTimeout state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class TimeoutHitsNotFoundSagaData : ContainSagaData 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 index 3b815ba2d..443716cb9 100644 --- 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 @@ -7,6 +7,8 @@ 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 @@ -73,7 +75,7 @@ public SagaEndpoint() metadata => metadata.RegisterPublisherFor(typeof(Publisher))); } - public class Saga1 : Saga, + public class Saga1 : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -96,10 +98,11 @@ public Task Handle(CompleteSaga1Now message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(MySaga1Data.DataId); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class MySaga1Data : ContainSagaData @@ -108,7 +111,7 @@ public class MySaga1Data : ContainSagaData } } - public class Saga2 : Saga, + public class Saga2 : SqlSaga, IAmStartedByMessages, IHandleMessages { @@ -129,10 +132,11 @@ public Task Handle(GroupPendingEvent message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(MySaga2Data.DataId); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class MySaga2Data : ContainSagaData 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 index 4aa07f2b3..983363889 100644 --- 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 @@ -7,6 +7,7 @@ using AcceptanceTesting.Support; using EndpointTemplates; using NUnit.Framework; + using Persistence.Sql; public class When_updating_existing_correlation_property : NServiceBusAcceptanceTest { @@ -41,7 +42,7 @@ public ChangePropertyEndpoint() EndpointSetup(); } - public class ChangeCorrPropertySaga : Saga, IAmStartedByMessages + public class ChangeCorrPropertySaga : SqlSaga, IAmStartedByMessages { public Context TestContext { get; set; } @@ -61,10 +62,10 @@ public Task Handle(StartSagaMessage message, IMessageHandlerContext context) }); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override string CorrelationPropertyName => nameof(ChangeCorrPropertySagaData.SomeId); + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId) - .ToSaga(s => s.SomeId); + mapper.ConfigureMapping(m => m.SomeId); } } 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 index 245674c98..0ce1df8b9 100644 --- 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 @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; public class When_using_a_received_message_for_timeout : NServiceBusAcceptanceTest { @@ -37,8 +38,10 @@ public ReceiveMessageForTimeoutEndpoint() EndpointSetup(config => config.EnableFeature()); } - public class TestSaga01 : Saga, IAmStartedByMessages, IHandleTimeouts + 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) @@ -54,10 +57,9 @@ public Task Timeout(StartSagaMessage message, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.SomeId) - .ToSaga(s => s.SomeId); + mapper.ConfigureMapping(m => m.SomeId); } } 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 index f326cfc3f..7b78af72d 100644 --- 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 @@ -6,6 +6,7 @@ using EndpointTemplates; using Features; using NUnit.Framework; + using Persistence.Sql; public class When_using_contain_saga_data : NServiceBusAcceptanceTest { @@ -36,10 +37,12 @@ public EndpointThatHostsASaga() EndpointSetup(config => config.EnableFeature()); } - public class MySaga : Saga, + 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) @@ -56,9 +59,9 @@ public Task Timeout(TimeHasPassed state, IMessageHandlerContext context) return Task.FromResult(0); } - protected override void ConfigureHowToFindSaga(SagaPropertyMapper mapper) + protected override void ConfigureMapping(IMessagePropertyMapper mapper) { - mapper.ConfigureMapping(m => m.DataId).ToSaga(s => s.DataId); + mapper.ConfigureMapping(m => m.DataId); } public class MySagaData : ContainSagaData From a1d6077ee22b18dd6a22be1a0cfaa664f07bee7e Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 11 May 2018 15:11:49 -0400 Subject: [PATCH 31/32] Update Integration package versions --- src/Integration/Shared/Shared.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Integration/Shared/Shared.csproj b/src/Integration/Shared/Shared.csproj index e8d4f7bfd..91cd38e1c 100644 --- a/src/Integration/Shared/Shared.csproj +++ b/src/Integration/Shared/Shared.csproj @@ -6,10 +6,10 @@ - + - + \ No newline at end of file From 8d8e9f015821a7790ee55e0545cc2443e97f2656 Mon Sep 17 00:00:00 2001 From: Brandon Ording Date: Fri, 11 May 2018 15:52:10 -0400 Subject: [PATCH 32/32] Fix inspections --- src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs | 9 ++++----- src/SqlPersistence/Subscription/SubscriptionPersister.cs | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs b/src/ScriptBuilder.Tests/Saga/SagaDefinitionReaderTest.cs index cb35422a0..972dbce3a 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; @@ -28,7 +27,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 +56,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 @@ -79,7 +78,7 @@ public void NonSqlSaga() var sagaType = module.GetTypeDefinition(); var exception = Assert.Throws(() => { - SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out SagaDefinition _); + SagaDefinitionReader.TryGetSqlSagaDefinition(sagaType, out _); }); Assert.IsNotNull(exception.Message); #if NET452 @@ -133,7 +132,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 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 _); } } }