diff --git a/mRemoteNGTests/Config/Serializers/MiscSerializers/RemoteDesktopConnectionManager27DeserializerTests.cs b/mRemoteNGTests/Config/Serializers/MiscSerializers/RemoteDesktopConnectionManager27DeserializerTests.cs new file mode 100644 index 00000000..20185a5f --- /dev/null +++ b/mRemoteNGTests/Config/Serializers/MiscSerializers/RemoteDesktopConnectionManager27DeserializerTests.cs @@ -0,0 +1,326 @@ +using System.IO; +using System.Linq; +using mRemoteNG.Config.Serializers; +using mRemoteNG.Connection.Protocol; +using mRemoteNG.Connection.Protocol.RDP; +using mRemoteNG.Container; +using mRemoteNG.Tree; +using mRemoteNGTests.Properties; +using NUnit.Framework; + +namespace mRemoteNGTests.Config.Serializers.MiscSerializers +{ + public class RemoteDesktopConnectionManager27DeserializerTests + { + private string _connectionFileContents; + private RemoteDesktopConnectionManagerDeserializer _deserializer; + private ConnectionTreeModel _connectionTreeModel; + private const string ExpectedName = "server1_displayname"; + private const string ExpectedHostname = "server1"; + private const string ExpectedDescription = "Comment text here"; + private const string ExpectedUsername = "myusername1"; + private const string ExpectedDomain = "mydomain"; + private const string ExpectedPassword = "passwordHere!"; + private const bool ExpectedUseConsoleSession = true; + private const int ExpectedPort = 9933; + private const RdpProtocol.RDGatewayUsageMethod ExpectedGatewayUsageMethod = RdpProtocol.RDGatewayUsageMethod.Always; + private const string ExpectedGatewayHostname = "gatewayserverhost.innerdomain.net"; + private const string ExpectedGatewayUsername = "gatewayusername"; + private const string ExpectedGatewayDomain = "innerdomain"; + private const string ExpectedGatewayPassword = "gatewayPassword123"; + private const RdpProtocol.RDPResolutions ExpectedRdpResolution = RdpProtocol.RDPResolutions.FitToWindow; + private const RdpProtocol.RDPColors ExpectedRdpColorDepth = RdpProtocol.RDPColors.Colors24Bit; + private const RdpProtocol.RDPSounds ExpectedAudioRedirection = RdpProtocol.RDPSounds.DoNotPlay; + private const bool ExpectedKeyRedirection = true; + private const bool ExpectedSmartcardRedirection = true; + private const bool ExpectedDriveRedirection = true; + private const bool ExpectedPortRedirection = true; + private const bool ExpectedPrinterRedirection = true; + private const RdpProtocol.AuthenticationLevel ExpectedAuthLevel = RdpProtocol.AuthenticationLevel.WarnOnFailedAuth; + + + [OneTimeSetUp] + public void OnetimeSetup() + { + _connectionFileContents = Resources.test_rdcman_v2_7_schema3; + _deserializer = new RemoteDesktopConnectionManagerDeserializer(); + _connectionTreeModel = _deserializer.Deserialize(_connectionFileContents); + } + + [Test] + public void ConnectionTreeModelHasARootNode() + { + var numberOfRootNodes = _connectionTreeModel.RootNodes.Count; + Assert.That(numberOfRootNodes, Is.GreaterThan(0)); + } + + [Test] + public void RootNodeHasContents() + { + var rootNodeContents = _connectionTreeModel.RootNodes.First().Children; + Assert.That(rootNodeContents, Is.Not.Empty); + } + + [Test] + public void AllSubRootFoldersImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var rootNodeContents = importedRdcmanRootNode.Children.Count(node => node.Name == "Group1" || node.Name == "Group2"); + Assert.That(rootNodeContents, Is.EqualTo(2)); + } + + [Test] + public void ConnectionDisplayNameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Name, Is.EqualTo(ExpectedName)); + } + + [Test] + public void ConnectionHostnameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Hostname, Is.EqualTo(ExpectedHostname)); + } + + [Test] + public void ConnectionDescriptionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Description, Is.EqualTo(ExpectedDescription)); + } + + [Test] + public void ConnectionUsernameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Username, Is.EqualTo(ExpectedUsername)); + } + + [Test] + public void ConnectionDomainImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Domain, Is.EqualTo(ExpectedDomain)); + } + + // Since password is encrypted with a machine key, cant test decryption on another machine + //[Test] + //public void ConnectionPasswordImported() + //{ + // var rootNode = _connectionTreeModel.RootNodes.First(); + // var importedRdcmanRootNode = rootNode.Children.OfType().First(); + // var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + // var connection = group1.Children.First(); + // Assert.That(connection.Password, Is.EqualTo(ExpectedPassword)); + //} + + [Test] + public void ConnectionProtocolSetToRdp() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Protocol, Is.EqualTo(ProtocolType.RDP)); + } + + [Test] + public void ConnectionUseConsoleSessionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.UseConsoleSession, Is.EqualTo(ExpectedUseConsoleSession)); + } + + [Test] + public void ConnectionPortImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Port, Is.EqualTo(ExpectedPort)); + } + + [Test] + public void ConnectionGatewayUsageMethodImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayUsageMethod, Is.EqualTo(ExpectedGatewayUsageMethod)); + } + + [Test] + public void ConnectionGatewayHostnameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayHostname, Is.EqualTo(ExpectedGatewayHostname)); + } + + [Test] + public void ConnectionGatewayUsernameImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayUsername, Is.EqualTo(ExpectedGatewayUsername)); + } + + // Since password is encrypted with a machine key, cant test decryption on another machine + //[Test] + //public void ConnectionGatewayPasswordImported() + //{ + // var rootNode = _connectionTreeModel.RootNodes.First(); + // var importedRdcmanRootNode = rootNode.Children.OfType().First(); + // var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + // var connection = group1.Children.First(); + // Assert.That(connection.RDGatewayPassword, Is.EqualTo(ExpectedGatewayPassword)); + //} + + [Test] + public void ConnectionGatewayDomainImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDGatewayDomain, Is.EqualTo(ExpectedGatewayDomain)); + } + + [Test] + public void ConnectionResolutionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Resolution, Is.EqualTo(ExpectedRdpResolution)); + } + + [Test] + public void ConnectionColorDepthImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.Colors, Is.EqualTo(ExpectedRdpColorDepth)); + } + + [Test] + public void ConnectionAudioRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectSound, Is.EqualTo(ExpectedAudioRedirection)); + } + + [Test] + public void ConnectionKeyRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectKeys, Is.EqualTo(ExpectedKeyRedirection)); + } + + [Test] + public void ConnectionDriveRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectDiskDrives, Is.EqualTo(ExpectedDriveRedirection)); + } + + [Test] + public void ConnectionPortRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectPorts, Is.EqualTo(ExpectedPortRedirection)); + } + + [Test] + public void ConnectionPrinterRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectPrinters, Is.EqualTo(ExpectedPrinterRedirection)); + } + + [Test] + public void ConnectionSmartcardRedirectionImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RedirectSmartCards, Is.EqualTo(ExpectedSmartcardRedirection)); + } + + [Test] + public void ConnectionauthenticationLevelImported() + { + var rootNode = _connectionTreeModel.RootNodes.First(); + var importedRdcmanRootNode = rootNode.Children.OfType().First(); + var group1 = importedRdcmanRootNode.Children.OfType().First(node => node.Name == "Group1"); + var connection = group1.Children.First(); + Assert.That(connection.RDPAuthenticationLevel, Is.EqualTo(ExpectedAuthLevel)); + } + + [Test] + public void ExceptionThrownOnBadSchemaVersion() + { + var badFileContents = Resources.test_rdcman_v2_2_badschemaversion; + Assert.That(() => _deserializer.Deserialize(badFileContents), Throws.TypeOf()); + } + + [Test] + public void ExceptionThrownOnUnsupportedVersion() + { + var badFileContents = Resources.test_rdcman_badVersionNumber; + Assert.That(() => _deserializer.Deserialize(badFileContents), Throws.TypeOf()); + } + + [Test] + public void ExceptionThrownOnNoVersion() + { + var badFileContents = Resources.test_rdcman_noversion; + Assert.That(() => _deserializer.Deserialize(badFileContents), Throws.TypeOf()); + } + } +} \ No newline at end of file diff --git a/mRemoteNGTests/Properties/Resources.Designer.cs b/mRemoteNGTests/Properties/Resources.Designer.cs index ebc09adb..187be104 100644 --- a/mRemoteNGTests/Properties/Resources.Designer.cs +++ b/mRemoteNGTests/Properties/Resources.Designer.cs @@ -19,7 +19,7 @@ namespace mRemoteNGTests.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "15.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] internal class Resources { @@ -65,8 +65,7 @@ namespace mRemoteNGTests.Properties { ///dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/v1.75Beta3/mRemoteNG-Installer-1.75.6179.28160.msi ///clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/v1.75Beta3/CHANGELOG.TXT ///CertificateThumbprint: 0CEA828E5C787EA8AA89268D83816C1EA03375BA - ///Checksum: A1E50ACAC4CB8023527E1E7A0E682459 - ///. + ///Checksum: A1E50ACAC4CB8023527E1E7A0E682459. /// internal static string beta_update { get { @@ -78,6 +77,7 @@ namespace mRemoteNGTests.Properties { /// Looks up a localized string similar to Version: 1.75.6170.27478 ///dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/v1.75Beta3/mRemoteNG-Portable-1.75.6179.28241.zip ///clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/v1.75Beta3/CHANGELOG.TXT + ///CertificateThumbprint: 0CEA828E5C787EA8AA89268D83816C1EA03375BA ///Checksum: 1C35EA199F58001BC4EBB164D8B3D11C. /// internal static string beta_update_portable { @@ -173,8 +173,7 @@ namespace mRemoteNGTests.Properties { ///dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/v1.75Beta3/mRemoteNG-Installer-1.75.6179.28160.msi ///clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/v1.75Beta3/CHANGELOG.TXT ///CertificateThumbprint: 0CEA828E5C787EA8AA89268D83816C1EA03375BA - ///Checksum: A1E50ACAC4CB8023527E1E7A0E682459 - ///. + ///Checksum: A1E50ACAC4CB8023527E1E7A0E682459. /// internal static string dev_update { get { @@ -186,6 +185,7 @@ namespace mRemoteNGTests.Properties { /// Looks up a localized string similar to Version: 1.75.6170.27478 ///dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/v1.75Beta3/mRemoteNG-Portable-1.75.6179.28241.zip ///clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/v1.75Beta3/CHANGELOG.TXT + ///CertificateThumbprint: 0CEA828E5C787EA8AA89268D83816C1EA03375BA ///Checksum: 1C35EA199F58001BC4EBB164D8B3D11C. /// internal static string dev_update_portable { @@ -330,11 +330,11 @@ namespace mRemoteNGTests.Properties { } /// - /// Looks up a localized string similar to Version: 1.72.5065.32737 - ///dURL: http://downloads.mremoteng.org/mRemoteNG-Installer-1.72.exe - ///clURL: http://update.mremoteng.org/changes-1.72.txt - ///CertificateThumbprint: 1cbd910dbd6e77f26506e7f600736972f700673f - ///. + /// Looks up a localized string similar to Version: 1.75.6164.27544 + ///dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/v1.75Beta3/mRemoteNG-Installer-1.75.6179.28160.msi + ///clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/v1.75Beta3/CHANGELOG.TXT + ///CertificateThumbprint: 0CEA828E5C787EA8AA89268D83816C1EA03375BA + ///Checksum: A1E50ACAC4CB8023527E1E7A0E682459. /// internal static string update { get { @@ -346,6 +346,7 @@ namespace mRemoteNGTests.Properties { /// Looks up a localized string similar to Version: 1.75.6170.27478 ///dURL: https://github.com/mRemoteNG/mRemoteNG/releases/download/v1.75Beta3/mRemoteNG-Portable-1.75.6179.28241.zip ///clURL: https://raw.githubusercontent.com/mRemoteNG/mRemoteNG/v1.75Beta3/CHANGELOG.TXT + ///CertificateThumbprint: 0CEA828E5C787EA8AA89268D83816C1EA03375BA ///Checksum: 1C35EA199F58001BC4EBB164D8B3D11C. /// internal static string update_portable { diff --git a/mRemoteNGTests/Resources/test_rdcman_v2_7_schema3.rdg b/mRemoteNGTests/Resources/test_rdcman_v2_7_schema3.rdg index e4b61c7c..3c66d7c5 100644 --- a/mRemoteNGTests/Resources/test_rdcman_v2_7_schema3.rdg +++ b/mRemoteNGTests/Resources/test_rdcman_v2_7_schema3.rdg @@ -26,16 +26,18 @@ + server1_displayname server1 + Comment text here Custom - someusername1 + myusername1 AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAA/jk3lWsW+ku0n4AOVYyLTAAAAAACAAAAAAAQZgAAAAEAACAAAACZryl2a4trJLcUdyg7jL/m51fxn4Vy+je6SBhT5FasmgAAAAAOgAAAAAIAACAAAAAcG6MQhKFvEcKRrRE74YKrrnYKxLFnVxbGzyfl7JoyvjAAAACAofcbQqcr6h9VQuwwWW5IBkW1zsugofl1MjsL9t2uWfuBgnrya1Xlyue5E7cG8BZAAAAApgx/XXqBqXhr6CV2SJTlXihg7n5epOIT02A8ymy3qRftDgXlmu3IaN7krK3gofv+iNdVrvIdJJMYCihm7dyqOw== mydomain - False + True 9933 @@ -43,25 +45,25 @@ True - gatewayserver.innerdomain.net + gatewayserverhost.innerdomain.net Any True True Custom - + gatewayusername - + innerdomain - False - True + True + False 24 - Client + NoSound Dynamic DoNotRecord - FullScreenClient + Remote True True diff --git a/mRemoteNGTests/mRemoteNGTests.csproj b/mRemoteNGTests/mRemoteNGTests.csproj index a9d540ea..311c3706 100644 --- a/mRemoteNGTests/mRemoteNGTests.csproj +++ b/mRemoteNGTests/mRemoteNGTests.csproj @@ -125,6 +125,7 @@ +