Skip to content

Commit bb8fbbb

Browse files
Add testcase for refresh activity (#665)
* add testcase for refresh activity * update * update * update
1 parent 78803ed commit bb8fbbb

File tree

5 files changed

+106
-4
lines changed

5 files changed

+106
-4
lines changed

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ internal IEnumerable<IKeyValueAdapter> Adapters
119119
/// </summary>
120120
internal IConfigurationSettingPageIterator ConfigurationSettingPageIterator { get; set; }
121121

122+
/// <summary>
123+
/// For use in tests only. An optional activity source name to specify the activity source used by the configuration provider.
124+
/// </summary>
125+
internal string ActivitySourceName { get; set; }
126+
122127
/// <summary>
123128
/// An optional timespan value to set the minimum backoff duration to a value other than the default.
124129
/// </summary>

src/Microsoft.Extensions.Configuration.AzureAppConfiguration/AzureAppConfigurationProvider.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ namespace Microsoft.Extensions.Configuration.AzureAppConfiguration
2424
{
2525
internal class AzureAppConfigurationProvider : ConfigurationProvider, IConfigurationRefresher, IHealthCheck, IDisposable
2626
{
27-
private readonly ActivitySource _activitySource = new ActivitySource(ActivityNames.AzureAppConfigurationActivitySource);
27+
private readonly ActivitySource _activitySource;
2828
private bool _optional;
2929
private bool _isInitialLoadComplete = false;
3030
private bool _isAssemblyInspected;
@@ -156,6 +156,8 @@ public AzureAppConfigurationProvider(IConfigurationClientManager configClientMan
156156
{
157157
SetRequestTracingOptions();
158158
}
159+
160+
_activitySource = new ActivitySource(options.ActivitySourceName ?? ActivityNames.AzureAppConfigurationActivitySource);
159161
}
160162

161163
/// <summary>
@@ -164,7 +166,7 @@ public AzureAppConfigurationProvider(IConfigurationClientManager configClientMan
164166
public override void Load()
165167
{
166168
var watch = Stopwatch.StartNew();
167-
using Activity activity = _activitySource.StartActivity(ActivityNames.Load);
169+
using Activity activity = _activitySource?.StartActivity(ActivityNames.Load);
168170
try
169171
{
170172
using var startupCancellationTokenSource = new CancellationTokenSource(_options.Startup.Timeout);
@@ -266,7 +268,7 @@ public async Task RefreshAsync(CancellationToken cancellationToken)
266268
return;
267269
}
268270

269-
using Activity activity = _activitySource.StartActivity(ActivityNames.Refresh);
271+
using Activity activity = _activitySource?.StartActivity(ActivityNames.Refresh);
270272
// Check if initial configuration load had failed
271273
if (_mappedData == null)
272274
{
@@ -1447,7 +1449,7 @@ private async Task ProcessKeyValueChangesAsync(
14471449
public void Dispose()
14481450
{
14491451
(_configClientManager as ConfigurationClientManager)?.Dispose();
1450-
_activitySource.Dispose();
1452+
_activitySource?.Dispose();
14511453
}
14521454
}
14531455
}

tests/Tests.AzureAppConfiguration/Unit/RefreshTests.cs

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
using Moq;
1313
using System;
1414
using System.Collections.Generic;
15+
using System.Diagnostics;
1516
using System.Linq;
1617
using System.Threading;
1718
using System.Threading.Tasks;
@@ -1218,6 +1219,68 @@ MockAsyncPageable GetTestKeys(SettingSelector selector, CancellationToken ct)
12181219
Assert.Null(config["FeatureManagement:MyFeature"]);
12191220
}
12201221

1222+
[Fact]
1223+
public async Task RefreshTests_StartsRefreshActivity()
1224+
{
1225+
string activitySourceName = Guid.NewGuid().ToString();
1226+
1227+
var _activities = new List<Activity>();
1228+
var _activityListener = new ActivityListener
1229+
{
1230+
ShouldListenTo = source => source.Name == activitySourceName,
1231+
Sample = (ref ActivityCreationOptions<ActivityContext> options) => ActivitySamplingResult.AllData,
1232+
ActivityStarted = activity => _activities.Add(activity),
1233+
};
1234+
ActivitySource.AddActivityListener(_activityListener);
1235+
1236+
IConfigurationRefresher refresher = null;
1237+
var mockClient = GetMockConfigurationClient();
1238+
1239+
var mockAsyncPageable = new MockAsyncPageable(_kvCollection);
1240+
1241+
mockClient.Setup(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
1242+
.Callback(() => mockAsyncPageable.UpdateCollection(_kvCollection))
1243+
.Returns(mockAsyncPageable);
1244+
1245+
var config = new ConfigurationBuilder()
1246+
.AddAzureAppConfiguration(options =>
1247+
{
1248+
options.ClientManager = TestHelpers.CreateMockedConfigurationClientManager(mockClient.Object);
1249+
options.Select("TestKey*", "label");
1250+
options.ConfigurationSettingPageIterator = new MockConfigurationSettingPageIterator();
1251+
options.ConfigureRefresh(refreshOptions =>
1252+
{
1253+
refreshOptions.RegisterAll()
1254+
.SetRefreshInterval(TimeSpan.FromSeconds(1));
1255+
});
1256+
options.ActivitySourceName = activitySourceName;
1257+
1258+
refresher = options.GetRefresher();
1259+
})
1260+
.Build();
1261+
1262+
Assert.Single(_activities);
1263+
Assert.Contains(_activities, a => a.OperationName == "Load");
1264+
1265+
// Wait for the cache to expire
1266+
await Task.Delay(1500);
1267+
await refresher.RefreshAsync();
1268+
1269+
Assert.Equal(2, _activities.Count);
1270+
Assert.Equal("Refresh", _activities.Last().OperationName);
1271+
1272+
await refresher.RefreshAsync();
1273+
Assert.Equal(2, _activities.Count); // only start refresh activity when real refresh happens
1274+
1275+
// Wait for the cache to expire
1276+
await Task.Delay(1500);
1277+
await refresher.RefreshAsync();
1278+
Assert.Equal(3, _activities.Count);
1279+
Assert.Equal("Refresh", _activities.Last().OperationName);
1280+
1281+
_activityListener.Dispose();
1282+
}
1283+
12211284
#if NET8_0
12221285
[Fact]
12231286
public void RefreshTests_ChainedConfigurationProviderUsedAsRootForRefresherProvider()

tests/Tests.AzureAppConfiguration/Unit/Tests.cs

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,10 @@
1010
using Moq;
1111
using System;
1212
using System.Collections.Generic;
13+
using System.Diagnostics;
1314
using System.Linq;
1415
using System.Threading;
16+
using System.Threading.Tasks;
1517
using Xunit;
1618

1719
namespace Tests.AzureAppConfiguration
@@ -346,5 +348,35 @@ public void TestKeepSelectorPrecedenceAfterDedup()
346348

347349
Assert.True(config["message"] == "message from dev label");
348350
}
351+
352+
[Fact]
353+
public void TestActivitySource()
354+
{
355+
var _activities = new List<Activity>();
356+
var _activityListener = new ActivityListener
357+
{
358+
ShouldListenTo = source => source.Name == "Microsoft.Extensions.Configuration.AzureAppConfiguration",
359+
Sample = (ref ActivityCreationOptions<ActivityContext> options) => ActivitySamplingResult.AllData,
360+
ActivityStarted = activity => _activities.Add(activity),
361+
};
362+
ActivitySource.AddActivityListener(_activityListener);
363+
364+
var mockResponse = new Mock<Response>();
365+
var mockClient = new Mock<ConfigurationClient>(MockBehavior.Strict);
366+
367+
mockClient.Setup(c => c.GetConfigurationSettingsAsync(It.IsAny<SettingSelector>(), It.IsAny<CancellationToken>()))
368+
.Returns(new MockAsyncPageable(_kvCollectionPageOne));
369+
370+
mockClient.Setup(c => c.GetConfigurationSettingAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<CancellationToken>()))
371+
.ReturnsAsync(Response.FromValue(_kv, mockResponse.Object));
372+
373+
var config = new ConfigurationBuilder()
374+
.AddAzureAppConfiguration(options => options.ClientManager = TestHelpers.CreateMockedConfigurationClientManager(mockClient.Object))
375+
.Build();
376+
377+
Assert.Contains(_activities, a => a.OperationName == "Load");
378+
379+
_activityListener.Dispose();
380+
}
349381
}
350382
}

0 commit comments

Comments
 (0)