File: AssemblyDependency\Perf.cs
Web Access
Project: ..\..\..\src\Tasks.UnitTests\Microsoft.Build.Tasks.UnitTests.csproj (Microsoft.Build.Tasks.UnitTests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using System.Collections.Generic;
using Microsoft.Build.Framework;
using Microsoft.Build.Tasks;
using Microsoft.Build.UnitTests.ResolveAssemblyReference_Tests.VersioningAndUnification.AutoUnify;
using Microsoft.Build.Utilities;
using Shouldly;
using Xunit;
using Xunit.Abstractions;
 
#nullable disable
 
namespace Microsoft.Build.UnitTests.ResolveAssemblyReference_Tests
{
    /// <summary>
    /// Test a few perf scenarios.
    /// </summary>
    public sealed class Perf : ResolveAssemblyReferenceTestFixture
    {
        public Perf(ITestOutputHelper output) : base(output)
        {
        }
 
        [Theory]
        [InlineData(RARSimulationMode.LoadProject, 1)]
        [InlineData(RARSimulationMode.BuildProject, 2)]
        public void AutoUnifyUsesMinimumIO(RARSimulationMode rarSimulationMode, int ioThreshold)
        {
            // This WriteLine is a hack.  On a slow machine, the Tasks unittest fails because remoting
            // times out the object used for remoting console writes.  Adding a write in the middle of
            // keeps remoting from timing out the object.
            Console.WriteLine("Performing Perf.AutoUnifyUsesMinimumIO() test");
 
            using StronglyNamedDependencyAutoUnify t = new StronglyNamedDependencyAutoUnify(_output);
 
            try
            {
                // Manually instantiate a test fixture and run it.
                t.StartIOMonitoring();
                t.ExistsImpl(rarSimulationMode);
            }
            finally
            {
                t.StopIOMonitoringAndAssert_Minimal_IOUse(ioThreshold);
            }
        }
 
        [Fact]
        public void DependeeDirectoryIsProbedForDependency()
        {
            // This WriteLine is a hack.  On a slow machine, the Tasks unittest fails because remoting
            // times out the object used for remoting console writes.  Adding a write in the middle of
            // keeps remoting from timing out the object.
            Console.WriteLine("Performing Perf.DependeeDirectoryIsProbedForDependency() test");
 
            try
            {
                StartIOMonitoring();
 
                MockEngine engine = new MockEngine(_output);
 
                ITaskItem[] assemblyNames =
                {
                    new TaskItem(s_dependsOnNuGet_ADllPath), // depends on N, version 1.0.0.0
                    new TaskItem(s_nugetCache_N_Lib_NDllPath) // version 2.0.0.0
                };
 
                ResolveAssemblyReference t = new ResolveAssemblyReference();
 
                t.BuildEngine = engine;
                t.Assemblies = assemblyNames;
                t.SearchPaths = new[] { "{RawFileName}" };
                t.AutoUnify = true;
 
                bool succeeded = Execute(t);
 
                Assert.True(succeeded);
 
                uniqueFileExists[s_dependsOnNuGet_NWinMdPath].ShouldBe(1);
                uniqueFileExists[s_dependsOnNuGet_NDllPath].ShouldBe(1);
                uniqueFileExists[s_dependsOnNuGet_NExePath].ShouldBe(1);
            }
            finally
            {
                StopIOMonitoring();
            }
        }
 
        [Fact]
        public void DependeeDirectoryShouldNotBeProbedForDependencyWhenDependencyResolvedExternally()
        {
            // This WriteLine is a hack.  On a slow machine, the Tasks unittest fails because remoting
            // times out the object used for remoting console writes.  Adding a write in the middle of
            // keeps remoting from timing out the object.
            Console.WriteLine("Performing Perf.DependeeDirectoryIsProbedForDependency() test");
 
            try
            {
                StartIOMonitoring();
 
                MockEngine engine = new MockEngine(_output);
 
                ITaskItem[] assemblyNames =
                {
                    new TaskItem(@"C:\DependsOnNuget\A.dll"), // depends on N, version 1.0.0.0
                    new TaskItem(@"C:\NugetCache\N\lib\N.dll", // version 2.0.0.0
                        new Dictionary<string, string>
                        {
                            {"ExternallyResolved", "true"}
                        })
                };
 
                ResolveAssemblyReference t = new ResolveAssemblyReference();
 
                t.BuildEngine = engine;
                t.Assemblies = assemblyNames;
                t.SearchPaths = new[] { "{RawFileName}" };
                t.AutoUnify = true;
 
                bool succeeded = Execute(t);
 
                Assert.True(succeeded);
 
                uniqueFileExists.ShouldNotContainKey(@"C:\DependsOnNuget\N.winmd");
                uniqueFileExists.ShouldNotContainKey(@"C:\DependsOnNuget\N.dll");
                uniqueFileExists.ShouldNotContainKey(@"C:\DependsOnNuget\N.exe");
            }
            finally
            {
                StopIOMonitoring();
            }
        }
    }
}