Skip to content

Commit c7645e4

Browse files
jschick04NikTilton
authored andcommitted
Removed required and set defaults and created unit tests for value converter
1 parent b43e11d commit c7645e4

File tree

4 files changed

+281
-8
lines changed

4 files changed

+281
-8
lines changed
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
// // Copyright (c) Microsoft Corporation.
2+
// // Licensed under the MIT License.
3+
4+
using EventLogExpert.Eventing.EventProviderDatabase;
5+
using EventLogExpert.Eventing.Tests.TestUtils;
6+
using System.Text.Json;
7+
8+
namespace EventLogExpert.Eventing.Tests.EventProviderDatabase;
9+
10+
public sealed class CompressedJsonValueConverterTests
11+
{
12+
[Fact]
13+
public void Constructor_ShouldCreateInstance()
14+
{
15+
// Act
16+
var converter = new CompressedJsonValueConverter<CompressionTestData>();
17+
18+
// Assert
19+
Assert.NotNull(converter);
20+
}
21+
22+
[Fact]
23+
public void ConvertFromCompressedJson_WithEmptyCollection_ShouldReturnEmptyCollection()
24+
{
25+
// Arrange
26+
var originalData = new List<string>();
27+
var compressed = CompressedJsonValueConverter<List<string>>.ConvertToCompressedJson(originalData);
28+
29+
// Act
30+
var result = CompressedJsonValueConverter<List<string>>.ConvertFromCompressedJson(compressed);
31+
32+
// Assert
33+
Assert.NotNull(result);
34+
Assert.Empty(result);
35+
}
36+
37+
[Fact]
38+
public void ConvertFromCompressedJson_WithInvalidData_ShouldThrowException()
39+
{
40+
// Arrange
41+
var invalidData = new byte[] { 0x00, 0x01, 0x02, 0x03 };
42+
43+
// Act & Assert
44+
Assert.ThrowsAny<Exception>(() =>
45+
CompressedJsonValueConverter<CompressionTestData>.ConvertFromCompressedJson(invalidData));
46+
}
47+
48+
[Fact]
49+
public void ConvertFromCompressedJson_WithNullDeserializationResult_ShouldThrowJsonException()
50+
{
51+
// Arrange - compress a JSON null value
52+
var compressedNull = CompressionTestUtils.CompressString("null");
53+
54+
// Act & Assert
55+
var exception = Assert.Throws<JsonException>(() =>
56+
CompressedJsonValueConverter<CompressionTestData>.ConvertFromCompressedJson(compressedNull));
57+
58+
Assert.Contains("Failed to deserialize compressed JSON", exception.Message);
59+
Assert.Contains(nameof(CompressionTestData), exception.Message);
60+
}
61+
62+
[Fact]
63+
public void ConvertToCompressedJson_ShouldProduceSmallerOutput_ForLargeData()
64+
{
65+
// Arrange
66+
var largeData = CompressionTestUtils.CreateLargeTestData();
67+
68+
var uncompressedJson = JsonSerializer.Serialize(largeData);
69+
var uncompressedBytes = System.Text.Encoding.UTF8.GetBytes(uncompressedJson);
70+
71+
// Act
72+
var compressed = CompressedJsonValueConverter<CompressionTestData>.ConvertToCompressedJson(largeData);
73+
74+
// Assert
75+
Assert.True(compressed.Length < uncompressedBytes.Length,
76+
$"Compressed size ({compressed.Length}) should be smaller than uncompressed size ({uncompressedBytes.Length})");
77+
}
78+
79+
[Fact]
80+
public void ConvertToCompressedJson_WithComplexObject_ShouldRoundTrip()
81+
{
82+
// Arrange
83+
var originalData = CompressionTestUtils.CreateBasicTestData();
84+
85+
// Act
86+
var compressed = CompressedJsonValueConverter<CompressionTestData>.ConvertToCompressedJson(originalData);
87+
var decompressed = CompressedJsonValueConverter<CompressionTestData>.ConvertFromCompressedJson(compressed);
88+
89+
// Assert
90+
Assert.NotNull(decompressed);
91+
Assert.Equal(originalData.Name, decompressed.Name);
92+
Assert.Equal(originalData.Value, decompressed.Value);
93+
Assert.Equal(originalData.Items, decompressed.Items);
94+
}
95+
96+
[Fact]
97+
public void ConvertToCompressedJson_WithDictionary_ShouldRoundTrip()
98+
{
99+
// Arrange
100+
var originalData = new Dictionary<string, int>
101+
{
102+
["one"] = 1,
103+
["two"] = 2,
104+
["three"] = 3
105+
};
106+
107+
// Act
108+
var compressed = CompressedJsonValueConverter<Dictionary<string, int>>.ConvertToCompressedJson(originalData);
109+
var decompressed = CompressedJsonValueConverter<Dictionary<string, int>>.ConvertFromCompressedJson(compressed);
110+
111+
// Assert
112+
Assert.NotNull(decompressed);
113+
Assert.Equal(originalData.Count, decompressed.Count);
114+
Assert.Equal(originalData["one"], decompressed["one"]);
115+
Assert.Equal(originalData["two"], decompressed["two"]);
116+
Assert.Equal(originalData["three"], decompressed["three"]);
117+
}
118+
119+
[Fact]
120+
public void ConvertToCompressedJson_WithEmptyObject_ShouldRoundTrip()
121+
{
122+
// Arrange
123+
var originalData = new CompressionTestData();
124+
125+
// Act
126+
var compressed = CompressedJsonValueConverter<CompressionTestData>.ConvertToCompressedJson(originalData);
127+
var decompressed = CompressedJsonValueConverter<CompressionTestData>.ConvertFromCompressedJson(compressed);
128+
129+
// Assert
130+
Assert.NotNull(decompressed);
131+
Assert.Null(decompressed.Name);
132+
Assert.Equal(0, decompressed.Value);
133+
Assert.Null(decompressed.Items);
134+
}
135+
136+
[Fact]
137+
public void ConvertToCompressedJson_WithNestedObjects_ShouldRoundTrip()
138+
{
139+
// Arrange
140+
var originalData = CompressionTestUtils.CreateNestedTestData();
141+
142+
// Act
143+
var compressed = CompressedJsonValueConverter<NestedCompressionTestData>.ConvertToCompressedJson(originalData);
144+
var decompressed = CompressedJsonValueConverter<NestedCompressionTestData>.ConvertFromCompressedJson(compressed);
145+
146+
// Assert
147+
Assert.NotNull(decompressed);
148+
Assert.Equal(originalData.Id, decompressed.Id);
149+
Assert.NotNull(decompressed.Child);
150+
Assert.Equal(originalData.Child!.Name, decompressed.Child.Name);
151+
Assert.Equal(originalData.Child.Value, decompressed.Child.Value);
152+
Assert.Equal(originalData.Child.Items, decompressed.Child.Items);
153+
}
154+
155+
[Fact]
156+
public void ConvertToCompressedJson_WithSpecialCharacters_ShouldRoundTrip()
157+
{
158+
// Arrange
159+
var originalData = CompressionTestUtils.CreateTestDataWithSpecialCharacters();
160+
161+
// Act
162+
var compressed = CompressedJsonValueConverter<CompressionTestData>.ConvertToCompressedJson(originalData);
163+
var decompressed = CompressedJsonValueConverter<CompressionTestData>.ConvertFromCompressedJson(compressed);
164+
165+
// Assert
166+
Assert.NotNull(decompressed);
167+
Assert.Equal(originalData.Name, decompressed.Name);
168+
Assert.Equal(originalData.Value, decompressed.Value);
169+
Assert.Equal(originalData.Items, decompressed.Items);
170+
}
171+
172+
[Fact]
173+
public void RoundTrip_WithList_ShouldPreserveAllElements()
174+
{
175+
// Arrange
176+
var originalList = CompressionTestUtils.CreateTestDataList();
177+
178+
// Act
179+
var compressed = CompressedJsonValueConverter<List<CompressionTestData>>.ConvertToCompressedJson(originalList);
180+
var decompressed = CompressedJsonValueConverter<List<CompressionTestData>>.ConvertFromCompressedJson(compressed);
181+
182+
// Assert
183+
Assert.NotNull(decompressed);
184+
Assert.Equal(originalList.Count, decompressed.Count);
185+
186+
for (int i = 0; i < originalList.Count; i++)
187+
{
188+
Assert.Equal(originalList[i].Name, decompressed[i].Name);
189+
Assert.Equal(originalList[i].Value, decompressed[i].Value);
190+
Assert.Equal(originalList[i].Items, decompressed[i].Items);
191+
}
192+
}
193+
}
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// // Copyright (c) Microsoft Corporation.
2+
// // Licensed under the MIT License.
3+
4+
using System.IO.Compression;
5+
using System.Text;
6+
7+
namespace EventLogExpert.Eventing.Tests.TestUtils;
8+
9+
public static class CompressionTestUtils
10+
{
11+
public static byte[] CompressString(string value)
12+
{
13+
var buffer = Encoding.UTF8.GetBytes(value);
14+
using var memoryStream = new MemoryStream();
15+
16+
using (var gZipStream = new GZipStream(memoryStream, CompressionLevel.SmallestSize))
17+
{
18+
gZipStream.Write(buffer, 0, buffer.Length);
19+
}
20+
21+
return memoryStream.ToArray();
22+
}
23+
24+
public static CompressionTestData CreateBasicTestData() =>
25+
new()
26+
{
27+
Name = "Test",
28+
Value = 42,
29+
Items = ["Item1", "Item2", "Item3"]
30+
};
31+
32+
public static CompressionTestData CreateLargeTestData() =>
33+
new()
34+
{
35+
Name = new string('A', 10000),
36+
Value = 42,
37+
Items = Enumerable.Range(0, 1000).Select(i => $"Item{i}").ToList()
38+
};
39+
40+
public static NestedCompressionTestData CreateNestedTestData() =>
41+
new()
42+
{
43+
Id = 1,
44+
Child = new CompressionTestData
45+
{
46+
Name = "Child",
47+
Value = 100,
48+
Items = ["A", "B"]
49+
}
50+
};
51+
52+
public static List<CompressionTestData> CreateTestDataList() =>
53+
[
54+
new() { Name = "First", Value = 1, Items = ["A"] },
55+
new() { Name = "Second", Value = 2, Items = ["B", "C"] },
56+
new() { Name = "Third", Value = 3, Items = [] }
57+
];
58+
59+
public static CompressionTestData CreateTestDataWithSpecialCharacters() =>
60+
new()
61+
{
62+
Name = "Test with special chars: <>&\"'\\日本語🎉",
63+
Value = int.MaxValue,
64+
Items = ["Line1\nLine2", "Tab\tSeparated", "Quote\"Test"]
65+
};
66+
}
67+
68+
public class CompressionTestData
69+
{
70+
public List<string>? Items { get; init; }
71+
72+
public string? Name { get; init; }
73+
74+
public int Value { get; init; }
75+
}
76+
77+
public class NestedCompressionTestData
78+
{
79+
public CompressionTestData? Child { get; init; }
80+
81+
public int Id { get; init; }
82+
}

