Skip to content

Commit 296369d

Browse files
Acceptance tests: More done statements removal (#7563)
* Conventions * CriticalErrors * DelayedDelivery * DependencyInjection * Versioning * Hosting * Mutators * Diagnostics * Outbox * Learning * Fix race * Metrics * Traces --------- Co-authored-by: Daniel Marbach <danielmarbach@users.noreply.github.com>
1 parent 91c821e commit 296369d

File tree

30 files changed

+226
-371
lines changed

30 files changed

+226
-371
lines changed
Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace NServiceBus.AcceptanceTests.Core.Conventions;
22

3+
using System;
34
using System.Linq;
45
using System.Threading.Tasks;
56
using AcceptanceTesting;
@@ -11,17 +12,20 @@ namespace NServiceBus.AcceptanceTests.Core.Conventions;
1112
public class When_receiving_unobtrusive_message_without_handler : NServiceBusAcceptanceTest
1213
{
1314
[Test]
14-
public async Task Message_should_be_moved_to_error_because_handler_not_found()
15+
public void Message_should_be_moved_to_error_because_handler_not_found()
1516
{
16-
var context = await Scenario.Define<Context>()
17-
.WithEndpoint<Sender>(c => c.When(s => s.Send(new MyCommand())))
18-
.WithEndpoint<Receiver>(c => c.DoNotFailOnErrorMessages())
19-
.Done(c => !c.FailedMessages.IsEmpty)
20-
.Run();
17+
Context context = null;
18+
Assert.That(async () =>
19+
{
20+
await Scenario.Define<Context>(ctx => context = ctx)
21+
.WithEndpoint<Sender>(c => c.When(s => s.Send(new MyCommand())))
22+
.WithEndpoint<Receiver>()
23+
.Run();
24+
}, Throws.Exception.With.InnerException.InstanceOf<InvalidOperationException>().
25+
And.InnerException.Message.Contains("No handlers could be found for message type: NServiceBus.AcceptanceTests.Core.Conventions.When_receiving_unobtrusive_message_without_handler+MyCommand"));
2126

2227
using (Assert.EnterMultipleScope())
2328
{
24-
Assert.That(context.Logs.Any(l => l.Level == LogLevel.Error && l.Message.Contains($"No handlers could be found for message type: {typeof(MyCommand).FullName}")), Is.True, "No handlers could be found was not logged.");
2529
Assert.That(context.Logs.Any(l => l.Level == LogLevel.Warn && l.Message.Contains($"Message header '{typeof(MyCommand).FullName}' was mapped to type '{typeof(MyCommand).FullName}' but that type was not found in the message registry, ensure the same message registration conventions are used in all endpoints, especially if using unobtrusive mode.")), Is.False, "Message type could not be mapped.");
2630
Assert.That(context.Logs.Any(l => l.Level == LogLevel.Warn && l.Message.Contains($"Could not determine message type from message header '{typeof(MyCommand).FullName}'")), Is.False, "Message type could not be mapped.");
2731
}
@@ -31,30 +35,24 @@ public class Context : ScenarioContext;
3135

3236
public class Sender : EndpointConfigurationBuilder
3337
{
34-
public Sender()
35-
{
38+
public Sender() =>
3639
EndpointSetup<DefaultServer>(c =>
3740
{
3841
c.Conventions()
3942
.DefiningCommandsAs(t => t.Namespace != null && t.FullName == typeof(MyCommand).FullName);
4043
c.ConfigureRouting().RouteToEndpoint(typeof(MyCommand), typeof(Receiver));
4144
});
42-
}
4345
}
4446

4547

4648
public class Receiver : EndpointConfigurationBuilder
4749
{
48-
public Receiver()
49-
{
50+
public Receiver() =>
5051
EndpointSetup<DefaultServer>(c =>
5152
{
5253
c.Conventions().DefiningCommandsAs(t => t.Namespace != null && t.FullName == typeof(MyCommand).FullName);
5354
});
54-
}
5555
}
5656

57-
public class MyCommand
58-
{
59-
}
57+
public class MyCommand;
6058
}

src/NServiceBus.AcceptanceTests/Core/Conventions/When_sending_with_conventions.cs

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ public async Task Should_receive_the_message()
1717
await session.SendLocal<MyMessage>(m => m.Id = c.Id);
1818
await session.SendLocal<IMyInterfaceMessage>(m => m.Id = c.Id);
1919
}))
20-
.Done(c => c.MessageClassReceived && c.MessageInterfaceReceived)
2120
.Run();
2221

2322
using (Assert.EnterMultipleScope())
@@ -32,14 +31,13 @@ public class Context : ScenarioContext
3231
public bool MessageClassReceived { get; set; }
3332
public bool MessageInterfaceReceived { get; set; }
3433
public Guid Id { get; set; }
34+
35+
public void MaybeCompleted() => MarkAsCompleted(MessageClassReceived, MessageInterfaceReceived);
3536
}
3637

