File: SwixComponentTests.cs
Web Access
Project: src\src\Microsoft.DotNet.Build.Tasks.Workloads.Tests\Microsoft.DotNet.Build.Tasks.Workloads.Tests.csproj (Microsoft.DotNet.Build.Tasks.Workloads.Tests)
// 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 System.IO;
using System.Linq;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
using Microsoft.Deployment.DotNet.Releases;
using Microsoft.DotNet.Build.Tasks.Workloads.Swix;
using Microsoft.NET.Sdk.WorkloadManifestReader;
using Xunit;
 
namespace Microsoft.DotNet.Build.Tasks.Workloads.Tests
{
    public class SwixComponentTests : TestBase
    {
        public string RandomPath => Path.Combine(AppContext.BaseDirectory, "obj", Path.GetFileNameWithoutExtension(Path.GetTempFileName()));
 
        [WindowsOnlyFact]
        public void ItAssignsDefaultValues()
        {
            WorkloadManifest manifest = Create("WorkloadManifest.json");
            WorkloadDefinition workload = (WorkloadDefinition)manifest.Workloads.FirstOrDefault().Value;
            SwixComponent component = SwixComponent.Create(new ReleaseVersion("6.0.300"), workload, manifest, packGroupId: null);
 
            ComponentSwixProject project = new(component, BaseIntermediateOutputPath, BaseOutputPath);
            string swixProj = project.Create();
 
            string componentSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.swr"));
            Assert.Contains("package name=microsoft.net.sdk.blazorwebassembly.aot", componentSwr);
            Assert.Contains("version=1.0.0", componentSwr);
 
            string componentResSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.res.swr"));
            Assert.Contains(@"title=""Blazor WebAssembly AOT workload""", componentResSwr);
            Assert.Contains(@"description=""Blazor WebAssembly AOT workload""", componentResSwr);
            Assert.Contains(@"category="".NET""", componentResSwr);
        }
 
        [WindowsOnlyFact]
        public void ItCanAdvertiseComponents()
        {
            ITaskItem[] componentResources = new[]
            {
                new TaskItem("microsoft-net-sdk-blazorwebassembly-aot").WithMetadata(Metadata.Version, "4.5.6")
                .WithMetadata(Metadata.Description, "A long wordy description about Blazor.")
                .WithMetadata(Metadata.Category, "WebAssembly")
                .WithMetadata(Metadata.AdvertisePackage, "true")
            };
 
            WorkloadManifest manifest = Create("WorkloadManifest.json");
            WorkloadDefinition workload = (WorkloadDefinition)manifest.Workloads.FirstOrDefault().Value;
            SwixComponent component = SwixComponent.Create(new ReleaseVersion("6.0.300"), workload, manifest, packGroupId: null,
                componentResources);
 
            ComponentSwixProject project = new(component, BaseIntermediateOutputPath, BaseOutputPath);
            string swixProj = project.Create();
 
            string componentSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.swr"));
            Assert.Contains("package name=microsoft.net.sdk.blazorwebassembly.aot", componentSwr);
            Assert.Contains("version=4.5.6", componentSwr);
            Assert.Contains("isAdvertisedPackage=yes", componentSwr);
 
            string componentResSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.res.swr"));
            Assert.Contains(@"title=""Blazor WebAssembly AOT workload""", componentResSwr);
            Assert.Contains(@"description=""A long wordy description about Blazor.""", componentResSwr);
            Assert.Contains(@"category=""WebAssembly""", componentResSwr);
        }
 
        [WindowsOnlyFact]
        public void ItPrefersComponentResourcesOverDefaults()
        {
            ITaskItem[] componentResources = new[] 
            {
                new TaskItem("microsoft-net-sdk-blazorwebassembly-aot").WithMetadata(Metadata.Version, "4.5.6")
                .WithMetadata(Metadata.Description, "A long wordy description about Blazor.")
                .WithMetadata(Metadata.Category, "WebAssembly")
            };
 
            WorkloadManifest manifest = Create("WorkloadManifest.json");
            WorkloadDefinition workload = (WorkloadDefinition)manifest.Workloads.FirstOrDefault().Value;
            SwixComponent component = SwixComponent.Create(new ReleaseVersion("6.0.300"), workload, manifest, packGroupId: null,
                componentResources);
 
            ComponentSwixProject project = new(component, BaseIntermediateOutputPath, BaseOutputPath);
            string swixProj = project.Create();
 
            string componentSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.swr"));
            Assert.Contains("package name=microsoft.net.sdk.blazorwebassembly.aot", componentSwr);
            Assert.Contains("version=4.5.6", componentSwr);
            Assert.Contains("isAdvertisedPackage=no", componentSwr);
 
            string componentResSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.res.swr"));
            Assert.Contains(@"title=""Blazor WebAssembly AOT workload""", componentResSwr);
            Assert.Contains(@"description=""A long wordy description about Blazor.""", componentResSwr);
            Assert.Contains(@"category=""WebAssembly""", componentResSwr);
        }
 