src/EventLogExpert.Eventing/EventProviderDatabase/CompressedJsonValueConverter.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,15 @@
88

99
namespace EventLogExpert.Eventing.EventProviderDatabase;
1010

11-
public class CompressedJsonValueConverter<T> : ValueConverter<T, byte[]> where T : class
11+
public class CompressedJsonValueConverter<T>() : ValueConverter<T, byte[]>(v => ConvertToCompressedJson(v),
12+
v => ConvertFromCompressedJson(v))
13+
where T : class
1214
{
13-
public CompressedJsonValueConverter() :
14-
base(v => ConvertToCompressedJson(v), v => ConvertFromCompressedJson(v))
15-
{ }
16-
1715
public static byte[] ConvertToCompressedJson(T value)
1816
{
1917
var json = JsonSerializer.Serialize(value);
2018
var buffer = Encoding.UTF8.GetBytes(json);
21-
MemoryStream memoryStream = new();
19+
using MemoryStream memoryStream = new();
2220
using (GZipStream gZipStream = new(memoryStream, CompressionLevel.SmallestSize))
2321
{
2422
gZipStream.Write(buffer, 0, buffer.Length);

src/EventLogExpert.Eventing/Models/MessageModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class MessageModel
1414
public string? LogLink { get; set; }
1515

1616
/// <summary>The provider name for this message</summary>
17-
public required string ProviderName { get; set; }
17+
public string ProviderName { get; set; } = string.Empty;
1818

1919
/// <summary>For raw ID format, see https://msdn.microsoft.com/en-us/library/windows/desktop/aa363651(v=vs.85).aspx</summary>
2020
public long RawId { get; set; }
@@ -32,5 +32,5 @@ public class MessageModel
3232
public string? Template { get; set; }
3333

3434
/// <summary>The text of the message</summary>
35-
public required string Text { get; set; }
35+
public string Text { get; set; } = string.Empty;
3636
}

0 commit comments

Comments
 (0)