Skip to content

Commit be4dfa9

Browse files
For Integration Scenario
Messages without IsControlMessage or EnclosedMessageTypes headers will still be processed and wont cause exceptions in SC Relates to #429
1 parent 0efd79c commit be4dfa9

File tree

5 files changed

+357
-6
lines changed

5 files changed

+357
-6
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
namespace ServiceBus.Management.AcceptanceTests.MessageFailures
2+
{
3+
using System;
4+
using Contexts;
5+
using NServiceBus;
6+
using NServiceBus.AcceptanceTesting;
7+
using NServiceBus.Features;
8+
using NServiceBus.Transports;
9+
using NUnit.Framework;
10+
using ServiceControl.CompositeViews.Messages;
11+
using ServiceControl.MessageFailures.Api;
12+
13+
class Audit_Messages_Have_Proper_IsSytemMessage_Tests: AcceptanceTest
14+
{
15+
[Test]
16+
public void Should_set_the_IsSystemMessage_when_message_type_is_not_a_scheduled_task()
17+
{
18+
var context = new SystemMessageTestContext
19+
{
20+
MessageId = Guid.NewGuid().ToString(),
21+
EnclosedMessageType = "SendOnlyError.SendSomeCommand, TestSendOnlyError, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
22+
IncludeControlMessageHeader = false,
23+
};
24+
25+
MessagesView auditMessage = null;
26+
Scenario.Define(context)
27+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
28+
.WithEndpoint<ServerEndpoint>()
29+
.Done(c => TryGetSingle("/api/messages", out auditMessage, r => r.MessageId == c.MessageId))
30+
.Run();
31+
Assert.IsNotNull(auditMessage);
32+
Assert.IsFalse(auditMessage.IsSystemMessage);
33+
}
34+
35+
[Test]
36+
public void Scheduled_task_messages_should_set_IsSystemMessage()
37+
{
38+
var context = new SystemMessageTestContext
39+
{
40+
MessageId = Guid.NewGuid().ToString(),
41+
EnclosedMessageType = "NServiceBus.Scheduling.Messages.ScheduledTask, TestSendOnlyError, Version=5.0.0.0, Culture=neutral, PublicKeyToken=null",
42+
IncludeControlMessageHeader = false,
43+
};
44+
45+
MessagesView auditMessage = null;
46+
Scenario.Define(context)
47+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
48+
.WithEndpoint<ServerEndpoint>()
49+
.Done(c => TryGetSingle("/api/messages?include_system_messages=true&sort=id", out auditMessage, r => r.MessageId == c.MessageId))
50+
.Run();
51+
Assert.IsNotNull(auditMessage);
52+
Assert.IsTrue(auditMessage.IsSystemMessage);
53+
54+
}
55+
56+
[Test]
57+
public void Control_messages_should_not_be_audited()
58+
{
59+
var context = new SystemMessageTestContext
60+
{
61+
MessageId = Guid.NewGuid().ToString(),
62+
EnclosedMessageType = "NServiceBus.Scheduling.Messages.ScheduledTask",
63+
IncludeControlMessageHeader = true, // If the control message header is present, then its a system message regardless of the value
64+
ControlMessageHeaderValue = null
65+
};
66+
67+
MessagesView auditMessage = null;
68+
Scenario.Define(context)
69+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
70+
.WithEndpoint<ServerEndpoint>()
71+
.Done(c => TryGetSingle("/api/messages", out auditMessage, r => r.MessageId == c.MessageId))
72+
.Run();
73+
Assert.IsNull(auditMessage);
74+
75+
}
76+
77+
[Test]
78+
public void Should_set_the_IsSystemMessage_for_integration_scenario()
79+
{
80+
var context = new SystemMessageTestContext
81+
{
82+
MessageId = Guid.NewGuid().ToString(),
83+
EnclosedMessageType = null,
84+
IncludeControlMessageHeader = false
85+
};
86+
87+
MessagesView auditMessage = null;
88+
Scenario.Define(context)
89+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
90+
.WithEndpoint<ServerEndpoint>()
91+
.Done(c => TryGetSingle("/api/messages", out auditMessage, r => r.MessageId == c.MessageId))
92+
.Run();
93+
Assert.IsNotNull(auditMessage);
94+
Assert.IsFalse(auditMessage.IsSystemMessage);
95+
}
96+
97+
public class ServerEndpoint : EndpointConfigurationBuilder
98+
{
99+
public ServerEndpoint()
100+
{
101+
EndpointSetup<DefaultServer>();
102+
}
103+
104+
class Foo : IWantToRunWhenBusStartsAndStops
105+
{
106+
public ISendMessages SendMessages { get; set; }
107+
108+
public SystemMessageTestContext SystemMessageTestContext { get; set; }
109+
110+
public void Start()
111+
{
112+
//hack until we can fix the types filtering in default server
113+
if (SystemMessageTestContext == null || string.IsNullOrEmpty(SystemMessageTestContext.MessageId))
114+
{
115+
return;
116+
}
117+
118+
if (Configure.EndpointName != "Particular.ServiceControl")
119+
{
120+
return;
121+
}
122+
123+
// Transport message has no headers for Processing endpoint and the ReplyToAddress is set to null
124+
var transportMessage = new TransportMessage();
125+
transportMessage.Headers[Headers.ProcessingEndpoint] = "ServerEndpoint";
126+
transportMessage.Headers[Headers.MessageId] = SystemMessageTestContext.MessageId;
127+
transportMessage.Headers[Headers.ConversationId] = "a59395ee-ec80-41a2-a728-a3df012fc707";
128+
transportMessage.Headers["$.diagnostics.hostid"] = "bdd4b0510bff5a6d07e91baa7e16a804";
129+
transportMessage.Headers["$.diagnostics.hostdisplayname"] = "SELENE";
130+
if (!string.IsNullOrEmpty(SystemMessageTestContext.EnclosedMessageType))
131+
{
132+
transportMessage.Headers[Headers.EnclosedMessageTypes] = SystemMessageTestContext.EnclosedMessageType;
133+
}
134+
if (SystemMessageTestContext.IncludeControlMessageHeader)
135+
{
136+
transportMessage.Headers[Headers.ControlMessageHeader] = SystemMessageTestContext.ControlMessageHeaderValue != null && (bool) SystemMessageTestContext.ControlMessageHeaderValue ? SystemMessageTestContext.ControlMessageHeaderValue.ToString() : null;
137+
}
138+
transportMessage.ReplyToAddress = null;
139+
SendMessages.Send(transportMessage, Address.Parse("audit"));
140+
}
141+
142+
public void Stop()
143+
{
144+
}
145+
}
146+
}
147+
148+
public class MyMessage : IMessage
149+
{
150+
}
151+
152+
public class SystemMessageTestContext : ScenarioContext
153+
{
154+
public string MessageId { get; set; }
155+
public bool IncludeControlMessageHeader { get; set; }
156+
public bool? ControlMessageHeaderValue { get; set; }
157+
public string EnclosedMessageType { get; set; }
158+
}
159+
160+
}
161+
}

