Skip to content

Commit 12ee932

Browse files
authored
File I/O abstraction part 21: Migrate IConfigurationManager and IFeatureProvider (#17906)
Refactored `IConfigurationManager` and `IFeatureProvider` (along with their implementations and tests) to use the Bicep.IO APIs. ###### Microsoft Reviewers: [Open in CodeFlow](https://microsoft.github.io/open-pr/?codeflow=https://github.com/Azure/bicep/pull/17906)
1 parent 934ac5c commit 12ee932

27 files changed

+435
-500
lines changed

src/Bicep.Cli/Commands/TestCommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public async Task<int> RunAsync(TestArguments args)
4444
{
4545
var inputUri = this.inputOutputArgumentsResolver.ResolveInputArguments(args);
4646
ArgumentHelper.ValidateBicepFile(inputUri);
47-
var features = featureProviderFactory.GetFeatureProvider(inputUri.ToUri());
47+
var features = featureProviderFactory.GetFeatureProvider(inputUri);
4848

4949
if (!features.TestFrameworkEnabled)
5050
{

src/Bicep.Core.IntegrationTests/Decorators/DecoratorTests.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using Bicep.Core.UnitTests.Assertions;
77
using Bicep.Core.UnitTests.Features;
88
using Bicep.Core.UnitTests.Utils;
9+
using Bicep.TextFixtures.Utils;
910
using FluentAssertions;
1011
using FluentAssertions.Execution;
1112
using Microsoft.VisualStudio.TestTools.UnitTesting;
@@ -39,6 +40,8 @@ public void ParameterDecorator_MissingDeclaration_ExpectedParameterDeclaration()
3940
[TestMethod]
4041
public void ParameterDecorator_AttachedToOtherKindsOfDeclarations_CannotBeUsedAsDecoratorSpecificToTheDeclarations()
4142
{
43+
var testCompiler = TestCompiler.ForMockFileSystemCompilation();
44+
4245
var mainUri = new Uri("file:///main.bicep");
4346
var moduleUri = new Uri("file:///module.bicep");
4447

src/Bicep.Core.UnitTests/Configuration/ConfigurationManagerTests.cs

Lines changed: 316 additions & 346 deletions
Large diffs are not rendered by default.

src/Bicep.Core.UnitTests/Configuration/PatchingConfigurationManager.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using Bicep.Core.Configuration;
5+
using Bicep.IO.Abstraction;
56

67
namespace Bicep.Core.UnitTests.Configuration;
78

@@ -16,5 +17,5 @@ public PatchingConfigurationManager(ConfigurationManager configurationManager, F
1617
this.patchFunc = patchFunc;
1718
}
1819

19-
public RootConfiguration GetConfiguration(Uri sourceFileUri) => patchFunc(configurationManager.GetConfiguration(sourceFileUri));
20+
public RootConfiguration GetConfiguration(IOUri sourceFileUri) => patchFunc(configurationManager.GetConfiguration(sourceFileUri));
2021
}

src/Bicep.Core.UnitTests/Configuration/ProviderConfigurationTests.cs

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using Bicep.Core.UnitTests.Assertions;
99
using Bicep.IO.Abstraction;
1010
using Bicep.IO.FileSystem;
11+
using Bicep.TextFixtures.IO;
1112
using FluentAssertions;
1213
using Microsoft.VisualStudio.TestTools.UnitTesting;
1314

@@ -66,23 +67,18 @@ public void ExtensionConfiguration_default_configuration_returns_known_list_of_b
6667
[TestMethod]
6768
public void ExtensionConfiguration_user_provided_configuration_overrides_default_configuration()
6869
{
69-
var bicepConfigFileName = "bicepconfig.json";
70-
var fs = new MockFileSystem(new Dictionary<string, MockFileData>
71-
{
72-
[bicepConfigFileName] = new("""
70+
var fileSet = InMemoryTestFileSet.Create(("bicepconfig.json", """
7371
{
74-
"extensions": {
75-
"foo": "br:example.azurecr.io/some/fake/path:1.0.0",
76-
"az": "br:mcr.microsoft.com/bicep/extensions/az:0.2.3"
77-
}
72+
"extensions": {
73+
"foo": "br:example.azurecr.io/some/fake/path:1.0.0",
74+
"az": "br:mcr.microsoft.com/bicep/extensions/az:0.2.3"
75+
}
7876
}
79-
""")
80-
});
77+
"""));
78+
79+
var configManager = new ConfigurationManager(fileSet.FileExplorer);
80+
var config = configManager.GetConfiguration(fileSet.GetUri("main.bicep"));
8181

82-
var fileExplorer = new FileSystemFileExplorer(fs);
83-
var configManager = new ConfigurationManager(fileExplorer);
84-
var testFilePath = fs.Path.GetFullPath(bicepConfigFileName);
85-
var config = configManager.GetConfiguration(PathHelper.FilePathToFileUrl(testFilePath));
8682
config.Diagnostics.Should().BeEmpty();
8783
config.Should().NotBeNull();
8884
config!.Extensions.Should().NotBeNull();

src/Bicep.Core.UnitTests/Features/FeatureProviderTests.cs

Lines changed: 31 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using Bicep.Core.Features;
88
using Bicep.Core.UnitTests.Assertions;
99
using Bicep.IO.FileSystem;
10+
using Bicep.TextFixtures.IO;
1011
using FluentAssertions;
1112
using Microsoft.VisualStudio.TestTools.UnitTesting;
1213

@@ -21,44 +22,47 @@ public class FeatureProviderTests
2122
[TestMethod]
2223
public void PropertyLookup_WithNothingConfigured_ReturnsDefault()
2324
{
24-
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
25-
{
26-
[CreatePath("repo")] = new MockDirectoryData(),
27-
[CreatePath("repo/bicepconfig.json")] = @"{""experimentalFeaturesEnabled"": {}}",
28-
});
25+
var fileSet = InMemoryTestFileSet.Create(("repo/bicepconfig.json", """
26+
{
27+
"experimentalFeaturesEnabled": {}
28+
}
29+
"""));
2930

30-
var fileExplorer = new FileSystemFileExplorer(fileSystem);
31-
var configManager = new ConfigurationManager(fileExplorer);
32-
var configuration = configManager.GetConfiguration(new Uri(this.CreatePath("repo/main.bicep")));
33-
var fpm = new FeatureProviderFactory(configManager, fileExplorer);
31+
var configManager = new ConfigurationManager(fileSet.FileExplorer);
32+
var configuration = configManager.GetConfiguration(fileSet.GetUri("repo/main.bicep"));
33+
var fpm = new FeatureProviderFactory(configManager, fileSet.FileExplorer);
3434

35-
var control = fpm.GetFeatureProvider(new Uri("file:///main.bicep"));
36-
var sut = fpm.GetFeatureProvider(new Uri(this.CreatePath("repo/main.bicep")));
35+
var control = fpm.GetFeatureProvider(fileSet.GetUri("main.bicep"));
36+
var sut = fpm.GetFeatureProvider(fileSet.GetUri("repo/main.bicep"));
3737
sut.SymbolicNameCodegenEnabled.Should().Be(control.SymbolicNameCodegenEnabled);
3838
}
3939

4040
[TestMethod]
4141
public void PropertyLookup_WithFeatureEnabledViaBicepConfig_ReturnsTrue()
4242
{
43-
var fileSystem = new MockFileSystem(new Dictionary<string, MockFileData>
44-
{
45-
[CreatePath("repo")] = new MockDirectoryData(),
46-
[CreatePath("repo/bicepconfig.json")] = @"{""experimentalFeaturesEnabled"": {}}",
47-
[CreatePath("repo/subdir")] = new MockDirectoryData(),
48-
[CreatePath("repo/subdir/bicepconfig.json")] = @"{""experimentalFeaturesEnabled"": {""symbolicNameCodegen"": true}}",
49-
});
50-
var fileExplorer = new FileSystemFileExplorer(fileSystem);
51-
var configManager = new ConfigurationManager(fileExplorer);
52-
var configuration = configManager.GetConfiguration(new Uri(this.CreatePath("repo/main.bicep")));
53-
var fpm = new FeatureProviderFactory(configManager, fileExplorer);
43+
var fileSet = InMemoryTestFileSet.Create(
44+
("repo/bicepconfig.json", """
45+
{
46+
"experimentalFeaturesEnabled": {}
47+
}
48+
"""),
49+
("repo/subdir/bicepconfig.json", """
50+
{
51+
"experimentalFeaturesEnabled": {
52+
"symbolicNameCodegen": true
53+
}
54+
}
55+
"""));
5456

55-
var control = fpm.GetFeatureProvider(new Uri("file:///main.bicep"));
57+
var configManager = new ConfigurationManager(fileSet.FileExplorer);
58+
var configuration = configManager.GetConfiguration(fileSet.GetUri("repo/main.bicep"));
59+
var fpm = new FeatureProviderFactory(configManager, fileSet.FileExplorer);
60+
61+
var control = fpm.GetFeatureProvider(fileSet.GetUri("main.bicep"));
5662
control.SymbolicNameCodegenEnabled.Should().BeFalse();
57-
var mainDirFeatures = fpm.GetFeatureProvider(new Uri(this.CreatePath("repo/main.bicep")));
63+
var mainDirFeatures = fpm.GetFeatureProvider(fileSet.GetUri("repo/main.bicep"));
5864
mainDirFeatures.SymbolicNameCodegenEnabled.Should().BeFalse();
59-
var subDirFeatures = fpm.GetFeatureProvider(new Uri(this.CreatePath("repo/subdir/module.bicep")));
65+
var subDirFeatures = fpm.GetFeatureProvider(fileSet.GetUri("repo/subdir/module.bicep"));
6066
subDirFeatures.SymbolicNameCodegenEnabled.Should().BeTrue();
6167
}
62-
63-
private string CreatePath(string path) => Path.Combine(this.TestContext.ResultsDirectory!, path.Replace('/', Path.DirectorySeparatorChar));
6468
}

src/Bicep.Core.UnitTests/Features/OverridableFeatureProviderFactory.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
// Licensed under the MIT License.
33

44
using Bicep.Core.Features;
5+
using Bicep.IO.Abstraction;
56

67
namespace Bicep.Core.UnitTests.Features;
78

@@ -16,6 +17,6 @@ public OverriddenFeatureProviderFactory(FeatureProviderFactory factory, FeatureP
1617
this.overrides = overrides;
1718
}
1819

19-
public IFeatureProvider GetFeatureProvider(Uri templateUri)
20-
=> new OverriddenFeatureProvider(factory.GetFeatureProvider(templateUri), overrides);
20+
public IFeatureProvider GetFeatureProvider(IOUri sourceFileUri)
21+
=> new OverriddenFeatureProvider(factory.GetFeatureProvider(sourceFileUri), overrides);
2122
}

src/Bicep.Core.UnitTests/Registry/ArtifactDispatcherTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public async Task GetModuleRestoreStatus_ConfigurationChanges_ReturnsCachedStatu
138138
{
139139
// Arrange.
140140
var configManagerMock = StrictMock.Of<IConfigurationManager>();
141-
configManagerMock.SetupSequence(m => m.GetConfiguration(It.IsAny<Uri>()))
141+
configManagerMock.SetupSequence(m => m.GetConfiguration(It.IsAny<IOUri>()))
142142
.Returns(BicepTestConstants.CreateMockConfiguration())
143143
.Returns(BicepTestConstants.CreateMockConfiguration())
144144
.Returns(changedConfiguration);

src/Bicep.Core.UnitTests/Registry/OciModuleRegistryTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -668,7 +668,7 @@ public async Task RestoreModuleWithSource_ShouldRestoreSourceToDisk(bool publish
668668
var template = BinaryData.FromString(jsonContentsV1);
669669

670670
var featureProviderFactoryMock = StrictMock.Of<IFeatureProviderFactory>();
671-
featureProviderFactoryMock.Setup(x => x.GetFeatureProvider(bicepFile.Uri)).Returns(bicepFile.Features);
671+
featureProviderFactoryMock.Setup(x => x.GetFeatureProvider(bicepFile.FileHandle.Uri)).Returns(bicepFile.Features);
672672

673673
SourceArchive? sourceArchive = null;
674674
if (publishSource)
@@ -746,7 +746,7 @@ private OciArtifactReference CreateModuleReference(BicepSourceFile referencingFi
746746
featureProviderMock.Setup(m => m.CacheRootDirectory).Returns(cacheRootDirectory);
747747

748748
var featureProviderFactoryMock = StrictMock.Of<IFeatureProviderFactory>();
749-
featureProviderFactoryMock.Setup(m => m.GetFeatureProvider(parentModuleUri)).Returns(featureProviderMock.Object);
749+
featureProviderFactoryMock.Setup(m => m.GetFeatureProvider(parentModuleUri.ToIOUri())).Returns(featureProviderMock.Object);
750750

751751
var parentModuleFile = new BicepFile(
752752
BicepTestConstants.FileExplorer.GetFile(parentModuleUri.ToIOUri()),

src/Bicep.Core.UnitTests/Utils/OciRegistryHelper.cs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,7 @@ public static (OciArtifactRegistry, FakeRegistryBlobClient) CreateModuleRegistry
9090
clientFactory.Setup(m => m.CreateAuthenticatedBlobClient(It.IsAny<CloudConfiguration>(), registryUri, repository)).Returns(client);
9191

9292
var containerRegistryManager = new AzureContainerRegistryManager(clientFactory.Object);
93-
var configurationManager = BicepTestConstants.ConfigurationManager;
94-
95-
var parentUri = new Uri("http://test.bicep", UriKind.Absolute);
96-
var configuration = configurationManager.GetConfiguration(parentUri);
93+
var configuration = IConfigurationManager.GetBuiltInConfiguration();
9794

9895
using var compiledStream = new BufferedMemoryStream();
9996

0 commit comments

Comments
 (0)