Skip to content

Commit 5cddf03

Browse files
committed
update environment variable prefix from PTENV to PTEnv for consistency.Only one utility is present, first load wins
1 parent f16d005 commit 5cddf03

File tree

3 files changed

+110
-35
lines changed

3 files changed

+110
-35
lines changed

libraries/src/AWS.Lambda.Powertools.Common/Core/PowertoolsEnvironment.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class PowertoolsEnvironment : IPowertoolsEnvironment
1515
/// <summary>
1616
/// Cached runtime environment string
1717
/// </summary>
18-
private static readonly string CachedRuntimeEnvironment = $"PTENV/{Environment.GetEnvironmentVariable(Constants.AwsExecutionEnvironmentVariableName)}";
18+
private static readonly string CachedRuntimeEnvironment = $"PTEnv/{Environment.GetEnvironmentVariable(Constants.AwsExecutionEnvironmentVariableName)}";
1919

2020
/// <summary>
2121
/// Cache for parsed assembly names to avoid repeated string operations
@@ -77,13 +77,16 @@ public void SetExecutionEnvironment<T>(T type, string utilityName = null)
7777
var assemblyVersion = GetAssemblyVersion(type);
7878
var newEntry = $"{assemblyName}/{assemblyVersion}";
7979

80-
if (!string.IsNullOrEmpty(currentEnvValue) && currentEnvValue.Contains(assemblyName))
80+
// Only set if not already present and only allows one utility
81+
// this will change when bitwise is supported
82+
if (!string.IsNullOrEmpty(currentEnvValue) && (currentEnvValue.Contains(assemblyName)
83+
|| currentEnvValue.Contains("PTEnv/")))
8184
{
8285
return;
8386
}
8487

8588
string finalValue;
86-
var ptenvIndex = currentEnvValue?.IndexOf("PTENV/") ?? -1;
89+
var ptenvIndex = currentEnvValue?.IndexOf("PTEnv/") ?? -1;
8790

8891
if (string.IsNullOrEmpty(currentEnvValue))
8992
{

libraries/tests/AWS.Lambda.Powertools.Common.Tests/Core/PowertoolsEnvironmentTest.cs

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public void Set_Execution_Environment()
2626
powertoolsEnv.SetExecutionEnvironment(this);
2727

2828
// Assert
29-
Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
29+
Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
3030
}
3131

3232
[Fact]
@@ -42,7 +42,7 @@ public void Set_Execution_Environment_WhenEnvironmentHasValue()
4242
powertoolsEnv.SetExecutionEnvironment(this);
4343

4444
// Assert
45-
Assert.Equal($"ExistingValuesInUserAgent {Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
45+
Assert.Equal($"ExistingValuesInUserAgent {Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
4646
}
4747

4848
[Fact]
@@ -56,10 +56,10 @@ public void Set_Same_Execution_Environment_Multiple_Times_Should_Only_Set_Once()
5656
powertoolsEnv.SetExecutionEnvironment(this);
5757

5858
// Assert
59-
Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
59+
Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}", powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
6060
}
6161

62-
[Fact]
62+
[Fact(Skip = "This will be added back when we have bitwise")]
6363
public void Set_Multiple_Execution_Environment()
6464
{
6565
// Arrange
@@ -70,7 +70,22 @@ public void Set_Multiple_Execution_Environment()
7070
powertoolsEnv.SetExecutionEnvironment(powertoolsEnv.GetType());
7171

7272
// Assert
73-
Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 {Constants.FeatureContextIdentifier}/Common/1.0.0 PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}",
73+
Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 {Constants.FeatureContextIdentifier}/Common/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}",
74+
powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
75+
}
76+
77+
[Fact]
78+
public void When_Multiple_Only_Set_One_Utility()
79+
{
80+
// Arrange
81+
var powertoolsEnv = new PowertoolsEnvironment();
82+
83+
// Act
84+
powertoolsEnv.SetExecutionEnvironment(this);
85+
powertoolsEnv.SetExecutionEnvironment(powertoolsEnv.GetType());
86+
87+
// Assert
88+
Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}",
7489
powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
7590
}
7691

