Skip to content

Commit a992ca2

Browse files
committed
Handles null values in MessageType and ContentType metadata fields when publishing external integration events.
Fixes #423
1 parent e292cda commit a992ca2

File tree

3 files changed

+67
-14
lines changed

3 files changed

+67
-14
lines changed

src/ServiceControl.UnitTests/ExternalIntegrations/ExternalIntegrationsFailedMessagesIndexTests.cs renamed to src/ServiceControl.UnitTests/ExternalIntegrations/MessageFailedConverterTests.cs

Lines changed: 53 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
using FailureDetails = ServiceControl.Contracts.Operations.FailureDetails;
1212

1313
[TestFixture]
14-
public class ExternalIntegrationsFailedMessagesIndexTests
14+
public class MessageFailedConverterTests
1515
{
1616
[Test]
1717
public void Archive_status_maps_to_archive()
@@ -59,6 +59,30 @@ public void If_not_present_in_metadata_body_is_ignored()
5959
Assert.IsNull(result.MessageDetails.Body);
6060
}
6161

62+
[Test]
63+
public void If_message_type_is_missing_it_is_ignored()
64+
{
65+
var failedMessage = new FailedMessageBuilder(FailedMessageStatus.Unresolved)
66+
.SetMessageType(null)
67+
.AddProcessingAttempt(pa => { })
68+
.Build();
69+
70+
var result = failedMessage.ToEvent();
71+
Assert.IsNull(result.MessageType);
72+
}
73+
74+
[Test]
75+
public void If_content_type_is_missing_it_is_ignored()
76+
{
77+
var failedMessage = new FailedMessageBuilder(FailedMessageStatus.Unresolved)
78+
.SetContentType(null)
79+
.AddProcessingAttempt(pa => { })
80+
.Build();
81+
82+
var result = failedMessage.ToEvent();
83+
Assert.IsNull(result.MessageDetails.ContentType);
84+
}
85+
6286
[Test]
6387
public void Body_is_mapped_from_metadata_of_last_processing_attempt()
6488
{
@@ -73,13 +97,27 @@ public void Body_is_mapped_from_metadata_of_last_processing_attempt()
7397
private class FailedMessageBuilder
7498
{
7599
private readonly FailedMessageStatus messageStatus;
100+
string messageType = "SomeMessage";
101+
string contentType = "application/json";
76102
private List<Action<FailedMessage.ProcessingAttempt>> processingAttempts = new List<Action<FailedMessage.ProcessingAttempt>>();
77103

78104
public FailedMessageBuilder(FailedMessageStatus messageStatus)
79105
{
80106
this.messageStatus = messageStatus;
81107
}
82108

109+
public FailedMessageBuilder SetMessageType(string messageType)
110+
{
111+
this.messageType = messageType;
112+
return this;
113+
}
114+
115+
public FailedMessageBuilder SetContentType(string contentType)
116+
{
117+
this.contentType = contentType;
118+
return this;
119+
}
120+
83121
public FailedMessageBuilder AddProcessingAttempt(Action<FailedMessage.ProcessingAttempt> callback)
84122
{
85123
processingAttempts.Add(callback);
@@ -92,19 +130,26 @@ public FailedMessage Build()
92130
{
93131
ProcessingAttempts = processingAttempts.Select(x =>
94132
{
133+
var messageMetadata = new Dictionary<string, object>
134+
{
135+
{"SendingEndpoint",new Contracts.Operations.EndpointDetails()},
136+
{"ReceivingEndpoint",new Contracts.Operations.EndpointDetails()},
137+
};
138+
if (messageType != null)
139+
{
140+
messageMetadata["MessageType"] = messageType;
141+
}
142+
if (contentType != null)
143+
{
144+
messageMetadata["ContentType"] = contentType;
145+
}
95146
var attempt = new FailedMessage.ProcessingAttempt
96147
{
97148
FailureDetails = new FailureDetails
98149
{
99150
Exception = new ExceptionDetails()
100151
},
101-
MessageMetadata = new Dictionary<string, object>
102-
{
103-
{"SendingEndpoint",new Contracts.Operations.EndpointDetails()},
104-
{"ReceivingEndpoint",new Contracts.Operations.EndpointDetails()},
105-
{"MessageType","SomeMessage"},
106-
{"ContentType","application/json"},
107-
},
152+
MessageMetadata = messageMetadata,
108153
};
109154
x(attempt);
110155
return attempt;

src/ServiceControl.UnitTests/ServiceControl.UnitTests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@
8989
<Reference Include="System.Xml.Linq" />
9090
</ItemGroup>
9191
<ItemGroup>
92-
<Compile Include="ExternalIntegrations\ExternalIntegrationsFailedMessagesIndexTests.cs" />
92+
<Compile Include="ExternalIntegrations\MessageFailedConverterTests.cs" />
9393
<Compile Include="CompositeViews\MessagesViewTests.cs" />
9494
<Compile Include="Expiration\CustomExpirationBundleTests.cs" />
9595
<Compile Include="Heartbeats\HeartbeatStatusProviderTests.cs" />

src/ServiceControl/ExternalIntegrations/MessageFailedConverter.cs

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
namespace ServiceControl.ExternalIntegrations
22
{
3+
using System.Collections.Generic;
34
using System.Linq;
45
using ServiceControl.Contracts.Operations;
56
using ServiceControl.MessageFailures;
@@ -10,13 +11,12 @@ public static Contracts.MessageFailed ToEvent(this FailedMessage message)
1011
{
1112
var last = message.ProcessingAttempts.Last();
1213
var sendingEndpoint = (EndpointDetails)last.MessageMetadata["SendingEndpoint"];
13-
object tmp;
14-
last.MessageMetadata.TryGetValue("ReceivingEndpoint", out tmp);
15-
var receivingEndpoint = (EndpointDetails) tmp;
14+
var receivingEndpoint = GetNullableMetadataValue<EndpointDetails>(last.MessageMetadata, "ReceivingEndpoint");
15+
1616
return new Contracts.MessageFailed
1717
{
1818
FailedMessageId = message.UniqueMessageId,
19-
MessageType = (string)last.MessageMetadata["MessageType"],
19+
MessageType = GetNullableMetadataValue<string>(last.MessageMetadata,"MessageType"),
2020
NumberOfProcessingAttempts = message.ProcessingAttempts.Count,
2121
Status = message.Status == FailedMessageStatus.Archived
2222
? Contracts.MessageFailed.MessageStatus.ArchivedFailure
@@ -38,7 +38,7 @@ public static Contracts.MessageFailed ToEvent(this FailedMessage message)
3838
MessageDetails = new Contracts.MessageFailed.Message
3939
{
4040
Headers = last.Headers,
41-
ContentType = (string)last.MessageMetadata["ContentType"],
41+
ContentType = GetNullableMetadataValue<string>(last.MessageMetadata, "ContentType"),
4242
Body = GetBody(last),
4343
MessageId = last.MessageId,
4444
},
@@ -57,6 +57,14 @@ public static Contracts.MessageFailed ToEvent(this FailedMessage message)
5757
};
5858
}
5959

60+
static T GetNullableMetadataValue<T>(IReadOnlyDictionary<string, object> metadata, string key)
61+
where T : class
62+
{
63+
object value;
64+
metadata.TryGetValue(key, out value);
65+
return (T)value;
66+
}
67+
6068
static string GetBody(FailedMessage.ProcessingAttempt last)
6169
{
6270
object body;

0 commit comments

Comments
 (0)