From 35df476a7389d5db4822ceb24bc257fcfe42c937 Mon Sep 17 00:00:00 2001 From: Matt Ward Date: Tue, 4 Dec 2012 22:20:30 +0000 Subject: [PATCH] Fix null reference when installing unknown NuGet package. If a NuGet package is not found when installing it via the Package Management Console or when a project template tries to install the package an exception is thrown indicating the actual problem instead of a null reference exception being thrown. --- .../Design/FakePackageManagementProject.cs | 5 +++++ .../Project/Src/ProcessPackageAction.cs | 9 ++++++++ .../Test/Src/InstallPackageActionTests.cs | 21 +++++++++++++++++++ .../Test/Src/UninstallPackageActionTests.cs | 12 +++++------ .../Test/Src/UpdatePackageActionTests.cs | 14 +++++++------ 5 files changed, 49 insertions(+), 12 deletions(-) diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs index f7bc593a10..3fe8611b14 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/Design/FakePackageManagementProject.cs @@ -208,5 +208,10 @@ namespace ICSharpCode.PackageManagement.Design { FakePackages.Add(new FakePackage(id)); } + + public void AddFakePackageToSourceRepository(string packageId) + { + FakeSourceRepository.AddFakePackage(packageId); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs b/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs index 72d552cf05..b335f617b1 100644 --- a/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs +++ b/src/AddIns/Misc/PackageManagement/Project/Src/ProcessPackageAction.cs @@ -99,6 +99,15 @@ namespace ICSharpCode.PackageManagement if (Package == null) { Package = Project.SourceRepository.FindPackage(PackageId, PackageVersion); } + if (Package == null) { + ThrowPackageNotFoundError(PackageId); + } + } + + void ThrowPackageNotFoundError(string packageId) + { + string message = String.Format("Unable to find package '{0}'.", packageId); + throw new ApplicationException(message); } protected bool PackageIdExistsInProject() diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/InstallPackageActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/InstallPackageActionTests.cs index c5b0f6340d..1fbcea8d84 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/InstallPackageActionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/InstallPackageActionTests.cs @@ -148,6 +148,7 @@ namespace PackageManagement.Tests { CreateAction(); fakeProject.AddFakeInstallOperation(); + fakeProject.AddFakePackageToSourceRepository("PackageId"); installPackageHelper.InstallPackageById("PackageId"); var actualOperations = action.Operations; @@ -174,6 +175,7 @@ namespace PackageManagement.Tests public void Execute_PackageIdAndSourceAndProjectPassedAndIgnoreDependenciesIsTrue_DependenciesIgnoredWhenGettingPackageOperations() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("PackageId"); installPackageHelper.IgnoreDependencies = true; installPackageHelper.InstallPackageById("PackageId"); @@ -186,6 +188,7 @@ namespace PackageManagement.Tests public void Execute_PackageIdAndSourceAndProjectPassedAndAllowPrereleaseVersionsIsTrue_PrereleaseVersionsAllowedWhenGettingPackageOperations() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("PackageId"); installPackageHelper.AllowPrereleaseVersions = true; installPackageHelper.InstallPackageById("PackageId"); @@ -198,6 +201,7 @@ namespace PackageManagement.Tests public void InstallPackage_PackageIdAndSourceAndProjectPassedAndIgnoreDependenciesIsFalse_DependenciesNotIgnoredWhenGettingPackageOperations() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("PackageId"); installPackageHelper.IgnoreDependencies = false; installPackageHelper.InstallPackageById("PackageId"); @@ -210,6 +214,7 @@ namespace PackageManagement.Tests public void Execute_PackageIdAndSourceAndProjectPassedAndAllowPrereleaseVersionsIsFalse_PrereleaseVersionsNotAllowedWhenGettingPackageOperations() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("PackageId"); installPackageHelper.AllowPrereleaseVersions = false; installPackageHelper.InstallPackageById("PackageId"); @@ -245,6 +250,7 @@ namespace PackageManagement.Tests public void HasPackageScriptsToRun_OnePackageInOperationsHasInitPowerShellScript_ReturnsTrue() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("Test"); action.PackageId = "Test"; AddInstallOperationWithFile(@"tools\init.ps1"); @@ -257,6 +263,7 @@ namespace PackageManagement.Tests public void HasPackageScriptsToRun_OnePackageInOperationsHasNoFiles_ReturnsFalse() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("Test"); action.PackageId = "Test"; action.Operations = new List(); @@ -269,6 +276,7 @@ namespace PackageManagement.Tests public void HasPackageScriptsToRun_OnePackageInOperationsHasInitPowerShellScriptInUpperCase_ReturnsTrue() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("Test"); action.PackageId = "Test"; AddInstallOperationWithFile(@"tools\INIT.PS1"); @@ -281,6 +289,7 @@ namespace PackageManagement.Tests public void HasPackageScriptsToRun_OnePackageInOperationsHasInstallPowerShellScriptInUpperCase_ReturnsTrue() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("Test"); action.PackageId = "Test"; AddInstallOperationWithFile(@"tools\INSTALL.PS1"); @@ -293,6 +302,7 @@ namespace PackageManagement.Tests public void HasPackageScriptsToRun_OnePackageInOperationsHasUninstallPowerShellScriptInUpperCase_ReturnsTrue() { CreateAction(); + fakeProject.AddFakePackageToSourceRepository("Test"); action.PackageId = "Test"; AddInstallOperationWithFile(@"tools\UNINSTALL.PS1"); @@ -331,5 +341,16 @@ namespace PackageManagement.Tests Assert.AreEqual(expectedPackage, actualPackage); } + + [Test] + public void Execute_PackageIdSpecifiedButDoesNotExistInRepository_ExceptionThrown() + { + CreateAction(); + action.PackageId = "UnknownId"; + + Exception ex = Assert.Throws(typeof(ApplicationException), () => action.Execute()); + + Assert.AreEqual("Unable to find package 'UnknownId'.", ex.Message); + } } } diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UninstallPackageActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UninstallPackageActionTests.cs index d9c1677e1f..9d43b194c3 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UninstallPackageActionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UninstallPackageActionTests.cs @@ -75,7 +75,7 @@ namespace PackageManagement.Tests public void Execute_PackageObjectPassedAndForceRemoveIsFalse_PackageIsNotForcefullyRemoved() { CreateAction(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); uninstallPackageHelper.ForceRemove = false; uninstallPackageHelper.UninstallPackageById("PackageId"); @@ -88,7 +88,7 @@ namespace PackageManagement.Tests public void Execute_PackageObjectPassedAndForceRemoveIsTrue_PackageIsForcefullyRemoved() { CreateAction(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); uninstallPackageHelper.ForceRemove = true; uninstallPackageHelper.UninstallPackageById("PackageId"); @@ -101,7 +101,7 @@ namespace PackageManagement.Tests public void Execute_PackageObjectPassedAndRemoveDependenciesIsFalse_PackageDependenciesAreNotRemoved() { CreateAction(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); uninstallPackageHelper.RemoveDependencies = false; uninstallPackageHelper.UninstallPackageById("PackageId"); @@ -114,7 +114,7 @@ namespace PackageManagement.Tests public void Execute_PackageObjectPassedAndRemoveDependenciesIsTrue_PackageDependenciesAreRemoved() { CreateAction(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); uninstallPackageHelper.RemoveDependencies = true; uninstallPackageHelper.UninstallPackageById("PackageId"); @@ -127,7 +127,7 @@ namespace PackageManagement.Tests public void Execute_PackageIdSpecifiedAndForceRemoveIsTrue_PackageIsForcefullyRemoved() { CreateAction(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); uninstallPackageHelper.ForceRemove = true; uninstallPackageHelper.UninstallPackageById("PackageId"); @@ -140,7 +140,7 @@ namespace PackageManagement.Tests public void Execute_PackageIdSpecifiedAndRemoveDependenciesIsTrue_PackageDependenciesAreRemoved() { CreateAction(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); uninstallPackageHelper.RemoveDependencies = true; uninstallPackageHelper.UninstallPackageById("PackageId"); diff --git a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs index a1e808c704..c8ab0389ab 100644 --- a/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs +++ b/src/AddIns/Misc/PackageManagement/Test/Src/UpdatePackageActionTests.cs @@ -166,7 +166,7 @@ namespace PackageManagement.Tests public void Execute_PackageIdAndSourceAndProjectPassedAndUpdateDependenciesIsTrue_DependenciesUpdatedWhenUpdatingPackage() { CreateSolution(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); updatePackageHelper.UpdateDependencies = true; updatePackageHelper.UpdatePackageById("PackageId"); @@ -179,7 +179,7 @@ namespace PackageManagement.Tests public void Execute_PackageIdAndSourceAndProjectPassedAndUpdateDependenciesIsFalse_DependenciesNotUpdatedWhenGettingPackageOperations() { CreateSolution(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); updatePackageHelper.UpdateDependencies = false; updatePackageHelper.UpdatePackageById("PackageId"); @@ -192,7 +192,7 @@ namespace PackageManagement.Tests public void Execute_UpdatedDepdenciesIsFalseAndNoPackageOperations_DependenciesIgnoredWhenGettingPackageOperations() { CreateSolution(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); updatePackageHelper.UpdateDependencies = false; updatePackageHelper.UpdatePackageById("PackageId"); @@ -205,7 +205,7 @@ namespace PackageManagement.Tests public void Execute_UpdateDependenciesIsTrueAndNoPackageOperations_DependenciesNotIgnoredWhenGettingPackageOperations() { CreateSolution(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); updatePackageHelper.UpdateDependencies = true; updatePackageHelper.UpdatePackageById("PackageId"); @@ -218,7 +218,7 @@ namespace PackageManagement.Tests public void Execute_AllowPrereleaseVersionsIsFalseAndNoPackageOperations_PrereleaseVersionsNotAllowedWhenGettingPackageOperations() { CreateSolution(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); updatePackageHelper.AllowPrereleaseVersions = false; updatePackageHelper.UpdatePackageById("PackageId"); @@ -231,7 +231,7 @@ namespace PackageManagement.Tests public void Execute_AllowPrereleaseVersionsIsTrueAndNoPackageOperations_PrereleaseVersionsAllowedWhenGettingPackageOperations() { CreateSolution(); - + fakeProject.AddFakePackageToSourceRepository("PackageId"); updatePackageHelper.AllowPrereleaseVersions = true; updatePackageHelper.UpdatePackageById("PackageId"); @@ -255,6 +255,7 @@ namespace PackageManagement.Tests public void HasPackageScriptsToRun_OnePackageInOperationsHasInitPowerShellScript_ReturnsTrue() { CreateSolution(); + fakeProject.AddFakePackageToSourceRepository("Test"); action.PackageId = "Test"; AddInstallOperationWithFile(@"tools\init.ps1"); @@ -267,6 +268,7 @@ namespace PackageManagement.Tests public void HasPackageScriptsToRun_OnePackageInOperationsHasNoFiles_ReturnsFalse() { CreateSolution(); + fakeProject.AddFakePackageToSourceRepository("Test"); action.PackageId = "Test"; action.Operations = new List();