File: LatestLinksManagerTests.cs
Web Access
Project: src\src\Microsoft.DotNet.Build.Tasks.Feed.Tests\Microsoft.DotNet.Build.Tasks.Feed.Tests.csproj (Microsoft.DotNet.Build.Tasks.Feed.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.Collections.Immutable;
using System.Linq;
using System.Text.RegularExpressions;
using FluentAssertions;
using Microsoft.Arcade.Test.Common;
using Microsoft.Build.Utilities;
using Microsoft.DotNet.Build.Tasks.Feed.Model;
using Microsoft.DotNet.Build.Tasks.Feed.Tests.TestDoubles;
using Microsoft.DotNet.Deployment.Tasks.Links;
using Xunit;
 
namespace Microsoft.DotNet.Build.Tasks.Feed.Tests
{
    public class LatestLinksManagerTests
    {
        [Theory]
        [InlineData("https://dotnetcli.blob.core.windows.net/test", "https://builds.dotnet.microsoft.com/test/")]
        [InlineData("https://dotnetbuilds.blob.core.windows.net/test/", "https://ci.dot.net/test/")]
        public void ComputeLatestLinkBase_WithValidFeedConfig_ReturnsExpectedBaseUrl(string safeTargetUrl, string expectedTargetUrl)
        {
            // Arrange
            var feedConfig = new TargetFeedConfig(
                contentType: TargetFeedContentType.Installer,
                targetURL: safeTargetUrl,
                type: FeedType.AzureStorageContainer,
                token: "dummyToken",
                latestLinkShortUrlPrefixes: ["prefix"],
                akaMSCreateLinkPatterns: [],
                akaMSDoNotCreateLinkPatterns: []
            );
 
            // Act
            LatestLinksManager.ComputeLatestLinkBase(feedConfig).Should().Be(expectedTargetUrl);
        }
 
        [Fact]
        public void ComputeLatestLinkBase_WithTrailingSlash_ReturnsExpectedBaseUrl()
        {
            // Arrange
            var feedConfig = new TargetFeedConfig(
                contentType: TargetFeedContentType.Installer,
                targetURL: "https://dotnetcli.blob.core.windows.net/test/",
                type: FeedType.AzureStorageContainer,
                token: "dummyToken",
                latestLinkShortUrlPrefixes: ["prefix"],
                akaMSCreateLinkPatterns: [],    
                akaMSDoNotCreateLinkPatterns: ImmutableList<Regex>.Empty
            );
 
            // Act
            LatestLinksManager.ComputeLatestLinkBase(feedConfig).Should().Be("https://builds.dotnet.microsoft.com/test/");
        }
 
        [Fact]
        public void ComputeLatestLinkBase_WithUnknownAuthority_ReturnsOriginalBaseUrl()
        {
            // Arrange
            var feedConfig = new TargetFeedConfig(
                contentType: TargetFeedContentType.Installer,
                targetURL: "https://unknown.blob.core.windows.net/test",
                type: FeedType.AzureStorageContainer,
                token: "dummyToken",
                latestLinkShortUrlPrefixes: [ "prefix" ],
                akaMSCreateLinkPatterns: [],
                akaMSDoNotCreateLinkPatterns: []
            );
 
            // Act
            LatestLinksManager.ComputeLatestLinkBase(feedConfig).Should().Be("https://unknown.blob.core.windows.net/test/");
        }
 
        [Fact]
        public void GetLatestLinksToCreate_Patterns()
        {
            var taskLoggingHelper = new Microsoft.Build.Utilities.TaskLoggingHelper(new StubTask());
            // Arrange
            var assetsToPublish = new HashSet<string>
            {
                "assets/symbols/Microsoft.stuff.symbols.nupkg",
                "assets/Microsoft.stuff.zip",
                "assets/Microsoft.stuff.zip.sha512",
                "assets/Microsoft.stuff.json",
                "assets/Microsoft.stuff.json.zip",
                "assets/Microsoft.stuff.sha512"
            };
            var feedConfig = new TargetFeedConfig(
                contentType: TargetFeedContentType.Other,
                targetURL: "https://example.com/feed",
                type: FeedType.AzureStorageContainer,
                token: "",
                latestLinkShortUrlPrefixes: ImmutableList.Create("prefix1", "prefix2"),
                akaMSCreateLinkPatterns: [new Regex(@"\.zip(\.sha512)?")],
                akaMSDoNotCreateLinkPatterns: [new Regex("json")],
                assetSelection: AssetSelection.All,
                isolated: false,
                @internal: false,
                allowOverwrite: false,
                symbolPublishVisibility: SymbolPublishVisibility.None,
                flatten: true
            );
 
            var manager = new LatestLinksManager("clientId", null, "tenant", "groupOwner", "createdBy", "owners", taskLoggingHelper);
 
            var links = manager.GetLatestLinksToCreate(assetsToPublish, feedConfig, "https://example.com/feed/");
 
            // Flattenned links should remove the path elements
            links.Should().BeEquivalentTo(new List<AkaMSLink>
            {
                new AkaMSLink("prefix1/Microsoft.stuff.zip", "https://example.com/feed/assets/Microsoft.stuff.zip"),
                new AkaMSLink("prefix2/Microsoft.stuff.zip", "https://example.com/feed/assets/Microsoft.stuff.zip"),
                new AkaMSLink("prefix1/Microsoft.stuff.zip.sha512", "https://example.com/feed/assets/Microsoft.stuff.zip.sha512"),
                new AkaMSLink("prefix2/Microsoft.stuff.zip.sha512", "https://example.com/feed/assets/Microsoft.stuff.zip.sha512")
            });
        }
 
        [Fact]
        public void GetLatestLinksToCreate_EmptyPatternsShouldCreateNoLinks()
        {
            var taskLoggingHelper = new Microsoft.Build.Utilities.TaskLoggingHelper(new StubTask());
            // Arrange
            var assetsToPublish = new HashSet<string> { "assets/symbols/Microsoft.stuff.symbols.nupkg", "assets/Microsoft.stuff.zip", "assets/Microsoft.stuff.json", "assets/Microsoft.stuff.json.zip" };
            var feedConfig = new TargetFeedConfig(
                contentType: TargetFeedContentType.Other,
                targetURL: "https://example.com/feed",
                type: FeedType.AzureStorageContainer,
                token: "",
                latestLinkShortUrlPrefixes: ImmutableList.Create("prefix1", "prefix2"),
                akaMSCreateLinkPatterns: [],
                akaMSDoNotCreateLinkPatterns: null,
                assetSelection: AssetSelection.All,
                isolated: false,
                @internal: false,
                allowOverwrite: false,
                symbolPublishVisibility: SymbolPublishVisibility.None,
                flatten: true
            );
 
            var manager = new LatestLinksManager("clientId", null, "tenant", "groupOwner", "createdBy", "owners", taskLoggingHelper);
 
            var links = manager.GetLatestLinksToCreate(assetsToPublish, feedConfig, "https://example.com/feed/");
 
            // Flattenned links should remove the path elements
            links.Should().BeEmpty();
        }
 
        [Fact]
        public void GetLatestLinksToCreate_OnlyIncludeShouldWork()
        {
            var taskLoggingHelper = new TaskLoggingHelper(new StubTask());
            // Arrange
            var assetsToPublish = new HashSet<string> { "assets/symbols/Microsoft.stuff.symbols.nupkg", "assets/Microsoft.stuff.zip", "assets/Microsoft.stuff.json", "assets/Microsoft.stuff.json.zip" };
            var feedConfig = new TargetFeedConfig(
                contentType: TargetFeedContentType.Other,
                targetURL: "https://example.com/feed",
                type: FeedType.AzureStorageContainer,
                token: "",
                latestLinkShortUrlPrefixes: ImmutableList.Create("prefix1", "prefix2"),
                akaMSCreateLinkPatterns: [new Regex(@"\.zip")],
                akaMSDoNotCreateLinkPatterns: [],
                assetSelection: AssetSelection.All,
                isolated: false,
                @internal: false,
                allowOverwrite: false,
                symbolPublishVisibility: SymbolPublishVisibility.None,
                flatten: true
            );
 
            var manager = new LatestLinksManager("clientId", null, "tenant", "groupOwner", "createdBy", "owners", taskLoggingHelper);
 
            var links = manager.GetLatestLinksToCreate(assetsToPublish, feedConfig, "https://example.com/feed/");
 
            // Flattenned links should remove the path elements
            // Flattenned links should remove the path elements
            links.Should().BeEquivalentTo(new List<AkaMSLink>
            {
                new AkaMSLink("prefix1/Microsoft.stuff.zip", "https://example.com/feed/assets/Microsoft.stuff.zip"),
                new AkaMSLink("prefix2/Microsoft.stuff.zip", "https://example.com/feed/assets/Microsoft.stuff.zip"),
                new AkaMSLink("prefix1/Microsoft.stuff.json.zip", "https://example.com/feed/assets/Microsoft.stuff.json.zip"),
                new AkaMSLink("prefix2/Microsoft.stuff.json.zip", "https://example.com/feed/assets/Microsoft.stuff.json.zip")
            });
        }
 
        [Fact]
        public void GetLatestLinksToCreate_NonFlattenedShouldNotFlatten()
        {
            var taskLoggingHelper = new TaskLoggingHelper(new StubTask());
            // Arrange
            var assetsToPublish = new HashSet<string> { "assets/symbols/Microsoft.stuff.symbols.nupkg", "bar/Microsoft.stuff.zip", "assets/Microsoft.stuff.json", "assets/plop/Microsoft.stuff.json.zip" };
            var feedConfig = new TargetFeedConfig(
                contentType: TargetFeedContentType.Other,
                targetURL: "https://example.com/feed",
                type: FeedType.AzureStorageContainer,
                token: "",
                latestLinkShortUrlPrefixes: ImmutableList.Create("prefix1", "prefix2"),
                akaMSCreateLinkPatterns: [new Regex(@"\.zip")],
                akaMSDoNotCreateLinkPatterns: [],
                assetSelection: AssetSelection.All,
                isolated: false,
                @internal: false,
                allowOverwrite: false,
                symbolPublishVisibility: SymbolPublishVisibility.None,
                flatten: false
            );
 
            var manager = new LatestLinksManager("clientId", null, "tenant", "groupOwner", "createdBy", "owners", taskLoggingHelper);
 
            var links = manager.GetLatestLinksToCreate(assetsToPublish, feedConfig, "https://example.com/feed/");
 
            // Flattenned links should remove the path elements
            // Flattenned links should remove the path elements
            links.Should().BeEquivalentTo(new List<AkaMSLink>
            {
                new AkaMSLink("prefix1/bar/Microsoft.stuff.zip", "https://example.com/feed/bar/Microsoft.stuff.zip"),
                new AkaMSLink("prefix2/bar/Microsoft.stuff.zip", "https://example.com/feed/bar/Microsoft.stuff.zip"),
                new AkaMSLink("prefix1/assets/plop/Microsoft.stuff.json.zip", "https://example.com/feed/assets/plop/Microsoft.stuff.json.zip"),
                new AkaMSLink("prefix2/assets/plop/Microsoft.stuff.json.zip", "https://example.com/feed/assets/plop/Microsoft.stuff.json.zip")
            });
        }
    }
}