File: Utils\TestDotnetSdkVersionProvider.cs
Web Access
Project: src\tests\Aspire.Hosting.TestUtilities\Aspire.Hosting.TestUtilities.csproj (Aspire.Hosting.TestUtilities)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Concurrent;
using Aspire.Hosting.Utils;
using Semver;
 
namespace Aspire.Hosting.Tests.Utils;
 
internal sealed class TestDotnetSdkVersionProvider(string? version) : IDotnetSdkVersionProvider
{
    private static readonly IReadOnlyDictionary<string, string> s_emptyEnvironment =
        new Dictionary<string, string>();
    private readonly SemVersion? _version = version is null
        ? null
        : SemVersion.Parse(version, SemVersionStyles.Strict);
    private readonly ConcurrentQueue<string?> _workingDirectories = [];
    private readonly ConcurrentQueue<IReadOnlyDictionary<string, string>> _probeEnvironments = [];
    private int _callCount;
 
    public int CallCount => _callCount;
 
    public IReadOnlyList<string?> WorkingDirectories => [.. _workingDirectories];
 
    public IReadOnlyList<IReadOnlyDictionary<string, string>> ProbeEnvironments => [.. _probeEnvironments];
 
    public Task<SemVersion?> TryGetVersionAsync(
        string? workingDirectory,
        CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested();
        RecordCall(workingDirectory, s_emptyEnvironment);
        return Task.FromResult(_version);
    }
 
    public Task<bool> SupportsMultiThreadedBuildAsync(
        string? workingDirectory,
        IReadOnlyDictionary<string, string> environmentVariables,
        CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested();
        RecordCall(workingDirectory, environmentVariables);
        return Task.FromResult(DotnetSdkUtils.SupportsMultiThreadedBuild(_version));
    }
 
    public Task<bool> SupportsFileBasedMultiThreadedBuildAsync(
        string? workingDirectory,
        IReadOnlyDictionary<string, string> environmentVariables,
        CancellationToken cancellationToken)
    {
        cancellationToken.ThrowIfCancellationRequested();
        RecordCall(workingDirectory, environmentVariables);
        return Task.FromResult(DotnetSdkUtils.SupportsFileBasedMultiThreadedBuild(_version));
    }
 
    private void RecordCall(
        string? workingDirectory,
        IReadOnlyDictionary<string, string> environmentVariables)
    {
        Interlocked.Increment(ref _callCount);
        _workingDirectories.Enqueue(workingDirectory);
        _probeEnvironments.Enqueue(environmentVariables.ToDictionary());
    }
}