3738
public class Endpoint : EndpointConfigurationBuilder
3839
{
39-
public Endpoint()
40-
{
41-
EndpointSetup<DefaultServer>(b => b.Conventions().DefiningMessagesAs(type => type.Name.EndsWith("Message")));
42-
}
40+
public Endpoint() => EndpointSetup<DefaultServer>(b => b.Conventions().DefiningMessagesAs(type => type.Name.EndsWith("Message")));
4341
}
4442

4543
public class MyMessage
@@ -52,13 +50,8 @@ public interface IMyInterfaceMessage
5250
Guid Id { get; set; }
5351
}
5452

55-
public class MyMessageHandler : IHandleMessages<MyMessage>
53+
public class MyMessageHandler(Context testContext) : IHandleMessages<MyMessage>
5654
{
57-
public MyMessageHandler(Context context)
58-
{
59-
testContext = context;
60-
}
61-
6255
public Task Handle(MyMessage message, IMessageHandlerContext context)
6356
{
6457
if (testContext.Id != message.Id)
@@ -67,20 +60,14 @@ public Task Handle(MyMessage message, IMessageHandlerContext context)
6760
}
6861

6962
testContext.MessageClassReceived = true;
63+
testContext.MaybeCompleted();
7064

7165
return Task.CompletedTask;
7266
}
73-
74-
Context testContext;
7567
}
7668

77-
public class MyMessageInterfaceHandler : IHandleMessages<IMyInterfaceMessage>
69+
public class MyMessageInterfaceHandler(Context testContext) : IHandleMessages<IMyInterfaceMessage>
7870
{
79-
public MyMessageInterfaceHandler(Context context)
80-
{
81-
testContext = context;
82-
}
83-
8471
public Task Handle(IMyInterfaceMessage interfaceMessage, IMessageHandlerContext context)
8572
{
8673
if (testContext.Id != interfaceMessage.Id)
@@ -89,10 +76,9 @@ public Task Handle(IMyInterfaceMessage interfaceMessage, IMessageHandlerContext
8976
}
9077

9178
testContext.MessageInterfaceReceived = true;
79+
testContext.MaybeCompleted();
9280

9381
return Task.CompletedTask;
9482
}
95-
96-
Context testContext;
9783
}
9884
}

src/NServiceBus.AcceptanceTests/Core/CriticalError/When_raising_critical_error_at_startup.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,31 +15,31 @@ public class When_raising_critical_error_at_startup : NServiceBusAcceptanceTest
1515
[Test]
1616
public async Task Should_call_critical_error_action_for_every_error_that_occurred_before_startup()
1717
{
18-
var exceptions = new ConcurrentDictionary<string, Exception>();
19-
20-
Func<ICriticalErrorContext, CancellationToken, Task> addCritical = (criticalContext, _) =>
21-
{
22-
exceptions.TryAdd(criticalContext.Error, criticalContext.Exception);
23-
return Task.CompletedTask;
24-
};
25-
2618
var context = await Scenario.Define<TestContext>()
2719
.WithEndpoint<EndpointWithCriticalErrorStartup>(b =>
28-
b.CustomConfig(config => config.DefineCriticalErrorAction(addCritical)))
29-
.Done(c => c.CriticalErrorsRaised >= 2 && exceptions.Count >= 2)
20+
b.CustomConfig((config, ctx) => config.DefineCriticalErrorAction((errorContext, token) => CollectCriticalErrors(errorContext, ctx, token))))
3021
.Run();
3122

3223
using (Assert.EnterMultipleScope())
3324
{
3425
Assert.That(context.CriticalErrorsRaised, Is.EqualTo(2));
35-
Assert.That(exceptions, Has.Count.EqualTo(context.CriticalErrorsRaised));
26+
Assert.That(context.Exceptions, Has.Count.EqualTo(context.CriticalErrorsRaised));
27+
}
28+
29+
return;
30+
31+
Task CollectCriticalErrors(ICriticalErrorContext criticalContext, TestContext testContext, CancellationToken cancellationToken)
32+
{
33+
testContext.Exceptions.TryAdd(criticalContext.Error, criticalContext.Exception);
34+
testContext.MarkAsCompleted(testContext.Exceptions.Count >= 2);
35+
return Task.CompletedTask;
3636
}
3737
}
3838

3939
public class TestContext : ScenarioContext
4040
{
41-
public string ContextId { get; set; }
4241
public int CriticalErrorsRaised { get; set; }
42+
public ConcurrentDictionary<string, Exception> Exceptions { get; } = [];
4343
}
4444

