From 860c6c21cfa6de0c4ba5b6f83f84d4e578ae7fc0 Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Thu, 8 May 2025 17:15:28 -0600 Subject: [PATCH 1/4] Slnx should now be found when using the DotnetSlnPostAction --- .../DotnetSlnPostActionProcessor.cs | 8 +++- .../dotnet-new/DotnetSlnPostActionTests.cs | 48 ++++++++++++------- 2 files changed, 36 insertions(+), 20 deletions(-) diff --git a/src/Cli/dotnet/commands/dotnet-new/PostActions/DotnetSlnPostActionProcessor.cs b/src/Cli/dotnet/commands/dotnet-new/PostActions/DotnetSlnPostActionProcessor.cs index 28143fd21d82..0f8a4bd0047d 100644 --- a/src/Cli/dotnet/commands/dotnet-new/PostActions/DotnetSlnPostActionProcessor.cs +++ b/src/Cli/dotnet/commands/dotnet-new/PostActions/DotnetSlnPostActionProcessor.cs @@ -27,8 +27,12 @@ public DotnetSlnPostActionProcessor(Func, string?, internal static IReadOnlyList FindSolutionFilesAtOrAbovePath(IPhysicalFileSystem fileSystem, string outputBasePath) { - return FileFindHelpers.FindFilesAtOrAbovePath(fileSystem, outputBasePath, "*.sln") - ?? FileFindHelpers.FindFilesAtOrAbovePath(fileSystem, outputBasePath, "*.slnx"); + var slnFiles = FileFindHelpers.FindFilesAtOrAbovePath(fileSystem, outputBasePath, "*.sln"); + if (slnFiles.Count > 0) + { + return slnFiles; + } + return FileFindHelpers.FindFilesAtOrAbovePath(fileSystem, outputBasePath, "*.slnx"); } // The project files to add are a subset of the primary outputs, specifically the primary outputs indicated by the primaryOutputIndexes post action argument (semicolon separated) diff --git a/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs b/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs index f32e970ff806..9701894af20b 100644 --- a/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs +++ b/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs @@ -19,11 +19,13 @@ public DotnetSlnPostActionTests(EnvironmentSettingsHelper environmentSettingsHel _engineEnvironmentSettings = environmentSettingsHelper.CreateEnvironment(hostIdentifier: GetType().Name, virtualize: true); } - [Fact(DisplayName = nameof(AddProjectToSolutionPostActionFindSolutionFileAtOutputPath))] - public void AddProjectToSolutionPostActionFindSolutionFileAtOutputPath() + [Theory] + [InlineData("MySln.sln")] + [InlineData("MySln.slnx")] + public void AddProjectToSolutionPostActionFindSolutionFileAtOutputPath(string solutionFileName) { string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); - string solutionFileFullPath = Path.Combine(targetBasePath, "MySln.sln"); + string solutionFileFullPath = Path.Combine(targetBasePath, solutionFileName); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(solutionFileFullPath, string.Empty); IReadOnlyList solutionFiles = DotnetSlnPostActionProcessor.FindSolutionFilesAtOrAbovePath(_engineEnvironmentSettings.Host.FileSystem, targetBasePath); @@ -160,14 +162,16 @@ public void AddProjectToSolutionPostActionWithoutPrimaryOutputIndexesWithOutputB Assert.Contains(outputFileFullPath1, foundProjectFiles.ToList()); } - [Fact(DisplayName = nameof(AddProjectToSolutionCanTargetASingleProjectWithAJsonArray))] - public void AddProjectToSolutionCanTargetASingleProjectWithAJsonArray() + [Theory] + [InlineData("MySln.sln")] + [InlineData("MySln.slnx")] + public void AddProjectToSolutionCanTargetASingleProjectWithAJsonArray(string solutionFileName) { var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); - string slnFileFullPath = Path.Combine(targetBasePath, "MyApp.sln"); + string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(slnFileFullPath, ""); @@ -189,14 +193,16 @@ public void AddProjectToSolutionCanTargetASingleProjectWithAJsonArray() Assert.Equal(slnFileFullPath, callback.Solution); } - [Fact(DisplayName = nameof(AddProjectToSolutionCanTargetASingleProjectWithTheProjectName))] - public void AddProjectToSolutionCanTargetASingleProjectWithTheProjectName() + [Theory] + [InlineData("MySln.sln")] + [InlineData("MySln.slnx")] + public void AddProjectToSolutionCanTargetASingleProjectWithTheProjectName(string solutionFileName) { var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); - string slnFileFullPath = Path.Combine(targetBasePath, "MyApp.sln"); + string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(slnFileFullPath, ""); @@ -218,14 +224,16 @@ public void AddProjectToSolutionCanTargetASingleProjectWithTheProjectName() Assert.Equal(slnFileFullPath, callback.Solution); } - [Fact(DisplayName = nameof(AddProjectToSolutionCanPlaceProjectInSolutionRoot))] - public void AddProjectToSolutionCanPlaceProjectInSolutionRoot() + [Theory] + [InlineData("MySln.sln")] + [InlineData("MySln.slnx")] + public void AddProjectToSolutionCanPlaceProjectInSolutionRoot(string solutionFileName) { var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); - string slnFileFullPath = Path.Combine(targetBasePath, "MyApp.sln"); + string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(slnFileFullPath, ""); @@ -250,14 +258,16 @@ public void AddProjectToSolutionCanPlaceProjectInSolutionRoot() Assert.Null(callback.TargetFolder); } - [Fact] - public void AddProjectToSolutionCanPlaceProjectInSolutionFolder() + [Theory] + [InlineData("MySln.sln")] + [InlineData("MySln.slnx")] + public void AddProjectToSolutionCanPlaceProjectInSolutionFolder(string solutionFileName) { var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); - string slnFileFullPath = Path.Combine(targetBasePath, "MyApp.sln"); + string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(slnFileFullPath, ""); @@ -282,14 +292,16 @@ public void AddProjectToSolutionCanPlaceProjectInSolutionFolder() Assert.Equal("src", callback.TargetFolder); } - [Fact] - public void AddProjectToSolutionFailsWhenSolutionFolderAndInRootSpecified() + [Theory] + [InlineData("MySln.sln")] + [InlineData("MySln.slnx")] + public void AddProjectToSolutionFailsWhenSolutionFolderAndInRootSpecified(string solutionFileName) { var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); - string slnFileFullPath = Path.Combine(targetBasePath, "MyApp.sln"); + string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(slnFileFullPath, ""); From b310967bba82bd9be4a1a5770b96e41f8d862181 Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Fri, 9 May 2025 13:46:06 -0600 Subject: [PATCH 2/4] Fixed tests. Used suggestion --- .../DotnetSlnPostActionProcessor.cs | 11 ++++--- .../dotnet-new/DotnetSlnPostActionTests.cs | 29 ++++++++++++++----- 2 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/Cli/dotnet/commands/dotnet-new/PostActions/DotnetSlnPostActionProcessor.cs b/src/Cli/dotnet/commands/dotnet-new/PostActions/DotnetSlnPostActionProcessor.cs index 0f8a4bd0047d..c03937f3723e 100644 --- a/src/Cli/dotnet/commands/dotnet-new/PostActions/DotnetSlnPostActionProcessor.cs +++ b/src/Cli/dotnet/commands/dotnet-new/PostActions/DotnetSlnPostActionProcessor.cs @@ -27,12 +27,11 @@ public DotnetSlnPostActionProcessor(Func, string?, internal static IReadOnlyList FindSolutionFilesAtOrAbovePath(IPhysicalFileSystem fileSystem, string outputBasePath) { - var slnFiles = FileFindHelpers.FindFilesAtOrAbovePath(fileSystem, outputBasePath, "*.sln"); - if (slnFiles.Count > 0) - { - return slnFiles; - } - return FileFindHelpers.FindFilesAtOrAbovePath(fileSystem, outputBasePath, "*.slnx"); + return + [ + ..FileFindHelpers.FindFilesAtOrAbovePath(fileSystem, outputBasePath, "*.sln"), + ..FileFindHelpers.FindFilesAtOrAbovePath(fileSystem, outputBasePath, "*.slnx") + ]; } // The project files to add are a subset of the primary outputs, specifically the primary outputs indicated by the primaryOutputIndexes post action argument (semicolon separated) diff --git a/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs b/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs index 9701894af20b..3dc919c05eb2 100644 --- a/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs +++ b/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs @@ -24,7 +24,7 @@ public DotnetSlnPostActionTests(EnvironmentSettingsHelper environmentSettingsHel [InlineData("MySln.slnx")] public void AddProjectToSolutionPostActionFindSolutionFileAtOutputPath(string solutionFileName) { - string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string targetBasePath = GetVirtualizedRootPath(); string solutionFileFullPath = Path.Combine(targetBasePath, solutionFileName); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(solutionFileFullPath, string.Empty); @@ -36,7 +36,7 @@ public void AddProjectToSolutionPostActionFindSolutionFileAtOutputPath(string so [Fact(DisplayName = nameof(AddProjectToSolutionPostActionFindsOneProjectToAdd))] public void AddProjectToSolutionPostActionFindsOneProjectToAdd() { - string outputBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string outputBasePath = GetVirtualizedRootPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { ActionId = DotnetSlnPostActionProcessor.ActionProcessorId, @@ -170,7 +170,7 @@ public void AddProjectToSolutionCanTargetASingleProjectWithAJsonArray(string sol var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -201,7 +201,7 @@ public void AddProjectToSolutionCanTargetASingleProjectWithTheProjectName(string var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -232,7 +232,7 @@ public void AddProjectToSolutionCanPlaceProjectInSolutionRoot(string solutionFil var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -266,7 +266,7 @@ public void AddProjectToSolutionCanPlaceProjectInSolutionFolder(string solutionF var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -300,7 +300,7 @@ public void AddProjectToSolutionFailsWhenSolutionFolderAndInRootSpecified(string var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -326,6 +326,21 @@ public void AddProjectToSolutionFailsWhenSolutionFolderAndInRootSpecified(string Assert.False(result); } + /// + /// Creates a virtualized path at the root. + /// This is used to test the behavior of finding *.slnx files after failing to find *.sln files. + /// + /// If the root is not virtualized, tests will fail because the "FindFilesAtOrAbovePath" method + /// will run into a non-virtualized directory and fail due to it not existing within the "virtual cone". + /// + /// The root path virtualized + private string GetVirtualizedRootPath() + { + var root = Path.GetPathRoot(Directory.GetCurrentDirectory())!; + _engineEnvironmentSettings.Host.VirtualizeDirectory(root); + return Path.Combine(Directory.GetCurrentDirectory(), "sandbox", Guid.NewGuid().ToString()) + Path.DirectorySeparatorChar; + } + private class MockAddProjectToSolutionCallback { public string? Solution { get; private set; } From e7e7827cada89abe85a59b0caa5b7a1d8d59e0c2 Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Fri, 9 May 2025 17:28:29 -0600 Subject: [PATCH 3/4] Update DotnetSlnPostActionTests.cs --- .../dotnet-new/DotnetSlnPostActionTests.cs | 38 ++++++++----------- 1 file changed, 15 insertions(+), 23 deletions(-) diff --git a/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs b/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs index 3dc919c05eb2..89ee69457597 100644 --- a/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs +++ b/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs @@ -16,7 +16,7 @@ public class DotnetSlnPostActionTests : IClassFixture public DotnetSlnPostActionTests(EnvironmentSettingsHelper environmentSettingsHelper) { - _engineEnvironmentSettings = environmentSettingsHelper.CreateEnvironment(hostIdentifier: GetType().Name, virtualize: true); + _engineEnvironmentSettings = environmentSettingsHelper.CreateEnvironment(hostIdentifier: GetType().Name, virtualize: false); } [Theory] @@ -24,7 +24,7 @@ public DotnetSlnPostActionTests(EnvironmentSettingsHelper environmentSettingsHel [InlineData("MySln.slnx")] public void AddProjectToSolutionPostActionFindSolutionFileAtOutputPath(string solutionFileName) { - string targetBasePath = GetVirtualizedRootPath(); + string targetBasePath = GetTemporaryPath(); string solutionFileFullPath = Path.Combine(targetBasePath, solutionFileName); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(solutionFileFullPath, string.Empty); @@ -36,7 +36,7 @@ public void AddProjectToSolutionPostActionFindSolutionFileAtOutputPath(string so [Fact(DisplayName = nameof(AddProjectToSolutionPostActionFindsOneProjectToAdd))] public void AddProjectToSolutionPostActionFindsOneProjectToAdd() { - string outputBasePath = GetVirtualizedRootPath(); + string outputBasePath = GetTemporaryPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { ActionId = DotnetSlnPostActionProcessor.ActionProcessorId, @@ -56,7 +56,7 @@ public void AddProjectToSolutionPostActionFindsOneProjectToAdd() [Fact(DisplayName = nameof(AddProjectToSolutionPostActionFindsMultipleProjectsToAdd))] public void AddProjectToSolutionPostActionFindsMultipleProjectsToAdd() { - string outputBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string outputBasePath = GetTemporaryPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { ActionId = DotnetSlnPostActionProcessor.ActionProcessorId, @@ -104,7 +104,7 @@ public void AddProjectToSolutionPostActionDoesntFindProjectOutOfRange() [Fact(DisplayName = nameof(AddProjectToSolutionPostActionFindsMultipleProjectsToAddWithOutputBasePath))] public void AddProjectToSolutionPostActionFindsMultipleProjectsToAddWithOutputBasePath() { - string outputBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string outputBasePath = GetTemporaryPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { @@ -138,7 +138,7 @@ public void AddProjectToSolutionPostActionFindsMultipleProjectsToAddWithOutputBa [Fact(DisplayName = nameof(AddProjectToSolutionPostActionWithoutPrimaryOutputIndexesWithOutputBasePath))] public void AddProjectToSolutionPostActionWithoutPrimaryOutputIndexesWithOutputBasePath() { - string outputBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); + string outputBasePath = GetTemporaryPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { @@ -170,7 +170,7 @@ public void AddProjectToSolutionCanTargetASingleProjectWithAJsonArray(string sol var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetVirtualizedRootPath(); + string targetBasePath = GetTemporaryPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -201,7 +201,7 @@ public void AddProjectToSolutionCanTargetASingleProjectWithTheProjectName(string var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetVirtualizedRootPath(); + string targetBasePath = GetTemporaryPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -232,7 +232,7 @@ public void AddProjectToSolutionCanPlaceProjectInSolutionRoot(string solutionFil var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetVirtualizedRootPath(); + string targetBasePath = GetTemporaryPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -266,7 +266,7 @@ public void AddProjectToSolutionCanPlaceProjectInSolutionFolder(string solutionF var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetVirtualizedRootPath(); + string targetBasePath = GetTemporaryPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -300,7 +300,7 @@ public void AddProjectToSolutionFailsWhenSolutionFolderAndInRootSpecified(string var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetVirtualizedRootPath(); + string targetBasePath = GetTemporaryPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -326,19 +326,11 @@ public void AddProjectToSolutionFailsWhenSolutionFolderAndInRootSpecified(string Assert.False(result); } - /// - /// Creates a virtualized path at the root. - /// This is used to test the behavior of finding *.slnx files after failing to find *.sln files. - /// - /// If the root is not virtualized, tests will fail because the "FindFilesAtOrAbovePath" method - /// will run into a non-virtualized directory and fail due to it not existing within the "virtual cone". - /// - /// The root path virtualized - private string GetVirtualizedRootPath() + private string GetTemporaryPath() { - var root = Path.GetPathRoot(Directory.GetCurrentDirectory())!; - _engineEnvironmentSettings.Host.VirtualizeDirectory(root); - return Path.Combine(Directory.GetCurrentDirectory(), "sandbox", Guid.NewGuid().ToString()) + Path.DirectorySeparatorChar; + string tempPath = Path.Combine(_engineEnvironmentSettings.Paths.GlobalSettingsDir, "sandbox", Guid.NewGuid().ToString()) + Path.DirectorySeparatorChar; + Directory.CreateDirectory(tempPath); + return tempPath; } private class MockAddProjectToSolutionCallback From 2b23e691e37404f438e2d0e1832867b005bc9431 Mon Sep 17 00:00:00 2001 From: Lance Barnes Date: Mon, 12 May 2025 10:23:29 -0600 Subject: [PATCH 4/4] Revert "Update DotnetSlnPostActionTests.cs" This reverts commit e7e7827cada89abe85a59b0caa5b7a1d8d59e0c2. --- .../dotnet-new/DotnetSlnPostActionTests.cs | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs b/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs index 89ee69457597..3dc919c05eb2 100644 --- a/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs +++ b/test/dotnet.Tests/dotnet-new/DotnetSlnPostActionTests.cs @@ -16,7 +16,7 @@ public class DotnetSlnPostActionTests : IClassFixture public DotnetSlnPostActionTests(EnvironmentSettingsHelper environmentSettingsHelper) { - _engineEnvironmentSettings = environmentSettingsHelper.CreateEnvironment(hostIdentifier: GetType().Name, virtualize: false); + _engineEnvironmentSettings = environmentSettingsHelper.CreateEnvironment(hostIdentifier: GetType().Name, virtualize: true); } [Theory] @@ -24,7 +24,7 @@ public DotnetSlnPostActionTests(EnvironmentSettingsHelper environmentSettingsHel [InlineData("MySln.slnx")] public void AddProjectToSolutionPostActionFindSolutionFileAtOutputPath(string solutionFileName) { - string targetBasePath = GetTemporaryPath(); + string targetBasePath = GetVirtualizedRootPath(); string solutionFileFullPath = Path.Combine(targetBasePath, solutionFileName); _engineEnvironmentSettings.Host.FileSystem.WriteAllText(solutionFileFullPath, string.Empty); @@ -36,7 +36,7 @@ public void AddProjectToSolutionPostActionFindSolutionFileAtOutputPath(string so [Fact(DisplayName = nameof(AddProjectToSolutionPostActionFindsOneProjectToAdd))] public void AddProjectToSolutionPostActionFindsOneProjectToAdd() { - string outputBasePath = GetTemporaryPath(); + string outputBasePath = GetVirtualizedRootPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { ActionId = DotnetSlnPostActionProcessor.ActionProcessorId, @@ -56,7 +56,7 @@ public void AddProjectToSolutionPostActionFindsOneProjectToAdd() [Fact(DisplayName = nameof(AddProjectToSolutionPostActionFindsMultipleProjectsToAdd))] public void AddProjectToSolutionPostActionFindsMultipleProjectsToAdd() { - string outputBasePath = GetTemporaryPath(); + string outputBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { ActionId = DotnetSlnPostActionProcessor.ActionProcessorId, @@ -104,7 +104,7 @@ public void AddProjectToSolutionPostActionDoesntFindProjectOutOfRange() [Fact(DisplayName = nameof(AddProjectToSolutionPostActionFindsMultipleProjectsToAddWithOutputBasePath))] public void AddProjectToSolutionPostActionFindsMultipleProjectsToAddWithOutputBasePath() { - string outputBasePath = GetTemporaryPath(); + string outputBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { @@ -138,7 +138,7 @@ public void AddProjectToSolutionPostActionFindsMultipleProjectsToAddWithOutputBa [Fact(DisplayName = nameof(AddProjectToSolutionPostActionWithoutPrimaryOutputIndexesWithOutputBasePath))] public void AddProjectToSolutionPostActionWithoutPrimaryOutputIndexesWithOutputBasePath() { - string outputBasePath = GetTemporaryPath(); + string outputBasePath = _engineEnvironmentSettings.GetTempVirtualizedPath(); IPostAction postAction = new MockPostAction(default, default, default, default, default!) { @@ -170,7 +170,7 @@ public void AddProjectToSolutionCanTargetASingleProjectWithAJsonArray(string sol var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetTemporaryPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -201,7 +201,7 @@ public void AddProjectToSolutionCanTargetASingleProjectWithTheProjectName(string var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetTemporaryPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -232,7 +232,7 @@ public void AddProjectToSolutionCanPlaceProjectInSolutionRoot(string solutionFil var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetTemporaryPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -266,7 +266,7 @@ public void AddProjectToSolutionCanPlaceProjectInSolutionFolder(string solutionF var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetTemporaryPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -300,7 +300,7 @@ public void AddProjectToSolutionFailsWhenSolutionFolderAndInRootSpecified(string var callback = new MockAddProjectToSolutionCallback(); var actionProcessor = new DotnetSlnPostActionProcessor(callback.AddProjectToSolution); - string targetBasePath = GetTemporaryPath(); + string targetBasePath = GetVirtualizedRootPath(); string slnFileFullPath = Path.Combine(targetBasePath, solutionFileName); string projFileFullPath = Path.Combine(targetBasePath, "MyApp.csproj"); @@ -326,11 +326,19 @@ public void AddProjectToSolutionFailsWhenSolutionFolderAndInRootSpecified(string Assert.False(result); } - private string GetTemporaryPath() + /// + /// Creates a virtualized path at the root. + /// This is used to test the behavior of finding *.slnx files after failing to find *.sln files. + /// + /// If the root is not virtualized, tests will fail because the "FindFilesAtOrAbovePath" method + /// will run into a non-virtualized directory and fail due to it not existing within the "virtual cone". + /// + /// The root path virtualized + private string GetVirtualizedRootPath() { - string tempPath = Path.Combine(_engineEnvironmentSettings.Paths.GlobalSettingsDir, "sandbox", Guid.NewGuid().ToString()) + Path.DirectorySeparatorChar; - Directory.CreateDirectory(tempPath); - return tempPath; + var root = Path.GetPathRoot(Directory.GetCurrentDirectory())!; + _engineEnvironmentSettings.Host.VirtualizeDirectory(root); + return Path.Combine(Directory.GetCurrentDirectory(), "sandbox", Guid.NewGuid().ToString()) + Path.DirectorySeparatorChar; } private class MockAddProjectToSolutionCallback