From 6f84c9e0e1189a738eba42f11b216a330934334a Mon Sep 17 00:00:00 2001 From: Mitch Denny Date: Wed, 25 Mar 2026 12:20:50 +1100 Subject: [PATCH] Make VerifyAspireCliVersionAsync resilient across branches Read VersionPrefix dynamically from eng/Versions.props instead of hardcoding a specific version. For non-stabilized builds (all normal PR builds), also verify the commit SHA suffix for exact build identity. This replaces the hardcoded '13.2.0' check that was added for the stabilized 13.2.0 release build. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Helpers/CliE2EAutomatorHelpers.cs | 26 ++++++---- .../Helpers/CliE2ETestHelpers.cs | 48 +++++++++++++++++++ 2 files changed, 66 insertions(+), 8 deletions(-) diff --git a/tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2EAutomatorHelpers.cs b/tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2EAutomatorHelpers.cs index de3bf127406..55e016d5ab4 100644 --- a/tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2EAutomatorHelpers.cs +++ b/tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2EAutomatorHelpers.cs @@ -147,23 +147,33 @@ internal static async Task SourceAspireCliEnvironmentAsync( } /// - /// Verifies the installed Aspire CLI version matches the expected version. + /// Verifies the installed Aspire CLI version matches the expected build. + /// Always checks the dynamic version prefix from eng/Versions.props. + /// For non-stabilized builds (all normal PR builds), also verifies the commit SHA suffix. /// -#pragma warning disable IDE0060 // commitSha is unused during stabilized builds — restore when merging back to main internal static async Task VerifyAspireCliVersionAsync( this Hex1bTerminalAutomator auto, string commitSha, SequenceCounter counter) -#pragma warning restore IDE0060 { + var versionPrefix = CliE2ETestHelpers.GetVersionPrefix(); + var isStabilized = CliE2ETestHelpers.IsStabilizedBuild(); + await auto.TypeAsync("aspire --version"); await auto.EnterAsync(); - // When the build is stabilized (StabilizePackageVersion=true), the CLI version - // is just "13.2.0" with no commit SHA suffix. When not stabilized, it includes - // the SHA (e.g., "13.2.0-preview.1.g"). In both cases, "13.2.0" is present. - // TODO: This change should be reverted on the integration to the main branch. - await auto.WaitUntilTextAsync("13.2.0", timeout: TimeSpan.FromSeconds(10)); + // Always verify the version prefix matches the branch's version (e.g., "13.3.0"). + await auto.WaitUntilTextAsync(versionPrefix, timeout: TimeSpan.FromSeconds(10)); + + // For non-stabilized builds (all PR CI builds), also verify the commit SHA suffix + // to uniquely identify the exact build. Stabilized builds (official releases only) + // produce versions without SHA suffixes, so we skip this check. + if (!isStabilized && commitSha.Length == 40) + { + var shortCommitSha = commitSha[..8]; + var expectedVersionSuffix = $"g{shortCommitSha}"; + await auto.WaitUntilTextAsync(expectedVersionSuffix, timeout: TimeSpan.FromSeconds(10)); + } await auto.WaitForSuccessPromptAsync(counter); } diff --git a/tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2ETestHelpers.cs b/tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2ETestHelpers.cs index ed41c1a899b..2937fec507c 100644 --- a/tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2ETestHelpers.cs +++ b/tests/Aspire.Cli.EndToEnd.Tests/Helpers/CliE2ETestHelpers.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Runtime.CompilerServices; +using System.Xml.Linq; using Aspire.Cli.Tests.Utils; using Hex1b; using Xunit; @@ -309,4 +310,51 @@ internal static string ToContainerPath(string hostPath, TemporaryWorkspace works var relativePath = Path.GetRelativePath(workspace.WorkspaceRoot.FullName, hostPath); return $"/workspace/{workspace.WorkspaceRoot.Name}/" + relativePath.Replace('\\', '/'); } + + /// + /// Reads the VersionPrefix (e.g., "13.3.0") from eng/Versions.props by parsing + /// the MajorVersion, MinorVersion, and PatchVersion MSBuild properties. + /// + internal static string GetVersionPrefix() + { + var repoRoot = GetRepoRoot(); + var versionsPropsPath = Path.Combine(repoRoot, "eng", "Versions.props"); + + var doc = XDocument.Load(versionsPropsPath); + var ns = doc.Root?.Name.Namespace ?? XNamespace.None; + + string? GetProperty(string name) => + doc.Descendants(ns + name).FirstOrDefault()?.Value; + + var major = GetProperty("MajorVersion") + ?? throw new InvalidOperationException("MajorVersion not found in eng/Versions.props"); + var minor = GetProperty("MinorVersion") + ?? throw new InvalidOperationException("MinorVersion not found in eng/Versions.props"); + var patch = GetProperty("PatchVersion") + ?? throw new InvalidOperationException("PatchVersion not found in eng/Versions.props"); + + return $"{major}.{minor}.{patch}"; + } + + /// + /// Checks whether the build is stabilized (StabilizePackageVersion=true in eng/Versions.props). + /// Stabilized builds produce version strings without commit SHA suffixes (e.g., "13.2.0" instead + /// of "13.2.0-preview.1.25175.1+g{sha}"). This is only true for official release builds, + /// never for normal PR CI builds. + /// + internal static bool IsStabilizedBuild() + { + var repoRoot = GetRepoRoot(); + var versionsPropsPath = Path.Combine(repoRoot, "eng", "Versions.props"); + + var doc = XDocument.Load(versionsPropsPath); + var ns = doc.Root?.Name.Namespace ?? XNamespace.None; + + // The default value in Versions.props uses a Condition to default to "false", + // so we read the element's text directly. + var stabilize = doc.Descendants(ns + "StabilizePackageVersion") + .FirstOrDefault()?.Value; + + return string.Equals(stabilize, "true", StringComparison.OrdinalIgnoreCase); + } }