@@ -110,7 +125,7 @@ public void SetExecutionEnvironment_Should_Format_Strings_Correctly_With_Mocked_
110125
{
111126
var assemblyName = "PT/Tests"; // Parsed name
112127
var assemblyVersion = "1.2.3";
113-
var runtimeEnv = "PTENV/AWS_LAMBDA_DOTNET8"; // Assuming .NET 8
128+
var runtimeEnv = "PTEnv/AWS_LAMBDA_DOTNET8"; // Assuming .NET 8
114129
var expectedValue = $"{assemblyName}/{assemblyVersion} {runtimeEnv}";
115130

116131
mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue);
@@ -120,7 +135,7 @@ public void SetExecutionEnvironment_Should_Format_Strings_Correctly_With_Mocked_
120135
mockEnvironment.SetExecutionEnvironment(this);
121136

122137
// Assert
123-
mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "PT/Tests/1.2.3 PTENV/AWS_LAMBDA_DOTNET8");
138+
mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "PT/Tests/1.2.3 PTEnv/AWS_LAMBDA_DOTNET8");
124139
}
125140

126141
[Fact]
@@ -141,7 +156,7 @@ public void SetExecutionEnvironment_Should_Append_To_Existing_Environment_With_M
141156
var currentEnv = "ExistingValue";
142157
var assemblyName = "PT/Logging";
143158
var assemblyVersion = "2.1.0";
144-
var runtimeEnv = "PTENV/AWS_LAMBDA_DOTNET8";
159+
var runtimeEnv = "PTEnv/AWS_LAMBDA_DOTNET8";
145160
var expectedValue = $"{currentEnv} {assemblyName}/{assemblyVersion} {runtimeEnv}";
146161

147162
mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue);
@@ -151,28 +166,28 @@ public void SetExecutionEnvironment_Should_Append_To_Existing_Environment_With_M
151166
mockEnvironment.SetExecutionEnvironment(this);
152167

153168
// Assert
154-
mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "ExistingValue PT/Logging/2.1.0 PTENV/AWS_LAMBDA_DOTNET8");
169+
mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "ExistingValue PT/Logging/2.1.0 PTEnv/AWS_LAMBDA_DOTNET8");
155170
}
156171

157172
[Fact]
158-
public void SetExecutionEnvironment_Should_Not_Add_PTENV_Twice_With_Mocked_Values()
173+
public void SetExecutionEnvironment_Should_Not_Add_PTEnv_Twice_With_Mocked_Values()
159174
{
160175
// Arrange
161176
var mockEnvironment = Substitute.For<IPowertoolsEnvironment>();
162177

163-
// Mock existing environment value that already contains PTENV
164-
mockEnvironment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID").Returns("PT/Metrics/1.0.0 PTENV/AWS_LAMBDA_DOTNET8");
178+
// Mock existing environment value that already contains PTEnv
179+
mockEnvironment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID").Returns("PT/Metrics/1.0.0 PTEnv/AWS_LAMBDA_DOTNET8");
165180
mockEnvironment.GetAssemblyName(Arg.Any<object>()).Returns("AWS.Lambda.Powertools.Tracing");
166181
mockEnvironment.GetAssemblyVersion(Arg.Any<object>()).Returns("1.5.0");
167182

168-
// Setup the method call - should not add PTENV again
183+
// Setup the method call - should not add PTEnv again
169184
mockEnvironment.When(x => x.SetExecutionEnvironment(Arg.Any<object>()))
170185
.Do(_ =>
171186
{
172-
var currentEnv = "PT/Metrics/1.0.0 PTENV/AWS_LAMBDA_DOTNET8";
187+
var currentEnv = "PT/Metrics/1.0.0 PTEnv/AWS_LAMBDA_DOTNET8";
173188
var assemblyName = "PT/Tracing";
174189
var assemblyVersion = "1.5.0";
175-
// No PTENV added since it already exists
190+
// No PTEnv added since it already exists
176191
var expectedValue = $"{currentEnv} {assemblyName}/{assemblyVersion}";
177192

178193
mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue);
@@ -182,7 +197,7 @@ public void SetExecutionEnvironment_Should_Not_Add_PTENV_Twice_With_Mocked_Value
182197
mockEnvironment.SetExecutionEnvironment(this);
183198

184199
// Assert
185-
mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "PT/Metrics/1.0.0 PTENV/AWS_LAMBDA_DOTNET8 PT/Tracing/1.5.0");
200+
mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "PT/Metrics/1.0.0 PTEnv/AWS_LAMBDA_DOTNET8 PT/Tracing/1.5.0");
186201
}
187202

