Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SystemTextJsonSerializer: Adds UseSystemTextJsonSerializerWithOptions in CosmosClientOptions to Set the Default STJ Serializer #4589

Merged
merged 25 commits into from
Jul 30, 2024
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
d2efdd6
Code changes to make STJ serializer public for preview.
kundadebdatta Jul 16, 2024
bfdb850
Code changes to make STJ serializer public for GA.
kundadebdatta Jul 16, 2024
93a0f9c
Code changes to hide STJ serializer implementation behind a boolean f…
kundadebdatta Jul 19, 2024
c1ee171
Code changes to fix tests.
kundadebdatta Jul 19, 2024
b590a4e
Revert "Code changes to fix tests."
kundadebdatta Jul 19, 2024
e6cd9f4
Code changes to fix baseline test.
kundadebdatta Jul 19, 2024
9d93df2
Merge branch 'master' into users/kundadebdatta/make_stj_serializer_pu…
kundadebdatta Jul 19, 2024
c6a172c
Code changes to fix root cause.
kundadebdatta Jul 19, 2024
9015d6c
Code changes to update tests.
kundadebdatta Jul 19, 2024
7460f30
Code changes to address review comments.
kundadebdatta Jul 22, 2024
8c07f8f
Code changes to add serializer options as contract.
kundadebdatta Jul 22, 2024
7902872
Code changes to add serializer options as public contract in builder.
kundadebdatta Jul 22, 2024
8226f7b
Code changes to update contract to remove the STJ serializer boolean …
kundadebdatta Jul 23, 2024
6976042
Code changes to update summary.
kundadebdatta Jul 23, 2024
078ab71
Code changes for minor cosmetic update.
kundadebdatta Jul 23, 2024
100b8e0
Merge branch 'master' into users/kundadebdatta/make_stj_serializer_pu…
kundadebdatta Jul 23, 2024
ee2f83a
Code changes to fix xml comment.
kundadebdatta Jul 23, 2024
ef7073a
Code changes to move remarks to summary. Updated test.
kundadebdatta Jul 24, 2024
1f65a66
Code changes to move the validation logic in cosmos client options.
kundadebdatta Jul 24, 2024
58981c2
Code changes to update contract.
kundadebdatta Jul 24, 2024
3ba71ea
Merge branch 'master' into users/kundadebdatta/make_stj_serializer_pu…
kundadebdatta Jul 24, 2024
ac5d07e
Code changes to remove client context core logic in cosmos client opt…
kundadebdatta Jul 26, 2024
77bf9ec
Code changes to update some tests.
kundadebdatta Jul 29, 2024
ac50590
Merge branch 'master' into users/kundadebdatta/make_stj_serializer_pu…
kundadebdatta Jul 29, 2024
f246ba8
Code changes to update contract. Made cosmetic changes.
kundadebdatta Jul 29, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions Microsoft.Azure.Cosmos/src/CosmosClientOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -392,6 +392,19 @@ public ConnectionMode ConnectionMode
/// <seealso cref="ItemRequestOptions.EnableContentResponseOnWrite"/>
/// <seealso cref="TransactionalBatchItemRequestOptions.EnableContentResponseOnWrite"/>
public bool? EnableContentResponseOnWrite { get; set; }

/// <summary>
/// Gets or sets the boolean flag to indicate if the default STJ serializer <see cref="CosmosSystemTextJsonSerializer"/> needed to be
/// used for JSON serialization.
/// </summary>
/// <remarks>
/// Note that, if this flag is set to true, then any custom seriliazer provided will be disregarded and overridden with the
/// default STJ serializer <see cref="CosmosSystemTextJsonSerializer"/>.
/// </remarks>
/// <value>
/// The default value is false
/// </value>
public bool UseSystemTextJsonForSerialization { get; set; } = false;
kundadebdatta marked this conversation as resolved.
Show resolved Hide resolved
kundadebdatta marked this conversation as resolved.
Show resolved Hide resolved

/// <summary>
/// Gets or sets the advanced replica selection flag. The advanced replica selection logic keeps track of the replica connection
Expand Down
10 changes: 10 additions & 0 deletions Microsoft.Azure.Cosmos/src/Fluent/CosmosClientBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -726,6 +726,16 @@ internal CosmosClientBuilder WithPartitionLevelFailoverEnabled()
this.clientOptions.EnablePartitionLevelFailover = true;
return this;
}

/// <summary>
/// Enables the usage of <see cref="CosmosSystemTextJsonSerializer"/> as the default
/// serializer.
/// </summary>
internal CosmosClientBuilder WithSystemTextJsonSerializerEnabled()
{
this.clientOptions.UseSystemTextJsonForSerialization = true;
return this;
}

/// <summary>
/// Enables SDK to inject fault. Used for testing applications.
Expand Down
6 changes: 6 additions & 0 deletions Microsoft.Azure.Cosmos/src/Resource/ClientContextCore.cs
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,12 @@ internal static CosmosClientContext Create(
requestInvokerHandler = clientPipelineBuilder.Build();
}

if (clientOptions.UseSystemTextJsonForSerialization)
{
clientOptions.Serializer = new CosmosSystemTextJsonSerializer(
kundadebdatta marked this conversation as resolved.
Show resolved Hide resolved
new System.Text.Json.JsonSerializerOptions());
}

