diff --git a/src/NuGetGallery/Controllers/ApiController.cs b/src/NuGetGallery/Controllers/ApiController.cs index b76915ca5b..91d77031ac 100644 --- a/src/NuGetGallery/Controllers/ApiController.cs +++ b/src/NuGetGallery/Controllers/ApiController.cs @@ -280,14 +280,6 @@ private async Task CreatePackageInternal() { await PackageFileService.SavePackageFileAsync(package, uploadStream); } - - if ( - packageToPush.Metadata.Id.Equals(Constants.NuGetCommandLinePackageId, - StringComparison.OrdinalIgnoreCase) && package.IsLatestStable) - { - // If we're pushing a new stable version of NuGet.CommandLine, update the extracted executable. - await NugetExeDownloaderService.UpdateExecutableAsync(packageToPush); - } } return new HttpStatusCodeResult(HttpStatusCode.Created); diff --git a/src/NuGetGallery/Controllers/PackagesController.cs b/src/NuGetGallery/Controllers/PackagesController.cs index f01e089561..c04e4b7d58 100644 --- a/src/NuGetGallery/Controllers/PackagesController.cs +++ b/src/NuGetGallery/Controllers/PackagesController.cs @@ -30,7 +30,6 @@ public partial class PackagesController : AppController private readonly IAutomaticallyCuratePackageCommand _autoCuratedPackageCmd; private readonly IAppConfiguration _config; private readonly IMessageService _messageService; - private readonly INuGetExeDownloaderService _nugetExeDownloaderService; private readonly IPackageService _packageService; private readonly IPackageFileService _packageFileService; private readonly ISearchService _searchService; @@ -46,7 +45,6 @@ public PackagesController( IMessageService messageService, ISearchService searchService, IAutomaticallyCuratePackageCommand autoCuratedPackageCmd, - INuGetExeDownloaderService nugetExeDownloaderService, IPackageFileService packageFileService, IEntitiesContext entitiesContext, IAppConfiguration config, @@ -59,7 +57,6 @@ public PackagesController( _messageService = messageService; _searchService = searchService; _autoCuratedPackageCmd = autoCuratedPackageCmd; - _nugetExeDownloaderService = nugetExeDownloaderService; _packageFileService = packageFileService; _entitiesContext = entitiesContext; _config = config; @@ -892,13 +889,6 @@ public virtual async Task VerifyPackage(VerifyPackageRequest formD // tell Lucene to update index for the new package _indexingService.UpdateIndex(); - - // If we're pushing a new stable version of NuGet.CommandLine, update the extracted executable. - if (package.PackageRegistration.Id.Equals(Constants.NuGetCommandLinePackageId, StringComparison.OrdinalIgnoreCase) && - package.IsLatestStable) - { - await _nugetExeDownloaderService.UpdateExecutableAsync(nugetPackage); - } } // delete the uploaded binary in the Uploads container diff --git a/src/NuGetGallery/Services/INuGetExeDownloaderService.cs b/src/NuGetGallery/Services/INuGetExeDownloaderService.cs index 30e04bc92f..ad48787a90 100644 --- a/src/NuGetGallery/Services/INuGetExeDownloaderService.cs +++ b/src/NuGetGallery/Services/INuGetExeDownloaderService.cs @@ -9,7 +9,5 @@ namespace NuGetGallery public interface INuGetExeDownloaderService { Task CreateNuGetExeDownloadActionResultAsync(Uri requestUrl); - - Task UpdateExecutableAsync(INupkg package); } } \ No newline at end of file diff --git a/src/NuGetGallery/Services/NuGetExeDownloaderService.cs b/src/NuGetGallery/Services/NuGetExeDownloaderService.cs index a98b215b1a..76573c909f 100644 --- a/src/NuGetGallery/Services/NuGetExeDownloaderService.cs +++ b/src/NuGetGallery/Services/NuGetExeDownloaderService.cs @@ -11,57 +11,16 @@ public class NuGetExeDownloaderService : INuGetExeDownloaderService { private const int MaxNuGetExeFileSize = 10 * 1024 * 1024; private readonly IFileStorageService _fileStorageService; - private readonly IPackageFileService _packageFileService; - private readonly IPackageService _packageService; public NuGetExeDownloaderService( - IPackageService packageService, - IPackageFileService packageFileService, IFileStorageService fileStorageService) { - _packageService = packageService; - _packageFileService = packageFileService; _fileStorageService = fileStorageService; } - public async Task CreateNuGetExeDownloadActionResultAsync(Uri requestUrl) + public Task CreateNuGetExeDownloadActionResultAsync(Uri requestUrl) { - await EnsureNuGetExe(); - return await _fileStorageService.CreateDownloadFileActionResultAsync(requestUrl, Constants.DownloadsFolderName, "nuget.exe"); - } - - public Task UpdateExecutableAsync(INupkg nupkg) - { - return ExtractNuGetExe(nupkg); - } - - private async Task EnsureNuGetExe() - { - if (await _fileStorageService.FileExistsAsync(Constants.DownloadsFolderName, "nuget.exe")) - { - // Ensure the file exists on blob storage. - return; - } - - var package = _packageService.FindPackageByIdAndVersion("NuGet.CommandLine", version: null, allowPrerelease: false); - if (package == null) - { - throw new InvalidOperationException("Unable to find NuGet.CommandLine."); - } - - using (Stream packageStream = await _packageFileService.DownloadPackageFileAsync(package)) - { - var nupkg = new Nupkg(packageStream, leaveOpen: true); - await ExtractNuGetExe(nupkg); - } - } - - private Task ExtractNuGetExe(INupkg package) - { - using (Stream nugetExeStream = package.GetSizeVerifiedFileStream(@"tools\NuGet.exe", MaxNuGetExeFileSize)) - { - return _fileStorageService.SaveFileAsync(Constants.DownloadsFolderName, "nuget.exe", nugetExeStream); - } + return _fileStorageService.CreateDownloadFileActionResultAsync(requestUrl, Constants.DownloadsFolderName, "nuget.exe"); } } } diff --git a/tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs index 684c5f3a8e..f9cf938c95 100644 --- a/tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/ApiControllerFacts.cs @@ -182,53 +182,6 @@ public void WillCreateAPackageWithTheUserMatchingTheApiKey() controller.MockPackageService.Verify(x => x.CreatePackage(It.IsAny(), user, false)); controller.MockEntitiesContext.VerifyCommitted(); } - - [Fact] - public void CreatePackageRefreshesNuGetExeIfCommandLinePackageIsUploaded() - { - // Arrange - var nuGetPackage = new Mock(); - nuGetPackage.Setup(x => x.Metadata.Id).Returns("NuGet.CommandLine"); - nuGetPackage.Setup(x => x.Metadata.Version).Returns(new SemanticVersion("1.0.42")); - var user = new User() { EmailAddress = "confirmed@email.com" }; - var controller = new TestableApiController(); - var apiKey = Guid.NewGuid(); - controller.MockPackageService.Setup(p => p.CreatePackage(nuGetPackage.Object, It.IsAny(), false)) - .Returns(new Package { IsLatestStable = true }); - controller.MockNuGetExeDownloaderService.Setup(s => s.UpdateExecutableAsync(nuGetPackage.Object)).Verifiable(); - controller.SetCurrentUser(user); - controller.SetupPackageFromInputStream(nuGetPackage); - - // Act - controller.CreatePackagePut(); - - // Assert - controller.MockNuGetExeDownloaderService.Verify(); - } - - [Fact] - public void CreatePackageDoesNotRefreshNuGetExeIfItIsNotLatestStable() - { - // Arrange - var nuGetPackage = new Mock(); - nuGetPackage.Setup(x => x.Metadata.Id).Returns("NuGet.CommandLine"); - nuGetPackage.Setup(x => x.Metadata.Version).Returns(new SemanticVersion("2.0.0-alpha")); - var user = new User() { EmailAddress = "confirmed@email.com" }; - var controller = new TestableApiController(); - var apiKey = Guid.NewGuid(); - controller.MockPackageService.Setup(p => p.CreatePackage(nuGetPackage.Object, It.IsAny(), false)) - .Returns(new Package { IsLatest = true, IsLatestStable = false }); - controller.MockNuGetExeDownloaderService.Setup(s => s.UpdateExecutableAsync(nuGetPackage.Object)).Verifiable(); - controller.SetCurrentUser(user); - controller.SetupPackageFromInputStream(nuGetPackage); - - // Act - controller.CreatePackagePut(); - - // Assert - controller.MockNuGetExeDownloaderService.Verify(s => s.UpdateExecutableAsync(It.IsAny()), Times.Never()); - controller.MockEntitiesContext.VerifyCommitted(); - } } public class TheDeletePackageAction diff --git a/tests/NuGetGallery.Facts/Controllers/PackagesControllerFacts.cs b/tests/NuGetGallery.Facts/Controllers/PackagesControllerFacts.cs index d9da6bc5dd..15b1282965 100644 --- a/tests/NuGetGallery.Facts/Controllers/PackagesControllerFacts.cs +++ b/tests/NuGetGallery.Facts/Controllers/PackagesControllerFacts.cs @@ -32,7 +32,6 @@ private static PackagesController CreateController( Mock searchService = null, Exception readPackageException = null, Mock autoCuratePackageCmd = null, - Mock downloaderService = null, Mock config = null, Mock packageFileService = null, Mock entitiesContext = null, @@ -50,7 +49,6 @@ private static PackagesController CreateController( messageService = messageService ?? new Mock(); searchService = searchService ?? CreateSearchService(); autoCuratePackageCmd = autoCuratePackageCmd ?? new Mock(); - downloaderService = downloaderService ?? new Mock(MockBehavior.Strict); config = config ?? new Mock(); if (packageFileService == null) @@ -73,7 +71,6 @@ private static PackagesController CreateController( messageService.Object, searchService.Object, autoCuratePackageCmd.Object, - downloaderService.Object, packageFileService.Object, entitiesContext.Object, config.Object, @@ -1526,126 +1523,6 @@ public async Task WillCurateThePackage() fakeAutoCuratePackageCmd.Verify(fake => fake.Execute(fakePackage, fakeNuGetPackage.Object, false)); } - - [Fact] - public async Task WillExtractNuGetExe() - { - // Arrange - var fakeUploadFileService = new Mock(); - fakeUploadFileService.Setup(x => x.DeleteUploadFileAsync(TestUtility.FakeUser.Key)).Returns(Task.FromResult(0)); - fakeUploadFileService.Setup(x => x.GetUploadFileAsync(TestUtility.FakeUser.Key)).Returns(Task.FromResult(Stream.Null)); - var fakePackageService = new Mock(); - var commandLinePackage = new Package - { - PackageRegistration = new PackageRegistration { Id = "NuGet.CommandLine" }, - Version = "2.0.0", - IsLatestStable = true - }; - fakePackageService.Setup(x => x.CreatePackage(It.IsAny(), It.IsAny(), It.IsAny())).Returns(commandLinePackage); - var nugetExeDownloader = new Mock(MockBehavior.Strict); - nugetExeDownloader.Setup(d => d.UpdateExecutableAsync(It.IsAny())).Returns(Task.FromResult(0)).Verifiable(); - var controller = CreateController( - packageService: fakePackageService, - uploadFileService: fakeUploadFileService, - downloaderService: nugetExeDownloader); - controller.SetCurrentUser(TestUtility.FakeUser); - - // Act - await controller.VerifyPackage(new VerifyPackageRequest() { Listed = false, Edit = null }); - - // Assert - nugetExeDownloader.Verify(); - } - - [Fact] - public async Task WillNotExtractNuGetExeIfIsNotLatestStable() - { - // Arrange - var fakeUploadFileService = new Mock(); - - var fakePackageService = new Mock(); - var commandLinePackage = new Package - { - PackageRegistration = new PackageRegistration { Id = "NuGet.CommandLine" }, - Version = "2.0.0", - IsLatestStable = false - }; - - fakePackageService.Setup(x => x.CreatePackage(It.IsAny(), It.IsAny(), It.IsAny())).Returns(commandLinePackage); - - fakeUploadFileService.Setup(x => x.GetUploadFileAsync(TestUtility.FakeUser.Key)).Returns(Task.FromResult( - CreateTestPackageStream(commandLinePackage))); - fakeUploadFileService.Setup(x => x.DeleteUploadFileAsync(TestUtility.FakeUser.Key)).Returns(Task.FromResult(0)); - - var nugetExeDownloader = new Mock(MockBehavior.Strict); - var controller = CreateController( - packageService: fakePackageService, - uploadFileService: fakeUploadFileService, - downloaderService: nugetExeDownloader); - controller.SetCurrentUser(TestUtility.FakeUser); - - // Act - await controller.VerifyPackage(new VerifyPackageRequest() { Listed = false, Edit = null }); - - // Assert - nugetExeDownloader.Verify(d => d.UpdateExecutableAsync(It.IsAny()), Times.Never()); - } - - [Theory] - [InlineData("nuget-commandline")] - [InlineData("nuget.x.commandline")] - [InlineData("nuget.command")] - public async Task WillNotExtractNuGetExeIfIsItDoesNotMatchId(string id) - { - // Arrange - var fakeUploadFileService = new Mock(); - - var fakePackageService = new Mock(); - var commandLinePackage = new Package { PackageRegistration = new PackageRegistration { Id = id }, Version = "2.0.0", IsLatestStable = true }; - - fakeUploadFileService.Setup(x => x.GetUploadFileAsync(TestUtility.FakeUser.Key)).Returns(Task.FromResult( - CreateTestPackageStream(commandLinePackage))); - fakeUploadFileService.Setup(x => x.DeleteUploadFileAsync(TestUtility.FakeUser.Key)).Returns(Task.FromResult(0)); - - fakePackageService.Setup(x => x.CreatePackage(It.IsAny(), It.IsAny(), It.IsAny())).Returns(commandLinePackage); - var nugetExeDownloader = new Mock(MockBehavior.Strict); - var controller = CreateController( - packageService: fakePackageService, - uploadFileService: fakeUploadFileService, - downloaderService: nugetExeDownloader); - TestUtility.SetupUrlHelperForUrlGeneration(controller, new Uri("http://1.1.1.1")); - controller.SetCurrentUser(TestUtility.FakeUser); - - // Act - await controller.VerifyPackage(new VerifyPackageRequest() { Listed = false, Edit = null }); - - // Assert - nugetExeDownloader.Verify(d => d.UpdateExecutableAsync(It.IsAny()), Times.Never()); - } - - private Stream CreateTestPackageStream(Package commandLinePackage) - { - var packageStream = new MemoryStream(); - var builder = new PackageBuilder - { - Id = commandLinePackage.PackageRegistration.Id, - Version = SemanticVersion.Parse(commandLinePackage.Version), - Authors = - { - "dummyAuthor", - }, - Description = commandLinePackage.Description ?? "dummyDesription", - }; - - // Make the package buildable by adding a dependency - if (builder.Files.Count == 0 && !builder.DependencySets.Any(s => s.Dependencies.Any())) - { - builder.DependencySets.Add(new PackageDependencySet(null, new[] { new NuGet.PackageDependency("dummy") })); - } - - builder.Save(packageStream); - return packageStream; - } } public class TheUploadProgressAction diff --git a/tests/NuGetGallery.Facts/Services/NuGetExeDownloaderServiceFacts.cs b/tests/NuGetGallery.Facts/Services/NuGetExeDownloaderServiceFacts.cs index 2e96765d88..a304293aff 100644 --- a/tests/NuGetGallery.Facts/Services/NuGetExeDownloaderServiceFacts.cs +++ b/tests/NuGetGallery.Facts/Services/NuGetExeDownloaderServiceFacts.cs @@ -19,9 +19,6 @@ public async Task CreateNuGetExeDownloadDoesNotExtractFileIfItAlreadyExists() { // Arrange var fileStorage = new Mock(MockBehavior.Strict); - fileStorage.Setup(s => s.FileExistsAsync("downloads", "nuget.exe")) - .Returns(Task.FromResult(true)).Verifiable(); - fileStorage.Setup(s => s.CreateDownloadFileActionResultAsync(HttpRequestUrl, "downloads", "nuget.exe")) .Returns(Task.FromResult(Mock.Of())) .Verifiable(); @@ -34,98 +31,12 @@ public async Task CreateNuGetExeDownloadDoesNotExtractFileIfItAlreadyExists() fileStorage.Verify(); } - [Fact] - public async Task CreateNuGetExeDownloadExtractsFileIfItDoesNotExist() - { - // Arrange - var fileStorage = new Mock(MockBehavior.Strict); - fileStorage.Setup(s => s.FileExistsAsync("downloads", "nuget.exe")).Returns(Task.FromResult(false)); - fileStorage.Setup(s => s.SaveFileAsync("downloads", "nuget.exe", It.IsAny())) - .Returns(Task.FromResult(0)) - .Verifiable(); - fileStorage.Setup(s => s.CreateDownloadFileActionResultAsync(HttpRequestUrl, "downloads", "nuget.exe")) - .Returns(Task.FromResult(Mock.Of())) - .Verifiable(); - - var package = new Package { Version = "2.0.0" }; - var packageService = new Mock(MockBehavior.Strict); - packageService.Setup(s => s.FindPackageByIdAndVersion("NuGet.CommandLine", null, false)) - .Returns(package) - .Verifiable(); - var packageFileService = new Mock(MockBehavior.Strict); - packageFileService.Setup(s => s.DownloadPackageFileAsync(package)) - .Returns(Task.FromResult(CreateCommandLinePackage())) - .Verifiable(); - - // Act - var downloaderService = GetDownloaderService(packageService, packageFileService, fileStorage); - await downloaderService.CreateNuGetExeDownloadActionResultAsync(HttpRequestUrl); - - // Assert - packageFileService.Verify(); - packageService.Verify(); - } - - [Fact] - public async Task UpdateExecutableExtractsExeToFileStorage() - { - // Arrange - var fileStorage = new Mock(MockBehavior.Strict); - fileStorage.Setup(s => s.SaveFileAsync("downloads", "nuget.exe", It.IsAny())) - .Returns(Task.FromResult(0)) - .Verifiable(); - - var nugetPackage = new Mock(); - nugetPackage.Setup(s => s.GetFiles()).Returns(new[] { @"tools\NuGet.exe" }); - nugetPackage - .Setup(s => s.GetSizeVerifiedFileStream("nuget.exe", 10000)) - .Returns((Stream)null); - - // Act - var downloaderService = GetDownloaderService(fileStorageService: fileStorage); - await downloaderService.UpdateExecutableAsync(nugetPackage.Object); - - // Assert - fileStorage.Verify(); - } - - private static Stream CreateCommandLinePackage() - { - var packageBuilder = new PackageBuilder - { - Id = "NuGet.CommandLine", - Version = new SemanticVersion("2.0.0"), - Description = "Some desc" - }; - packageBuilder.Authors.Add("test"); - var exeFile = CreateExePackageFile(); - packageBuilder.Files.Add(exeFile); - - var memoryStream = new MemoryStream(); - packageBuilder.Save(memoryStream); - memoryStream.Seek(0, SeekOrigin.Begin); - - return memoryStream; - } - - private static IPackageFile CreateExePackageFile() - { - var exeFile = new Mock(); - exeFile.Setup(s => s.Path).Returns(@"tools\NuGet.exe"); - exeFile.Setup(s => s.GetStream()).Returns(Stream.Null); - return exeFile.Object; - } - private static NuGetExeDownloaderService GetDownloaderService( - Mock packageService = null, - Mock packageFileService = null, Mock fileStorageService = null) { - packageService = packageService ?? new Mock(MockBehavior.Strict); - packageFileService = packageFileService ?? new Mock(MockBehavior.Strict); fileStorageService = fileStorageService ?? new Mock(MockBehavior.Strict); - return new NuGetExeDownloaderService(packageService.Object, packageFileService.Object, fileStorageService.Object); + return new NuGetExeDownloaderService(fileStorageService.Object); } } } \ No newline at end of file