188203
[Fact]
@@ -294,11 +309,11 @@ public void SetExecutionEnvironment_Should_Handle_Empty_Current_Environment()
294309
// Assert
295310
var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID");
296311
Assert.Contains($"{Constants.FeatureContextIdentifier}/Tests/", result);
297-
Assert.Contains("PTENV/AWS_LAMBDA_DOTNET", result);
312+
Assert.Contains("PTEnv/AWS_LAMBDA_DOTNET", result);
298313
}
299314

300315
[Fact]
301-
public void SetExecutionEnvironment_Should_Add_PTENV_When_Not_Present()
316+
public void SetExecutionEnvironment_Should_Add_PTEnv_When_Not_Present()
302317
{
303318
// Arrange
304319
var powertoolsEnv = new PowertoolsEnvironment();
@@ -310,24 +325,24 @@ public void SetExecutionEnvironment_Should_Add_PTENV_When_Not_Present()
310325
// Assert
311326
var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID");
312327
Assert.StartsWith("SomeExistingValue", result);
313-
Assert.Contains("PTENV/AWS_LAMBDA_DOTNET", result);
328+
Assert.Contains("PTEnv/AWS_LAMBDA_DOTNET", result);
314329
}
315330

316331
[Fact]
317-
public void SetExecutionEnvironment_Should_Not_Add_PTENV_When_Already_Present()
332+
public void SetExecutionEnvironment_Should_Not_Add_PTEnv_When_Already_Present()
318333
{
319334
// Arrange
320335
var powertoolsEnv = new PowertoolsEnvironment();
321-
var existingValue = $"ExistingValue PTENV/AWS_LAMBDA_DOTNET{Environment.Version.Major}";
336+
var existingValue = $"ExistingValue PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}";
322337
powertoolsEnv.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", existingValue);
323338

324339
// Act
325340
powertoolsEnv.SetExecutionEnvironment(this);
326341

327342
// Assert
328343
var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID");
329-
var ptenvCount = result.Split("PTENV/").Length - 1;
330-
Assert.Equal(1, ptenvCount); // Should only have one PTENV entry
344+
var ptenvCount = result.Split("PTEnv/").Length - 1;
345+
Assert.Equal(1, ptenvCount); // Should only have one PTEnv entry
331346
}
332347

333348
public void Dispose()

libraries/tests/AWS.Lambda.Powertools.ModuleInitializer.Tests/EnvWrapperTests.cs

Lines changed: 66 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,10 @@ public void SetExecutionEnvironment_Should_Set_AWS_SDK_UA_APP_ID()
5151
public void Is_PTENV_Set()
5252
{
5353
Assert.NotNull(_appId);
54-
Assert.Contains("PTENV/", _appId);
54+
Assert.Contains("PTEnv/", _appId);
5555
_output.WriteLine(_appId);
5656
// check that it is last in the string
57-
Assert.EndsWith("PTENV/", _appId, StringComparison.OrdinalIgnoreCase);
57+
Assert.EndsWith("PTEnv/", _appId, StringComparison.OrdinalIgnoreCase);
5858
}
5959

6060
[Fact]
@@ -71,8 +71,8 @@ public void SetExecutionEnvironment_Should_Have_Correct_Format()
7171
{
7272
Assert.NotNull(_appId);
7373

74-
// Should end with PTENV/
75-
Assert.EndsWith("PTENV/", _appId);
74+
// Should end with PTEnv/
75+
Assert.EndsWith("PTEnv/", _appId);
7676

7777
// Should contain at least one PT/ entry
7878
var ptEntries = Regex.Matches(_appId, @"PT/[^/]+/\d+\.\d+\.\d+");
@@ -125,7 +125,7 @@ public void SetExecutionEnvironment_Multiple_Calls_Should_Not_Duplicate()
125125
_output.WriteLine($"Second call: {secondCall}");
126126
}
127127

128-
[Fact]
128+
[Fact(Skip = "This will be added back when we have bitwise")]
129129
public void SetExecutionEnvironment_All_Libraries_Should_Set_All_Utilities()
130130
{
131131
// Clear environment variable to start fresh
@@ -172,8 +172,8 @@ public void SetExecutionEnvironment_All_Libraries_Should_Set_All_Utilities()
172172
_output.WriteLine($"✓ Found utility: {utility}");
173173
}
174174