src/ServiceControl.AcceptanceTests/When_a_message_has_been_successfully_processed.cs renamed to src/ServiceControl.AcceptanceTests/Audit/When_a_message_has_been_successfully_processed.cs

File renamed without changes.
Lines changed: 188 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,188 @@
1+
namespace ServiceBus.Management.AcceptanceTests.MessageFailures
2+
{
3+
using System;
4+
using Contexts;
5+
using NServiceBus;
6+
using NServiceBus.AcceptanceTesting;
7+
using NServiceBus.Transports;
8+
using NUnit.Framework;
9+
using ServiceControl.MessageFailures.Api;
10+
11+
class Is_System_Message_Tests: AcceptanceTest
12+
{
13+
[Test]
14+
public void Should_set_the_IsSystemMessage_when_message_type_is_not_a_scheduled_task()
15+
{
16+
var context = new SystemMessageTestContext
17+
{
18+
MessageId = Guid.NewGuid().ToString(),
19+
EnclosedMessageType = "SendOnlyError.SendSomeCommand, TestSendOnlyError, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null",
20+
IncludeControlMessageHeader = false,
21+
};
22+
23+
FailedMessageView failure = null;
24+
Scenario.Define(context)
25+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
26+
.WithEndpoint<ServerEndpoint>()
27+
.Done(c => TryGetSingle("/api/errors", out failure, r => r.MessageId == c.MessageId))
28+
.Run();
29+
Assert.IsNotNull(failure);
30+
Assert.IsFalse(failure.IsSystemMessage);
31+
}
32+
33+
[Test]
34+
public void Should_set_the_IsSystemMessage_when_message_type_is_a_scheduled_task()
35+
{
36+
var context = new SystemMessageTestContext
37+
{
38+
MessageId = Guid.NewGuid().ToString(),
39+
EnclosedMessageType = "NServiceBus.Scheduling.Messages.ScheduledTask",
40+
IncludeControlMessageHeader = false,
41+
};
42+
43+
FailedMessageView failure = null;
44+
Scenario.Define(context)
45+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
46+
.WithEndpoint<ServerEndpoint>()
47+
.Done(c => TryGetSingle("/api/errors", out failure, r => r.MessageId == c.MessageId))
48+
.Run();
49+
Assert.IsNotNull(failure);
50+
Assert.IsTrue(failure.IsSystemMessage);
51+
}
52+
53+
[Test]
54+
public void Should_set_the_IsSystemMessage_when_control_message_header_is_true()
55+
{
56+
var context = new SystemMessageTestContext
57+
{
58+
MessageId = Guid.NewGuid().ToString(),
59+
EnclosedMessageType = null,
60+
IncludeControlMessageHeader = true,
61+
ControlMessageHeaderValue = true
62+
};
63+
64+
FailedMessageView failure = null;
65+
Scenario.Define(context)
66+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
67+
.WithEndpoint<ServerEndpoint>()
68+
.Done(c => TryGetSingle("/api/errors", out failure, r => r.MessageId == c.MessageId))
69+
.Run();
70+
Assert.IsNotNull(failure);
71+
Assert.IsTrue(failure.IsSystemMessage);
72+
}
73+
74+
[Test]
75+
public void Should_set_the_IsSystemMessage_when_control_message_header_is_null()
76+
{
77+
var context = new SystemMessageTestContext
78+
{
79+
MessageId = Guid.NewGuid().ToString(),
80+
EnclosedMessageType = "NServiceBus.Scheduling.Messages.ScheduledTask",
81+
IncludeControlMessageHeader = true, // If hte control message header is present, then its a system message
82+
ControlMessageHeaderValue = null
83+
};
84+
85+
FailedMessageView failure = null;
86+
Scenario.Define(context)
87+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
88+
.WithEndpoint<ServerEndpoint>()
89+
.Done(c => TryGetSingle("/api/errors", out failure, r => r.MessageId == c.MessageId))
90+
.Run();
91+
Assert.IsNotNull(failure);
92+
Assert.IsTrue(failure.IsSystemMessage);
93+
}
94+
95+
[Test]
96+
public void Should_set_the_IsSystemMessage_for_integration_scenario()
97+
{
98+
var context = new SystemMessageTestContext
99+
{
100+
MessageId = Guid.NewGuid().ToString(),
101+
EnclosedMessageType = null,
102+
IncludeControlMessageHeader = false
103+
};
104+
105+
FailedMessageView failure = null;
106+
Scenario.Define(context)
107+
.WithEndpoint<ManagementEndpoint>(c => c.AppConfig(PathToAppConfig))
108+
.WithEndpoint<ServerEndpoint>()
109+
.Done(c => TryGetSingle("/api/errors", out failure, r => r.MessageId == c.MessageId))
110+
.Run();
111+
Assert.IsNotNull(failure);
112+
Assert.IsFalse(failure.IsSystemMessage);
113+
}
114+
115+
public class ServerEndpoint : EndpointConfigurationBuilder
116+
{
117+
public ServerEndpoint()
118+
{
119+
EndpointSetup<DefaultServer>();
120+
}
121+
122+
class Foo : IWantToRunWhenBusStartsAndStops
123+
{
124+
public ISendMessages SendMessages { get; set; }
125+
126+
public SystemMessageTestContext SystemMessageTestContext { get; set; }
127+
128+
public void Start()
129+
{
130+
//hack until we can fix the types filtering in default server
131+
if (SystemMessageTestContext == null || string.IsNullOrEmpty(SystemMessageTestContext.MessageId))
132+
{
133+
return;
134+
}
135+
136+
if (Configure.EndpointName != "Particular.ServiceControl")
137+
{
138+
return;
139+
}
140+
141+
// Transport message has no headers for Processing endpoint and the ReplyToAddress is set to null
142+
var transportMessage = new TransportMessage();
143+
transportMessage.Headers[Headers.ProcessingEndpoint] = "ServerEndpoint";
144+
transportMessage.Headers[Headers.MessageId] = SystemMessageTestContext.MessageId;
145+
transportMessage.Headers[Headers.ConversationId] = "a59395ee-ec80-41a2-a728-a3df012fc707";
146+
transportMessage.Headers["$.diagnostics.hostid"] = "bdd4b0510bff5a6d07e91baa7e16a804";
147+
transportMessage.Headers["$.diagnostics.hostdisplayname"] = "SELENE";
148+
transportMessage.Headers["NServiceBus.ExceptionInfo.ExceptionType"] = "2014-11-11 02:26:57:767462 Z";
149+
transportMessage.Headers["NServiceBus.ExceptionInfo.Message"] = "An error occurred while attempting to extract logical messages from transport message NServiceBus.TransportMessage";
150+
transportMessage.Headers["NServiceBus.ExceptionInfo.InnerExceptionType"] = "System.Exception";
151+
transportMessage.Headers["NServiceBus.ExceptionInfo.HelpLink"] = "";
152+
transportMessage.Headers["NServiceBus.ExceptionInfo.Source"] = "NServiceBus.Core";
153+
transportMessage.Headers["NServiceBus.ExceptionInfo.StackTrace"] = "";
154+
transportMessage.Headers["NServiceBus.FailedQ"] = "SomeEndpoint@SELENE";
155+
transportMessage.Headers["NServiceBus.TimeOfFailure"] = "2014-11-11 02:26:58:000462 Z";
156+
transportMessage.Headers["NServiceBus.TimeSent"] = "2014-11-11 02:26:01:174786 Z";
157+
if (!string.IsNullOrEmpty(SystemMessageTestContext.EnclosedMessageType))
158+
{
159+
transportMessage.Headers[Headers.EnclosedMessageTypes] = SystemMessageTestContext.EnclosedMessageType;
160+
}
161+
if (SystemMessageTestContext.IncludeControlMessageHeader)
162+
{
163+
transportMessage.Headers[Headers.ControlMessageHeader] = SystemMessageTestContext.ControlMessageHeaderValue != null && (bool) SystemMessageTestContext.ControlMessageHeaderValue ? SystemMessageTestContext.ControlMessageHeaderValue.ToString() : null;
164+
}
165+
transportMessage.ReplyToAddress = null;
166+
SendMessages.Send(transportMessage, Address.Parse("error"));
167+
}
168+
169+
public void Stop()
170+
{
171+
}
172+
}
173+
}
174+
175+
public class MyMessage : IMessage
176+
{
177+
}
178+
179+
public class SystemMessageTestContext : ScenarioContext
180+
{
181+
public string MessageId { get; set; }
182+
public bool IncludeControlMessageHeader { get; set; }
183+
public bool? ControlMessageHeaderValue { get; set; }
184+
public string EnclosedMessageType { get; set; }
185+
}
186+
187+
}
188+
}