        [WindowsOnlyFact]
        public void ItShortensComponentIds()
        {
            ITaskItem[] shortNames = new TaskItem[]
            {
                new TaskItem("Microsoft.NET.Runtime", new Dictionary<string, string> { { Metadata.Replacement, "MSFT" } })
            };
 
            WorkloadManifest manifest = Create("WorkloadManifest.json");
            WorkloadDefinition workload = (WorkloadDefinition)manifest.Workloads.FirstOrDefault().Value;
            SwixComponent component = SwixComponent.Create(new ReleaseVersion("6.0.300"), workload, manifest, packGroupId: null, shortNames: shortNames);
 
            ComponentSwixProject project = new(component, BaseIntermediateOutputPath, BaseOutputPath);
            string swixProj = project.Create();
 
            string componentSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.swr"));
            Assert.Contains("vs.dependency id=MSFT.MonoAOTCompiler.Task.6.0.0-preview.4.21201.1", componentSwr);
        }
 
        [WindowsOnlyFact]
        public void ItIgnoresNonApplicableDepedencies()
        {
            WorkloadManifest manifest = Create("AbstractWorkloadsNonWindowsPacks.json");
            WorkloadDefinition workload = (WorkloadDefinition)manifest.Workloads.FirstOrDefault().Value;
            SwixComponent component = SwixComponent.Create(new ReleaseVersion("6.0.300"), workload, manifest, packGroupId: null, null, null);
 
            ComponentSwixProject project = new(component, BaseIntermediateOutputPath, BaseOutputPath);
            string swixProj = project.Create();
 
            string componentSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.swr"));
            Assert.Contains(@"package name=microsoft.net.runtime.ios", componentSwr);
            Assert.DoesNotContain(@"vs.dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm", componentSwr);
            Assert.DoesNotContain(@"vs dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.ios-arm64", componentSwr);
            Assert.DoesNotContain(@"vs dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-arm64", componentSwr);
            Assert.DoesNotContain(@"vs dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x64", componentSwr);
            Assert.DoesNotContain(@"vs dependency id=Microsoft.NETCore.App.Runtime.AOT.Cross.iossimulator-x86", componentSwr);
            Assert.Contains(@"vs.dependency id=runtimes.ios", componentSwr);
        }
 
        [WindowsOnlyFact]
        public void ItCanOverrideDefaultValues()
        {
            WorkloadManifest manifest = Create("WorkloadManifest.json");
            WorkloadDefinition workload = (WorkloadDefinition)manifest.Workloads.FirstOrDefault().Value;
 
            ITaskItem[] componentResources = new ITaskItem[]
            {
                new TaskItem("microsoft-net-sdk-blazorwebassembly-aot", new Dictionary<string, string> {
                    { "Title", "AOT" },
                    { "Description", "A long wordy description." },
                    { "Category", "Compilers, build tools, and runtimes" }
                })
            };
 
            SwixComponent component = SwixComponent.Create(new ReleaseVersion("6.0.300"), workload, manifest, packGroupId: null, componentResources);
            ComponentSwixProject project = new(component, BaseIntermediateOutputPath, BaseOutputPath);
            string swixProj = project.Create();
 
            string componentResSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.res.swr"));
 
            Assert.Contains(@"title=""AOT""", componentResSwr);
            Assert.Contains(@"description=""A long wordy description.""", componentResSwr);
            Assert.Contains(@"category=""Compilers, build tools, and runtimes""", componentResSwr);
        }
 
        [Fact]
        public void ItCreatesComponentsWhenWorkloadsDoNotIncludePacks()
        {
            WorkloadManifest manifest = Create("mauiWorkloadManifest.json");
            WorkloadDefinition workload = (WorkloadDefinition)manifest.Workloads.FirstOrDefault().Value;
            SwixComponent component = SwixComponent.Create(new ReleaseVersion("7.0.100"), workload, manifest, packGroupId: null);
            ComponentSwixProject project = new(component, BaseIntermediateOutputPath, BaseOutputPath);
            string swixProj = project.Create();
 
            string componentSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.swr"));
            Assert.Contains(@"vs.dependency id=maui.mobile", componentSwr);
            Assert.Contains(@"vs.dependency id=maui.desktop", componentSwr);
        }
 
        [Fact]
        public void ItCreatesDependenciesForPackGroup()
        {
            WorkloadManifest manifest = Create("WorkloadManifest.json");
            WorkloadDefinition workload = (WorkloadDefinition)manifest.Workloads.FirstOrDefault().Value;
            var packGroupId = "microsoft.net.sdk.blazorwebassembly.aot.WorkloadPacks";
            SwixComponent component = SwixComponent.Create(new ReleaseVersion("7.0.100"), workload, manifest, packGroupId: packGroupId);
            ComponentSwixProject project = new(component, BaseIntermediateOutputPath, BaseOutputPath);
            string swixProj = project.Create();
 
            string componentSwr = File.ReadAllText(Path.Combine(Path.GetDirectoryName(swixProj), "component.swr"));
 
            //  Should have only one dependency, use string.Split to check how many times vs.dependency occurs in swr
            Assert.Equal(2, componentSwr.Split(new[] { "vs.dependency" }, StringSplitOptions.None).Length);
            Assert.Contains($"vs.dependency id={packGroupId}", componentSwr);
        }
 
        private static WorkloadManifest Create(string filename)
        {
            return WorkloadManifestReader.ReadWorkloadManifest(Path.GetFileNameWithoutExtension(filename),
                File.OpenRead(Path.Combine(TestAssetsPath, filename)), filename);
        }
    }
}