Skip to content

Commit 4ab0fea

Browse files
authored
Merge pull request #657 from hjgraca/fix(logging)-typeinforesolver-non-aot
chore: Remove TypeInfoResolver from non AOT mode.
2 parents a1275b4 + 83ff555 commit 4ab0fea

File tree

5 files changed

+98
-7
lines changed

5 files changed

+98
-7
lines changed

.github/ISSUE_TEMPLATE/bug_report.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ body:
5959
label: AWS Lambda function runtime
6060
options:
6161
- dotnet6
62+
- dotnet8
63+
- dotnet8 (AOT)
6264
validations:
6365
required: true
6466
- type: textarea
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using System.Runtime.CompilerServices;
3+
4+
namespace AWS.Lambda.Powertools.Common.Utils;
5+
6+
/// <summary>
7+
/// Wrapper for RuntimeFeature
8+
/// </summary>
9+
public static class RuntimeFeatureWrapper
10+
{
11+
private static Func<bool> _isDynamicCodeSupportedFunc = () => RuntimeFeature.IsDynamicCodeSupported;
12+
13+
/// <summary>
14+
/// Check to see if IsDynamicCodeSupported
15+
/// </summary>
16+
public static bool IsDynamicCodeSupported => _isDynamicCodeSupportedFunc();
17+
18+
// For testing purposes
19+
internal static void SetIsDynamicCodeSupported(bool value)
20+
{
21+
_isDynamicCodeSupportedFunc = () => value;
22+
}
23+
24+
// To reset after tests
25+
internal static void Reset()
26+
{
27+
_isDynamicCodeSupportedFunc = () => RuntimeFeature.IsDynamicCodeSupported;
28+
}
29+
}

libraries/src/AWS.Lambda.Powertools.Logging/Serializers/PowertoolsLoggingSerializer.cs

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
using System.Text.Json.Serialization.Metadata;
2424
using Amazon.Lambda.Serialization.SystemTextJson;
2525
using AWS.Lambda.Powertools.Common;
26+
using AWS.Lambda.Powertools.Common.Utils;
2627
using AWS.Lambda.Powertools.Logging.Internal.Converters;
2728
using Microsoft.Extensions.Logging;
2829

