From 7d94dbbd9922fc0174f6123af197d27a8c4c1fc6 Mon Sep 17 00:00:00 2001 From: William Li Date: Thu, 21 Jun 2018 10:40:44 -0700 Subject: [PATCH] Test and automatic Update default package version and re-enable Latest package version test (#9507) * Add Compute UseBundledNETCoreAppPackageVersionAsDefaultNetCorePatchVersion * Add tests to catch DefaultNetCorePatchVersion moving * Update LatestPatchVersionForNetCore2_0 to 2.0.9, it is in the process of shipping * Update LatestPatchVersionForNetCore1_0 and LatestPatchVersionForNetCore1_1 --- build/MSBuildExtensions.targets | 17 +++- build/Microsoft.DotNet.Cli.tasks | 1 + build/NugetConfigFile.targets | 2 + .../GetUseBundledVersionAsDefaultVersion.cs | 30 +++++++ test/EndToEnd/GivenFrameworkDependentApps.cs | 90 +++++++++++++++++++ .../GivenSelfContainedAppsRollForward.cs | 25 ++---- test/EndToEnd/SupportedNetCoreAppVersions.cs | 26 ++++++ 7 files changed, 168 insertions(+), 23 deletions(-) create mode 100644 build_projects/dotnet-cli-build/GetUseBundledVersionAsDefaultVersion.cs create mode 100644 test/EndToEnd/GivenFrameworkDependentApps.cs create mode 100644 test/EndToEnd/SupportedNetCoreAppVersions.cs diff --git a/build/MSBuildExtensions.targets b/build/MSBuildExtensions.targets index 042cd2e93..f5365724a 100644 --- a/build/MSBuildExtensions.targets +++ b/build/MSBuildExtensions.targets @@ -132,6 +132,16 @@ <_NETCoreSdkIsPreview Condition=" '$(DropSuffix)' != 'true' ">true + + + + + @@ -170,6 +180,7 @@ Copyright (c) .NET Foundation. All rights reserved. $(_NETCoreAppTargetFrameworkVersion) $(_NETCoreAppPackageVersion) + $(_UseBundledNETCoreAppPackageVersionAsDefaultNetCorePatchVersion) $(_NETStandardTargetFrameworkVersion) $(_NETStandardLibraryPackageVersion) $(_NETCorePlatformsPackageVersion) @@ -182,9 +193,9 @@ Copyright (c) .NET Foundation. All rights reserved. $(_DefaultPatchVersionForAspNetCoreApp2_1) - 1.0.11 - 1.1.8 - 2.0.7 + 1.0.12 + 1.1.9 + 2.0.9 ]]> diff --git a/build/Microsoft.DotNet.Cli.tasks b/build/Microsoft.DotNet.Cli.tasks index 901a48f84..812c04925 100644 --- a/build/Microsoft.DotNet.Cli.tasks +++ b/build/Microsoft.DotNet.Cli.tasks @@ -23,6 +23,7 @@ + diff --git a/build/NugetConfigFile.targets b/build/NugetConfigFile.targets index 604d26b00..37d2ddb7c 100644 --- a/build/NugetConfigFile.targets +++ b/build/NugetConfigFile.targets @@ -5,6 +5,7 @@ + + ]]> diff --git a/build_projects/dotnet-cli-build/GetUseBundledVersionAsDefaultVersion.cs b/build_projects/dotnet-cli-build/GetUseBundledVersionAsDefaultVersion.cs new file mode 100644 index 000000000..91d10694a --- /dev/null +++ b/build_projects/dotnet-cli-build/GetUseBundledVersionAsDefaultVersion.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using System; +using System.IO; +using Microsoft.Build.Utilities; +using Microsoft.Build.Framework; +using Microsoft.DotNet.Cli.Build.Framework; +using NuGet.Versioning; + +namespace Microsoft.DotNet.Cli.Build +{ + public class GetUseBundledNETCoreAppPackageVersionAsDefaultNetCorePatchVersion : Task + { + [Required] + public string BundledNETCoreAppPackageVersion { get; set; } + + [Output] + public string UseBundledNETCoreAppPackageVersionAsDefaultNetCorePatchVersion { get; set; } + + public override bool Execute() + { + var parsedVersion = NuGetVersion.Parse(BundledNETCoreAppPackageVersion); + UseBundledNETCoreAppPackageVersionAsDefaultNetCorePatchVersion = + (parsedVersion.Patch == 0) && parsedVersion.IsPrerelease ? "true" : "false"; + + return true; + } + } +} diff --git a/test/EndToEnd/GivenFrameworkDependentApps.cs b/test/EndToEnd/GivenFrameworkDependentApps.cs new file mode 100644 index 000000000..605e22bd2 --- /dev/null +++ b/test/EndToEnd/GivenFrameworkDependentApps.cs @@ -0,0 +1,90 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml.Linq; +using FluentAssertions; +using Microsoft.DotNet.PlatformAbstractions; +using Microsoft.DotNet.TestFramework; +using Microsoft.DotNet.Tools.Test.Utilities; +using NuGet.ProjectModel; +using NuGet.Versioning; +using Xunit; + +namespace EndToEnd +{ + public class GivenFrameworkDependentApps : TestBase + { + [Theory] + [ClassData(typeof(SupportedNetCoreAppVersions))] + public void ItDoesNotRollForwardToTheLatestVersion(string minorVersion) + { + var _testInstance = TestAssets.Get("TestAppSimple") + .CreateInstance(identifier: minorVersion) + // scope the feed to only dotnet-core feed to avoid flaky when different feed has a newer / lower version + .WithNuGetConfig(new RepoDirectoriesProvider().TestPackages) + .WithSourceFiles(); + + string projectDirectory = _testInstance.Root.FullName; + + string projectPath = Path.Combine(projectDirectory, "TestAppSimple.csproj"); + + var project = XDocument.Load(projectPath); + var ns = project.Root.Name.Namespace; + + // Update TargetFramework to the right version of .NET Core + project.Root.Element(ns + "PropertyGroup") + .Element(ns + "TargetFramework") + .Value = "netcoreapp" + minorVersion; + + project.Save(projectPath); + + // Get the resolved version of .NET Core + new RestoreCommand() + .WithWorkingDirectory(projectDirectory) + .Execute() + .Should().Pass(); + + string assetsFilePath = Path.Combine(projectDirectory, "obj", "project.assets.json"); + var assetsFile = new LockFileFormat().Read(assetsFilePath); + + var versionInAssertsJson = GetNetCoreAppVersion(assetsFile); + versionInAssertsJson.Should().NotBeNull(); + + if (versionInAssertsJson.IsPrerelease && versionInAssertsJson.Patch == 0) + { + // if the bundled version is, for example, a prerelease of + // .NET Core 2.1.1, that we don't roll forward to that prerelease + // version for framework-dependent deployments. + return; + } + + versionInAssertsJson.ToNormalizedString().Should().BeEquivalentTo(GetExpectedVersion(minorVersion)); + } + + private NuGetVersion GetNetCoreAppVersion(LockFile lockFile) + { + return lockFile?.Targets?.SingleOrDefault(t => t.RuntimeIdentifier == null) + ?.Libraries?.SingleOrDefault(l => + string.Compare(l.Name, "Microsoft.NETCore.App", StringComparison.CurrentCultureIgnoreCase) == 0) + ?.Version; + } + + public string GetExpectedVersion(string minorVersion) + { + if (minorVersion.StartsWith("1.0")) + { + return "1.0.5"; // special case for 1.0 + } + else if (minorVersion.StartsWith("1.1")) + { + return "1.1.2"; // special case for 1.1 + } + else + { + var parsed = NuGetVersion.Parse(minorVersion); + return new NuGetVersion(parsed.Major, parsed.Minor, 0).ToNormalizedString(); + } + } + } +} diff --git a/test/EndToEnd/GivenSelfContainedAppsRollForward.cs b/test/EndToEnd/GivenSelfContainedAppsRollForward.cs index 080197472..b624cd14f 100644 --- a/test/EndToEnd/GivenSelfContainedAppsRollForward.cs +++ b/test/EndToEnd/GivenSelfContainedAppsRollForward.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; @@ -13,13 +12,13 @@ using Xunit; namespace EndToEnd { - public class GivenSelfContainedAppsRollForward : TestBase + public partial class GivenSelfContainedAppsRollForward : TestBase { - [Theory(Skip = "Runtime 1.1 support for openSUSE and Fedora 27 needed")] + [Theory] // MemberData is used instead of InlineData here so we can access it in another test to // verify that we are covering the latest release of .NET Core - [MemberData(nameof(SupportedNetCoreAppVersions))] + [ClassData(typeof(SupportedNetCoreAppVersions))] public void ItRollsForwardToTheLatestVersion(string minorVersion) { var _testInstance = TestAssets.Get("TestAppSimple") @@ -118,25 +117,11 @@ namespace EndToEnd .Element(ns + "TargetFramework") .Value; - SupportedNetCoreAppVersions.Select(v => $"netcoreapp{v[0]}") - .Should().Contain(targetFramework, $"the {nameof(SupportedNetCoreAppVersions)} property should include the default version " + + SupportedNetCoreAppVersions.Versions.Select(v => $"netcoreapp{v[0]}") + .Should().Contain(targetFramework, $"the {nameof(SupportedNetCoreAppVersions)}.{nameof(SupportedNetCoreAppVersions.Versions)} property should include the default version " + "of .NET Core created by \"dotnet new\""); } } - - public static IEnumerable SupportedNetCoreAppVersions - { - get - { - return new[] - { - "1.0", - "1.1", - "2.0", - "2.1" - }.Select(version => new object[] { version }); - } - } } } diff --git a/test/EndToEnd/SupportedNetCoreAppVersions.cs b/test/EndToEnd/SupportedNetCoreAppVersions.cs new file mode 100644 index 000000000..fe1eb44e2 --- /dev/null +++ b/test/EndToEnd/SupportedNetCoreAppVersions.cs @@ -0,0 +1,26 @@ +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace EndToEnd +{ + public class SupportedNetCoreAppVersions : IEnumerable + { + public IEnumerator GetEnumerator() => Versions.GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + public static IEnumerable Versions + { + get + { + return new[] + { + "1.0", + "1.1", + "2.0", + "2.1" + }.Select(version => new object[] { version }); + } + } + } +}