175-
// Verify PTENV/ is at the end
176-
Assert.EndsWith("PTENV/", appId);
175+
// Verify PTEnv/ is at the end
176+
Assert.EndsWith("PTEnv/", appId);
177177

178178
// Verify each utility appears exactly once
179179
foreach (var utility in expectedUtilities)
@@ -189,6 +189,63 @@ public void SetExecutionEnvironment_All_Libraries_Should_Set_All_Utilities()
189189

190190
_output.WriteLine($"Total utilities found: {ptEntries.Count}");
191191
}
192+
193+
[Fact]
194+
public void SetExecutionEnvironment_All_Libraries_Should_Set_Only_One_Utility()
195+
{
196+
// Clear environment variable to start fresh
197+
Environment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", null);
198+
199+
// Call SetExecutionEnvironment from all EnvWrapper classes to simulate
200+
// what would happen when all libraries are used in a real application
201+
AWS.Lambda.Powertools.Logging.Internal.EnvWrapper.SetExecutionEnvironment();
202+
AWS.Lambda.Powertools.Tracing.Internal.EnvWrapper.SetExecutionEnvironment();
203+
AWS.Lambda.Powertools.BatchProcessing.Internal.EnvWrapper.SetExecutionEnvironment();
204+
AWS.Lambda.Powertools.Idempotency.Internal.EnvWrapper.SetExecutionEnvironment();
205+
AWS.Lambda.Powertools.Metrics.Internal.EnvWrapper.SetExecutionEnvironment();
206+
AWS.Lambda.Powertools.Parameters.Internal.EnvWrapper.SetExecutionEnvironment();
207+
AWS.Lambda.Powertools.EventHandler.Internal.EnvWrapper.SetExecutionEnvironment();
208+
AWS.Lambda.Powertools.EventHandler.Resolvers.BedrockAgentFunction.Internal.EnvWrapper.SetExecutionEnvironment();
209+
AWS.Lambda.Powertools.Kafka.Avro.Internal.EnvWrapper.SetExecutionEnvironment();
210+
AWS.Lambda.Powertools.Kafka.Json.Internal.EnvWrapper.SetExecutionEnvironment();
211+
AWS.Lambda.Powertools.Kafka.Protobuf.Internal.EnvWrapper.SetExecutionEnvironment();
212+
213+
var appId = Environment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID");
214+
Assert.NotNull(appId);
215+
216+
_output.WriteLine($"Complete environment variable: {appId}");
217+
218+
// Verify all expected utilities are present
219+
var utilitiesThatShouldNotBePresent = new[]
220+
{
221+
// "Logging",
222+
"Tracing",
223+
"BatchProcessing",
224+
"Idempotency",
225+
"Metrics",
226+
"Parameters",
227+
"EventHandler",
228+
"BedrockAgentFunction",
229+
"Kafka.Avro",
230+
"Kafka.Json",
231+
"Kafka.Protobuf"
232+
};
233+
234+
foreach (var utility in utilitiesThatShouldNotBePresent)
235+
{
236+
Assert.DoesNotContain($"PT/{utility}/", appId);
237+
_output.WriteLine($"✓ Not Found utility: {utility}");
238+
}
239+
240+
// Verify PTEnv/ is at the end
241+
Assert.EndsWith("PTEnv/", appId);
242+
243+
// Count total PT/ entries
244+
var ptEntries = Regex.Matches(appId, @"PT/[^/]+/\d+\.\d+\.\d+");
245+
Assert.Single(ptEntries);
246+
247+
_output.WriteLine($"Total utilities found: {ptEntries.Count}");
248+
}
192249

193250
[Theory]
194251
[InlineData("Logging")]
@@ -251,8 +308,8 @@ public void SetExecutionEnvironment_Individual_Library_Should_Set_Specific_Utili
251308
// Verify the specific utility is present
252309
Assert.Contains($"PT/{expectedUtility}/", appId);
253310

254-
// Verify PTENV/ is at the end
255-
Assert.EndsWith("PTENV/", appId);
311+
// Verify PTEnv/ is at the end
312+
Assert.EndsWith("PTEnv/", appId);
256313

257314
_output.WriteLine($"Testing {expectedUtility}: {appId}");
258315
}

0 commit comments

Comments
 (0)