diff options
author | Matt Ward <matt.ward@xamarin.com> | 2016-04-22 17:33:25 +0300 |
---|---|---|
committer | Matt Ward <matt.ward@xamarin.com> | 2016-04-22 17:36:57 +0300 |
commit | 660f4a3875867014e5e334c12ab7ce7a56a8e280 (patch) | |
tree | 978d648c4cd4516d26a84deeeb910d9c3f14e4d4 | |
parent | a30aab7b56e898715f8610895c6ae2e33f3182d6 (diff) |
[NuGet] Add tests to check project system exceptions are reported.nuget-add-project-system-exception-tests
Exceptions thrown by the MonoDevelopProjectSystem were not reported
due to a problem with the Runtime.RunInMainThread method that takes
Func<Task>. Added tests to verify the various ways RunInMainThread
are called results in an exception returned to the caller.
4 files changed, 154 insertions, 9 deletions
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs index 8b8d0f3fdd..4efa1cfdb0 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs @@ -26,9 +26,6 @@ using System;
using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using MonoDevelop.PackageManagement;
namespace MonoDevelop.PackageManagement.Tests.Helpers
{
@@ -42,6 +39,10 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers public FakeFileService (IDotNetProject project)
{
this.project = project;
+
+ OnFileChangedAction = path => {
+ FileNamePassedToOnFileChanged = path;
+ };
}
public void RemoveFile (string path)
@@ -55,10 +56,15 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers project.Files.Clear ();
}
+ public string FileNamePassedToOnFileChanged;
+
public void OnFileChanged (string path)
{
+ OnFileChangedAction (path);
}
+ public Action<string> OnFileChangedAction;
+
public string FileNamePassedToOpenFile;
public bool IsOpenFileCalled;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs index 145b665048..e1cc7a62b3 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs @@ -49,8 +49,23 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers public FileNameAndProjectName FileNameAndProjectNamePassedToLogAddedFileToProject;
public FakeNuGetPackageNewImportsHandler NewImportsHandler;
- public static Action<Action> GuiSyncDispatcher = handler => handler.Invoke ();
- public static Func<Func<Task>,Task> GuiSyncDispatcherFunc = handler => handler.Invoke();
+ public static bool UseDefaultGuiDispatcher = false;
+
+ public static Action<Action> GuiSyncDispatcher = handler => {
+ if (UseDefaultGuiDispatcher) {
+ MonoDevelopProjectSystem.DefaultGuiSyncDispatcher (handler);
+ } else {
+ handler.Invoke ();
+ }
+ };
+
+ public static Func<Func<Task>,Task> GuiSyncDispatcherFunc = handler => {
+ if (UseDefaultGuiDispatcher) {
+ return MonoDevelopProjectSystem.GuiSyncDispatchWithException (handler);
+ } else {
+ return handler.Invoke();
+ }
+ };
public TestableMonoDevelopProjectSystem (IDotNetProject project)
: this (
@@ -74,8 +89,11 @@ namespace MonoDevelop.PackageManagement.Tests.Helpers FakeProjectService = (FakePackageManagementProjectService)projectService;
PackageManagementEvents = packageManagementEvents;
Logger = logger;
- }
+ FakeLogger = logger;
+ UseDefaultGuiDispatcher = false;
+ }
+ protected override void PhysicalFileSystemAddFile (string path, Stream stream)
{
PathPassedToPhysicalFileSystemAddFile = path;
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs index 0fa66464e2..c097010075 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs @@ -28,6 +28,8 @@ using System; using System.IO;
using System.Linq;
using System.Runtime.Versioning;
+using System.Threading;
+using System.Threading.Tasks;
using MonoDevelop.PackageManagement;
using MonoDevelop.Core;
using MonoDevelop.Core.Assemblies;
@@ -691,6 +693,96 @@ namespace MonoDevelop.PackageManagement.Tests }
[Test]
+ public void AddFile_FileAdded_FileChangedEventIsFired ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.Name = "MyProject";
+ CreateProjectSystem (project);
+
+ string fileName = @"d:\projects\MyProject\NewFile.cs".ToNativePath ();
+ AddFile (@"NewFile.cs");
+
+ Assert.AreEqual (fileName, projectSystem.FakeFileService.FileNamePassedToOnFileChanged);
+ }
+
+ [Test]
+ public void AddFile_FileServiceOnFileChangedThrowsException_ExceptionIsThrownByAddFile ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.Name = "MyProject";
+ CreateProjectSystem (project);
+ var expectedException = new Exception ("Error");
+ projectSystem.FakeFileService.OnFileChangedAction = path => {
+ throw expectedException;
+ };
+
+ AggregateException ex = Assert.Throws<AggregateException> (() => {
+ AddFile (@"NewFile.cs");
+ });
+
+ Assert.AreEqual (expectedException, ex.GetBaseException ());
+ }
+
+ [Test]
+ public async Task AddFile_UseRuntimeRunInMainThreadAndFileServiceOnFileChangedThrowsException_ExceptionIsThrownByAddFile ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.Name = "MyProject";
+ CreateProjectSystem (project);
+ var expectedException = new Exception ("Error");
+ projectSystem.FakeFileService.OnFileChangedAction = path => {
+ throw expectedException;
+ };
+
+ await Task.Run (() => {
+ AggregateException ex = Assert.Throws<AggregateException> (() => {
+ AddFile (@"NewFile.cs");
+ });
+
+ Assert.AreEqual (expectedException, ex.GetBaseException ());
+ });
+ }
+
+ [Test]
+ public void AddFile_ProjectSaveThrowsException_ExceptionIsThrownByAddFile ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.Name = "MyProject";
+ CreateProjectSystem (project);
+ var expectedException = new Exception ("Error");
+ project.SaveAction = () => {
+ throw expectedException;
+ };
+
+ AggregateException ex = Assert.Throws<AggregateException> (() => {
+ AddFile (@"NewFile.cs");
+ });
+
+ Assert.AreEqual (expectedException, ex.GetBaseException ());
+ }
+
+ [Test]
+ public async Task AddFile_UseRuntimeRunInMainThreadAndProjectSaveThrowsException_ExceptionIsThrownByAddFile ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject.csproj");
+ project.Name = "MyProject";
+ CreateProjectSystem (project);
+ var expectedException = new Exception ("Error");
+ project.SaveAction = () => {
+ throw expectedException;
+ };
+ TestableMonoDevelopProjectSystem.UseDefaultGuiDispatcher = true;
+
+ await Task.Run (() => {
+ AggregateException ex = Assert.Throws<AggregateException> (() => {
+ AddFile (@"NewFile.cs");
+ });
+
+ Assert.AreEqual (expectedException, ex.GetBaseException ());
+ });
+ }
+
+ [Test]
public void DeleteFile_DeletesFileFromFileSystem_CallsFileServiceRemoveFile ()
{
CreateTestProject (@"d:\temp\MyProject.csproj");
@@ -1251,6 +1343,35 @@ namespace MonoDevelop.PackageManagement.Tests Assert.IsTrue (projectSystem.NewImportsHandler.IsDisposed);
}
+
+ [Test]
+ public void FileExistsInProject_ProjectThrowsException_ExceptionThrownByFileExistsInProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ project.Files = null;
+
+ Assert.Throws<ArgumentNullException> (() => {
+ projectSystem.FileExistsInProject ("MyClass.cs");
+ });
+ }
+
+ [Test]
+ public async Task FileExistsInProject_UseRealGuiDispatcherProjectThrowsException_ExceptionThrownByFileExistsInProject ()
+ {
+ CreateTestProject (@"d:\projects\MyProject\MyProject\MyProject.csproj");
+ CreateProjectSystem (project);
+ project.Files = null;
+ TestableMonoDevelopProjectSystem.UseDefaultGuiDispatcher = true;
+
+ await Task.Run (() => {
+ AggregateException ex = Assert.Throws<AggregateException> (() => {
+ projectSystem.FileExistsInProject ("MyClass.cs");
+ });
+
+ Assert.IsInstanceOf<ArgumentNullException> (ex.GetBaseException ());
+ });
+ }
}
}
diff --git a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopProjectSystem.cs b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopProjectSystem.cs index 2679c57a95..20d99a0186 100644 --- a/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopProjectSystem.cs +++ b/main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopProjectSystem.cs @@ -258,7 +258,7 @@ namespace MonoDevelop.PackageManagement public override void AddFile(string path, Stream stream)
{
PhysicalFileSystemAddFile(path, stream);
- GuiSyncDispatch (async () => await AddFileToProject (path));
+ GuiSyncDispatch (() => AddFileToProject (path));
}
protected virtual void PhysicalFileSystemAddFile(string path, Stream stream)
@@ -269,7 +269,7 @@ namespace MonoDevelop.PackageManagement public override void AddFile(string path, Action<Stream> writeToStream)
{
PhysicalFileSystemAddFile (path, writeToStream);
- GuiSyncDispatch (async () => await AddFileToProject (path));
+ GuiSyncDispatch (() => AddFileToProject (path));
}
protected virtual void PhysicalFileSystemAddFile (string path, Action<Stream> writeToStream)
@@ -478,7 +478,7 @@ namespace MonoDevelop.PackageManagement guiSyncDispatcher (() => action ());
}
- static Task GuiSyncDispatchWithException (Func<Task> func)
+ public static Task GuiSyncDispatchWithException (Func<Task> func)
{
if (Runtime.IsMainThread)
throw new InvalidOperationException ("GuiSyncDispatch called from GUI thread");
|