GivenThatWeWantToRestoreProjectsUsingNuGetConfigProperties.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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.Common;
  4. using NuGet.Packaging;
  5. using NuGet.Packaging.Core;
  6. using NuGet.Packaging.Signing;
  7. namespace Microsoft.NET.Restore.Tests
  8. {
  9. public class GivenThatWeWantToRestoreProjectsUsingNuGetConfigProperties : SdkTest
  10. {
  11. public GivenThatWeWantToRestoreProjectsUsingNuGetConfigProperties(ITestOutputHelper log) : base(log)
  12. {
  13. }
  14. [Theory]
  15. [InlineData("netstandard1.3", "1.3", false)]
  16. [InlineData("netcoreapp1.0", "1.0", true)]
  17. [InlineData("netcoreapp1.1", "1.1", true)]
  18. [InlineData("netstandard2.0", "2.0", false)]
  19. [InlineData("netcoreapp2.0", "2.0app", false)]
  20. [InlineData("net462", "461app", false)]
  21. [InlineData("netcoreapp2.0;net462", "multiTFM20app", false)]
  22. [InlineData("netcoreapp1.0;netcoreapp2.0", "multiTFM1020app", true)]
  23. [InlineData("netcoreapp1.0;net462", "multiTFM1046app", true)]
  24. public void I_can_restore_a_project_with_implicit_msbuild_nuget_config(
  25. string frameworks,
  26. string projectPrefix,
  27. bool fileExists)
  28. {
  29. string testProjectName = $"{projectPrefix}Fallback";
  30. TestAsset testProjectTestAsset = CreateTestAsset(testProjectName, frameworks);
  31. var packagesFolder = Path.Combine(TestContext.Current.TestExecutionDirectory, "packages", testProjectName);
  32. var restoreCommand = testProjectTestAsset.GetRestoreCommand(Log, relativePath: testProjectName);
  33. restoreCommand.Execute($"/p:RestorePackagesPath={packagesFolder}", $"/p:_NugetFallbackFolder={TestContext.Current.NuGetFallbackFolder}").Should().Pass();
  34. File.Exists(Path.Combine(
  35. packagesFolder,
  36. GetUniquePackageNameForEachTestProject(testProjectName),
  37. "1.0.0",
  38. $"{GetUniquePackageNameForEachTestProject(testProjectName)}.1.0.0.nupkg")).Should().Be(fileExists);
  39. }
  40. [Theory]
  41. [InlineData("netstandard1.3", "1.3")]
  42. [InlineData(ToolsetInfo.CurrentTargetFramework, ToolsetInfo.CurrentTargetFrameworkVersion)]
  43. // base line of the following tests
  44. public void I_can_restore_with_implicit_msbuild_nuget_config(string frameworks, string projectPrefix)
  45. {
  46. string testProjectName = $"{projectPrefix}EnableFallback";
  47. TestAsset testProjectTestAsset = CreateTestAsset(testProjectName, frameworks);
  48. var restoreCommand = testProjectTestAsset.GetRestoreCommand(Log, relativePath: testProjectName);
  49. restoreCommand.Execute($"/p:_NugetFallbackFolder={TestContext.Current.NuGetFallbackFolder}").Should().Pass();
  50. }
  51. [Theory]
  52. [InlineData("netstandard1.3", "1.3")]
  53. [InlineData(ToolsetInfo.CurrentTargetFramework, ToolsetInfo.CurrentTargetFrameworkVersion)]
  54. [InlineData("netcoreapp1.1", "1.1")]
  55. [InlineData("netstandard2.0", "2.0")]
  56. [InlineData("netcoreapp2.0", "2.0app")]
  57. public void I_can_disable_implicit_msbuild_nuget_config(string frameworks, string projectPrefix)
  58. {
  59. string testProjectName = $"{projectPrefix}DisabledFallback";
  60. TestAsset testProjectTestAsset = CreateTestAsset(testProjectName, frameworks);
  61. var restoreCommand = testProjectTestAsset.GetRestoreCommand(Log, relativePath: testProjectName);
  62. restoreCommand.Execute($"/p:_NugetFallbackFolder={TestContext.Current.NuGetFallbackFolder}", "/p:DisableImplicitNuGetFallbackFolder=true").Should().Fail();
  63. }
  64. [Theory]
  65. [InlineData("netstandard1.3", "1.3", true)]
  66. [InlineData("netcoreapp1.0", "1.0", false)]
  67. [InlineData("netcoreapp1.1", "1.1", false)]
  68. [InlineData("netstandard2.0", "2.0", true)]
  69. [InlineData("netcoreapp2.0", "2.0app", true)]
  70. public void I_can_disable_1_x_implicit_msbuild_nuget_config(string frameworks, string projectPrefix, bool shouldExecutePass)
  71. {
  72. string testProjectName = $"{projectPrefix}1xDisabledFallback";
  73. TestAsset testProjectTestAsset = CreateTestAsset(testProjectName, frameworks);
  74. var restoreCommand = testProjectTestAsset.GetRestoreCommand(Log, relativePath: testProjectName);
  75. var executeResult = restoreCommand.Execute($"/p:_NugetFallbackFolder={TestContext.Current.NuGetFallbackFolder}", "/p:DisableImplicit1xNuGetFallbackFolder=true");
  76. if (shouldExecutePass)
  77. {
  78. executeResult.Should().Pass();
  79. }
  80. else
  81. {
  82. executeResult.Should().Fail();
  83. }
  84. }
  85. private TestAsset CreateTestAsset(string testProjectName, string frameworks)
  86. {
  87. var packageInNuGetFallbackFolder = CreatePackageInNuGetFallbackFolder(testProjectName);
  88. var testProject =
  89. new TestProject
  90. {
  91. Name = testProjectName,
  92. TargetFrameworks = frameworks,
  93. };
  94. testProject.PackageReferences.Add(packageInNuGetFallbackFolder);
  95. var testProjectTestAsset = _testAssetsManager.CreateTestProject(
  96. testProject,
  97. string.Empty,
  98. testProjectName);
  99. return testProjectTestAsset;
  100. }
  101. private TestPackageReference CreatePackageInNuGetFallbackFolder(string testProjectName)
  102. {
  103. var projectInNuGetFallbackFolder =
  104. new TestProject
  105. {
  106. Name = GetUniquePackageNameForEachTestProject(testProjectName),
  107. TargetFrameworks = "netstandard1.3",
  108. };
  109. var projectInNuGetFallbackFolderPackageReference =
  110. new TestPackageReference(
  111. projectInNuGetFallbackFolder.Name,
  112. "1.0.0",
  113. TestContext.Current.NuGetFallbackFolder);
  114. if (!projectInNuGetFallbackFolderPackageReference.NuGetPackageExists())
  115. {
  116. var projectInNuGetFallbackFolderTestAsset =
  117. _testAssetsManager.CreateTestProject(projectInNuGetFallbackFolder);
  118. var packageRestoreCommand = projectInNuGetFallbackFolderTestAsset.GetRestoreCommand(
  119. Log,
  120. relativePath: projectInNuGetFallbackFolder.Name).Execute().Should().Pass();
  121. var dependencyProjectDirectory = Path.Combine(
  122. projectInNuGetFallbackFolderTestAsset.TestRoot,
  123. projectInNuGetFallbackFolder.Name);
  124. var packagePackCommand =
  125. new PackCommand(Log, dependencyProjectDirectory)
  126. .Execute($"/p:PackageOutputPath={TestContext.Current.NuGetFallbackFolder}").Should().Pass();
  127. ExtractNupkg(
  128. TestContext.Current.NuGetFallbackFolder,
  129. Path.Combine(TestContext.Current.NuGetFallbackFolder, $"{projectInNuGetFallbackFolder.Name}.1.0.0.nupkg"));
  130. // make sure there is no package in cache
  131. DeleteFolder(Path.Combine(TestContext.Current.NuGetCachePath, projectInNuGetFallbackFolder.Name.ToLowerInvariant()));
  132. }
  133. return projectInNuGetFallbackFolderPackageReference;
  134. }
  135. private static string GetUniquePackageNameForEachTestProject(string testProjectName)
  136. {
  137. return "for" + testProjectName.Replace(".", "").ToLower();
  138. }
  139. private void ExtractNupkg(string nugetCache, string nupkg)
  140. {
  141. var pathResolver = new VersionFolderPathResolver(nugetCache);
  142. PackageIdentity identity = null;
  143. using (var reader = new PackageArchiveReader(File.OpenRead(nupkg)))
  144. {
  145. identity = reader.GetIdentity();
  146. }
  147. if (!File.Exists(pathResolver.GetHashPath(identity.Id, identity.Version)))
  148. {
  149. using (var fileStream = File.OpenRead(nupkg))
  150. {
  151. ClientPolicyContext clientPolicyContext = null;
  152. PackageExtractor.InstallFromSourceAsync(
  153. source: null,
  154. packageIdentity: identity,
  155. copyToAsync: stream => fileStream.CopyToAsync(stream, 4096, CancellationToken.None),
  156. versionFolderPathResolver: pathResolver,
  157. packageExtractionContext: new PackageExtractionContext(
  158. PackageSaveMode.Defaultv3,
  159. XmlDocFileSaveMode.None,
  160. clientPolicyContext,
  161. NullLogger.Instance),
  162. token: CancellationToken.None).Wait();
  163. }
  164. }
  165. }
  166. private static void DeleteFolder(string path)
  167. {
  168. if (Directory.Exists(path))
  169. {
  170. Directory.Delete(path, true);
  171. }
  172. }
  173. }
  174. }