@@ -69,6 +70,13 @@ internal static string Serialize(object value, Type inputType)
6970
var options = GetSerializerOptions();
7071
return JsonSerializer.Serialize(value, options);
7172
#else
73+
if (RuntimeFeatureWrapper.IsDynamicCodeSupported)
74+
{
75+
var options = GetSerializerOptions();
76+
#pragma warning disable
77+
return JsonSerializer.Serialize(value, options);
78+
}
79+
7280
var typeInfo = GetTypeInfo(inputType);
7381
if (typeInfo == null)
7482
{
@@ -154,10 +162,15 @@ private static JsonSerializerOptions BuildJsonSerializerOptions()
154162
_jsonOptions.PropertyNameCaseInsensitive = true;
155163

156164
#if NET8_0_OR_GREATER
157-
_jsonOptions.TypeInfoResolverChain.Add(PowertoolsLoggingSerializationContext.Default);
158-
foreach (var context in AdditionalContexts)
165+
166+
// Only add TypeInfoResolver if AOT mode
167+
if (!RuntimeFeatureWrapper.IsDynamicCodeSupported)
159168
{
160-
_jsonOptions.TypeInfoResolverChain.Add(context);
169+
_jsonOptions.TypeInfoResolverChain.Add(PowertoolsLoggingSerializationContext.Default);
170+
foreach (var context in AdditionalContexts)
171+
{
172+
_jsonOptions.TypeInfoResolverChain.Add(context);
173+
}
161174
}
162175
#endif
163176
return _jsonOptions;

libraries/tests/AWS.Lambda.Powertools.Logging.Tests/Serializers/PowertoolsLoggingSerializerTests.cs

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,12 @@
1515

1616
using System;
1717
using System.Collections.Generic;
18+
using System.Runtime.CompilerServices;
1819
using System.Text.Encodings.Web;
1920
using System.Text.Json;
2021
using System.Text.Json.Serialization;
2122
using Amazon.Lambda.Serialization.SystemTextJson;
23+
using AWS.Lambda.Powertools.Common.Utils;
2224
using AWS.Lambda.Powertools.Logging.Internal;
2325
using AWS.Lambda.Powertools.Logging.Internal.Converters;
2426
using AWS.Lambda.Powertools.Logging.Serializers;
@@ -48,8 +50,10 @@ public void SerializerOptions_ShouldNotBeNull()
4850
[Fact]
4951
public void SerializerOptions_ShouldHaveCorrectDefaultSettings()
5052
{
51-
var options = PowertoolsLoggingSerializer.GetSerializerOptions();
52-
53+
RuntimeFeatureWrapper.SetIsDynamicCodeSupported(false);
54+
55+
var options = PowertoolsLoggingSerializer.GetSerializerOptions();
56+
5357
Assert.Collection(options.Converters,
5458
converter => Assert.IsType<ByteArrayConverter>(converter),
5559
converter => Assert.IsType<ExceptionConverter>(converter),
@@ -70,6 +74,33 @@ public void SerializerOptions_ShouldHaveCorrectDefaultSettings()
7074
resolver => Assert.IsType<PowertoolsLoggingSerializationContext>(resolver));
7175
#endif
7276
}
77+
78+
[Fact]
79+
public void SerializerOptions_ShouldHaveCorrectDefaultSettings_WhenDynamic()
80+
{
81+
RuntimeFeatureWrapper.SetIsDynamicCodeSupported(true);
82+
83+
var options = PowertoolsLoggingSerializer.GetSerializerOptions();
84+
85+
Assert.Collection(options.Converters,
86+
converter => Assert.IsType<ByteArrayConverter>(converter),
87+
converter => Assert.IsType<ExceptionConverter>(converter),
88+
converter => Assert.IsType<MemoryStreamConverter>(converter),
89+
converter => Assert.IsType<ConstantClassConverter>(converter),
90+
converter => Assert.IsType<DateOnlyConverter>(converter),
91+
converter => Assert.IsType<TimeOnlyConverter>(converter),
92+
#if NET8_0_OR_GREATER
93+
converter => Assert.IsType<JsonStringEnumConverter<LogLevel>>(converter));
94+
#elif NET6_0
95+
converter => Assert.IsType<JsonStringEnumConverter>(converter));
96+
#endif
97+
98+
Assert.Equal(JavaScriptEncoder.UnsafeRelaxedJsonEscaping, options.Encoder);
99+
100+
#if NET8_0_OR_GREATER
101+
Assert.Empty(options.TypeInfoResolverChain);
102+
#endif
103+
}
73104

74105
[Fact]
75106
public void SerializerOptions_ShouldUseSnakeCaseByDefault()
@@ -143,13 +174,28 @@ public void Serialize_UnknownType_ThrowsInvalidOperationException()
143174
// Arrange
144175
var unknownObject = new UnknownType();
145176

177+
RuntimeFeatureWrapper.SetIsDynamicCodeSupported(false);
146178
// Act & Assert
147179
var exception = Assert.Throws<JsonSerializerException>(() =>
148180
PowertoolsLoggingSerializer.Serialize(unknownObject, typeof(UnknownType)));
149181

150182
Assert.Contains("is not known to the serializer", exception.Message);
151183
Assert.Contains(typeof(UnknownType).ToString(), exception.Message);
152184
}
185+
186+
[Fact]
187+
public void Serialize_UnknownType_Should_Not_Throw_InvalidOperationException_When_Dynamic()
188+
{
189+
// Arrange
190+
var unknownObject = new UnknownType{ SomeProperty = "Hello"};
191+
192+
RuntimeFeatureWrapper.SetIsDynamicCodeSupported(true);
193+
// Act & Assert
194+
var expected =
195+
PowertoolsLoggingSerializer.Serialize(unknownObject, typeof(UnknownType));
196+
197+
Assert.Equal("{\"some_property\":\"Hello\"}", expected);
198+
}
153199

154200
private class UnknownType
155201
{
@@ -175,5 +221,6 @@ public void Dispose()
175221
PowertoolsLoggingSerializer.ClearContext();
176222
#endif
177223
PowertoolsLoggingSerializer.ClearOptions();
224+
RuntimeFeatureWrapper.Reset();
178225
}
179226
}

version.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
{
22
"Core": {
3-
"Logging": "1.6.0",
3+
"Logging": "1.6.1",
44
"Metrics": "1.7.1",
55
"Tracing": "1.5.1"
66
},
77
"Utilities": {
88
"Parameters": "1.3.0",
99
"Idempotency": "1.2.2",
10-
"BatchProcessing": "1.1.2"
10+
"BatchProcessing": "1.2.0"
1111
}
1212
}

0 commit comments

Comments
 (0)