-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #424 from Particular/transactional-session-v2
Transactional session v2
- Loading branch information
Showing
33 changed files
with
930 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
3 changes: 2 additions & 1 deletion
3
src/NServiceBus.Persistence.CosmosDB.Tests/ApprovalFiles/APIApprovals.Approve.approved.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
12 changes: 12 additions & 0 deletions
12
src/NServiceBus.Persistence.CosmosDB.TransactionalSession.AcceptanceTests/.editorconfig
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
[*.cs] | ||
|
||
# Justification: Test project | ||
dotnet_diagnostic.CA2007.severity = none | ||
|
||
# Justification: Tests don't support cancellation and don't need to forward IMessageHandlerContext.CancellationToken | ||
dotnet_diagnostic.NSB0002.severity = suggestion | ||
dotnet_diagnostic.PS0018.severity = suggestion | ||
dotnet_diagnostic.PS0013.severity = suggestion | ||
|
||
# Persistene library doesn't need saga analyzers | ||
dotnet_diagnostic.NSB0004.severity = none |
23 changes: 23 additions & 0 deletions
23
....TransactionalSession.AcceptanceTests/Infrastructure/CaptureServiceProviderStartupTask.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
namespace NServiceBus.TransactionalSession.AcceptanceTests | ||
{ | ||
using System; | ||
using System.Threading; | ||
using System.Threading.Tasks; | ||
using NServiceBus.AcceptanceTesting; | ||
using NServiceBus.Features; | ||
|
||
public class CaptureServiceProviderStartupTask : FeatureStartupTask | ||
{ | ||
public CaptureServiceProviderStartupTask(IServiceProvider serviceProvider, ScenarioContext context) | ||
{ | ||
if (context is IInjectServiceProvider c) | ||
{ | ||
c.ServiceProvider = serviceProvider; | ||
} | ||
} | ||
|
||
protected override Task OnStart(IMessageSession session, CancellationToken cancellationToken = default) => Task.CompletedTask; | ||
|
||
protected override Task OnStop(IMessageSession session, CancellationToken cancellationToken = default) => Task.CompletedTask; | ||
} | ||
} |
16 changes: 16 additions & 0 deletions
16
...tence.CosmosDB.TransactionalSession.AcceptanceTests/Infrastructure/ConfigureExtensions.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
namespace NServiceBus.TransactionalSession.AcceptanceTests | ||
{ | ||
using Configuration.AdvancedExtensibility; | ||
using Transport; | ||
|
||
public static class ConfigureExtensions | ||
{ | ||
public static TransportDefinition ConfigureTransport(this EndpointConfiguration configuration) => | ||
configuration.GetSettings().Get<TransportDefinition>(); | ||
|
||
public static TTransportDefinition ConfigureTransport<TTransportDefinition>( | ||
this EndpointConfiguration configuration) | ||
where TTransportDefinition : TransportDefinition => | ||
(TTransportDefinition)configuration.GetSettings().Get<TransportDefinition>(); | ||
} | ||
} |
54 changes: 54 additions & 0 deletions
54
...nalSession.AcceptanceTests/Infrastructure/EndpointCustomizationConfigurationExtensions.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,54 @@ | ||
namespace NServiceBus.TransactionalSession.AcceptanceTests | ||
{ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using System.Reflection; | ||
using NServiceBus.AcceptanceTesting.Support; | ||
using Hosting.Helpers; | ||
|
||
public static class EndpointCustomizationConfigurationExtensions | ||
{ | ||
public static IEnumerable<Type> GetTypesScopedByTestClass(this EndpointCustomizationConfiguration endpointConfiguration) | ||
{ | ||
var assemblyScanner = new AssemblyScanner | ||
{ | ||
ScanFileSystemAssemblies = false | ||
}; | ||
|
||
var assemblies = assemblyScanner.GetScannableAssemblies(); | ||
|
||
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)); | ||
|
||
types = types.Union(endpointConfiguration.TypesToInclude); | ||
|
||
return types.Where(t => !endpointConfiguration.TypesToExclude.Contains(t)).ToList(); | ||
} | ||
|
||
static IEnumerable<Type> GetNestedTypeRecursive(Type rootType, Type builderType) | ||
{ | ||
if (rootType == null) | ||
{ | ||
throw new InvalidOperationException("Make sure you nest the endpoint infrastructure inside the TestFixture as nested classes"); | ||
} | ||
|
||
yield return rootType; | ||
|
||
if (typeof(IEndpointConfigurationFactory).IsAssignableFrom(rootType) && rootType != builderType) | ||
{ | ||
yield break; | ||
} | ||
|
||
foreach (var nestedType in rootType.GetNestedTypes(BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).SelectMany(t => GetNestedTypeRecursive(t, builderType))) | ||
{ | ||
yield return nestedType; | ||
} | ||
} | ||
} | ||
} |
9 changes: 9 additions & 0 deletions
9
...ce.CosmosDB.TransactionalSession.AcceptanceTests/Infrastructure/IInjectServiceProvider.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
namespace NServiceBus.TransactionalSession.AcceptanceTests | ||
{ | ||
using System; | ||
|
||
public interface IInjectServiceProvider | ||
{ | ||
IServiceProvider ServiceProvider { get; set; } | ||
} | ||
} |
40 changes: 40 additions & 0 deletions
40
...CosmosDB.TransactionalSession.AcceptanceTests/Infrastructure/NServiceBusAcceptanceTest.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
namespace NServiceBus.TransactionalSession.AcceptanceTests | ||
{ | ||
using System.Linq; | ||
using System.Threading; | ||
using NServiceBus.AcceptanceTesting.Customization; | ||
using NUnit.Framework; | ||
|
||
/// <summary> | ||
/// Base class for all the NSB test that sets up our conventions | ||
/// </summary> | ||
[TestFixture] | ||
public abstract class NServiceBusAcceptanceTest | ||
{ | ||
[SetUp] | ||
public void SetUp() | ||
{ | ||
#if NETFRAMEWORK | ||
// 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 => | ||
{ | ||
string classAndEndpoint = t.FullName.Split('.').Last(); | ||
string testName = classAndEndpoint.Split('+').First(); | ||
testName = testName.Replace("When_", ""); | ||
string endpointBuilder = classAndEndpoint.Split('+').Last(); | ||
testName = Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(testName); | ||
testName = testName.Replace("_", ""); | ||
return testName + "." + endpointBuilder; | ||
}; | ||
} | ||
} | ||
} |
69 changes: 69 additions & 0 deletions
69
...DB.TransactionalSession.AcceptanceTests/Infrastructure/TransactionSessionDefaultServer.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
namespace NServiceBus.TransactionalSession.AcceptanceTests | ||
{ | ||
using System; | ||
using System.Collections.Generic; | ||
using System.IO; | ||
using System.Threading.Tasks; | ||
using AcceptanceTesting; | ||
using AcceptanceTesting.Customization; | ||
using AcceptanceTesting.Support; | ||
using Microsoft.Azure.Cosmos; | ||
using Microsoft.Extensions.DependencyInjection; | ||
using NUnit.Framework; | ||
using Persistence.CosmosDB; | ||
|
||
public class TransactionSessionDefaultServer : IEndpointSetupTemplate | ||
{ | ||
public virtual async Task<EndpointConfiguration> GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration, | ||
Func<EndpointConfiguration, Task> configurationBuilderCustomization) | ||
{ | ||
var builder = new EndpointConfiguration(endpointConfiguration.EndpointName); | ||
builder.EnableInstallers(); | ||
|
||
builder.Recoverability() | ||
.Delayed(delayed => delayed.NumberOfRetries(0)) | ||
.Immediate(immediate => immediate.NumberOfRetries(0)); | ||
builder.SendFailedMessagesTo("error"); | ||
|
||
var storageDir = Path.Combine(Path.GetTempPath(), "learn", TestContext.CurrentContext.Test.ID); | ||
|
||
builder.UseTransport(new AcceptanceTestingTransport | ||
{ | ||
StorageLocation = storageDir | ||
}); | ||
|
||
var persistence = builder.UsePersistence<CosmosPersistence>(); | ||
persistence.EnableTransactionalSession(); | ||
persistence.DisableContainerCreation(); | ||
persistence.CosmosClient(SetupFixture.CosmosDbClient); | ||
persistence.DatabaseName(SetupFixture.DatabaseName); | ||
|
||
persistence.DefaultContainer(SetupFixture.ContainerName, SetupFixture.PartitionPathKey); | ||
|
||
builder.RegisterComponents(services => services.AddSingleton<IPartitionKeyFromHeadersExtractor, PartitionKeyProvider>()); | ||
|
||
builder.RegisterStartupTask(sp => new CaptureServiceProviderStartupTask(sp, runDescriptor.ScenarioContext)); | ||
|
||
await configurationBuilderCustomization(builder).ConfigureAwait(false); | ||
|
||
// scan types at the end so that all types used by the configuration have been loaded into the AppDomain | ||
builder.TypesToIncludeInScan(endpointConfiguration.GetTypesScopedByTestClass()); | ||
|
||
return builder; | ||
} | ||
|
||
class PartitionKeyProvider : IPartitionKeyFromHeadersExtractor | ||
{ | ||
|
||
public PartitionKeyProvider(ScenarioContext scenarioContext) => this.scenarioContext = scenarioContext; | ||
|
||
public bool TryExtract(IReadOnlyDictionary<string, string> headers, out PartitionKey? partitionKey) | ||
{ | ||
partitionKey = new PartitionKey(scenarioContext.TestRunId.ToString()); | ||
return true; | ||
} | ||
|
||
readonly ScenarioContext scenarioContext; | ||
} | ||
} | ||
} |
Oops, something went wrong.