4545
public class EndpointWithCriticalErrorStartup : EndpointConfigurationBuilder

src/NServiceBus.AcceptanceTests/Core/CriticalError/When_raising_critical_error_from_a_handler.cs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,19 +14,10 @@ public class When_raising_critical_error_from_a_handler : NServiceBusAcceptanceT
1414
[Test]
1515
public async Task Should_trigger_critical_error_action()
1616
{
17-
var exceptions = new ConcurrentDictionary<string, Exception>();
18-
19-
Func<ICriticalErrorContext, CancellationToken, Task> addCritical = (criticalContext, _) =>
20-
{
21-
exceptions.TryAdd(criticalContext.Error, criticalContext.Exception);
22-
return Task.CompletedTask;
23-
};
24-
25-
await Scenario.Define<TestContext>()
17+
var context = await Scenario.Define<TestContext>()
2618
.WithEndpoint<EndpointWithCriticalError>(b =>
2719
{
28-
b.CustomConfig(config => { config.DefineCriticalErrorAction(addCritical); });
29-
20+
b.CustomConfig((config, ctx) => config.DefineCriticalErrorAction((errorContext, token) => CollectCriticalErrors(errorContext, ctx, token)));
3021
b.When((session, c) =>
3122
{
3223
c.ContextId = Guid.NewGuid().ToString();
@@ -36,16 +27,23 @@ await Scenario.Define<TestContext>()
3627
});
3728
});
3829
})
39-
.Done(c => c.CriticalErrorsRaised > 0 && exceptions.Keys.Count > 0)
4030
.Run();
4131

42-
Assert.That(exceptions.Keys, Has.Count.EqualTo(1));
32+
Assert.That(context.Exceptions.Keys, Has.Count.EqualTo(1));
33+
34+
Task CollectCriticalErrors(ICriticalErrorContext criticalContext, TestContext testContext, CancellationToken cancellationToken)
35+
{
36+
testContext.Exceptions.TryAdd(criticalContext.Error, criticalContext.Exception);
37+
testContext.MarkAsCompleted(!testContext.Exceptions.IsEmpty);
38+
return Task.CompletedTask;
39+
}
4340
}
4441

4542
public class TestContext : ScenarioContext
4643
{
4744
public string ContextId { get; set; }
4845
public int CriticalErrorsRaised { get; set; }
46+
public ConcurrentDictionary<string, Exception> Exceptions { get; } = [];
4947
}
5048

5149
public class EndpointWithCriticalError : EndpointConfigurationBuilder

src/NServiceBus.AcceptanceTests/Core/DelayedDelivery/When_delayed_delivery_is_not_supported.cs

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,12 @@ public async Task Trying_to_delay_should_throw()
2525

2626
return session.Send(new MyMessage(), options);
2727
}))
28-
.Done(c => c.ExceptionThrown || c.SecondMessageReceived)
2928
.Run();
3029

3130
using (Assert.EnterMultipleScope())
3231
{
33-
Assert.That(context.ExceptionThrown, Is.EqualTo(true));
34-
Assert.That(context.SecondMessageReceived, Is.EqualTo(false));
32+
Assert.That(context.ExceptionThrown, Is.True);
33+
Assert.That(context.SecondMessageReceived, Is.False);
3534
}
3635

3736
}
@@ -44,18 +43,10 @@ public class Context : ScenarioContext
4443

4544
public class Endpoint : EndpointConfigurationBuilder
4645
{
47-
public Endpoint()
48-
{
49-
EndpointSetup<DefaultServer>();
50-
}
46+
public Endpoint() => EndpointSetup<DefaultServer>();
5147

52-
public class MyMessageHandler : IHandleMessages<MyMessage>, IHandleMessages<MyOtherMessage>
48+
public class MyMessageHandler(Context testContext) : IHandleMessages<MyMessage>, IHandleMessages<MyOtherMessage>
5349
{
54-
public MyMessageHandler(Context testContext)
55-
{
56-
this.testContext = testContext;
57-
}
58-
5950
public async Task Handle(MyMessage message, IMessageHandlerContext context)
6051
{
6152
try
@@ -70,25 +61,20 @@ public async Task Handle(MyMessage message, IMessageHandlerContext context)
7061
{
7162
Console.WriteLine(x.Message);
7263
testContext.ExceptionThrown = true;
64+
testContext.MarkAsCompleted();
7365
}
7466
}
7567

7668
public Task Handle(MyOtherMessage message, IMessageHandlerContext context)
7769
{
7870
testContext.SecondMessageReceived = true;
79-
71+
testContext.MarkAsCompleted();
8072
return Task.CompletedTask;
8173
}
82-
83-
Context testContext;
8474
}
8575
}
8676

87-
public class MyMessage : IMessage
88-
{
89-
}
77+
public class MyMessage : IMessage;
9078

