diff --git a/src/Aspire.Cli/DotNet/DotNetCliRunner.cs b/src/Aspire.Cli/DotNet/DotNetCliRunner.cs index 9ddd56b189c..8ac6505d4ca 100644 --- a/src/Aspire.Cli/DotNet/DotNetCliRunner.cs +++ b/src/Aspire.Cli/DotNet/DotNetCliRunner.cs @@ -83,7 +83,7 @@ private string GetMsBuildServerValue() internal static string GetBackchannelSocketPath() { - return CliPathHelper.CreateSocketPath("cli.sock"); + return CliPathHelper.CreateUnixDomainSocketPath("cli.sock"); } private async Task ExecuteAsync( diff --git a/src/Aspire.Cli/Projects/AppHostServerProject.cs b/src/Aspire.Cli/Projects/AppHostServerProject.cs index d2c37cc2d5a..a0aacb7bef7 100644 --- a/src/Aspire.Cli/Projects/AppHostServerProject.cs +++ b/src/Aspire.Cli/Projects/AppHostServerProject.cs @@ -34,7 +34,7 @@ internal sealed class AppHostServerProjectFactory( { public async Task CreateAsync(string appPath, CancellationToken cancellationToken = default) { - var socketPath = CliPathHelper.CreateSocketPath("apphost.sock"); + var socketPath = CliPathHelper.CreateGuestAppHostSocketPath("apphost.sock"); // Priority 1: Check for dev mode (ASPIRE_REPO_ROOT or running from Aspire source repo) var repoRoot = AspireRepositoryDetector.DetectRepositoryRoot(appPath); diff --git a/src/Aspire.Cli/Projects/GuestAppHostProject.cs b/src/Aspire.Cli/Projects/GuestAppHostProject.cs index 74c16ceda2a..8b589e220b7 100644 --- a/src/Aspire.Cli/Projects/GuestAppHostProject.cs +++ b/src/Aspire.Cli/Projects/GuestAppHostProject.cs @@ -925,7 +925,7 @@ await GenerateCodeViaRpcAsync( /// private static string GetBackchannelSocketPath() { - return CliPathHelper.CreateSocketPath("cli.sock"); + return CliPathHelper.CreateUnixDomainSocketPath("cli.sock"); } /// diff --git a/src/Aspire.Cli/Utils/CliPathHelper.cs b/src/Aspire.Cli/Utils/CliPathHelper.cs index 46f87a397b2..48aedcb8e52 100644 --- a/src/Aspire.Cli/Utils/CliPathHelper.cs +++ b/src/Aspire.Cli/Utils/CliPathHelper.cs @@ -14,11 +14,17 @@ internal static string GetAspireHomeDirectory() /// Creates a randomized CLI-managed socket path. /// /// The socket file prefix. - internal static string CreateSocketPath(string socketPrefix) + internal static string CreateUnixDomainSocketPath(string socketPrefix) + => CreateSocketPath(socketPrefix, isGuestAppHost: false); + + internal static string CreateGuestAppHostSocketPath(string socketPrefix) + => CreateSocketPath(socketPrefix, isGuestAppHost: true); + + private static string CreateSocketPath(string socketPrefix, bool isGuestAppHost) { var socketName = $"{socketPrefix}.{BackchannelConstants.CreateRandomIdentifier()}"; - if (OperatingSystem.IsWindows()) + if (isGuestAppHost && OperatingSystem.IsWindows()) { return socketName; } diff --git a/tests/Aspire.Cli.Tests/Utils/CliPathHelperTests.cs b/tests/Aspire.Cli.Tests/Utils/CliPathHelperTests.cs index 5f31d7fa973..2c570508e98 100644 --- a/tests/Aspire.Cli.Tests/Utils/CliPathHelperTests.cs +++ b/tests/Aspire.Cli.Tests/Utils/CliPathHelperTests.cs @@ -8,12 +8,12 @@ namespace Aspire.Cli.Tests.Utils; public class CliPathHelperTests(ITestOutputHelper outputHelper) { [Fact] - public void CreateSocketPath_UsesRandomizedIdentifier() + public void CreateGuestAppHostSocketPath_UsesRandomizedIdentifier() { using var workspace = TemporaryWorkspace.Create(outputHelper); - var socketPath1 = CliPathHelper.CreateSocketPath("apphost.sock"); - var socketPath2 = CliPathHelper.CreateSocketPath("apphost.sock"); + var socketPath1 = CliPathHelper.CreateGuestAppHostSocketPath("apphost.sock"); + var socketPath2 = CliPathHelper.CreateGuestAppHostSocketPath("apphost.sock"); Assert.NotEqual(socketPath1, socketPath2); @@ -31,4 +31,21 @@ public void CreateSocketPath_UsesRandomizedIdentifier() Assert.Matches("^apphost\\.sock\\.[a-f0-9]{12}$", Path.GetFileName(socketPath2)); } } + + [Fact] + public void CreateUnixDomainSocketPath_UsesRandomizedIdentifier() + { + using var workspace = TemporaryWorkspace.Create(outputHelper); + + var socketPath1 = CliPathHelper.CreateUnixDomainSocketPath("apphost.sock"); + var socketPath2 = CliPathHelper.CreateUnixDomainSocketPath("apphost.sock"); + + Assert.NotEqual(socketPath1, socketPath2); + + var expectedDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".aspire", "cli", "runtime", "sockets"); + Assert.Equal(expectedDirectory, Path.GetDirectoryName(socketPath1)); + Assert.Equal(expectedDirectory, Path.GetDirectoryName(socketPath2)); + Assert.Matches("^apphost\\.sock\\.[a-f0-9]{12}$", Path.GetFileName(socketPath1)); + Assert.Matches("^apphost\\.sock\\.[a-f0-9]{12}$", Path.GetFileName(socketPath2)); + } }