diff --git a/mRemoteNGTests/App/ImportTests.cs b/mRemoteNGTests/App/ImportTests.cs new file mode 100644 index 00000000..22628db3 --- /dev/null +++ b/mRemoteNGTests/App/ImportTests.cs @@ -0,0 +1,47 @@ +using System.IO; +using mRemoteNG.App; +using mRemoteNG.Config.Putty; +using mRemoteNG.Connection; +using mRemoteNG.Container; +using mRemoteNGTests.Properties; +using mRemoteNGTests.TestHelpers; +using NUnit.Framework; + +namespace mRemoteNGTests.App +{ + public class ImportTests + { + [Test] + public void ErrorHandlerCalledWhenUnsupportedFileExtensionFound() + { + using (FileTestHelpers.DisposableTempFile(out var file, ".blah")) + { + var conService = new ConnectionsService(PuttySessionsManager.Instance); + var container = new ContainerInfo(); + var exceptionOccurred = false; + + Import.HeadlessFileImport(new []{file}, container, conService, s => exceptionOccurred = true); + + Assert.That(exceptionOccurred); + } + } + + [Test] + public void AnErrorInOneFileDoNotPreventOtherFilesFromProcessing() + { + using (FileTestHelpers.DisposableTempFile(out var badFile, ".blah")) + using (FileTestHelpers.DisposableTempFile(out var rdpFile, ".rdp")) + { + File.AppendAllText(rdpFile, Resources.test_remotedesktopconnection_rdp); + var conService = new ConnectionsService(PuttySessionsManager.Instance); + var container = new ContainerInfo(); + var exceptionCount = 0; + + Import.HeadlessFileImport(new[] { badFile, rdpFile }, container, conService, s => exceptionCount++); + + Assert.That(exceptionCount, Is.EqualTo(1)); + Assert.That(container.Children, Has.One.Items); + } + } + } +} diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index 207c3007..fd012ad6 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -108,6 +108,7 @@ + diff --git a/mRemoteV1/App/Import.cs b/mRemoteV1/App/Import.cs index 99a07f69..48ad47ab 100644 --- a/mRemoteV1/App/Import.cs +++ b/mRemoteV1/App/Import.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Windows.Forms; using mRemoteNG.Config.Import; +using mRemoteNG.Connection; using mRemoteNG.Connection.Protocol; using mRemoteNG.Container; using mRemoteNG.Tools; @@ -35,23 +36,12 @@ namespace mRemoteNG.App if (openFileDialog.ShowDialog() != DialogResult.OK) return; - using (Runtime.ConnectionsService.BatchedSavingContext()) - { - foreach (var fileName in openFileDialog.FileNames) - { - try - { - var importer = BuildConnectionImporterFromFileExtension(fileName); - importer.Import(fileName, importDestinationContainer); - } - catch (Exception ex) - { - MessageBox.Show(string.Format(Language.strImportFileFailedContent, fileName), Language.strImportFileFailedMainInstruction, - MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); - Runtime.MessageCollector.AddExceptionMessage("Unable to import file.", ex); - } - } - } + HeadlessFileImport( + openFileDialog.FileNames, + importDestinationContainer, + Runtime.ConnectionsService, + fileName => MessageBox.Show(string.Format(Language.strImportFileFailedContent, fileName), Language.strImportFileFailedMainInstruction, + MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)); } } catch (Exception ex) @@ -60,12 +50,38 @@ namespace mRemoteNG.App } } + public static void HeadlessFileImport( + IEnumerable filePaths, + ContainerInfo importDestinationContainer, + ConnectionsService connectionsService, + Action exceptionAction = null) + { + using (connectionsService.BatchedSavingContext()) + { + foreach (var fileName in filePaths) + { + try + { + var importer = BuildConnectionImporterFromFileExtension(fileName); + importer.Import(fileName, importDestinationContainer); + } + catch (Exception ex) + { + exceptionAction?.Invoke(fileName); + Runtime.MessageCollector.AddExceptionMessage($"Error occurred while importing file '{fileName}'.", ex); + } + } + } + } + public static void ImportFromActiveDirectory(string ldapPath, ContainerInfo importDestinationContainer, bool importSubOu) { try { - ActiveDirectoryImporter.Import(ldapPath, importDestinationContainer, importSubOu); - Runtime.ConnectionsService.SaveConnectionsAsync(); + using (Runtime.ConnectionsService.BatchedSavingContext()) + { + ActiveDirectoryImporter.Import(ldapPath, importDestinationContainer, importSubOu); + } } catch (Exception ex) { @@ -77,9 +93,11 @@ namespace mRemoteNG.App { try { - var importer = new PortScanImporter(protocol); - importer.Import(hosts, importDestinationContainer); - Runtime.ConnectionsService.SaveConnectionsAsync(); + using (Runtime.ConnectionsService.BatchedSavingContext()) + { + var importer = new PortScanImporter(protocol); + importer.Import(hosts, importDestinationContainer); + } } catch (Exception ex) {