src/ServiceControl.AcceptanceTests/ServiceControl.AcceptanceTests.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,7 @@
167167
<Reference Include="System.Xml.Linq" />
168168
</ItemGroup>
169169
<ItemGroup>
170+
<Compile Include="Audit\Audit_Messages_Have_Proper_IsSytemMessage_Tests.cs" />
170171
<Compile Include="Contexts\ExternalIntegrationsManagementEndpointSetup.cs" />
171172
<Compile Include="Contexts\TransportIntegration\ActiveMqTransportIntegration.cs" />
172173
<Compile Include="Contexts\TransportIntegration\AzureStorageQueuesTransportIntegration.cs" />
@@ -187,6 +188,7 @@
187188
<Compile Include="HeartbeatMonitoring\When_an_endpoint_starts_up.cs" />
188189
<Compile Include="HeartbeatMonitoring\When_endpoints_heartbeats_are_received_in_a_timely_manner.cs" />
189190
<Compile Include="MessageFailures\ErrorImportPerformanceTests.cs" />
191+
<Compile Include="MessageFailures\Is_System_Message_Tests.cs" />
190192
<Compile Include="MessageFailures\When_a_message_has_failed.cs" />
191193
<Compile Include="MessageFailures\When_a_message_has_failed_from_send_only_endpoint.cs" />
192194
<Compile Include="MessageFailures\When_a_retry_for_a_failed_message_is_successful.cs" />
@@ -205,7 +207,7 @@
205207
<Compile Include="SagaAudit\When_publishing_from_a_saga.cs" />
206208
<Compile Include="SagaAudit\When_a_message_hitting_a_saga_is_audited.cs" />
207209
<Compile Include="When_a_message_is_imported_twice.cs" />
208-
<Compile Include="When_a_message_has_been_successfully_processed.cs" />
210+
<Compile Include="Audit\When_a_message_has_been_successfully_processed.cs" />
209211
<Compile Include="When_signalr_receives_a_message.cs" />
210212
</ItemGroup>
211213
<ItemGroup>

0 commit comments

Comments
 (0)