GivenUsingDefaultRuntimeFrameworkVersions.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Licensed to the .NET Foundation under one or more agreements.
  2. // The .NET Foundation licenses this file to you under the MIT license.
  3. using NuGet.Versioning;
  4. using RestoreCommand = Microsoft.DotNet.Tools.Test.Utilities.RestoreCommand;
  5. using TestBase = Microsoft.DotNet.Tools.Test.Utilities.TestBase;
  6. using static Microsoft.DotNet.Tools.Test.Utilities.TestCommandExtensions;
  7. namespace EndToEnd
  8. {
  9. public partial class GivenUsingDefaultRuntimeFrameworkVersions : TestBase
  10. {
  11. private static readonly IEnumerable<string> frameworks = new string[] {"Microsoft.NETCore.App", "Microsoft.WindowsDesktop.App",
  12. "Microsoft.WindowsDesktop.App.WPF", "Microsoft.WindowsDesktop.App.WindowsForms", "Microsoft.AspNetCore.App" };
  13. private static readonly IEnumerable<string> versions = SupportedNetCoreAppVersions.Versions.Where(version => NuGetVersion.Parse(version).Major >= 3);
  14. [Fact]
  15. public void DefaultRuntimeVersionsAreUpToDate()
  16. {
  17. var outputFile = "resolvedVersions.txt";
  18. var testProjectCreator = new TestProjectCreator()
  19. {
  20. PackageName = "DefaultRuntimeVersionsAreUpToDate",
  21. MinorVersion = "3.0"
  22. };
  23. var testProject = testProjectCreator.Create();
  24. var projectFile = new DirectoryInfo(testProject.Root.FullName).GetFiles("*.csproj").First().FullName;
  25. var project = XDocument.Load(projectFile);
  26. string writeResolvedVersionsTarget = @$"
  27. <Target Name=`WriteResolvedVersions` AfterTargets=`PrepareForBuild;ProcessFrameworkReferences`>
  28. <ItemGroup>
  29. <LinesToWrite Include=`%(KnownFrameworkReference.Identity) %(KnownFrameworkReference.DefaultRuntimeFrameworkVersion) %(KnownFrameworkReference.LatestRuntimeFrameworkVersion)`/>
  30. </ItemGroup>
  31. <WriteLinesToFile File=`$(OutputPath){ outputFile }`
  32. Lines=`@(LinesToWrite)`
  33. Overwrite=`true`
  34. Encoding=`Unicode`/>
  35. </Target>";
  36. writeResolvedVersionsTarget = writeResolvedVersionsTarget.Replace('`', '"');
  37. var targetElement = XElement.Parse(writeResolvedVersionsTarget);
  38. var ns = project.Root.Name.Namespace;
  39. foreach (var elem in targetElement.Descendants())
  40. elem.Name = ns + elem.Name.LocalName;
  41. targetElement.Name = ns + targetElement.Name.LocalName;
  42. project.Root.Add(targetElement);
  43. using (var file = File.CreateText(projectFile))
  44. {
  45. project.Save(file);
  46. }
  47. new RestoreCommand()
  48. .WithWorkingDirectory(testProject.Root.FullName)
  49. .Execute().Should().Pass();
  50. var binDirectory = new DirectoryInfo(testProject.Root.FullName).Sub("bin").Sub("Debug").GetDirectories().FirstOrDefault();
  51. binDirectory.Should().HaveFilesMatching(outputFile, SearchOption.TopDirectoryOnly);
  52. var resolvedVersionsFile = File.ReadAllLines(Path.Combine(binDirectory.FullName, outputFile));
  53. foreach (var framework in frameworks)
  54. {
  55. foreach (var version in versions)
  56. {
  57. var frameworkVersionLine = resolvedVersionsFile.Where(line => line.Contains(framework) && line.Contains(version)).FirstOrDefault();
  58. if (!string.IsNullOrEmpty(frameworkVersionLine))
  59. {
  60. var defaultVersion = NuGetVersion.Parse(frameworkVersionLine.Split(" ")[1]);
  61. var latestVersion = NuGetVersion.Parse(frameworkVersionLine.Split(" ")[2]);
  62. if (latestVersion.Patch == 0 && latestVersion.IsPrerelease)
  63. {
  64. defaultVersion.Should().Be(latestVersion,
  65. $"the DefaultRuntimeFrameworkVersion for { framework } { version } in Microsoft.NETCoreSdk.BundledVersions.props does not match latest prerelease version { latestVersion }");
  66. }
  67. else
  68. {
  69. defaultVersion.Should().Be(new NuGetVersion(latestVersion.Major, latestVersion.Minor, 0),
  70. $"the DefaultRuntimeFrameworkVersion for { framework } { version } in Microsoft.NETCoreSdk.BundledVersions.props needs to be updated to { version }.0");
  71. }
  72. }
  73. }
  74. }
  75. }
  76. }
  77. }