aspnetcore/test/Microsoft.AspNetCore.Blazor.../RuntimeDependenciesResolver...

109 lines
4.9 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.IO;
using System.Linq;
using Xunit;
namespace Microsoft.AspNetCore.Blazor.Build.Test
{
public class RuntimeDependenciesResolverTest
{
[Fact]
public void FindsReferenceAssemblyGraph_ForStandaloneApp()
{
// Arrange
var standaloneAppAssembly = typeof(StandaloneApp.Program).Assembly;
var mainAssemblyLocation = standaloneAppAssembly.Location;
// This list of hints is populated by MSBuild so it will be on the output
// folder.
var hintPaths = File.ReadAllLines(Path.Combine(
Path.GetDirectoryName(mainAssemblyLocation),
"referenceHints.txt"));
var references = new[]
{
"Microsoft.AspNetCore.Blazor.Browser.dll",
"Microsoft.AspNetCore.Blazor.dll",
"Microsoft.Extensions.DependencyInjection.Abstractions.dll",
"Microsoft.Extensions.DependencyInjection.dll"
}.Select(a => hintPaths.Single(p => Path.GetFileName(p) == a))
.ToArray();
var basePath = Path.GetDirectoryName(typeof(RuntimeDependenciesResolverTest).Assembly.Location);
var bclLocations = new []
{
Path.Combine(basePath, "../../../../../src/mono/dist/optimized/bcl/"),
Path.Combine(basePath, "../../../../../src/mono/dist/optimized/bcl/Facades/"),
};
var expectedContents = new[]
{
/*
The current Mono WASM BCL forwards from netstandard.dll to various facade assemblies
in which small bits of implementation live, such as System.Xml.XPath.XDocument. So
if you reference netstandard, then you also reference System.Xml.XPath.XDocument.dll,
even though you're very unlikely to be calling it at runtime. That's why the following
list (for a very basic Blazor app) is longer than you'd expect.
These redundant references could be stripped out during publishing, but it's still
unfortunate that in development mode you'd see all these unexpected assemblies get
fetched from the server. We should try to get the Mono WASM BCL reorganized so that
all the implementation goes into mscorlib.dll, with the facade assemblies existing only
in case someone (or some 3rd party assembly) references them directly, but with their
implementations 100% forwarding to mscorlib.dll. Then in development you'd fetch far
fewer assemblies from the server, and during publishing, illink would remove all the
uncalled implementation code from mscorlib.dll anyway.
*/
"Microsoft.AspNetCore.Blazor.Browser.dll",
"Microsoft.AspNetCore.Blazor.dll",
"Microsoft.Extensions.DependencyInjection.Abstractions.dll",
"Microsoft.Extensions.DependencyInjection.dll",
"Mono.Security.dll",
"mscorlib.dll",
"netstandard.dll",
"StandaloneApp.dll",
"System.ComponentModel.Composition.dll",
"System.Core.dll",
"System.Data.dll",
"System.Diagnostics.StackTrace.dll",
"System.dll",
"System.Drawing.dll",
"System.Globalization.Extensions.dll",
"System.IO.Compression.dll",
"System.IO.Compression.FileSystem.dll",
"System.Net.Http.dll",
"System.Numerics.dll",
"System.Runtime.Serialization.dll",
"System.Runtime.Serialization.Primitives.dll",
"System.Runtime.Serialization.Xml.dll",
"System.Security.Cryptography.Algorithms.dll",
"System.Security.SecureString.dll",
"System.ServiceModel.Internals.dll",
"System.Transactions.dll",
"System.Web.Services.dll",
"System.Xml.dll",
"System.Xml.Linq.dll",
"System.Xml.XPath.XDocument.dll",
}.OrderBy(i => i, StringComparer.Ordinal)
.ToArray();
// Act
var paths = RuntimeDependenciesResolver
.ResolveRuntimeDependenciesCore(
mainAssemblyLocation,
references,
bclLocations);
var contents = paths
.Select(p => Path.GetFileName(p))
.OrderBy(i => i, StringComparer.Ordinal)
.ToArray();
// Assert
Assert.Equal(expectedContents, contents);
}
}
}