File: ProjectSystemShim\SdkAnalyzerAssemblyRedirectorTests.cs
Web Access
Project: src\src\VisualStudio\CSharp\Test\Microsoft.VisualStudio.LanguageServices.CSharp.UnitTests.csproj (Microsoft.VisualStudio.LanguageServices.CSharp.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
 
using System.Collections.Generic;
using System.IO;
using System.Text.Json;
using Microsoft.VisualStudio.LanguageServices.ProjectSystem;
using Roslyn.Test.Utilities;
using Xunit;
 
namespace Roslyn.VisualStudio.CSharp.UnitTests.ProjectSystemShim;
 
public sealed class SdkAnalyzerAssemblyRedirectorTests : TestBase
{
    [Theory]
    [InlineData("9.0.0-preview.5.24306.11", "9.0.0-preview.7.24406.2")]
    [InlineData("9.0.0-preview.5.24306.11", "9.0.1-preview.7.24406.2")]
    [InlineData("9.0.100", "9.0.0-preview.7.24406.2")]
    [InlineData("9.0.100", "9.0.200")]
    [InlineData("9.0.100", "9.0.101")]
    public void SameMajorMinorVersion(string a, string b)
    {
        var testDir = Temp.CreateDirectory();
 
        var vsDir = Path.Combine(testDir.Path, "vs");
        Metadata(vsDir, new() { { "AspNetCoreAnalyzers", new() { Version = a, Files = [@"analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll"] } } });
        var vsAnalyzerPath = FakeDll(vsDir, @$"AspNetCoreAnalyzers\analyzers\dotnet\cs", "Microsoft.AspNetCore.App.Analyzers");
        var sdkAnalyzerPath = @$"Z:\Program Files\dotnet\sdk\packs\Microsoft.AspNetCore.App.Ref\{b}\analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll";
 
        var resolver = new SdkAnalyzerAssemblyRedirectorCore(vsDir);
        var redirected = resolver.RedirectPath(sdkAnalyzerPath);
        AssertEx.Equal(vsAnalyzerPath, redirected);
    }
 
    [Fact]
    public void DifferentPathSuffix()
    {
        var testDir = Temp.CreateDirectory();
 
        var vsDir = Path.Combine(testDir.Path, "vs");
        Metadata(vsDir, new() { { "AspNetCoreAnalyzers", new() { Version = "9.0.0-preview.5.24306.11", Files = [@"analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll"] } } });
        FakeDll(vsDir, @"AspNetCoreAnalyzers\analyzers\dotnet\cs", "Microsoft.AspNetCore.App.Analyzers");
        var sdkAnalyzerPath = @"Z:\Program Files\dotnet\sdk\packs\Microsoft.AspNetCore.App.Ref\9.0.0-preview.7.24406.2\analyzers\dotnet\vb\Microsoft.AspNetCore.App.Analyzers.dll";
 
        var resolver = new SdkAnalyzerAssemblyRedirectorCore(vsDir);
        var redirected = resolver.RedirectPath(sdkAnalyzerPath);
        Assert.Null(redirected);
    }
 
    [Fact]
    public void DifferentPathSuffix_NoParentDirectory()
    {
        var testDir = Temp.CreateDirectory();
 
        var vsDir = Path.Combine(testDir.Path, "vs");
        Metadata(vsDir, new() { { "AspNetCoreAnalyzers", new() { Version = "9.0.0-preview.5.24306.11", Files = [@"analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll"] } } });
        var vsAnalyzerPath = FakeDll(vsDir, @"AspNetCoreAnalyzers\analyzers\dotnet\cs", "Microsoft.AspNetCore.App.Analyzers");
 
        // The suffix matches but there is no parent directory.
        var sdkAnalyzerPath = @"\sdk\packs\Microsoft.AspNetCore.App.Ref\9.0.0-preview.7.24406.2\analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll";
 
        var resolver = new SdkAnalyzerAssemblyRedirectorCore(vsDir);
        var redirected = resolver.RedirectPath(sdkAnalyzerPath);
        AssertEx.Equal(vsAnalyzerPath, redirected);
    }
 
    [Fact]
    public void TwoMajorVersions()
    {
        var testDir = Temp.CreateDirectory();
 
        var vsDir = Path.Combine(testDir.Path, "vs");
        Metadata(vsDir, new()
        {
            { "AspNetCoreAnalyzers9", new() { Version = "9.0.0-preview.5.24306.11", Files = [@"analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll"] } },
            { "AspNetCoreAnalyzers10", new() { Version = "10.0.0-preview.5.24306.11", Files = [@"analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll"] } },
        });
        var vsAnalyzerPath9 = FakeDll(vsDir, @"AspNetCoreAnalyzers9\analyzers\dotnet\cs", "Microsoft.AspNetCore.App.Analyzers");
        var vsAnalyzerPath10 = FakeDll(vsDir, @"AspNetCoreAnalyzers10\analyzers\dotnet\cs", "Microsoft.AspNetCore.App.Analyzers");
 
        var resolver = new SdkAnalyzerAssemblyRedirectorCore(vsDir);
        AssertEx.Equal(vsAnalyzerPath9, resolver.RedirectPath(@"Z:\sdk\packs\Microsoft.AspNetCore.App.Ref\9.0.0-preview.7.24406.2\analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll"));
        AssertEx.Equal(vsAnalyzerPath10, resolver.RedirectPath(@"Z:\sdk\packs\Microsoft.AspNetCore.App.Ref\10.0.0-preview.7.24406.2\analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll"));
    }
 
    [Theory]
    [InlineData("8.0.100", "9.0.0-preview.7.24406.2")]
    [InlineData("8.0.1", "8.01.1")]
    [InlineData("8.01.1", "8.0.1")]
    [InlineData("9.1.100", "9.0.0-preview.7.24406.2")]
    [InlineData("9.1.0-preview.5.24306.11", "9.0.0-preview.7.24406.2")]
    [InlineData("9.0.100", "9.1.100")]
    [InlineData("9.0.100", "10.0.100")]
    [InlineData("9.9.100", "9.10.100")]
    [InlineData("111.111.0", "1.1.0")]
    [InlineData("1.1.0", "111.111.0")]
    public void DifferentMajorMinorVersion(string a, string b)
    {
        var testDir = Temp.CreateDirectory();
 
        var vsDir = Path.Combine(testDir.Path, "vs");
        Metadata(vsDir, new() { { "AspNetCoreAnalyzers", new() { Version = a, Files = [@"analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll"] } } });
        FakeDll(vsDir, @$"AspNetCoreAnalyzers\analyzers\dotnet\cs", "Microsoft.AspNetCore.App.Analyzers");
        var sdkAnalyzerPath = @$"Z:\Program Files\dotnet\sdk\packs\Microsoft.AspNetCore.App.Ref\{b}\analyzers\dotnet\cs\Microsoft.AspNetCore.App.Analyzers.dll";
 
        var resolver = new SdkAnalyzerAssemblyRedirectorCore(vsDir);
        var redirected = resolver.RedirectPath(sdkAnalyzerPath);
        Assert.Null(redirected);
    }
 
    private static string FakeDll(string root, string subdir, string name)
    {
        var dllPath = Path.Combine(root, subdir, $"{name}.dll");
        Directory.CreateDirectory(Path.GetDirectoryName(dllPath));
        File.WriteAllText(dllPath, "");
        return dllPath;
    }
 
    private static void Metadata(string root, Dictionary<string, MetadataEntry> metadata)
    {
        var metadataFilePath = Path.Combine(root, "metadata.json");
        Directory.CreateDirectory(Path.GetDirectoryName(metadataFilePath));
        File.WriteAllText(metadataFilePath, JsonSerializer.Serialize(metadata));
    }
}