Skip to content

Commit 73f3221

Browse files
authored
Use json converters collection instead of property converters (#423)
* Fix serialization * Remove white space * Fix namespace ordering * Add tests * Address comments
1 parent 1f88fca commit 73f3221

File tree

16 files changed

+319
-35
lines changed

16 files changed

+319
-35
lines changed

src/PluginsSystem/Microsoft.Performance.Toolkit.Plugins.Core.Tests/Microsoft.Performance.Toolkit.Plugins.Core.Tests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
</PropertyGroup>
1010

1111
<ItemGroup>
12+
<PackageReference Include="AutoFixture" Version="4.18.1" />
1213
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.1.0" />
1314
<PackageReference Include="Moq" Version="4.18.4" />
1415
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using Microsoft.Performance.Toolkit.Plugins.Core.Metadata;
5+
using Microsoft.VisualStudio.TestTools.UnitTesting;
6+
using Fixture = AutoFixture.Fixture;
7+
8+
namespace Microsoft.Performance.Toolkit.Plugins.Core.Tests;
9+
10+
[TestClass]
11+
public sealed class PluginMetadataSerializationTests
12+
{
13+
private Fixture? fixture = null;
14+
15+
[TestInitialize]
16+
public void Setup()
17+
{
18+
this.fixture = new Fixture();
19+
}
20+
21+
[TestMethod]
22+
public void PluginMetadata_Serialization_RoundTrip()
23+
{
24+
SerializationTestsHelper.RunSerializationTest<PluginMetadata>(this.fixture!);
25+
}
26+
27+
[TestMethod]
28+
public void PluginContentsMetadata_Serialization_RoundTrip()
29+
{
30+
SerializationTestsHelper.RunSerializationTest<PluginContentsMetadata>(this.fixture!);
31+
}
32+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
using AutoFixture;
5+
using Microsoft.Performance.Toolkit.Plugins.Core.Serialization;
6+
using Microsoft.VisualStudio.TestTools.UnitTesting;
7+
8+
namespace Microsoft.Performance.Toolkit.Plugins.Core.Tests;
9+
10+
public class SerializationTestsHelper
11+
{
12+
public static void RunSerializationTest<T>(Fixture fixture) where T : class
13+
{
14+
ISerializer<T> serializer = SerializationUtils.GetJsonSerializerWithDefaultOptions<T>();
15+
16+
T original = fixture.Create<T>();
17+
18+
using var stream = new MemoryStream();
19+
serializer.Serialize(stream, original);
20+
21+
stream.Position = 0;
22+
23+
T deserialized = serializer.Deserialize(stream);
24+
25+
Assert.IsNotNull(deserialized);
26+
Assert.IsTrue(original.Equals(deserialized));
27+
}
28+
}

src/PluginsSystem/Microsoft.Performance.Toolkit.Plugins.Core/EnumerableExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace Microsoft.Performance.Toolkit.Plugins.Core
1111
/// <summary>
1212
/// Provides extension methods for <see cref="IEnumerable{T}"/>.
1313
/// </summary>
14-
internal static class EnumerableExtensions
14+
public static class EnumerableExtensions
1515
{
1616
/// <summary>
1717
/// Determines whether two sequences are equal by comparing their elements by using the default equality comparer for their type.

src/PluginsSystem/Microsoft.Performance.Toolkit.Plugins.Core/Metadata/PluginMetadata.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
using System.Collections.Generic;
66
using System.Text.Json.Serialization;
77
using Microsoft.Performance.SDK;
8-
using Microsoft.Performance.Toolkit.Plugins.Core.Serialization;
98
using NuGet.Versioning;
109

1110
namespace Microsoft.Performance.Toolkit.Plugins.Core.Metadata
@@ -87,7 +86,6 @@ public PluginMetadata(
8786
/// <summary>
8887
/// Gets the version of the performance SDK which this plugin depends upon.
8988
/// </summary>
90-
[JsonConverter(typeof(SemanticVersionJsonConverter))]
9189
public SemanticVersion SdkVersion { get; }
9290

9391
/// <summary>

src/PluginsSystem/Microsoft.Performance.Toolkit.Plugins.Core/PluginIdentity.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public PluginIdentity(string id, PluginVersion version)
3636
}
3737

3838
/// <summary>
39-
/// Gets the identifer of this plugin.
39+
/// Gets the identifier of this plugin.
4040
/// </summary>
4141
public string Id { get; }
4242

src/PluginsSystem/Microsoft.Performance.Toolkit.Plugins.Core/Serialization/PluginVersionJsonConverter.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,19 @@
77

88
namespace Microsoft.Performance.Toolkit.Plugins.Core.Serialization
99
{
10+
/// <summary>
11+
/// Converts a <see cref="PluginVersion"/> to and from JSON.
12+
/// </summary>
1013
public class PluginVersionJsonConverter : JsonConverter<PluginVersion>
1114
{
15+
/// <inheritdoc/>
1216
public override PluginVersion Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1317
{
1418
var versionString = reader.GetString();
1519
return versionString is null ? null : PluginVersion.Parse(versionString);
1620
}
21+
22+
/// <inheritdoc/>
1723
public override void Write(Utf8JsonWriter writer, PluginVersion value, JsonSerializerOptions options)
1824
{
1925
writer.WriteStringValue(value.ToString());

src/PluginsSystem/Microsoft.Performance.Toolkit.Plugins.Core/Serialization/SemanticVersionConverter.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,19 @@
88

99
namespace Microsoft.Performance.Toolkit.Plugins.Core.Serialization
1010
{
11+
/// <summary>
12+
/// Converts a <see cref="SemanticVersion"/> to and from JSON.
13+
/// </summary>
1114
public class SemanticVersionJsonConverter : JsonConverter<SemanticVersion>
1215
{
16+
/// <inheritdoc/>
1317
public override SemanticVersion Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1418
{
1519
var versionString = reader.GetString();
1620
return versionString is null ? null : SemanticVersion.Parse(versionString);
1721
}
1822

23+
/// <inheritdoc/>
1924
public override void Write(Utf8JsonWriter writer, SemanticVersion value, JsonSerializerOptions options)
2025
{
2126
writer.WriteStringValue(value.ToString());

src/PluginsSystem/Microsoft.Performance.Toolkit.Plugins.Core/Serialization/SerializationUtils.cs

Lines changed: 2 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -54,28 +54,9 @@ public static ISerializer<T> GetJsonSerializer<T>(JsonSerializerOptions serializ
5454
Converters =
5555
{
5656
new JsonStringEnumConverter(),
57-
new VersionStringConverter(),
57+
new PluginVersionJsonConverter(),
58+
new SemanticVersionJsonConverter(),
5859
}
5960
};
60-
61-
internal class VersionStringConverter
62-
: JsonConverter<Version>
63-
{
64-
public override Version Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
65-
{
66-
if (reader.TokenType == JsonTokenType.String)
67-
{
68-
string stringValue = reader.GetString();
69-
return new Version(stringValue);
70-
}
71-
72-
throw new JsonException();
73-
}
74-
75-
public override void Write(Utf8JsonWriter writer, Version value, JsonSerializerOptions options)
76-
{
77-
writer.WriteStringValue(value.ToString());
78-
}
79-
}
8061
}
8162
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<ImplicitUsings>enable</ImplicitUsings>
6+
<Nullable>enable</Nullable>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<PackageReference Include="AutoFixture" Version="4.18.1" />
11+
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
12+
<PackageReference Include="MSTest.TestAdapter" Version="2.2.8" />
13+
<PackageReference Include="MSTest.TestFramework" Version="2.2.8" />
14+
<PackageReference Include="coverlet.collector" Version="3.1.2" />
15+
</ItemGroup>
16+
17+
<ItemGroup>
18+
<ProjectReference Include="..\..\..\Microsoft.Performance.SDK\Microsoft.Performance.SDK.csproj" />
19+
<ProjectReference Include="..\..\Microsoft.Performance.Toolkit.Plugins.Core.Tests\Microsoft.Performance.Toolkit.Plugins.Core.Tests.csproj" />
20+
<ProjectReference Include="..\..\Microsoft.Performance.Toolkit.Plugins.Core\Microsoft.Performance.Toolkit.Plugins.Core.csproj" />
21+
<ProjectReference Include="..\Microsoft.Performance.Toolkit.Plugins.Cli\Microsoft.Performance.Toolkit.Plugins.Cli.csproj" />
22+
</ItemGroup>
23+
24+
<ItemGroup>
25+
<Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
26+
</ItemGroup>
27+
28+
</Project>

0 commit comments

Comments
 (0)