From 43be2bff953d9e43c95848e593a15a4b4fdd4c0f Mon Sep 17 00:00:00 2001 From: Mike Harder Date: Tue, 19 Jun 2018 13:52:56 -0700 Subject: [PATCH] Update tests for SDK 2.1.301 (#10) - Offline restore is broken in SDK 2.1.301 - "dotnet build" cannot use "--no-restore" if the app is self-contained and the SDK contains a patched runtime --- AspNetCoreSdkTests/TemplateTests.cs | 38 ++++++++++++++---------- AspNetCoreSdkTests/Templates/Template.cs | 2 +- AspNetCoreSdkTests/Util/DotNetUtil.cs | 33 ++++++++++++++++++-- 3 files changed, 54 insertions(+), 19 deletions(-) diff --git a/AspNetCoreSdkTests/TemplateTests.cs b/AspNetCoreSdkTests/TemplateTests.cs index 6660c7922b..3052d17cb2 100644 --- a/AspNetCoreSdkTests/TemplateTests.cs +++ b/AspNetCoreSdkTests/TemplateTests.cs @@ -1,4 +1,5 @@ using AspNetCoreSdkTests.Templates; +using AspNetCoreSdkTests.Util; using NUnit.Framework; using System; using System.Collections.Generic; @@ -85,20 +86,25 @@ namespace AspNetCoreSdkTests { if (runtimeIdentifier == RuntimeIdentifier.None) { + // Offline restore is broken in SDK 2.1.301 (https://github.com/aspnet/Universe/issues/1220) + var packageSource = (DotNetUtil.SdkVersion == new Version(2, 1, 301)) ? NuGetPackageSource.NuGetOrg : NuGetPackageSource.None; + // Framework-dependent return new[] { Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), + Template.GetInstance(packageSource, runtimeIdentifier), + // Offline restore currently not supported for RazorClassLibrary template (https://github.com/aspnet/Universe/issues/1123) Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), + + Template.GetInstance(packageSource, runtimeIdentifier), + Template.GetInstance(packageSource, runtimeIdentifier), + Template.GetInstance(packageSource, runtimeIdentifier), + Template.GetInstance(packageSource, runtimeIdentifier), + Template.GetInstance(packageSource, runtimeIdentifier), + Template.GetInstance(packageSource, runtimeIdentifier), + Template.GetInstance(packageSource, runtimeIdentifier), }; } else @@ -108,15 +114,15 @@ namespace AspNetCoreSdkTests { // ClassLibrary does not require a package source, even for self-contained deployments Template.GetInstance(NuGetPackageSource.None, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.DotNetCore, runtimeIdentifier), + Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.DotNetCore, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.DotNetCore, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.DotNetCore, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.DotNetCore, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.DotNetCore, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.DotNetCore, runtimeIdentifier), - Template.GetInstance(NuGetPackageSource.DotNetCore, runtimeIdentifier), + Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), + Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), + Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), + Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), + Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), + Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), + Template.GetInstance(NuGetPackageSource.NuGetOrg, runtimeIdentifier), }; } } diff --git a/AspNetCoreSdkTests/Templates/Template.cs b/AspNetCoreSdkTests/Templates/Template.cs index 4e9f2a7f78..51fc89a141 100644 --- a/AspNetCoreSdkTests/Templates/Template.cs +++ b/AspNetCoreSdkTests/Templates/Template.cs @@ -105,7 +105,7 @@ namespace AspNetCoreSdkTests.Templates // Build depends on Restore _ = ObjFilesAfterRestore; - DotNetUtil.Build(TempDir, RuntimeIdentifier); + DotNetUtil.Build(TempDir, NuGetPackageSource, RuntimeIdentifier); return (IOUtil.GetFiles(Path.Combine(TempDir, "obj")), IOUtil.GetFiles(Path.Combine(TempDir, "bin"))); } diff --git a/AspNetCoreSdkTests/Util/DotNetUtil.cs b/AspNetCoreSdkTests/Util/DotNetUtil.cs index 28278a83f8..c45935406e 100644 --- a/AspNetCoreSdkTests/Util/DotNetUtil.cs +++ b/AspNetCoreSdkTests/Util/DotNetUtil.cs @@ -3,6 +3,8 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Text.RegularExpressions; +using System.Threading; namespace AspNetCoreSdkTests.Util { @@ -22,6 +24,27 @@ namespace AspNetCoreSdkTests.Util public static string PublishOutput => "pub"; + private static readonly Lazy _sdkVersion = new Lazy(GetSdkVersion, LazyThreadSafetyMode.PublicationOnly); + + public static Version SdkVersion => _sdkVersion.Value; + + private static Version GetSdkVersion() + { + var info = RunDotNet("--info", workingDirectory: null); + var versionString = Regex.Match(info, @"Version:\W*([0-9.]+)").Groups[1].Value; + var version = new Version(versionString); + + // Supported version range is [2.1.300,2.1.301] (inclusive) + if (version >= new Version(2, 1, 300) && version <= new Version(2, 1, 301)) + { + return version; + } + else + { + throw new InvalidOperationException($"Unsupported SDK version: {version}"); + } + } + private static IEnumerable> GetEnvironment(NuGetPackageSource nuGetPackageSource) { // Set NUGET_PACKAGES to an initially-empty, distinct folder for each NuGetPackageSource. This ensures packages are loaded @@ -45,9 +68,15 @@ namespace AspNetCoreSdkTests.Util workingDirectory, GetEnvironment(packageSource)); } - public static string Build(string workingDirectory, RuntimeIdentifier runtimeIdentifier) + public static string Build(string workingDirectory, NuGetPackageSource packageSource, RuntimeIdentifier runtimeIdentifier) { - return RunDotNet($"build --no-restore {runtimeIdentifier.RuntimeArgument}", workingDirectory); + // "dotnet build" cannot use "--no-restore" if the app is self-contained and the SDK contains a patched runtime + // https://github.com/dotnet/sdk/issues/2312, https://github.com/dotnet/cli/issues/9514 + bool restoreRequired = (runtimeIdentifier != RuntimeIdentifier.None) && (DotNetUtil.SdkVersion >= new Version(2, 1, 301)); + + var restoreArgument = restoreRequired ? $"--no-cache {packageSource.SourceArgument}" : "--no-restore"; + + return RunDotNet($"build {restoreArgument} {runtimeIdentifier.RuntimeArgument}", workingDirectory, GetEnvironment(packageSource)); } public static (Process Process, ConcurrentStringBuilder OutputBuilder, ConcurrentStringBuilder ErrorBuilder) Run(