From 944f1ff248a11d029d27cc51c6ae3c16d15ccf39 Mon Sep 17 00:00:00 2001 From: Scott Xu Date: Thu, 25 Jul 2024 19:34:10 +0800 Subject: [PATCH 1/7] Enable all net48 integration tests --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 1a9d73906..2861ad9d7 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,7 +28,7 @@ for: - sh: dotnet test -f net8.0 -c Debug --no-restore --no-build --results-directory artifacts --logger Appveyor --logger "console;verbosity=normal" --logger "liquid.md;LogFileName=linux_unit_test_net_8_report.md" -p:CollectCoverage=true -p:CoverletOutputFormat=cobertura -p:CoverletOutput=../../artifacts/linux_unit_test_net_8_coverage.xml test/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj - sh: echo "Run integration tests" - sh: dotnet test -f net8.0 -c Debug --no-restore --no-build --results-directory artifacts --logger Appveyor --logger "console;verbosity=normal" --logger "liquid.md;LogFileName=linux_integration_test_net_8_report.md" -p:CollectCoverage=true -p:CoverletOutputFormat=cobertura -p:CoverletOutput=../../artifacts/linux_integration_test_net_8_coverage.xml test/Renci.SshNet.IntegrationTests/Renci.SshNet.IntegrationTests.csproj - - sh: dotnet test -f net48 -c Debug --no-restore --no-build --results-directory artifacts --logger Appveyor --logger "console;verbosity=normal" --logger "liquid.md;LogFileName=linux_integration_test_net_48_report.md" -p:CollectCoverage=true -p:CoverletOutputFormat=cobertura -p:CoverletOutput=../../artifacts/linux_integration_test_net_48_coverage.xml --filter Name~Zlib test/Renci.SshNet.IntegrationTests/Renci.SshNet.IntegrationTests.csproj + - sh: dotnet test -f net48 -c Debug --no-restore --no-build --results-directory artifacts --logger Appveyor --logger "console;verbosity=normal" --logger "liquid.md;LogFileName=linux_integration_test_net_48_report.md" -p:CollectCoverage=true -p:CoverletOutputFormat=cobertura -p:CoverletOutput=../../artifacts/linux_integration_test_net_48_coverage.xml test/Renci.SshNet.IntegrationTests/Renci.SshNet.IntegrationTests.csproj - matrix: From 8d58888825f5a411535ab99ce82e10d98b2c5789 Mon Sep 17 00:00:00 2001 From: Scott Xu Date: Fri, 26 Jul 2024 09:03:09 +0800 Subject: [PATCH 2/7] Skip ECDsa in net48 integration tests --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index 2861ad9d7..88a674cff 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -28,7 +28,7 @@ for: - sh: dotnet test -f net8.0 -c Debug --no-restore --no-build --results-directory artifacts --logger Appveyor --logger "console;verbosity=normal" --logger "liquid.md;LogFileName=linux_unit_test_net_8_report.md" -p:CollectCoverage=true -p:CoverletOutputFormat=cobertura -p:CoverletOutput=../../artifacts/linux_unit_test_net_8_coverage.xml test/Renci.SshNet.Tests/Renci.SshNet.Tests.csproj - sh: echo "Run integration tests" - sh: dotnet test -f net8.0 -c Debug --no-restore --no-build --results-directory artifacts --logger Appveyor --logger "console;verbosity=normal" --logger "liquid.md;LogFileName=linux_integration_test_net_8_report.md" -p:CollectCoverage=true -p:CoverletOutputFormat=cobertura -p:CoverletOutput=../../artifacts/linux_integration_test_net_8_coverage.xml test/Renci.SshNet.IntegrationTests/Renci.SshNet.IntegrationTests.csproj - - sh: dotnet test -f net48 -c Debug --no-restore --no-build --results-directory artifacts --logger Appveyor --logger "console;verbosity=normal" --logger "liquid.md;LogFileName=linux_integration_test_net_48_report.md" -p:CollectCoverage=true -p:CoverletOutputFormat=cobertura -p:CoverletOutput=../../artifacts/linux_integration_test_net_48_coverage.xml test/Renci.SshNet.IntegrationTests/Renci.SshNet.IntegrationTests.csproj + - sh: dotnet test -f net48 -c Debug --no-restore --no-build --results-directory artifacts --logger Appveyor --logger "console;verbosity=normal" --logger "liquid.md;LogFileName=linux_integration_test_net_48_report.md" -p:CollectCoverage=true -p:CoverletOutputFormat=cobertura -p:CoverletOutput=../../artifacts/linux_integration_test_net_48_coverage.xml --filter Name\!~ECDsa test/Renci.SshNet.IntegrationTests/Renci.SshNet.IntegrationTests.csproj - matrix: From b507b6de35abe3e9248374a618c8ed0edb12068f Mon Sep 17 00:00:00 2001 From: Scott Xu Date: Sat, 27 Jul 2024 20:26:51 +0800 Subject: [PATCH 3/7] Stabilise tests --- ...Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs b/test/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs index e6af7394b..db8440036 100644 --- a/test/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs +++ b/test/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived.cs @@ -61,6 +61,7 @@ protected override void SetupMocks() { new Thread(() => { + _closeTimer.Start(); Thread.Sleep(100); // raise ChannelCloseReceived event to set waithandle for receiving // SSH_MSG_CHANNEL_CLOSE message from server which is waited on after @@ -68,7 +69,6 @@ protected override void SetupMocks() SessionMock.Raise(s => s.ChannelCloseReceived += null, new MessageEventArgs(new ChannelCloseMessage(_localChannelNumber))); }).Start(); - _closeTimer.Start(); try { waitHandle.WaitOne(); From 494a44f1e182250a392235fbcd68c5bd97d36214 Mon Sep 17 00:00:00 2001 From: Scott Xu Date: Sat, 27 Jul 2024 20:47:10 +0800 Subject: [PATCH 4/7] Stabilise tests --- ...IsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs b/test/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs index 89dc6c987..f6eb2933b 100644 --- a/test/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs +++ b/test/Renci.SshNet.Tests/Classes/Channels/ChannelTest_Dispose_SessionIsConnectedAndChannelIsOpen_EofNotReceived_SendEofInvoked.cs @@ -66,6 +66,7 @@ protected override void SetupMocks() { new Thread(() => { + _closeTimer.Start(); Thread.Sleep(100); // raise ChannelCloseReceived event to set waithandle for receiving // SSH_MSG_CHANNEL_CLOSE message from server which is waited on after @@ -74,7 +75,6 @@ protected override void SetupMocks() new MessageEventArgs( new ChannelCloseMessage(_localChannelNumber))); }).Start(); - _closeTimer.Start(); try { w.WaitOne(); From 50838f858930566bf99d087b2b2c08eb4a07cbfb Mon Sep 17 00:00:00 2001 From: Scott Xu Date: Wed, 31 Jul 2024 22:35:00 +0800 Subject: [PATCH 5/7] Stabilise tests --- .../Renci.SshNet.IntegrationTests/SshTests.cs | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/test/Renci.SshNet.IntegrationTests/SshTests.cs b/test/Renci.SshNet.IntegrationTests/SshTests.cs index ba179d7e3..f0378cd27 100644 --- a/test/Renci.SshNet.IntegrationTests/SshTests.cs +++ b/test/Renci.SshNet.IntegrationTests/SshTests.cs @@ -655,17 +655,32 @@ public void Ssh_RemotePortForwarding() var endpoint1 = new IPEndPoint(ipv4HostAddress, 10000); var endpoint2 = new IPEndPoint(ipv4HostAddress, 10001); + var isBytesReceivedOnLister1 = false; + var isBytesReceivedOnLister2 = false; + var bytesReceivedOnListener1 = new List(); var bytesReceivedOnListener2 = new List(); using (var socketListener1 = new AsyncSocketListener(endpoint1)) using (var socketListener2 = new AsyncSocketListener(endpoint2)) + using (var bytesReceivedEventOnListener1 = new AutoResetEvent(false)) + using (var bytesReceivedEventOnListener2 = new AutoResetEvent(false)) using (var client = new SshClient(_connectionInfoFactory.Create())) { - socketListener1.BytesReceived += (received, socket) => bytesReceivedOnListener1.AddRange(received); + socketListener1.BytesReceived += (received, socket) => + { + bytesReceivedOnListener1.AddRange(received); + bytesReceivedEventOnListener1.Set(); + }; + socketListener1.Start(); - socketListener2.BytesReceived += (received, socket) => bytesReceivedOnListener2.AddRange(received); + socketListener2.BytesReceived += (received, socket) => + { + bytesReceivedOnListener2.AddRange(received); + bytesReceivedEventOnListener2.Set(); + }; + socketListener2.Start(); client.Connect(); @@ -706,10 +721,16 @@ public void Ssh_RemotePortForwarding() s.Close(); } + isBytesReceivedOnLister1 = bytesReceivedEventOnListener1.WaitOne(1000); + isBytesReceivedOnLister2 = bytesReceivedEventOnListener2.WaitOne(1000); + forwardedPort1.Stop(); forwardedPort2.Stop(); } + Assert.IsTrue(isBytesReceivedOnLister1); + Assert.IsTrue(isBytesReceivedOnLister2); + var textReceivedOnListener1 = Encoding.ASCII.GetString(bytesReceivedOnListener1.ToArray()); Assert.AreEqual("ABC\r\n", textReceivedOnListener1); From 071bdd7deeb7f3a81bae281a962f9f6fd8ff6f71 Mon Sep 17 00:00:00 2001 From: Scott Xu Date: Wed, 31 Jul 2024 23:28:21 +0800 Subject: [PATCH 6/7] Stabilise tests --- .../Classes/SessionTest_Connected.cs | 9 +++++--- .../Classes/SessionTest_ConnectedBase.cs | 22 +++++++++++++++---- 2 files changed, 24 insertions(+), 7 deletions(-) diff --git a/test/Renci.SshNet.Tests/Classes/SessionTest_Connected.cs b/test/Renci.SshNet.Tests/Classes/SessionTest_Connected.cs index d105d9a35..db0f10f25 100644 --- a/test/Renci.SshNet.Tests/Classes/SessionTest_Connected.cs +++ b/test/Renci.SshNet.Tests/Classes/SessionTest_Connected.cs @@ -41,6 +41,7 @@ public void ClientVersionIsRenciSshNet() [TestMethod] public void IncludeStrictKexPseudoAlgorithmInInitKex() { + Assert.IsTrue(FirstKexReceived.Wait(1000)); Assert.IsTrue(ServerBytesReceivedRegister.Count > 0); var kexInitMessage = new KeyExchangeInitMessage(); @@ -51,7 +52,9 @@ public void IncludeStrictKexPseudoAlgorithmInInitKex() [TestMethod] public void ShouldNotIncludeStrictKexPseudoAlgorithmInSubsequentKex() { - using var kexReceived = new ManualResetEventSlim(); + Assert.IsTrue(FirstKexReceived.Wait(1000)); + + using var subsequentKexReceived = new ManualResetEventSlim(); bool kexContainsPseudoAlg = true; ServerListener.BytesReceived += ServerListener_BytesReceived; @@ -64,13 +67,13 @@ void ServerListener_BytesReceived(byte[] bytesReceived, System.Net.Sockets.Socke var kexInitMessage = new KeyExchangeInitMessage(); kexInitMessage.Load(bytesReceived, 6, bytesReceived.Length - 6); kexContainsPseudoAlg = kexInitMessage.KeyExchangeAlgorithms.Contains("kex-strict-c-v00@openssh.com"); - kexReceived.Set(); + subsequentKexReceived.Set(); } } Session.SendMessage(Session.ClientInitMessage); - Assert.IsTrue(kexReceived.Wait(1000)); + Assert.IsTrue(subsequentKexReceived.Wait(1000)); Assert.IsFalse(kexContainsPseudoAlg); ServerListener.BytesReceived -= ServerListener_BytesReceived; diff --git a/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs b/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs index b507aac9f..0b7fad0e5 100644 --- a/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs +++ b/test/Renci.SshNet.Tests/Classes/SessionTest_ConnectedBase.cs @@ -4,6 +4,7 @@ using System.Net; using System.Net.Sockets; using System.Security.Cryptography; +using System.Threading; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -43,6 +44,7 @@ public abstract class SessionTest_ConnectedBase protected IList ErrorOccurredRegister { get; private set; } protected AsyncSocketListener ServerListener { get; private set; } protected IList ServerBytesReceivedRegister { get; private set; } + protected ManualResetEventSlim FirstKexReceived { get; private set; } protected Session Session { get; private set; } protected Socket ClientSocket { get; private set; } protected Socket ServerSocket { get; private set; } @@ -87,6 +89,12 @@ public void TearDown() ClientSocket.Shutdown(SocketShutdown.Both); ClientSocket.Dispose(); } + + if (FirstKexReceived != null) + { + FirstKexReceived.Dispose(); + FirstKexReceived = null; + } } protected virtual void SetupData() @@ -107,6 +115,7 @@ protected virtual void SetupData() DisconnectReceivedRegister = new List>(); ErrorOccurredRegister = new List(); ServerBytesReceivedRegister = new List(); + FirstKexReceived = new ManualResetEventSlim(); ServerIdentification = new SshIdentification("2.0", "OurServerStub"); _authenticationStarted = false; _socketFactory = new SocketFactory(); @@ -151,11 +160,16 @@ protected virtual void SetupData() { ServerBytesReceivedRegister.Add(received); - if (WaitForClientKeyExchangeInit && received.Length > 5 && received[5] == 20) + if (received.Length > 5 && received[5] == 20) { - // This is the KEXINIT. Send one back. - SendKeyExchangeInit(); - WaitForClientKeyExchangeInit = false; + if (WaitForClientKeyExchangeInit) + { + // This is the KEXINIT. Send one back. + SendKeyExchangeInit(); + WaitForClientKeyExchangeInit = false; + } + + FirstKexReceived.Set(); } }; ServerListener.Start(); From 7159c60a9e01b2550868aa9d6c9bb682b4c303db Mon Sep 17 00:00:00 2001 From: Scott Xu Date: Thu, 1 Aug 2024 08:21:24 +0800 Subject: [PATCH 7/7] Spelling --- test/Renci.SshNet.IntegrationTests/SshTests.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/Renci.SshNet.IntegrationTests/SshTests.cs b/test/Renci.SshNet.IntegrationTests/SshTests.cs index f0378cd27..2888e74e2 100644 --- a/test/Renci.SshNet.IntegrationTests/SshTests.cs +++ b/test/Renci.SshNet.IntegrationTests/SshTests.cs @@ -655,8 +655,8 @@ public void Ssh_RemotePortForwarding() var endpoint1 = new IPEndPoint(ipv4HostAddress, 10000); var endpoint2 = new IPEndPoint(ipv4HostAddress, 10001); - var isBytesReceivedOnLister1 = false; - var isBytesReceivedOnLister2 = false; + var areBytesReceivedOnListener1 = false; + var areBytesReceivedOnListener2 = false; var bytesReceivedOnListener1 = new List(); var bytesReceivedOnListener2 = new List(); @@ -721,15 +721,15 @@ public void Ssh_RemotePortForwarding() s.Close(); } - isBytesReceivedOnLister1 = bytesReceivedEventOnListener1.WaitOne(1000); - isBytesReceivedOnLister2 = bytesReceivedEventOnListener2.WaitOne(1000); + areBytesReceivedOnListener1 = bytesReceivedEventOnListener1.WaitOne(1000); + areBytesReceivedOnListener2 = bytesReceivedEventOnListener2.WaitOne(1000); forwardedPort1.Stop(); forwardedPort2.Stop(); } - Assert.IsTrue(isBytesReceivedOnLister1); - Assert.IsTrue(isBytesReceivedOnLister2); + Assert.IsTrue(areBytesReceivedOnListener1); + Assert.IsTrue(areBytesReceivedOnListener2); var textReceivedOnListener1 = Encoding.ASCII.GetString(bytesReceivedOnListener1.ToArray()); Assert.AreEqual("ABC\r\n", textReceivedOnListener1);