Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/monodevelop.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Ward <matt.ward@xamarin.com>2016-04-22 17:33:25 +0300
committerMatt Ward <matt.ward@xamarin.com>2016-04-22 17:36:57 +0300
commit660f4a3875867014e5e334c12ab7ce7a56a8e280 (patch)
tree978d648c4cd4516d26a84deeeb910d9c3f14e4d4
parenta30aab7b56e898715f8610895c6ae2e33f3182d6 (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.
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/FakeFileService.cs12
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests.Helpers/TestableMonoDevelopProjectSystem.cs24
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement.Tests/MonoDevelop.PackageManagement.Tests/MonoDevelopProjectSystemTests.cs121
-rw-r--r--main/src/addins/MonoDevelop.PackageManagement/MonoDevelop.PackageManagement/MonoDevelopProjectSystem.cs6
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");