Skip to content

Commit 0d3c540

Browse files
author
Christian
committed
Use base test context to capture all service provider
1 parent 5342bec commit 0d3c540

8 files changed

+120
-91
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,15 @@
1-
namespace NServiceBus.TransactionalSession.AcceptanceTests
2-
{
3-
using System;
4-
using System.Threading;
5-
using System.Threading.Tasks;
6-
using NServiceBus.AcceptanceTesting;
7-
using NServiceBus.Features;
1+
namespace NServiceBus.TransactionalSession.AcceptanceTests;
2+
3+
using System;
4+
using System.Threading;
5+
using System.Threading.Tasks;
6+
using Features;
87

9-
public class CaptureServiceProviderStartupTask : FeatureStartupTask
10-
{
11-
public CaptureServiceProviderStartupTask(IServiceProvider serviceProvider, ScenarioContext context)
12-
{
13-
if (context is IInjectServiceProvider c)
14-
{
15-
c.ServiceProvider = serviceProvider;
16-
}
17-
}
8+
public class CaptureServiceProviderStartupTask : FeatureStartupTask
9+
{
10+
public CaptureServiceProviderStartupTask(IServiceProvider serviceProvider, TransactionalSessionTestContext context, string endpointName) => context.RegisterServiceProvider(serviceProvider, endpointName);
1811

19-
protected override Task OnStart(IMessageSession session, CancellationToken cancellationToken = default) => Task.CompletedTask;
12+
protected override Task OnStart(IMessageSession session, CancellationToken cancellationToken = default) => Task.CompletedTask;
2013

21-
protected override Task OnStop(IMessageSession session, CancellationToken cancellationToken = default) => Task.CompletedTask;
22-
}
14+
protected override Task OnStop(IMessageSession session, CancellationToken cancellationToken = default) => Task.CompletedTask;
2315
}

src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/Infrastructure/DefaultServer.cs

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,12 @@ namespace NServiceBus.TransactionalSession.AcceptanceTests;
77
using AcceptanceTesting;
88
using AcceptanceTesting.Customization;
99
using AcceptanceTesting.Support;
10-
using Configuration.AdvancedExtensibility;
1110
using global::NHibernate.Driver;
1211
using NUnit.Framework;
13-
using Persistence;
1412
using Persistence.NHibernate;
1513

1614
public class DefaultServer : IEndpointSetupTemplate
1715
{
18-
const string DefaultConnStr = @"Server=localhost\SqlExpress;Database=nservicebus;Trusted_Connection=True;";
19-
20-
public static string ConnectionString
21-
{
22-
get
23-
{
24-
string env = Environment.GetEnvironmentVariable("SQLServerConnectionString");
25-
return string.IsNullOrEmpty(env) ? DefaultConnStr : env;
26-
}
27-
}
28-
2916
public virtual async Task<EndpointConfiguration> GetConfiguration(RunDescriptor runDescriptor,
3017
EndpointCustomizationConfiguration endpointConfiguration,
3118
Func<EndpointConfiguration, Task> configurationBuilderCustomization)
@@ -52,15 +39,9 @@ public virtual async Task<EndpointConfiguration> GetConfiguration(RunDescriptor
5239

5340
builder.UseTransport(new AcceptanceTestingTransport { StorageLocation = storageDir });
5441

55-
PersistenceExtensions<NHibernatePersistence> persistence = builder.UsePersistence<NHibernatePersistence>();
56-
persistence.ConnectionString(ConnectionString);
57-
persistence.EnableTransactionalSession();
58-
59-
builder.GetSettings().Set(persistence);
60-
61-
if (!typeof(IDoNotCaptureServiceProvider).IsAssignableFrom(endpointConfiguration.BuilderType))
42+
if (runDescriptor.ScenarioContext is TransactionalSessionTestContext testContext)
6243
{
63-
builder.RegisterStartupTask(sp => new CaptureServiceProviderStartupTask(sp, runDescriptor.ScenarioContext));
44+
builder.RegisterStartupTask(sp => new CaptureServiceProviderStartupTask(sp, testContext, endpointConfiguration.EndpointName));
6445
}
6546

6647
await configurationBuilderCustomization(builder).ConfigureAwait(false);

src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/Infrastructure/IDoNotCaptureServiceProvider.cs

Lines changed: 0 additions & 5 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,30 @@
1-
namespace NServiceBus.TransactionalSession.AcceptanceTests
1+
namespace NServiceBus.TransactionalSession.AcceptanceTests;
2+
3+
using System;
4+
using System.Threading.Tasks;
5+
using AcceptanceTesting.Support;
6+
using Persistence;
7+
8+
public class TransactionSessionDefaultServer : DefaultServer
29
{
3-
using System;
4-
using System.Threading.Tasks;
5-
using AcceptanceTesting.Support;
6-
using Configuration.AdvancedExtensibility;
7-
public class TransactionSessionDefaultServer : DefaultServer
10+
const string DefaultConnStr = @"Server=localhost\SqlExpress;Database=nservicebus;Trusted_Connection=True;";
11+
12+
public static string ConnectionString
813
{
9-
public override async Task<EndpointConfiguration> GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointCustomization, Func<EndpointConfiguration, Task> configurationBuilderCustomization)
14+
get
1015
{
11-
var endpointConfiguration = await base.GetConfiguration(runDescriptor, endpointCustomization, configurationBuilderCustomization);
12-
13-
endpointConfiguration.GetSettings().Get<PersistenceExtensions<NHibernatePersistence>>()
14-
.EnableTransactionalSession();
15-
16-
return endpointConfiguration;
16+
string env = Environment.GetEnvironmentVariable("SQLServerConnectionString");
17+
return string.IsNullOrEmpty(env) ? DefaultConnStr : env;
1718
}
1819
}
20+
public override async Task<EndpointConfiguration> GetConfiguration(RunDescriptor runDescriptor, EndpointCustomizationConfiguration endpointConfiguration,
21+
Func<EndpointConfiguration, Task> configurationBuilderCustomization) =>
22+
await base.GetConfiguration(runDescriptor, endpointConfiguration, async configuration =>
23+
{
24+
PersistenceExtensions<NHibernatePersistence> persistence = configuration.UsePersistence<NHibernatePersistence>();
25+
persistence.ConnectionString(ConnectionString);
26+
persistence.EnableTransactionalSession();
27+
28+
await configurationBuilderCustomization(configuration);
29+
});
1930
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
namespace NServiceBus.TransactionalSession.AcceptanceTests;
2+
3+
using System;
4+
using System.Collections.Concurrent;
5+
using System.Reflection;
6+
using AcceptanceTesting;
7+
8+
public class TransactionalSessionTestContext : ScenarioContext
9+
{
10+
public IServiceProvider ServiceProvider
11+
{
12+
get
13+
{
14+
var property = typeof(ScenarioContext).GetProperty("CurrentEndpoint", BindingFlags.NonPublic | BindingFlags.Static);
15+
16+
if (property!.GetValue(this) is not string endpointName)
17+
{
18+
throw new InvalidOperationException("Access to the service provider of the endpoint is only possible with in a When statement.");
19+
}
20+
21+
if (!serviceProviders.TryGetValue(endpointName, out var serviceProvider))
22+
{
23+
throw new InvalidOperationException("Could not find service provider for endpoint " + endpointName);
24+
}
25+
26+
return serviceProvider;
27+
}
28+
}
29+
30+
public void RegisterServiceProvider(IServiceProvider serviceProvider, string endpointName) => serviceProviders[endpointName] = serviceProvider;
31+
32+
readonly ConcurrentDictionary<string, IServiceProvider> serviceProviders = new();
33+
}

src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/When_using_outbox_send_only.cs

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,7 @@ namespace NServiceBus.TransactionalSession.AcceptanceTests;
66
using Microsoft.Extensions.DependencyInjection;
77
using AcceptanceTesting;
88
using AcceptanceTesting.Customization;
9-
using Configuration.AdvancedExtensibility;
109
using NUnit.Framework;
11-
using Pipeline;
1210

1311
public class When_using_outbox_send_only : NServiceBusAcceptanceTest
1412
{
@@ -35,35 +33,62 @@ public async Task Should_send_messages_on_transactional_session_commit()
3533
.Done(c => c.MessageReceived)
3634
.Run();
3735

38-
Assert.That(context.ControlMessageReceived, Is.True);
3936
Assert.That(context.MessageReceived, Is.True);
4037
}
4138

42-
class Context : ScenarioContext, IInjectServiceProvider
39+
[Test]
40+
public void Should_throw_when_processor_address_not_specified()
4341
{
44-
public bool MessageReceived { get; set; }
42+
var exception = Assert.ThrowsAsync<InvalidOperationException>(async () =>
43+
{
44+
await Scenario.Define<Context>()
45+
.WithEndpoint<SendOnlyEndpointWithoutProcessor>()
46+
.Done(c => c.MessageReceived)
47+
.Run();
48+
});
49+
50+
Assert.That(exception?.Message, Is.EqualTo("A configured ProcessorAddress is required when using the transactional session and the outbox with send-only endpoints"));
51+
}
4552

46-
public IServiceProvider ServiceProvider { get; set; }
53+
class Context : TransactionalSessionTestContext
54+
{
55+
//public CustomTestingOutboxStorage SharedOutboxStorage { get; } = new();
4756

48-
public bool ControlMessageReceived { get; set; }
57+
public bool MessageReceived { get; set; }
4958
}
5059

5160
class SendOnlyEndpoint : EndpointConfigurationBuilder
5261
{
53-
public SendOnlyEndpoint() => EndpointSetup<TransactionSessionDefaultServer>(c =>
62+
public SendOnlyEndpoint() => EndpointSetup<TransactionSessionWithOutboxEndpoint>((c, runDescriptor) =>
5463
{
55-
var persistence = c.GetSettings().Get<PersistenceExtensions<NHibernatePersistence>>();
56-
5764
var options = new TransactionalSessionOptions { ProcessorAddress = Conventions.EndpointNamingConvention.Invoke(typeof(ProcessorEndpoint)) };
5865

66+
var persistence = c.UsePersistence<NHibernatePersistence>();
67+
68+
//options.SharedOutboxStorage(((Context)runDescriptor.ScenarioContext).SharedOutboxStorage);
69+
5970
persistence.EnableTransactionalSession(options);
6071

6172
c.EnableOutbox();
6273
c.SendOnly();
6374
});
6475
}
6576

66-
class AnotherEndpoint : EndpointConfigurationBuilder, IDoNotCaptureServiceProvider
77+
class SendOnlyEndpointWithoutProcessor : EndpointConfigurationBuilder
78+
{
79+
public SendOnlyEndpointWithoutProcessor() => EndpointSetup<TransactionSessionWithOutboxEndpoint>(c =>
80+
{
81+
var persistence = c.UsePersistence<NHibernatePersistence>();
82+
83+
// Deliberately not passing a ProcessorAddress via TransactionalSessionOptions
84+
persistence.EnableTransactionalSession();
85+
86+
c.EnableOutbox();
87+
c.SendOnly();
88+
});
89+
}
90+
91+
class AnotherEndpoint : EndpointConfigurationBuilder
6792
{
6893
public AnotherEndpoint() => EndpointSetup<DefaultServer>();
6994

@@ -78,28 +103,22 @@ public Task Handle(SampleMessage message, IMessageHandlerContext context)
78103
}
79104
}
80105

81-
class ProcessorEndpoint : EndpointConfigurationBuilder, IDoNotCaptureServiceProvider
106+
class ProcessorEndpoint : EndpointConfigurationBuilder
82107
{
83-
public ProcessorEndpoint() => EndpointSetup<TransactionSessionDefaultServer>(c =>
84-
{
85-
c.Pipeline.Register(typeof(DiscoverControlMessagesBehavior), "Discovers control messages");
86-
c.EnableOutbox();
87-
c.ConfigureTransport().TransportTransactionMode = TransportTransactionMode.ReceiveOnly;
88-
}
89-
);
90-
91-
class DiscoverControlMessagesBehavior(Context testContext) : Behavior<ITransportReceiveContext>
108+
public ProcessorEndpoint() => EndpointSetup<TransactionSessionWithOutboxEndpoint>((c, runDescriptor) =>
92109
{
93-
public override async Task Invoke(ITransportReceiveContext context, Func<Task> next)
94-
{
95-
if (context.Message.Headers.ContainsKey("NServiceBus.TransactionalSession.CommitDelayIncrement"))
96-
{
97-
testContext.ControlMessageReceived = true;
98-
}
110+
c.EnableOutbox();
111+
c.ConfigureTransport().TransportTransactionMode = TransportTransactionMode.ReceiveOnly;
99112

100-
await next();
101-
}
113+
var persistence = c.UsePersistence<NHibernatePersistence>();
114+
115+
var options = new TransactionalSessionOptions();
116+
117+
//options.SharedOutboxStorage(((Context)runDescriptor.ScenarioContext).SharedOutboxStorage);
118+
119+
persistence.EnableTransactionalSession(options);
102120
}
121+
);
103122
}
104123

105124
class SampleMessage : ICommand

src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/When_using_transactional_session.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,10 @@ CREATE TABLE [dbo].[SomeTable]([Id] [nvarchar](50) NOT NULL)
144144
Assert.That(result, Is.EqualTo(rowId));
145145
}
146146

147-
class Context : ScenarioContext, IInjectServiceProvider
147+
class Context : TransactionalSessionTestContext
148148
{
149149
public bool MessageReceived { get; set; }
150150
public bool CompleteMessageReceived { get; set; }
151-
public IServiceProvider ServiceProvider { get; set; }
152151
}
153152

154153
class AnEndpoint : EndpointConfigurationBuilder

src/NServiceBus.NHibernate.TransactionalSession.AcceptanceTests/When_using_transactional_session_with_transactionscope.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -69,11 +69,10 @@ CREATE TABLE [dbo].[SomeTable]([Id] [nvarchar](50) NOT NULL)
6969
Assert.That(result, Is.EqualTo(rowId));
7070
}
7171

72-
class Context : ScenarioContext, IInjectServiceProvider
72+
class Context : TransactionalSessionTestContext
7373
{
7474
public bool MessageReceived { get; set; }
7575
public bool CompleteMessageReceived { get; set; }
76-
public IServiceProvider ServiceProvider { get; set; }
7776
}
7877

7978
class AnEndpoint : EndpointConfigurationBuilder

0 commit comments

Comments
 (0)