Skip to content

Commit 0e6d31d

Browse files
authored
Addressed Error for Events Missing Required Fields (Azure#15076)
* Handled deserialization of events with missing fields Should throw an error if required fields for EventGridEvent are missing when Parse is called * Added tests for this error * Added a similar constructor in CloudEvent that checks if Id (a required field) is null
1 parent ad80cd5 commit 0e6d31d

File tree

4 files changed

+81
-40
lines changed

4 files changed

+81
-40
lines changed

sdk/eventgrid/Azure.Messaging.EventGrid/src/Customization/BinaryDataExtensions.cs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,13 @@ public static EventGridEvent ToEventGridEvent(this BinaryData binaryData)
2525
JsonDocument requestDocument = JsonDocument.Parse(binaryData.ToBytes());
2626
EventGridEventInternal egEventInternal = EventGridEventInternal.DeserializeEventGridEventInternal(requestDocument.RootElement);
2727

28-
EventGridEvent egEvent = new EventGridEvent()
29-
{
30-
Subject = egEventInternal.Subject,
31-
EventType = egEventInternal.EventType,
32-
DataVersion = egEventInternal.DataVersion,
33-
Id = egEventInternal.Id,
34-
EventTime = egEventInternal.EventTime,
35-
SerializedData = egEventInternal.Data
36-
};
28+
EventGridEvent egEvent = new EventGridEvent(
29+
egEventInternal.Data,
30+
egEventInternal.Subject,
31+
egEventInternal.EventType,
32+
egEventInternal.DataVersion,
33+
egEventInternal.EventTime,
34+
egEventInternal.Id);
3735

3836
return egEvent;
3937
}
@@ -56,17 +54,15 @@ public static CloudEvent ToCloudEvent(this BinaryData binaryData)
5654
}
5755

5856
CloudEvent cloudEvent = new CloudEvent(
59-
cloudEventInternal.Source,
60-
cloudEventInternal.Type)
61-
{
62-
Id = cloudEventInternal.Id,
63-
Time = cloudEventInternal.Time,
64-
DataBase64 = cloudEventInternal.DataBase64,
65-
DataSchema = cloudEventInternal.Dataschema,
66-
DataContentType = cloudEventInternal.Datacontenttype,
67-
Subject = cloudEventInternal.Subject,
68-
SerializedData = cloudEventInternal.Data
69-
};
57+
cloudEventInternal.Id,
58+
cloudEventInternal.Source,
59+
cloudEventInternal.Type,
60+
cloudEventInternal.Time,
61+
cloudEventInternal.Dataschema,
62+
cloudEventInternal.Datacontenttype,
63+
cloudEventInternal.Subject,
64+
cloudEventInternal.Data,
65+
cloudEventInternal.DataBase64);
7066

7167
if (cloudEventInternal.AdditionalProperties != null)
7268
{

sdk/eventgrid/Azure.Messaging.EventGrid/src/Customization/CloudEvent.cs

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,24 @@ public CloudEvent(string source, string type, BinaryData data, string dataConten
8585
ExtensionAttributes = new Dictionary<string, object>();
8686
}
8787

88+
internal CloudEvent(string id, string source, string type, DateTimeOffset? time, string dataSchema, string dataContentType, string subject, JsonElement? serializedData, byte[] dataBase64)
89+
{
90+
Argument.AssertNotNull(id, nameof(id));
91+
Argument.AssertNotNull(source, nameof(source));
92+
Argument.AssertNotNull(type, nameof(type));
93+
94+
Id = id;
95+
Source = source;
96+
Type = type;
97+
Time = time;
98+
DataSchema = dataSchema;
99+
DataContentType = dataContentType;
100+
Subject = subject;
101+
SerializedData = serializedData;
102+
DataBase64 = dataBase64;
103+
ExtensionAttributes = new Dictionary<string, object>();
104+
}
105+
88106
/// <summary> An identifier for the event. The combination of id and source must be unique for each distinct event. </summary>
89107
public string Id { get; set; } = Guid.NewGuid().ToString();
90108

@@ -163,17 +181,15 @@ public static CloudEvent[] Parse(string requestContent)
163181
}
164182

165183
CloudEvent cloudEvent = new CloudEvent(
184+
cloudEventInternal.Id,
166185
cloudEventInternal.Source,
167-
cloudEventInternal.Type)
168-
{
169-
Id = cloudEventInternal.Id,
170-
Time = cloudEventInternal.Time,
171-
DataBase64 = cloudEventInternal.DataBase64,
172-
DataSchema = cloudEventInternal.Dataschema,
173-
DataContentType = cloudEventInternal.Datacontenttype,
174-
Subject = cloudEventInternal.Subject,
175-
SerializedData = cloudEventInternal.Data
176-
};
186+
cloudEventInternal.Type,
187+
cloudEventInternal.Time,
188+
cloudEventInternal.Dataschema,
189+
cloudEventInternal.Datacontenttype,
190+
cloudEventInternal.Subject,
191+
cloudEventInternal.Data,
192+
cloudEventInternal.DataBase64);
177193

