-
Notifications
You must be signed in to change notification settings - Fork 36
Expand file tree
/
Copy pathPowertoolsEnvironmentTest.cs
More file actions
375 lines (303 loc) · 13.2 KB
/
PowertoolsEnvironmentTest.cs
File metadata and controls
375 lines (303 loc) · 13.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;
using System.Xml.XPath;
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
using NSubstitute;
using Xunit;
namespace AWS.Lambda.Powertools.Common.Tests;
public class PowertoolsEnvironmentTest : IDisposable
{
public PowertoolsEnvironmentTest()
{
Environment.SetEnvironmentVariable("AWS_EXECUTION_ENV", $"AWS_LAMBDA_DOTNET{Environment.Version.Major}");
}
[Fact]
public void Set_Execution_Environment()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
// Act
powertoolsEnv.SetExecutionEnvironment(this);
// Assert
Assert.Equal(
$"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}",
powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
}
[Fact]
public void Set_Execution_Environment_WhenEnvironmentHasValue()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
powertoolsEnv.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "ExistingValuesInUserAgent");
powertoolsEnv.SetEnvironmentVariable("AWS_EXECUTION_ENV", $"AWS_LAMBDA_DOTNET{Environment.Version.Major}");
// Act
powertoolsEnv.SetExecutionEnvironment(this);
// Assert
Assert.Equal(
$"ExistingValuesInUserAgent {Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}",
powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
}
[Fact]
public void Set_Same_Execution_Environment_Multiple_Times_Should_Only_Set_Once()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
// Act
powertoolsEnv.SetExecutionEnvironment(this);
powertoolsEnv.SetExecutionEnvironment(this);
// Assert
Assert.Equal(
$"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}",
powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
}
[Fact(Skip = "This will be added back when we have bitwise")]
public void Set_Multiple_Execution_Environment()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
// Act
powertoolsEnv.SetExecutionEnvironment(this);
powertoolsEnv.SetExecutionEnvironment(powertoolsEnv.GetType());
// Assert
Assert.Equal(
$"{Constants.FeatureContextIdentifier}/Tests/1.0.0 {Constants.FeatureContextIdentifier}/Common/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}",
powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
}
[Fact]
public void When_Multiple_Only_Set_One_Utility()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
// Act
powertoolsEnv.SetExecutionEnvironment(this);
powertoolsEnv.SetExecutionEnvironment(powertoolsEnv.GetType());
// Assert
Assert.Equal(
$"{Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}",
powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID"));
}
[Fact]
public void SetExecutionEnvironment_Should_Format_Strings_Correctly_With_Mocked_Environment()
{
// Arrange
var mockEnvironment = Substitute.For<IPowertoolsEnvironment>();
// Mock the dependencies to return controlled values
mockEnvironment.GetAssemblyName(Arg.Any<object>()).Returns("AWS.Lambda.Powertools.Common.Tests");
mockEnvironment.GetAssemblyVersion(Arg.Any<object>()).Returns("1.2.3");
mockEnvironment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID").Returns((string)null);
// Setup the actual method call to use real implementation logic
mockEnvironment.When(x => x.SetExecutionEnvironment(Arg.Any<object>()))
.Do(_ =>
{
var assemblyName = "PT/Tests"; // Parsed name
var assemblyVersion = "1.2.3";
var runtimeEnv = "PTEnv/AWS_LAMBDA_DOTNET8"; // Assuming .NET 8
var expectedValue = $"{assemblyName}/{assemblyVersion} {runtimeEnv}";
mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue);
});
// Act
mockEnvironment.SetExecutionEnvironment(this);
// Assert
mockEnvironment.Received(1)
.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "PT/Tests/1.2.3 PTEnv/AWS_LAMBDA_DOTNET8");
}
[Fact]
public void SetExecutionEnvironment_Should_Append_To_Existing_Environment_With_Mocked_Values()
{
// Arrange
var mockEnvironment = Substitute.For<IPowertoolsEnvironment>();
// Mock existing environment value
mockEnvironment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID").Returns("ExistingValue");
mockEnvironment.GetAssemblyName(Arg.Any<object>()).Returns("AWS.Lambda.Powertools.Logging");
mockEnvironment.GetAssemblyVersion(Arg.Any<object>()).Returns("2.1.0");
// Setup the method call
mockEnvironment.When(x => x.SetExecutionEnvironment(Arg.Any<object>()))
.Do(_ =>
{
var currentEnv = "ExistingValue";
var assemblyName = "PT/Logging";
var assemblyVersion = "2.1.0";
var runtimeEnv = "PTEnv/AWS_LAMBDA_DOTNET8";
var expectedValue = $"{currentEnv} {assemblyName}/{assemblyVersion} {runtimeEnv}";
mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue);
});
// Act
mockEnvironment.SetExecutionEnvironment(this);
// Assert
mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID",
"ExistingValue PT/Logging/2.1.0 PTEnv/AWS_LAMBDA_DOTNET8");
}
[Fact]
public void SetExecutionEnvironment_Should_Not_Add_PTEnv_Twice_With_Mocked_Values()
{
// Arrange
var mockEnvironment = Substitute.For<IPowertoolsEnvironment>();
// Mock existing environment value that already contains PTEnv
mockEnvironment.GetEnvironmentVariable("AWS_SDK_UA_APP_ID")
.Returns("PT/Metrics/1.0.0 PTEnv/AWS_LAMBDA_DOTNET8");
mockEnvironment.GetAssemblyName(Arg.Any<object>()).Returns("AWS.Lambda.Powertools.Tracing");
mockEnvironment.GetAssemblyVersion(Arg.Any<object>()).Returns("1.5.0");
// Setup the method call - should not add PTEnv again
mockEnvironment.When(x => x.SetExecutionEnvironment(Arg.Any<object>()))
.Do(_ =>
{
var currentEnv = "PT/Metrics/1.0.0 PTEnv/AWS_LAMBDA_DOTNET8";
var assemblyName = "PT/Tracing";
var assemblyVersion = "1.5.0";
// No PTEnv added since it already exists
var expectedValue = $"{currentEnv} {assemblyName}/{assemblyVersion}";
mockEnvironment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", expectedValue);
});
// Act
mockEnvironment.SetExecutionEnvironment(this);
// Assert
mockEnvironment.Received(1).SetEnvironmentVariable("AWS_SDK_UA_APP_ID",
"PT/Metrics/1.0.0 PTEnv/AWS_LAMBDA_DOTNET8 PT/Tracing/1.5.0");
}
[Fact]
public void GetAssemblyName_Should_Handle_Type_Object()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
var typeObject = typeof(PowertoolsEnvironment);
// Act
var result = powertoolsEnv.GetAssemblyName(typeObject);
// Assert
Assert.Equal("AWS.Lambda.Powertools.Common", result);
}
[Fact]
public void GetAssemblyName_Should_Handle_Regular_Object()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
// Act
var result = powertoolsEnv.GetAssemblyName(this);
// Assert
Assert.Equal("AWS.Lambda.Powertools.Common.Tests", result);
}
[Fact]
public void GetAssemblyVersion_Should_Handle_Type_Object()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
var typeObject = typeof(PowertoolsEnvironment);
// Act
var result = powertoolsEnv.GetAssemblyVersion(typeObject);
// Assert
Assert.Matches(@"\d+\.\d+\.\d+", result); // Should match version pattern like "1.0.0"
}
[Fact]
public void GetAssemblyVersion_Should_Handle_Regular_Object()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
// Act
var result = powertoolsEnv.GetAssemblyVersion(this);
// Assert
Assert.Matches(@"\d+\.\d+\.\d+", result); // Should match version pattern like "1.0.0"
}
[Fact]
public void ParseAssemblyName_Should_Handle_Assembly_Without_Dots()
{
// Act
var result = PowertoolsEnvironment.ParseAssemblyName("SimpleAssemblyName");
// Assert
Assert.Equal($"{Constants.FeatureContextIdentifier}/SimpleAssemblyName", result);
}
[Fact]
public void ParseAssemblyName_Should_Handle_Assembly_With_Dots()
{
// Act
var result = PowertoolsEnvironment.ParseAssemblyName("AWS.Lambda.Powertools.Common");
// Assert
Assert.Equal($"{Constants.FeatureContextIdentifier}/Common", result);
}
[Fact]
public void ParseAssemblyName_Should_Use_Cache_For_Same_Assembly_Name()
{
// Act - Call twice with same assembly name
var result1 = PowertoolsEnvironment.ParseAssemblyName("AWS.Lambda.Powertools.Tests");
var result2 = PowertoolsEnvironment.ParseAssemblyName("AWS.Lambda.Powertools.Tests");
// Assert - Should return same result (cached)
Assert.Equal(result1, result2);
Assert.Equal($"{Constants.FeatureContextIdentifier}/Tests", result1);
}
[Fact]
public void ParseAssemblyName_Null_Return_Empty()
{
// Act - Call twice with same assembly name
var result = PowertoolsEnvironment.ParseAssemblyName(null);
// Assert - Should return null
Assert.Empty(result);
}
[Fact]
public void SetExecutionEnvironment_Should_Handle_Empty_Current_Environment()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
Environment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "");
// Act
powertoolsEnv.SetExecutionEnvironment(this);
// Assert
var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID");
Assert.Contains($"{Constants.FeatureContextIdentifier}/Tests/", result);
Assert.Contains("PTEnv/AWS_LAMBDA_DOTNET", result);
}
[Fact]
public void SetExecutionEnvironment_Should_Add_PTEnv_When_Not_Present()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
powertoolsEnv.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", "SomeExistingValue");
// Act
powertoolsEnv.SetExecutionEnvironment(this);
// Assert
var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID");
Assert.StartsWith("SomeExistingValue", result);
Assert.Contains("PTEnv/AWS_LAMBDA_DOTNET", result);
}
[Fact]
public void SetExecutionEnvironment_Should_Not_Add_PTEnv_When_Already_Present()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
var existingValue = $"ExistingValue PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}";
powertoolsEnv.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", existingValue);
// Act
powertoolsEnv.SetExecutionEnvironment(this);
// Assert
var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID");
var ptenvCount = result.Split("PTEnv/").Length - 1;
Assert.Equal(1, ptenvCount); // Should only have one PTEnv entry
}
[Fact]
public void SetExecutionEnvironment_Should_Insert_Before_Existing_PTEnv()
{
// Arrange
var powertoolsEnv = new PowertoolsEnvironment();
var existingValue = $"ExistingValue PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}";
powertoolsEnv.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", existingValue);
// Act
powertoolsEnv.SetExecutionEnvironment(this);
// Assert
var result = powertoolsEnv.GetEnvironmentVariable("AWS_SDK_UA_APP_ID");
var expectedValue =
$"ExistingValue {Constants.FeatureContextIdentifier}/Tests/1.0.0 PTEnv/AWS_LAMBDA_DOTNET{Environment.Version.Major}";
Assert.Equal(expectedValue, result);
// Verify the new entry is inserted before PTEnv
var ptenvIndex = result.IndexOf("PTEnv/");
var testEntryIndex = result.IndexOf($"{Constants.FeatureContextIdentifier}/Tests/");
Assert.True(testEntryIndex < ptenvIndex, "New entry should be inserted before PTEnv");
}
public void Dispose()
{
//Do cleanup actions here
Environment.SetEnvironmentVariable("AWS_SDK_UA_APP_ID", null);
// Clear the singleton instance to ensure fresh state for each test
var instanceField = typeof(PowertoolsEnvironment).GetField("_instance",
System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static);
instanceField?.SetValue(null, null);
}
}