File: Assertions\DependencyContextAssertions.cs
Web Access
Project: ..\..\..\test\Microsoft.NET.TestFramework\Microsoft.NET.TestFramework.csproj (Microsoft.NET.TestFramework)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.DotNet.Cli.Utils;
using Microsoft.Extensions.DependencyModel;
 
namespace Microsoft.NET.TestFramework.Assertions
{
    public class DependencyContextAssertions
    {
        private DependencyContext _dependencyContext;
 
        public DependencyContextAssertions(DependencyContext dependencyContext)
        {
            _dependencyContext = dependencyContext;
        }
 
        public AndConstraint<DependencyContextAssertions> HaveNoDuplicateRuntimeAssemblies(string runtimeIdentifier)
        {
            var assemblyNames = _dependencyContext.GetRuntimeAssemblyNames(runtimeIdentifier);
 
            var duplicateAssemblies = assemblyNames.GroupBy(n => n.Name).Where(g => g.Count() > 1);
            duplicateAssemblies.Select(g => g.Key).Should().BeEmpty();
 
            return new AndConstraint<DependencyContextAssertions>(this);
        }
 
        public AndConstraint<DependencyContextAssertions> HaveNoDuplicateNativeAssets(string runtimeIdentifier)
        {
            var nativeAssets = _dependencyContext.GetRuntimeNativeAssets(runtimeIdentifier);
            var nativeFilenames = nativeAssets.Select(n => Path.GetFileName(n));
            var duplicateNativeAssets = nativeFilenames.GroupBy(n => n).Where(g => g.Count() > 1);
            duplicateNativeAssets.Select(g => g.Key).Should().BeEmpty();
 
            return new AndConstraint<DependencyContextAssertions>(this);
        }
 
        public AndConstraint<DependencyContextAssertions> OnlyHaveRuntimeAssemblies(string runtimeIdentifier, params string[] runtimeAssemblyNames)
        {
            var assemblyNames = _dependencyContext.GetRuntimeAssemblyNames(runtimeIdentifier);
 
            assemblyNames.Select(n => n.Name)
                .Should()
                .BeEquivalentTo(runtimeAssemblyNames);
 
            return new AndConstraint<DependencyContextAssertions>(this);
        }
 
        public AndConstraint<DependencyContextAssertions> OnlyHaveRuntimeAssembliesWhichAreInFolder(string runtimeIdentifier, string folder)
        {
            var assemblyNames = _dependencyContext.GetRuntimeAssemblyNames(runtimeIdentifier);
 
            var assemblyFiles = assemblyNames.Select(an => Path.Combine(folder, an.Name + ".dll"));
 
            var missingFiles = assemblyFiles.Where(f => !File.Exists(f));
 
            missingFiles.Should().BeEmpty();
 
            return new AndConstraint<DependencyContextAssertions>(this);
        }
 
        public AndConstraint<DependencyContextAssertions> OnlyHaveNativeAssembliesWhichAreInFolder(string runtimeIdentifier, string folder, string appName)
        {
            var nativeAssets = _dependencyContext.GetRuntimeNativeAssets(runtimeIdentifier);
            var nativeAssetsWithPath = nativeAssets.Select(f =>
            {
                //  apphost gets renamed to the name of the app in self-contained publish
                if (Path.GetFileNameWithoutExtension(f) == "apphost")
                {
                    return Path.Combine(folder, appName + Constants.ExeSuffix);
                }
                else
                {
                    return Path.Combine(folder, Path.GetFileName(f));
                }
            });
            var missingNativeAssets = nativeAssetsWithPath.Where(f => !File.Exists(f));
            missingNativeAssets.Should().BeEmpty();
 
            return new AndConstraint<DependencyContextAssertions>(this);
        }
 
        public AndConstraint<DependencyContextAssertions> OnlyHavePackagesWithPathProperties()
        {
            var packageLibraries = _dependencyContext.RuntimeLibraries
                .Union<Library>(_dependencyContext.CompileLibraries)
                .Where(l => string.Equals(l.Type, "package", StringComparison.OrdinalIgnoreCase));
 
            foreach (var packageLibrary in packageLibraries)
            {
                packageLibrary.Path.Should().NotBeNullOrEmpty($"Every Library with Type='package' should have a Path, but {packageLibrary.Name} does not.");
                packageLibrary.HashPath.Should().NotBeNullOrEmpty($"Every Library with Type='package' should have a HashPath, but {packageLibrary.Name} does not.");
            }
 
            return new AndConstraint<DependencyContextAssertions>(this);
        }
    }
}