Skip to content

Commit

Permalink
Merge pull request #424 from Particular/transactional-session-v2
Browse files Browse the repository at this point in the history
Transactional session v2
  • Loading branch information
danielmarbach authored Sep 9, 2022
2 parents a320245 + dcaac34 commit ab89422
Show file tree
Hide file tree
Showing 33 changed files with 930 additions and 34 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
<PropertyGroup>
<TargetFrameworks>net472;net6.0</TargetFrameworks>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\Test.snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>..\NServiceBusTests.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.0.1" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="Nunit" Version="3.13.3" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="8.0.0-rc.1" GeneratePathProperty="true" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="8.0.0-rc.3" GeneratePathProperty="true" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
<PropertyGroup>
<TargetFrameworks>net472;net6.0</TargetFrameworks>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\Test.snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>..\NServiceBusTests.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.0.1" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="Nunit" Version="3.13.3" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="8.0.0-rc.1" GeneratePathProperty="true" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="8.0.0-rc.3" GeneratePathProperty="true" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
<PropertyGroup>
<TargetFrameworks>net472;net6.0</TargetFrameworks>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\Test.snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>..\NServiceBusTests.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.0.1" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="NUnit" Version="3.13.3" />
<PackageReference Include="NServiceBus.PersistenceTests.Sources" Version="8.0.0-rc.1" GeneratePathProperty="true" />
<PackageReference Include="NServiceBus.PersistenceTests.Sources" Version="8.0.0-rc.3" GeneratePathProperty="true" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
<PropertyGroup>
<TargetFrameworks>net472;net6.0</TargetFrameworks>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\Test.snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>..\NServiceBusTests.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.0.1" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="Nunit" Version="3.13.3" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="8.0.0-rc.1" GeneratePathProperty="true" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="8.0.0-rc.3" GeneratePathProperty="true" />
</ItemGroup>

<ItemGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@
<PropertyGroup>
<TargetFrameworks>net472;net6.0</TargetFrameworks>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\Test.snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>..\NServiceBusTests.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.0.1" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="Nunit" Version="3.13.3" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="8.0.0-rc.1" GeneratePathProperty="true" />
<PackageReference Include="NServiceBus.AcceptanceTests.Sources" Version="8.0.0-rc.3" GeneratePathProperty="true" />
</ItemGroup>

<ItemGroup>
Expand Down
2 changes: 1 addition & 1 deletion src/NServiceBus.Persistence.CosmosDB.Tests/ApiApprovals.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class APIApprovals
[Test]
public void Approve()
{
var publicApi = ApiGenerator.GeneratePublicApi(typeof(CosmosPersistence).Assembly, new ApiGeneratorOptions
var publicApi = typeof(CosmosPersistence).Assembly.GeneratePublicApi(new ApiGeneratorOptions
{
ExcludeAttributes = new[] { "System.Runtime.Versioning.TargetFrameworkAttribute", "System.Reflection.AssemblyMetadataAttribute" }
});
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.Persistence.CosmosDB.LogicalOutbox.AcceptanceTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.Persistence.CosmosDB.NonTransactionalSagas.AcceptanceTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.Persistence.CosmosDB.PersistenceTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.Persistence.CosmosDB.PessimisticLock.AcceptanceTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.Persistence.CosmosDB.PhysicalOutbox.AcceptanceTests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.Persistence.CosmosDB.Tests, PublicKey=00240000048000009400000006020000002400005253413100040000010001007f16e21368ff041183fab592d9e8ed37e7be355e93323147a1d29983d6e591b04282e4da0c9e18bd901e112c0033925eb7d7872c2f1706655891c5c9d57297994f707d16ee9a8f40d978f064ee1ffc73c0db3f4712691b23bf596f75130f4ec978cf78757ec034625a5f27e6bb50c618931ea49f6f628fd74271c32959efb1c5")]
[assembly: System.Runtime.CompilerServices.InternalsVisibleTo(@"NServiceBus.Persistence.CosmosDB.TransactionalSession, PublicKey=0024000004800000940000000602000000240000525341310004000001000100dde965e6172e019ac82c2639ffe494dd2e7dd16347c34762a05732b492e110f2e4e2e1b5ef2d85c848ccfb671ee20a47c8d1376276708dc30a90ff1121b647ba3b7259a6bc383b2034938ef0e275b58b920375ac605076178123693c6c4f1331661a62eba28c249386855637780e3ff5f23a6d854700eaa6803ef48907513b92")]
namespace NServiceBus
{
public readonly struct ContainerInformation
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
<PropertyGroup>
<TargetFrameworks>net472;net6.0</TargetFrameworks>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>..\Test.snk</AssemblyOriginatorKeyFile>
<AssemblyOriginatorKeyFile>..\NServiceBusTests.snk</AssemblyOriginatorKeyFile>
<LangVersion>10.0</LangVersion>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="GitHubActionsTestLogger" Version="2.0.1" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.0" />
<PackageReference Include="Microsoft.Azure.Cosmos" Version="3.30.1" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.1" />
<PackageReference Include="NServiceBus" Version="8.0.0-rc.1" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.1" />
<PackageReference Include="NServiceBus" Version="8.0.0-rc.3" />
<PackageReference Include="NServiceBus.Testing" Version="8.0.0-rc.2" />
<PackageReference Include="NUnit3TestAdapter" Version="4.2.1" />
<PackageReference Include="Nunit" Version="3.13.3" />
</ItemGroup>
Expand Down
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
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;
}
}
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>();
}
}
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;
}
}
}
}
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; }
}
}
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;
};
}
}
}
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;
}
}
}
Loading

0 comments on commit ab89422

Please sign in to comment.