178194
if (cloudEventInternal.AdditionalProperties != null)
179195
{

sdk/eventgrid/Azure.Messaging.EventGrid/src/Customization/EventGridEvent.cs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,19 @@ public EventGridEvent(object data, string subject, string eventType, string data
3636
DataVersion = dataVersion;
3737
}
3838

39-
internal EventGridEvent()
39+
internal EventGridEvent(JsonElement serializedData, string subject, string eventType, string dataVersion, DateTimeOffset eventTime, string id)
4040
{
41+
Argument.AssertNotNull(subject, nameof(subject));
42+
Argument.AssertNotNull(eventType, nameof(eventType));
43+
Argument.AssertNotNull(dataVersion, nameof(dataVersion));
44+
Argument.AssertNotNull(id, nameof(id));
45+
46+
Subject = subject;
47+
SerializedData = serializedData;
48+
EventType = eventType;
49+
DataVersion = dataVersion;
50+
EventTime = eventTime;
51+
Id = id;
4152
}
4253

4354
/// <summary> An unique identifier for the event. </summary>
@@ -100,15 +111,13 @@ public static EventGridEvent[] Parse(string requestContent)
100111

101112
foreach (EventGridEventInternal egEventInternal in egEventsInternal)
102113
{
103-
EventGridEvent egEvent = new EventGridEvent()
104-
{
105-
Subject = egEventInternal.Subject,
106-
EventType = egEventInternal.EventType,
107-
DataVersion = egEventInternal.DataVersion,
108-
Id = egEventInternal.Id,
109-
EventTime = egEventInternal.EventTime,
110-
SerializedData = egEventInternal.Data
111-
};
114+
EventGridEvent egEvent = new EventGridEvent(
115+
egEventInternal.Data,
116+
egEventInternal.Subject,
117+
egEventInternal.EventType,
118+
egEventInternal.DataVersion,
119+
egEventInternal.EventTime,
120+
egEventInternal.Id);
112121

113122
egEvents.Add(egEvent);
114123
}

sdk/eventgrid/Azure.Messaging.EventGrid/tests/ConsumeEventTests.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,16 @@ public void EGEventGetDataThrowsWhenCalledWithoutParse()
129129
Assert.AreEqual("512d38b6-c7b8-40c8-89fe-f46f9e9622b6", eventData1.ItemSku);
130130
}
131131
}
132+
133+
[Test]
134+
public void EGEventParseThrowsIfMissingRequiredProperties()
135+
{
136+
// missing Id and DataVersion
137+
string requestContent = "[{ \"subject\": \"\", \"data\": { \"itemSku\": \"512d38b6-c7b8-40c8-89fe-f46f9e9622b6\", \"itemUri\": \"https://rp-eastus2.eventgrid.azure.net:553/eventsubscriptions/estest/validate?id=B2E34264-7D71-453A-B5FB-B62D0FDC85EE&t=2018-04-26T20:30:54.4538837Z&apiVersion=2018-05-01-preview&token=1BNqCxBBSSE9OnNSfZM4%2b5H9zDegKMY6uJ%2fO2DFRkwQ%3d\" }, \"eventType\": \"Contoso.Items.ItemReceived\", \"eventTime\": \"2018-01-25T22:12:19.4556811Z\", \"metadataVersion\": \"1\"}]";
138+
139+
Assert.That(() => EventGridEvent.Parse(requestContent),
140+
Throws.InstanceOf<ArgumentNullException>());
141+
}
132142
#endregion
133143

134144
#region Custom event tests
@@ -1479,6 +1489,16 @@ public void CloudEventGetDataThrowsWhenCalledWithoutParse()
14791489
Assert.AreEqual("512d38b6-c7b8-40c8-89fe-f46f9e9622b6", eventData1.ItemSku);
14801490
}
14811491
}
1492+
1493+
[Test]
1494+
public void CloudEventParseThrowsIfMissingRequiredProperties()
1495+
{
1496+
// missing Id and Source
1497+
string requestContent = "[{ \"subject\": \"\", \"data\": { \"itemSku\": \"512d38b6-c7b8-40c8-89fe-f46f9e9622b6\", \"itemUri\": \"https://rp-eastus2.eventgrid.azure.net:553/eventsubscriptions/estest/validate?id=B2E34264-7D71-453A-B5FB-B62D0FDC85EE&t=2018-04-26T20:30:54.4538837Z&apiVersion=2018-05-01-preview&token=1BNqCxBBSSE9OnNSfZM4%2b5H9zDegKMY6uJ%2fO2DFRkwQ%3d\" }, \"type\": \"Contoso.Items.ItemReceived\"}]";
1498+
1499+
Assert.That(() => CloudEvent.Parse(requestContent),
1500+
Throws.InstanceOf<ArgumentNullException>());
1501+
}
14821502
#endregion
14831503

14841504
#region Custom event tests

0 commit comments

Comments
 (0)