Skip to content

Commit 7fd31c1

Browse files
committed
Handle tests adding non-reloadable config sources
1 parent 0bb0a25 commit 7fd31c1

File tree

3 files changed

+110
-36
lines changed

3 files changed

+110
-36
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Microsoft.Extensions.Configuration;
5+
using Microsoft.Extensions.Primitives;
6+
7+
namespace Microsoft.AspNetCore.Builder
8+
{
9+
internal sealed class ConfigurationProviderSource : IConfigurationSource
10+
{
11+
private readonly IConfigurationProvider _configurationProvider;
12+
13+
public ConfigurationProviderSource(IConfigurationProvider configurationProvider)
14+
{
15+
_configurationProvider = configurationProvider;
16+
}
17+
18+
public IConfigurationProvider Build(IConfigurationBuilder builder)
19+
{
20+
return new IgnoreFirstLoadConfigurationProvider(_configurationProvider);
21+
}
22+
23+
// These providers have already been loaded, so no need to reload initially.
24+
// Otherwise, providers that cannot be reloaded like StreamConfigurationProviders will fail.
25+
private sealed class IgnoreFirstLoadConfigurationProvider : IConfigurationProvider
26+
{
27+
private readonly IConfigurationProvider _provider;
28+
29+
private bool _hasIgnoredFirstLoad;
30+
31+
public IgnoreFirstLoadConfigurationProvider(IConfigurationProvider provider)
32+
{
33+
_provider = provider;
34+
}
35+
36+
public IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath)
37+
{
38+
return _provider.GetChildKeys(earlierKeys, parentPath);
39+
}
40+
41+
public IChangeToken GetReloadToken()
42+
{
43+
return _provider.GetReloadToken();
44+
}
45+
46+
public void Load()
47+
{
48+
if (!_hasIgnoredFirstLoad)
49+
{
50+
_hasIgnoredFirstLoad = true;
51+
return;
52+
}
53+
54+
_provider.Load();
55+
}
56+
57+
public void Set(string key, string value)
58+
{
59+
_provider.Set(key, value);
60+
}
61+
62+
public bool TryGet(string key, out string value)
63+
{
64+
return _provider.TryGet(key, out value);
65+
}
66+
67+
public override bool Equals(object? obj)
68+
{
69+
return _provider.Equals(obj);
70+
}
71+
72+
public override int GetHashCode()
73+
{
74+
return _provider.GetHashCode();
75+
}
76+
77+
public override string? ToString()
78+
{
79+
return _provider.ToString();
80+
}
81+
}
82+
}
83+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using Microsoft.Extensions.Configuration;
5+
6+
namespace Microsoft.AspNetCore.Builder
7+
{
8+
internal sealed class TrackingChainedConfigurationSource : IConfigurationSource
9+
{
10+
private readonly ChainedConfigurationSource _chainedConfigurationSource = new();
11+
12+
public TrackingChainedConfigurationSource(ConfigurationManager configManager)
13+
{
14+
_chainedConfigurationSource.Configuration = configManager;
15+
}
16+
17+
public IConfigurationProvider? BuiltProvider { get; set; }
18+
19+
public IConfigurationProvider Build(IConfigurationBuilder builder)
20+
{
21+
BuiltProvider = _chainedConfigurationSource.Build(builder);
22+
return BuiltProvider;
23+
}
24+
}
25+
}

src/DefaultBuilder/src/WebApplicationBuilder.cs

Lines changed: 2 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -198,9 +198,8 @@ public WebApplication Build()
198198

199199
if (!hostBuilderProviders.Contains(chainedConfigSource.BuiltProvider))
200200
{
201-
// Something removed the TrackingChainedConfigurationSource pointing back to the ConfigurationManager.
202-
// This is likely a test using WebApplicationFactory<TEntryPoint>.
203-
// We replicate the effect by clearing the ConfingurationManager sources.
201+
// Something removed the _hostBuilder's TrackingChainedConfigurationSource pointing back to the ConfigurationManager.
202+
// This is likely a test using WebApplicationFactory. Replicate the effect by clearing the ConfingurationManager sources.
204203
((IConfigurationBuilder)Configuration).Sources.Clear();
205204
}
206205

@@ -303,38 +302,5 @@ public LoggingBuilder(IServiceCollection services)
303302

304303
public IServiceCollection Services { get; }
305304
}
306-
307-
private sealed class TrackingChainedConfigurationSource : IConfigurationSource
308-
{
309-
private readonly ChainedConfigurationSource _chainedConfigurationSource = new();
310-
311-
public TrackingChainedConfigurationSource(ConfigurationManager configManager)
312-
{
313-
_chainedConfigurationSource.Configuration = configManager;
314-
}
315-
316-
public IConfigurationProvider? BuiltProvider { get; set; }
317-
318-
public IConfigurationProvider Build(IConfigurationBuilder builder)
319-
{
320-
BuiltProvider = _chainedConfigurationSource.Build(builder);
321-
return BuiltProvider;
322-
}
323-
}
324-
325-
private sealed class ConfigurationProviderSource : IConfigurationSource
326-
{
327-
private readonly IConfigurationProvider _configurationProvider;
328-
329-
public ConfigurationProviderSource(IConfigurationProvider configurationProvider)
330-
{
331-
_configurationProvider = configurationProvider;
332-
}
333-
334-
public IConfigurationProvider Build(IConfigurationBuilder builder)
335-
{
336-
return _configurationProvider;
337-
}
338-
}
339305
}
340306
}

0 commit comments

Comments
 (0)