CosmosSerializerCore serializerCore = CosmosSerializerCore.Create(
clientOptions.Serializer,
clientOptions.SerializerOptions);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ public class LinqAggregateCustomSerializationBaseline : BaselineTests<LinqAggreg
private static Cosmos.Database testDb;
private static Container testContainer;

private static CosmosSerializer stjCosmosSerializer;
private static CosmosClient stjClient;
private static Cosmos.Database testDbSTJ;
private static Container testContainerSTJ;
Expand Down Expand Up @@ -64,10 +63,8 @@ public async static Task Initialize(TestContext textContext)
testDb = await client.CreateDatabaseAsync(dbName);
testContainer = testDb.CreateContainerAsync(new ContainerProperties(id: Guid.NewGuid().ToString(), partitionKeyPath: "/Pk")).Result;

stjCosmosSerializer = new CosmosSystemTextJsonSerializer(new JsonSerializerOptions());

stjClient = TestCommon.CreateCosmosClient((cosmosClientBuilder)
=> cosmosClientBuilder.WithCustomSerializer(stjCosmosSerializer));
=> cosmosClientBuilder.WithSystemTextJsonSerializerEnabled());

// Set a callback to get the handle of the last executed query to do the verification
// This is neede because aggregate queries return type is a scalar so it can't be used
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,8 @@ public async static Task Initialize(TestContext textContext)
TestDb = await CosmosClient.CreateDatabaseAsync(dbName);

CosmosDefaultSTJClient = TestCommon.CreateCosmosClient((cosmosClientBuilder)
=> cosmosClientBuilder.WithCustomSerializer(new CosmosSystemTextJsonSerializer(new JsonSerializerOptions())));
=> cosmosClientBuilder.WithSystemTextJsonSerializerEnabled(),
useCustomSeralizer: false);

string dbNameSTJ = $"{nameof(LinqTranslationBaselineTests)}-{Guid.NewGuid():N}";
TestDbSTJDefault = await CosmosDefaultSTJClient.CreateDatabaseAsync(dbNameSTJ);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2711,11 +2711,23 @@
],
"MethodInfo": "Boolean get_LimitToEndpoint();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Boolean get_UseSystemTextJsonForSerialization()[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": {
"Type": "Method",
"Attributes": [
"CompilerGeneratedAttribute"
],
"MethodInfo": "Boolean get_UseSystemTextJsonForSerialization();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Boolean LimitToEndpoint": {
"Type": "Property",
"Attributes": [],
"MethodInfo": "Boolean LimitToEndpoint;CanRead:True;CanWrite:True;Boolean get_LimitToEndpoint();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_LimitToEndpoint(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Boolean UseSystemTextJsonForSerialization": {
"Type": "Property",
"Attributes": [],
"MethodInfo": "Boolean UseSystemTextJsonForSerialization;CanRead:True;CanWrite:True;Boolean get_UseSystemTextJsonForSerialization();IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;Void set_UseSystemTextJsonForSerialization(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Int32 GatewayModeMaxConnectionLimit": {
"Type": "Property",
"Attributes": [],
Expand Down Expand Up @@ -3165,6 +3177,13 @@
],
"MethodInfo": "Void set_TokenCredentialBackgroundRefreshInterval(System.Nullable`1[System.TimeSpan]);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Void set_UseSystemTextJsonForSerialization(Boolean)[System.Runtime.CompilerServices.CompilerGeneratedAttribute()]": {
"Type": "Method",
"Attributes": [
"CompilerGeneratedAttribute"
],
"MethodInfo": "Void set_UseSystemTextJsonForSerialization(Boolean);IsAbstract:False;IsStatic:False;IsVirtual:False;IsGenericMethod:False;IsConstructor:False;IsFinal:False;"
},
"Void set_WebProxy(System.Net.IWebProxy)": {
"Type": "Method",
"Attributes": [],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ namespace Microsoft.Azure.Cosmos.Tests
using System.Net.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using global::Azure.Core;
using Microsoft.Azure.Cosmos.Fluent;
using Microsoft.Azure.Documents;
Expand Down Expand Up @@ -476,6 +477,25 @@ public void UserAgentContainsEnvironmentInformation()
Assert.AreEqual(userAgentSuffix, connectionPolicy.UserAgentSuffix);
Assert.IsTrue(connectionPolicy.UserAgentContainer.UserAgent.StartsWith(expectedValue));
Assert.IsTrue(connectionPolicy.UserAgentContainer.UserAgent.EndsWith(userAgentSuffix));
}

[TestMethod]
public void ValidateThatCustomSerializerGetsOverriddenWhenSTJSerializerEnabled()
{
CosmosClientOptions options = new CosmosClientOptions()
{
Serializer = new CosmosJsonDotNetSerializer()
};

options.UseSystemTextJsonForSerialization = true;

CosmosClient client = new(
"https://fake-account.documents.azure.com:443/",
Convert.ToBase64String(Encoding.UTF8.GetBytes(Guid.NewGuid().ToString())),
options
);

Assert.AreEqual(typeof(CosmosSystemTextJsonSerializer), client.ClientOptions.Serializer.GetType());
}

[TestMethod]
Expand All @@ -500,7 +520,7 @@ public void ThrowOnCustomSerializerWithSerializerOptions()
};

options.Serializer = new CosmosJsonDotNetSerializer();
}
}

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
Expand Down