91-
public class MyOtherMessage : IMessage
92-
{
93-
}
79+
public class MyOtherMessage : IMessage;
9480
}

src/NServiceBus.AcceptanceTests/Core/DependencyInjection/When_defining_same_dependencies_in_endpoints.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ public async Task Should_be_isolated_except_global_shared_once()
2525
b.Services(static services => services.AddSingleton<IDependency, MyDependency>())
2626
.CustomConfig(c => c.OverrideLocalAddress("DeeplyNestedDependenciesEndpoint2"))
2727
.When((session, c) => session.Send("DeeplyNestedDependenciesEndpoint2", new SomeMessage())))
28-
.Done(c => c.Dependencies.Count == 2)
2928
.Run();
3029

3130
using (Assert.EnterMultipleScope())
@@ -42,6 +41,8 @@ public async Task Should_be_isolated_except_global_shared_once()
4241
class Context : ScenarioContext
4342
{
4443
public ConcurrentBag<IDependency> Dependencies { get; } = [];
44+
45+
public void MaybeCompleted() => MarkAsCompleted(Dependencies.Count >= 2);
4546
}
4647

4748
class WithSameDependenciesEndpoint : EndpointConfigurationBuilder
@@ -116,6 +117,7 @@ public void DoSomething()
116117
{
117118
var context = serviceProvider.GetRequiredService<Context>();
118119
context.Dependencies.Add(serviceProvider.GetRequiredService<IDependency>());
120+
context.MaybeCompleted();
119121
}
120122
}
121123

src/NServiceBus.AcceptanceTests/Core/DependencyInjection/When_resolving_address_translator.cs

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ public async Task Should_be_available_after_the_endpoint_is_started()
1515
{
1616
string translatedAddress = null;
1717

18-
await Scenario.Define<Context>()
18+
Context context = null;
19+
await Scenario.Define<Context>(c => context = c)
1920
.WithEndpoint<ExternallyManagedContainerEndpoint>(b =>
2021
b.ToCreateInstance(
2122
(services, config) => EndpointWithExternallyManagedContainer.Create(config, services),
@@ -28,38 +29,34 @@ await Scenario.Define<Context>()
2829

2930
translatedAddress = transportAddressResolver.ToTransportAddress(new QueueAddress("SomeAddress"));
3031

32+
context.MarkAsCompleted();
33+
3134
return endpoint;
3235
}))
33-
.Done(_ => !string.IsNullOrEmpty(translatedAddress))
3436
.Run();
3537

3638
Assert.That(translatedAddress, Is.Not.Null);
3739
}
3840

3941
[Test]
40-
public async Task Should_throw_meaningful_exception_when_resolved_before_endpoint_started()
41-
{
42-
Exception thrownException = null;
42+
public void Should_throw_meaningful_exception_when_resolved_before_endpoint_started() =>
43+
Assert.That(async () =>
44+
{
45+
await Scenario.Define<Context>()
46+
.WithEndpoint<ExternallyManagedContainerEndpoint>(b =>
47+
b.ToCreateInstance(
48+
(services, config) => EndpointWithExternallyManagedContainer.Create(config, services),
49+
(startableEndpoint, provider, ct) =>
50+
{
51+
var transportAddressResolver = provider.GetRequiredService<ITransportAddressResolver>();
4352

44-
await Scenario.Define<Context>()
45-
.WithEndpoint<ExternallyManagedContainerEndpoint>(b =>
46-
b.ToCreateInstance(
47-
(services, config) => EndpointWithExternallyManagedContainer.Create(config, services),
48-
(startableEndpoint, provider, ct) =>
49-
{
50-
var transportAddressResolver = provider.GetRequiredService<ITransportAddressResolver>();
51-
52-
// HINT: Call before start
53-
thrownException = Assert.Throws<Exception>(() => transportAddressResolver.ToTransportAddress(new QueueAddress("SomeAddress")));
53+
transportAddressResolver.ToTransportAddress(new QueueAddress("SomeAddress"));
5454

55-
return startableEndpoint.Start(provider, ct);
56-
})
57-
)
58-
.Done(ctx => thrownException != null)
59-
.Run();
60-
61-
Assert.That(thrownException.Message, Does.Contain("Transport address resolution is not supported before the NServiceBus transport has been started."));
62-
}
55+
return startableEndpoint.Start(provider, ct);
56+
})
57+
)
58+
.Run();
59+
}, Throws.Exception.TypeOf<Exception>().With.Message.EqualTo("Transport address resolution is not supported before the NServiceBus transport has been started. Start the NServiceBus transport before calling `ToTransportAddress`"));
6360

6461
class Context : ScenarioContext;
6562

0 commit comments

Comments
 (0)